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
@@ -1,93 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Drive `waygraph auto --cli` through login -> add-all -> remove-all -> quit.
4
- * Waits for each Choose: prompt so picks are not sent early.
5
- *
6
- * Usage (from examples/saucedemo):
7
- * node scripts/drive-auto-cli.mjs
8
- */
9
- import { spawn } from "node:child_process";
10
- import { createInterface } from "node:readline";
11
- import { fileURLToPath } from "node:url";
12
- import { dirname, join } from "node:path";
13
-
14
- const root = join(dirname(fileURLToPath(import.meta.url)), "..");
15
- const waygraphBin = join(root, "../../bin/waygraph");
16
- const DATA =
17
- process.env.WAYGRAPH_DATA ??
18
- '{"saucedemo.credentials":{"username":"standard_user","password":"secret_sauce"}}';
19
-
20
- function pickByLabel(menuText, label) {
21
- const re = new RegExp(`\\[(\\d+)\\]\\s+${label.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}`);
22
- const m = menuText.match(re);
23
- if (!m) throw new Error(`menu missing "${label}"\n${menuText}`);
24
- return m[1];
25
- }
26
-
27
- async function main() {
28
- const child = spawn(waygraphBin, ["auto", "--cli", "--data", DATA, "."], {
29
- cwd: root,
30
- stdio: ["pipe", "pipe", "pipe"],
31
- env: process.env,
32
- });
33
-
34
- let buf = "";
35
- const dump = (chunk, stream) => {
36
- const s = chunk.toString();
37
- buf += s;
38
- process[stream].write(s);
39
- };
40
- child.stdout.on("data", (c) => dump(c, "stdout"));
41
- child.stderr.on("data", (c) => dump(c, "stderr"));
42
-
43
- const waitChoose = () =>
44
- new Promise((resolve, reject) => {
45
- const start = Date.now();
46
- const tick = () => {
47
- if (buf.includes("Choose:")) {
48
- const i = buf.lastIndexOf("Choose:");
49
- const slice = buf.slice(Math.max(0, i - 4000), i + 8);
50
- resolve(slice);
51
- return;
52
- }
53
- if (Date.now() - start > 120_000) {
54
- reject(new Error(`timeout waiting for Choose:\n${buf.slice(-2000)}`));
55
- return;
56
- }
57
- setTimeout(tick, 100);
58
- };
59
- tick();
60
- });
61
-
62
- const send = (line) => {
63
- console.error(`\n>> pick ${line.trim()}`);
64
- buf = buf.replace(/Choose:/g, "Choose(done):");
65
- child.stdin.write(line);
66
- };
67
-
68
- try {
69
- let menu = await waitChoose();
70
- send("1\n"); // submit-login
71
- menu = await waitChoose();
72
- if (!/LoggedIn|Add all to cart/.test(menu)) {
73
- throw new Error(`expected inventory after login, got:\n${menu}`);
74
- }
75
- send(`${pickByLabel(menu, "Add all to cart")}\n`);
76
- menu = await waitChoose();
77
- send(`${pickByLabel(menu, "Remove all from cart")}\n`);
78
- menu = await waitChoose();
79
- if (!/Add all to cart/.test(menu)) {
80
- throw new Error(`expected Add all again after remove-all, got:\n${menu}`);
81
- }
82
- send("q\n");
83
- const code = await new Promise((res) => child.on("exit", res));
84
- if (code !== 0 && code !== null) process.exitCode = code;
85
- else console.error("\ndrive-auto-cli: PASS login -> add-all -> remove-all -> quit");
86
- } catch (err) {
87
- console.error(err instanceof Error ? err.message : String(err));
88
- child.kill("SIGTERM");
89
- process.exitCode = 1;
90
- }
91
- }
92
-
93
- main();
@@ -1,126 +0,0 @@
1
- // Proves the dynamic add-to-cart menu for real: buildExploreMenu must offer
2
- // one row PER item still on the page (not one generic "add-to-cart" row tied
3
- // to the backpack), picking a non-default item must add THAT item (not the
4
- // backpack), and the menu must stop offering an item once it is in the cart.
5
- import { chromium } from "@playwright/test";
6
- import { join, dirname } from "node:path";
7
- import { fileURLToPath, pathToFileURL } from "node:url";
8
- import { createRequire } from "node:module";
9
- import { chromiumExecutablePath } from "waygraph";
10
-
11
- const require = createRequire(import.meta.url);
12
- await import(require.resolve("tsx/esm"));
13
-
14
- const root = join(dirname(fileURLToPath(import.meta.url)), "..");
15
- const waygraphDist = join(root, "../../dist");
16
-
17
- const { buildExploreContext, buildExploreMenu } = await import(
18
- pathToFileURL(join(waygraphDist, "auto-explore.js")).href
19
- );
20
- const { MemPage, Engine, start, end } = await import(pathToFileURL(join(waygraphDist, "index.js")).href);
21
-
22
- const exe = chromiumExecutablePath();
23
-
24
- async function runBlock(engine, entry, context, page, mem) {
25
- const flow = engine.defineFlow([start, entry.block, end]);
26
- await flow.run(context, mem, { page, closeOnFinish: false });
27
- }
28
-
29
- const { graph, library } = await buildExploreContext(root);
30
- const mem = new MemPage();
31
- mem.set(library.byName.get("submit-login").block.requires[0], {
32
- username: "standard_user",
33
- password: "secret_sauce",
34
- });
35
-
36
- const browser = await chromium.launch({
37
- headless: true,
38
- ...(exe ? { executablePath: exe, args: ["--no-sandbox"] } : {}),
39
- });
40
- const context = await browser.newContext({
41
- baseURL: "https://www.saucedemo.com",
42
- viewport: { width: 1280, height: 900 },
43
- });
44
- const page = await context.newPage();
45
- const engine = new Engine({ headless: true });
46
-
47
- await page.goto("/", { waitUntil: "load" });
48
- await runBlock(engine, library.byName.get("submit-login"), context, page, mem);
49
- await page.waitForURL(/inventory\.html/);
50
-
51
- // 1. Menu on LoggedIn must offer one distinct add-to-cart row per product on
52
- // the inventory page - not a single generic row.
53
- const menu1 = await buildExploreMenu(page, graph, library, "LoggedIn");
54
- const addRows1 = menu1.flat.filter((e) => e.block === "add-to-cart");
55
- console.log(`add-to-cart rows on LoggedIn: ${addRows1.length}`);
56
- for (const row of addRows1) console.log(` - ${row.label}`);
57
- if (addRows1.length < 2) {
58
- throw new Error(`expected several distinct add-to-cart rows, got ${addRows1.length}`);
59
- }
60
- if (addRows1.some((r) => !r.instanceOption)) {
61
- throw new Error("every add-to-cart row must carry an instanceOption");
62
- }
63
- const backpackRow = addRows1.find((r) => r.instanceOption.value.id === "sauce-labs-backpack");
64
- const bikeLightRow = addRows1.find((r) => r.instanceOption.value.id === "sauce-labs-bike-light");
65
- if (!backpackRow || !bikeLightRow) {
66
- throw new Error("expected both the backpack and the bike light as separate rows");
67
- }
68
- if (backpackRow.label === bikeLightRow.label) {
69
- throw new Error("rows must have distinct, item-specific labels");
70
- }
71
-
72
- // 2. Picking the NON-default item (bike light, not the backpack) must add
73
- // exactly that item - proving mem really drives which product act() clicks.
74
- mem.set(bikeLightRow.instanceOption.key, bikeLightRow.instanceOption.value);
75
- await runBlock(engine, library.byName.get("add-to-cart"), context, page, mem);
76
-
77
- const bikeLightInCart = await page.locator('[data-test="remove-sauce-labs-bike-light"]').first().isVisible();
78
- const backpackStillInCart = await page.locator('[data-test="remove-sauce-labs-backpack"]').first().isVisible();
79
- console.log(`bike light in cart: ${bikeLightInCart}, backpack in cart (should be false): ${backpackStillInCart}`);
80
- if (!bikeLightInCart) throw new Error("expected the picked item (bike light) to be in the cart");
81
- if (backpackStillInCart) throw new Error("backpack should NOT be in the cart - it was never picked");
82
-
83
- // 3. Rebuilding the menu must now offer bike light's "Remove" row instead,
84
- // and drop it from the add-to-cart options - the menu reflects the live page.
85
- const menu2 = await buildExploreMenu(page, graph, library, "LoggedIn");
86
- const addRows2 = menu2.flat.filter((e) => e.block === "add-to-cart");
87
- if (addRows2.some((r) => r.instanceOption.value.id === "sauce-labs-bike-light")) {
88
- throw new Error("bike light should no longer be offered - it is already in the cart");
89
- }
90
- if (!addRows2.some((r) => r.instanceOption.value.id === "sauce-labs-backpack")) {
91
- throw new Error("backpack should still be offered - it was never added");
92
- }
93
- console.log(`add-to-cart rows after adding bike light: ${addRows2.length} (one fewer than before)`);
94
- if (addRows2.length !== addRows1.length - 1) {
95
- throw new Error(`expected exactly one fewer row (${addRows1.length - 1}), got ${addRows2.length}`);
96
- }
97
-
98
- // 4. Same rebuild must now offer Remove for the bike light (mem branch for
99
- // items already in the cart) - not only shrink the Add list.
100
- const removeRows = menu2.flat.filter((e) => e.block === "remove-from-cart");
101
- console.log(`remove-from-cart rows after add: ${removeRows.length}`);
102
- for (const row of removeRows) console.log(` - ${row.label}`);
103
- if (removeRows.length !== 1) {
104
- throw new Error(`expected exactly 1 Remove row (bike light), got ${removeRows.length}`);
105
- }
106
- if (removeRows[0].instanceOption.value.id !== "sauce-labs-bike-light") {
107
- throw new Error(`expected Remove for bike light, got ${removeRows[0].label}`);
108
- }
109
- if (!/Remove "Sauce Labs Bike Light" from cart/.test(removeRows[0].label)) {
110
- throw new Error(`unexpected Remove label: ${removeRows[0].label}`);
111
- }
112
-
113
- // 5. MemNav: Open "…" details for every inventory card (including ones already
114
- // in the cart) - separate from Add/Remove effect rows.
115
- const openRows = menu2.flat.filter((e) => e.block === "nav-item-detail");
116
- console.log(`nav-item-detail (MemNav) rows: ${openRows.length}`);
117
- for (const row of openRows) console.log(` - ${row.label}`);
118
- if (openRows.length < 6) {
119
- throw new Error(`expected 6 Open details rows, got ${openRows.length}`);
120
- }
121
- if (!openRows.some((r) => /Open "Test\.allTheThings\(\) T-Shirt \(Red\)" details/.test(r.label))) {
122
- throw new Error("missing Open details row for Test.allTheThings() T-Shirt (Red)");
123
- }
124
-
125
- console.log("\nPASS: add/remove Effect + open-details MemNav reflect the live page");
126
- await browser.close();
@@ -1,92 +0,0 @@
1
- import { chromium } from "@playwright/test";
2
- import { join, dirname } from "node:path";
3
- import { fileURLToPath, pathToFileURL } from "node:url";
4
- import { createRequire } from "node:module";
5
- import { chromiumExecutablePath } from "waygraph";
6
-
7
- const require = createRequire(import.meta.url);
8
- await import(require.resolve("tsx/esm"));
9
-
10
- const root = join(dirname(fileURLToPath(import.meta.url)), "..");
11
- const outDir = join(root, "../../.tmp/waygraph-auto");
12
- const waygraphDist = join(root, "../../dist");
13
-
14
- const { buildExploreContext, buildExploreMenu } = await import(
15
- pathToFileURL(join(waygraphDist, "auto-explore.js")).href
16
- );
17
- const { locate, MemPage, Engine, start, end } = await import(pathToFileURL(join(waygraphDist, "index.js")).href);
18
-
19
- const exe = chromiumExecutablePath();
20
-
21
- async function snap(page, name) {
22
- const path = join(outDir, `graph-proof-${name}.png`);
23
- await page.screenshot({ path, fullPage: false });
24
- console.log("screenshot", path);
25
- }
26
-
27
- async function resolveHere(page, navTags) {
28
- const path = new URL(page.url()).pathname;
29
- if (path.includes("inventory-item.html")) return "ItemDetailPage";
30
- if (path.includes("inventory.html")) return "LoggedIn";
31
- if (path.includes("cart.html")) return "CartPage";
32
- if (path.includes("checkout-complete.html")) return "OrderComplete";
33
- if (path === "/" || path === "") {
34
- if (await page.locator("#login-button").isVisible({ timeout: 500 }).catch(() => false)) return "LoginPage";
35
- }
36
- return locate(page, navTags, { timeoutMs: 1500 });
37
- }
38
-
39
- async function menuSummary(page, graph, library, label) {
40
- const navTags = library.navBlocks.map((n) => n.block);
41
- const resolved = await resolveHere(page, navTags);
42
- const menu = await buildExploreMenu(page, graph, library, resolved);
43
- console.log(`\n=== ${label} | here=${resolved} ===`);
44
- for (const s of menu.sections) {
45
- console.log(` ${s.title}:`);
46
- for (const e of s.edges) console.log(` ${e.block} (${e.kind}) → ${e.to}`);
47
- }
48
- return resolved;
49
- }
50
-
51
- async function runBlock(engine, entry, context, page, mem) {
52
- const flow = engine.defineFlow([start, entry.block, end]);
53
- await flow.run(context, mem, { page, closeOnFinish: false });
54
- }
55
-
56
- const { graph, library } = await buildExploreContext(root);
57
- const mem = new MemPage();
58
- mem.set(
59
- library.byName.get("submit-login").block.requires[0],
60
- { username: "standard_user", password: "secret_sauce" },
61
- );
62
-
63
- const browser = await chromium.launch({
64
- headless: true,
65
- ...(exe ? { executablePath: exe, args: ["--no-sandbox"] } : {}),
66
- });
67
- const context = await browser.newContext({ baseURL: "https://www.saucedemo.com", viewport: { width: 1280, height: 900 } });
68
- const page = await context.newPage();
69
- const engine = new Engine({ headless: true });
70
-
71
- await page.goto("/", { waitUntil: "load" });
72
- await menuSummary(page, graph, library, "1. Login page");
73
- await snap(page, "1-login-menu");
74
-
75
- await runBlock(engine, library.byName.get("submit-login"), context, page, mem);
76
- await page.waitForURL(/inventory\.html/);
77
- const here2 = await menuSummary(page, graph, library, "2. After submit-login → LoggedIn");
78
- if (here2 !== "LoggedIn") throw new Error(`expected LoggedIn got ${here2}`);
79
- await snap(page, "2-logged-in-menu");
80
-
81
- const logout = library.byName.get("submit-logout");
82
- const hasLogout = (await buildExploreMenu(page, graph, library, "LoggedIn")).flat.some((e) => e.block === "submit-logout");
83
- if (!hasLogout) throw new Error("graph menu missing submit-logout on LoggedIn");
84
-
85
- await runBlock(engine, logout, context, page, mem);
86
- await page.waitForSelector("#login-button");
87
- const here3 = await menuSummary(page, graph, library, "3. After submit-logout → LoginPage");
88
- if (here3 !== "LoginPage") throw new Error(`expected LoginPage got ${here3}`);
89
- await snap(page, "3-back-to-login-menu");
90
-
91
- console.log("\nPASS: graph cycle LoginPage → LoggedIn → LoginPage");
92
- await browser.close();
@@ -1,63 +0,0 @@
1
- /**
2
- * Headless runtime proof: wrong password -> LoginPage + error banner.
3
- * Prints PASS/FAIL to stdout only (no screenshots, no visible browser).
4
- */
5
- import { chromium } from "@playwright/test";
6
- import { join, dirname } from "node:path";
7
- import { fileURLToPath, pathToFileURL } from "node:url";
8
- import { createRequire } from "node:module";
9
- import { chromiumExecutablePath } from "waygraph";
10
-
11
- const require = createRequire(import.meta.url);
12
- await import(require.resolve("tsx/esm"));
13
-
14
- const root = join(dirname(fileURLToPath(import.meta.url)), "..");
15
- const waygraphDist = join(root, "../../dist");
16
- const { Engine, start, end, MemPage } = await import(pathToFileURL(join(waygraphDist, "index.js")).href);
17
- const { NavLoginBlock } = await import(pathToFileURL(join(root, "src/blocks/saucedemo-web/nav-login.block.js")).href);
18
- const { FillUsernameBlock } = await import(
19
- pathToFileURL(join(root, "src/blocks/saucedemo-web/methods/fill-username.method.block.js")).href
20
- );
21
- const { FillPasswordBlock } = await import(
22
- pathToFileURL(join(root, "src/blocks/saucedemo-web/methods/fill-password.method.block.js")).href
23
- );
24
- const { SubmitLoginBlock } = await import(
25
- pathToFileURL(join(root, "src/blocks/saucedemo-web/methods/submit-login.method.block.js")).href
26
- );
27
- const { LoginCreds } = await import(pathToFileURL(join(root, "src/states/checkout.mem-keys.js")).href);
28
-
29
- const exe = chromiumExecutablePath();
30
- const baseURL = "https://www.saucedemo.com";
31
-
32
- console.log("RUNTIME: headless browser (wrong password test)...");
33
- console.log("RUNTIME: baseURL =", baseURL);
34
-
35
- const browser = await chromium.launch({
36
- headless: true,
37
- ...(exe ? { executablePath: exe, args: ["--no-sandbox", "--disable-dev-shm-usage"] } : {}),
38
- });
39
- const context = await browser.newContext({ baseURL, viewport: { width: 1280, height: 900 } });
40
- const page = await context.newPage();
41
- const engine = new Engine({ headless: true });
42
- const mem = new MemPage();
43
- mem.set(LoginCreds({ username: "standard_user", password: "wrong-password" }));
44
-
45
- const flow = engine.defineFlow([start, NavLoginBlock, FillUsernameBlock, FillPasswordBlock, SubmitLoginBlock, end]);
46
- const runOut = await flow.run(context, mem, { page, closeOnFinish: false });
47
- const result = runOut && typeof runOut === "object" && "result" in runOut ? runOut.result : runOut;
48
-
49
- const errorVisible = await page.locator('[data-test="error"]').isVisible();
50
- const url = page.url();
51
-
52
- console.log("RUNTIME: checkpoint =", result.__state);
53
- console.log("RUNTIME: url =", url);
54
- console.log("RUNTIME: error banner visible =", errorVisible);
55
-
56
- if (result.__state !== "LoginPage" || !errorVisible) {
57
- console.error("RUNTIME: FAIL");
58
- await browser.close();
59
- process.exit(1);
60
- }
61
-
62
- console.log("RUNTIME: PASS — stayed on LoginPage with error banner.");
63
- await browser.close();
@@ -1,22 +0,0 @@
1
- import { fastForwardComposeBlock } from "waygraph";
2
- import { NavLoginBlock } from "./nav-login.block.js";
3
- import { FillUsernameBlock } from "./methods/fill-username.method.block.js";
4
- import { FillPasswordBlock } from "./methods/fill-password.method.block.js";
5
- import { SubmitLoginForFlow } from "./methods/submit-login-for-flow.js";
6
-
7
- /**
8
- * Kind: FFCompose (fast-forward)
9
- * Helper: fastForwardComposeBlock
10
- * Route: saucedemo-web/ (auth prefix)
11
- *
12
- * Collapses nav-login + fill-username + fill-password + submit-login into
13
- * one opaque demo/run step so checkout demos skip watching auth. Use
14
- * --ff-expand to gate inners again (they show as 4 separate steps).
15
- * loginFlow stays expanded for Sign In episode narration.
16
- */
17
- export const FfOwnerAuthBlock = fastForwardComposeBlock("ff-owner-auth", [
18
- NavLoginBlock,
19
- FillUsernameBlock,
20
- FillPasswordBlock,
21
- SubmitLoginForFlow,
22
- ]);
@@ -1,14 +0,0 @@
1
- import { defineConfig } from "@playwright/test";
2
-
3
- export default defineConfig({
4
- testDir: "./tests",
5
- fullyParallel: false,
6
- workers: 1,
7
- timeout: 30_000,
8
- reporter: [["list"], ["html", { open: "never" }]],
9
- use: {
10
- headless: true,
11
- baseURL: "https://www.saucedemo.com",
12
- trace: "retain-on-failure",
13
- },
14
- });
@@ -1,93 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Drive `waygraph auto --cli` through login -> add-all -> remove-all -> quit.
4
- * Waits for each Choose: prompt so picks are not sent early.
5
- *
6
- * Usage (from examples/saucedemo):
7
- * node scripts/drive-auto-cli.mjs
8
- */
9
- import { spawn } from "node:child_process";
10
- import { createInterface } from "node:readline";
11
- import { fileURLToPath } from "node:url";
12
- import { dirname, join } from "node:path";
13
-
14
- const root = join(dirname(fileURLToPath(import.meta.url)), "..");
15
- const waygraphBin = join(root, "../../bin/waygraph");
16
- const DATA =
17
- process.env.WAYGRAPH_DATA ??
18
- '{"saucedemo.credentials":{"username":"standard_user","password":"secret_sauce"}}';
19
-
20
- function pickByLabel(menuText, label) {
21
- const re = new RegExp(`\\[(\\d+)\\]\\s+${label.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}`);
22
- const m = menuText.match(re);
23
- if (!m) throw new Error(`menu missing "${label}"\n${menuText}`);
24
- return m[1];
25
- }
26
-
27
- async function main() {
28
- const child = spawn(waygraphBin, ["auto", "--cli", "--data", DATA, "."], {
29
- cwd: root,
30
- stdio: ["pipe", "pipe", "pipe"],
31
- env: process.env,
32
- });
33
-
34
- let buf = "";
35
- const dump = (chunk, stream) => {
36
- const s = chunk.toString();
37
- buf += s;
38
- process[stream].write(s);
39
- };
40
- child.stdout.on("data", (c) => dump(c, "stdout"));
41
- child.stderr.on("data", (c) => dump(c, "stderr"));
42
-
43
- const waitChoose = () =>
44
- new Promise((resolve, reject) => {
45
- const start = Date.now();
46
- const tick = () => {
47
- if (buf.includes("Choose:")) {
48
- const i = buf.lastIndexOf("Choose:");
49
- const slice = buf.slice(Math.max(0, i - 4000), i + 8);
50
- resolve(slice);
51
- return;
52
- }
53
- if (Date.now() - start > 120_000) {
54
- reject(new Error(`timeout waiting for Choose:\n${buf.slice(-2000)}`));
55
- return;
56
- }
57
- setTimeout(tick, 100);
58
- };
59
- tick();
60
- });
61
-
62
- const send = (line) => {
63
- console.error(`\n>> pick ${line.trim()}`);
64
- buf = buf.replace(/Choose:/g, "Choose(done):");
65
- child.stdin.write(line);
66
- };
67
-
68
- try {
69
- let menu = await waitChoose();
70
- send("1\n"); // submit-login
71
- menu = await waitChoose();
72
- if (!/LoggedIn|Add all to cart/.test(menu)) {
73
- throw new Error(`expected inventory after login, got:\n${menu}`);
74
- }
75
- send(`${pickByLabel(menu, "Add all to cart")}\n`);
76
- menu = await waitChoose();
77
- send(`${pickByLabel(menu, "Remove all from cart")}\n`);
78
- menu = await waitChoose();
79
- if (!/Add all to cart/.test(menu)) {
80
- throw new Error(`expected Add all again after remove-all, got:\n${menu}`);
81
- }
82
- send("q\n");
83
- const code = await new Promise((res) => child.on("exit", res));
84
- if (code !== 0 && code !== null) process.exitCode = code;
85
- else console.error("\ndrive-auto-cli: PASS login -> add-all -> remove-all -> quit");
86
- } catch (err) {
87
- console.error(err instanceof Error ? err.message : String(err));
88
- child.kill("SIGTERM");
89
- process.exitCode = 1;
90
- }
91
- }
92
-
93
- main();
@@ -1,22 +0,0 @@
1
- import { fastForwardComposeBlock } from "waygraph";
2
- import { NavLoginBlock } from "./nav-login.block.js";
3
- import { FillUsernameBlock } from "./methods/fill-username.method.block.js";
4
- import { FillPasswordBlock } from "./methods/fill-password.method.block.js";
5
- import { SubmitLoginForFlow } from "./methods/submit-login-for-flow.js";
6
-
7
- /**
8
- * Kind: FFCompose (fast-forward)
9
- * Helper: fastForwardComposeBlock
10
- * Route: saucedemo-web/ (auth prefix)
11
- *
12
- * Collapses nav-login + fill-username + fill-password + submit-login into
13
- * one opaque demo/run step so checkout demos skip watching auth. Use
14
- * --ff-expand to gate inners again (they show as 4 separate steps).
15
- * loginFlow stays expanded for Sign In episode narration.
16
- */
17
- export const FfOwnerAuthBlock = fastForwardComposeBlock("ff-owner-auth", [
18
- NavLoginBlock,
19
- FillUsernameBlock,
20
- FillPasswordBlock,
21
- SubmitLoginForFlow,
22
- ]);
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes