waygraph 0.15.54 → 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 (510) 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 +10 -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 +3 -11
  52. package/dist/{highlights → demo/narration}/demo-pace.js +5 -11
  53. package/dist/{highlights → demo/narration}/device.d.ts +2 -2
  54. package/dist/{highlights → demo/narration}/device.js +1 -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/demo/overlay/cursor.d.ts +12 -0
  69. package/dist/demo/overlay/cursor.js +142 -0
  70. package/dist/demo/overlay/device-stage.d.ts +13 -0
  71. package/dist/demo/overlay/device-stage.js +396 -0
  72. package/dist/demo/overlay/inpage/banner.d.ts +1 -0
  73. package/dist/demo/overlay/inpage/banner.js +160 -0
  74. package/dist/demo/overlay/inpage/caption.d.ts +2 -0
  75. package/dist/demo/overlay/inpage/caption.js +24 -0
  76. package/dist/demo/overlay/inpage/core.d.ts +1 -0
  77. package/dist/demo/overlay/inpage/core.js +345 -0
  78. package/dist/demo/overlay/inpage/device-chip.d.ts +1 -0
  79. package/dist/demo/overlay/inpage/device-chip.js +191 -0
  80. package/dist/demo/overlay/inpage/network.d.ts +9 -0
  81. package/dist/demo/overlay/inpage/network.js +200 -0
  82. package/dist/demo/overlay/inpage/panel-chrome.d.ts +1 -0
  83. package/dist/demo/overlay/inpage/panel-chrome.js +203 -0
  84. package/dist/demo/overlay/inpage/stamp.d.ts +1 -0
  85. package/dist/demo/overlay/inpage/stamp.js +46 -0
  86. package/dist/demo/overlay/inpage/swipe-zoom.d.ts +1 -0
  87. package/dist/demo/overlay/inpage/swipe-zoom.js +220 -0
  88. package/dist/demo/overlay/inpage/todos.d.ts +1 -0
  89. package/dist/demo/overlay/inpage/todos.js +294 -0
  90. package/dist/demo/overlay/locator-theater.d.ts +25 -0
  91. package/dist/demo/overlay/locator-theater.js +76 -0
  92. package/dist/demo/overlay/network-capture.d.ts +22 -0
  93. package/dist/demo/overlay/network-capture.js +127 -0
  94. package/dist/demo/overlay/overlay-css.d.ts +3 -0
  95. package/dist/demo/overlay/overlay-css.js +369 -0
  96. package/dist/demo/overlay/overlay-stage.d.ts +23 -0
  97. package/dist/demo/overlay/overlay-stage.js +106 -0
  98. package/dist/demo/overlay/overlay.d.ts +10 -0
  99. package/dist/demo/overlay/overlay.js +89 -0
  100. package/dist/{pilot-overlay/overlay-fixtures.d.ts → demo/overlay/phase-fixtures.d.ts} +2 -2
  101. package/dist/{pilot-overlay/overlay-fixtures.js → demo/overlay/phase-fixtures.js} +2 -2
  102. package/dist/{pilot-overlay/action-ring.js → demo/overlay/pilot/actions.js} +2 -1
  103. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.d.ts +6 -5
  104. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.js +19 -18
  105. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.d.ts +2 -2
  106. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.js +13 -22
  107. package/dist/demo/overlay/reattach.d.ts +7 -0
  108. package/dist/demo/overlay/reattach.js +23 -0
  109. package/dist/demo/overlay/rings.d.ts +33 -0
  110. package/dist/demo/overlay/rings.js +448 -0
  111. package/dist/{ui → demo/overlay/ui}/components/ring.js +2 -2
  112. package/dist/{ui → demo/overlay/ui}/overlay.css +4 -4
  113. package/dist/{ui → demo/overlay/ui}/shadow.d.ts +1 -1
  114. package/dist/{ui → demo/overlay/ui}/shadow.js +39 -2
  115. package/dist/demo/stepper/after.d.ts +3 -0
  116. package/dist/demo/stepper/after.js +113 -0
  117. package/dist/demo/stepper/banner-log.d.ts +37 -0
  118. package/dist/demo/stepper/banner-log.js +63 -0
  119. package/dist/demo/stepper/before.d.ts +4 -0
  120. package/dist/demo/stepper/before.js +110 -0
  121. package/dist/demo/stepper/demo-log.d.ts +31 -0
  122. package/dist/demo/stepper/demo-log.js +309 -0
  123. package/dist/demo/stepper/gate.d.ts +11 -0
  124. package/dist/demo/stepper/gate.js +78 -0
  125. package/dist/demo/stepper/interaction-patch.d.ts +3 -0
  126. package/dist/demo/stepper/interaction-patch.js +323 -0
  127. package/dist/demo/stepper/pacing.d.ts +21 -0
  128. package/dist/demo/stepper/pacing.js +23 -0
  129. package/dist/demo/stepper/slides.d.ts +11 -0
  130. package/dist/demo/stepper/slides.js +233 -0
  131. package/dist/demo/stepper/step-panels.d.ts +21 -0
  132. package/dist/demo/stepper/step-panels.js +589 -0
  133. package/dist/demo/stepper/stepper.d.ts +24 -0
  134. package/dist/demo/stepper/stepper.js +122 -0
  135. package/dist/demo/stepper/teardown.d.ts +48 -0
  136. package/dist/demo/stepper/teardown.js +179 -0
  137. package/dist/demo/stepper/todo-advance.d.ts +14 -0
  138. package/dist/demo/stepper/todo-advance.js +110 -0
  139. package/dist/demo/stepper/view.d.ts +68 -0
  140. package/dist/demo/stepper/view.js +31 -0
  141. package/dist/demo/types.d.ts +17 -0
  142. package/dist/demo/verbose-log.js +15 -0
  143. package/dist/{types.d.ts → engine/block/block.d.ts} +106 -91
  144. package/dist/{core → engine/block}/block.js +10 -53
  145. package/dist/{core → engine/block}/compose.d.ts +9 -7
  146. package/dist/{core → engine/block}/compose.js +1 -1
  147. package/dist/{core/blocks → engine/block/kinds}/api.d.ts +16 -12
  148. package/dist/{core/blocks → engine/block/kinds}/api.js +26 -18
  149. package/dist/{core/blocks → engine/block/kinds}/effect.d.ts +13 -18
  150. package/dist/engine/block/kinds/effect.js +17 -0
  151. package/dist/{core/blocks → engine/block/kinds}/method.d.ts +17 -29
  152. package/dist/{core/blocks → engine/block/kinds}/method.js +6 -21
  153. package/dist/{core/blocks → engine/block/kinds}/nav.d.ts +21 -31
  154. package/dist/{core/blocks → engine/block/kinds}/nav.js +6 -12
  155. package/dist/{core/blocks → engine/block/kinds}/page.d.ts +14 -20
  156. package/dist/{core/blocks → engine/block/kinds}/page.js +5 -7
  157. package/dist/engine/checkpoint/checkpoint.d.ts +22 -0
  158. package/dist/engine/checkpoint/checkpoint.js +8 -0
  159. package/dist/engine/checkpoint/route.d.ts +28 -0
  160. package/dist/engine/checkpoint/route.js +28 -0
  161. package/dist/{core → engine}/config.d.ts +7 -2
  162. package/dist/engine/config.js +6 -0
  163. package/dist/engine/engine.d.ts +45 -0
  164. package/dist/{core → engine}/engine.js +6 -10
  165. package/dist/engine/env.d.ts +59 -0
  166. package/dist/engine/env.js +83 -0
  167. package/dist/{errors.d.ts → engine/errors.d.ts} +22 -22
  168. package/dist/{errors.js → engine/errors.js} +22 -22
  169. package/dist/{core → engine/flow}/branch-regression.d.ts +7 -7
  170. package/dist/{core → engine/flow}/branch-regression.js +4 -3
  171. package/dist/engine/flow/flow.d.ts +162 -0
  172. package/dist/engine/flow/flow.js +244 -0
  173. package/dist/{core → engine/flow}/map-builder.d.ts +34 -39
  174. package/dist/{core → engine/flow}/map-builder.js +45 -47
  175. package/dist/{core → engine}/locate.d.ts +1 -1
  176. package/dist/{core → engine}/locate.js +1 -2
  177. package/dist/{mem-stub.d.ts → engine/mem/mem-stub.d.ts} +9 -8
  178. package/dist/{mem-stub.js → engine/mem/mem-stub.js} +2 -2
  179. package/dist/{mem-page.d.ts → engine/mem/mem.d.ts} +1 -1
  180. package/dist/{mem-page.js → engine/mem/mem.js} +2 -1
  181. package/dist/engine/page-gone.d.ts +5 -0
  182. package/dist/engine/page-gone.js +20 -0
  183. package/dist/engine/run/connect.d.ts +28 -0
  184. package/dist/{types.js → engine/run/connect.js} +11 -10
  185. package/dist/engine/run/events.d.ts +67 -0
  186. package/dist/engine/run/events.js +90 -0
  187. package/dist/engine/run/hooks.d.ts +16 -0
  188. package/dist/engine/run/hooks.js +8 -0
  189. package/dist/engine/run/launch.d.ts +13 -0
  190. package/dist/engine/run/launch.js +27 -0
  191. package/dist/{core/run-graph.d.ts → engine/run/run.d.ts} +8 -12
  192. package/dist/{core/run-graph.js → engine/run/run.js} +22 -12
  193. package/dist/engine/stub/pace.d.ts +12 -0
  194. package/dist/engine/stub/pace.js +2 -0
  195. package/dist/engine/stub/ring.d.ts +130 -0
  196. package/dist/engine/stub/ring.js +41 -0
  197. package/dist/engine/stub/stub.d.ts +268 -0
  198. package/dist/engine/stub/stub.js +1 -0
  199. package/dist/engine/stub/todos.d.ts +104 -0
  200. package/dist/engine/stub/todos.js +2 -0
  201. package/dist/engine/stub/viewport.d.ts +26 -0
  202. package/dist/engine/stub/viewport.js +2 -0
  203. package/dist/{trait.d.ts → engine/trait/trait.d.ts} +1 -1
  204. package/dist/index.d.ts +84 -36
  205. package/dist/index.js +44 -19
  206. package/dist/{session/auto-explore-run.d.ts → live/auto/auto.d.ts} +10 -16
  207. package/dist/{session/auto-explore-run.js → live/auto/auto.js} +164 -254
  208. package/dist/{session/auto-explore.d.ts → live/auto/explore.d.ts} +4 -14
  209. package/dist/{session/auto-explore.js → live/auto/explore.js} +21 -127
  210. package/dist/{auto-session/session.d.ts → live/auto-session/auto-session.d.ts} +1 -1
  211. package/dist/{auto-session/session.js → live/auto-session/auto-session.js} +27 -24
  212. package/dist/{auto-session → live/auto-session}/helpers.d.ts +6 -5
  213. package/dist/{auto-session → live/auto-session}/helpers.js +1 -1
  214. package/dist/{session/auto-session-ipc.d.ts → live/auto-session/ipc.d.ts} +7 -5
  215. package/dist/{session/auto-session-ipc.js → live/auto-session/ipc.js} +31 -16
  216. package/dist/{session/browser.d.ts → live/auto-session/start.d.ts} +1 -2
  217. package/dist/{session/browser.js → live/auto-session/start.js} +2 -3
  218. package/dist/{pilot-overlay → live/pilot}/panel.d.ts +1 -1
  219. package/dist/{pilot-overlay → live/pilot}/panel.js +23 -31
  220. package/dist/{session → live/pilot}/pilot.d.ts +3 -3
  221. package/dist/{session → live/pilot}/pilot.js +4 -4
  222. package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +1 -1
  223. package/dist/{traverse/run.js → live/traverse/traverse.js} +26 -43
  224. package/dist/manifest/manifest.d.ts +52 -0
  225. package/dist/manifest/manifest.js +93 -0
  226. package/dist/manifest/map-imports.d.ts +7 -0
  227. package/dist/manifest/map-imports.js +22 -0
  228. package/dist/manifest/maps.d.ts +33 -0
  229. package/dist/manifest/maps.js +62 -0
  230. package/dist/manifest/pack.d.ts +21 -0
  231. package/dist/manifest/pack.js +109 -0
  232. package/dist/manifest/project.d.ts +60 -0
  233. package/dist/manifest/project.js +101 -0
  234. package/dist/{session/block-inject.js → manifest/roots.js} +1 -18
  235. package/dist/manifest/scan.d.ts +19 -0
  236. package/dist/manifest/scan.js +57 -0
  237. package/dist/manifest/source.d.ts +23 -0
  238. package/dist/manifest/source.js +86 -0
  239. package/dist/runner/mode.d.ts +71 -0
  240. package/dist/runner/mode.js +1 -0
  241. package/dist/runner/modes/branches.d.ts +5 -0
  242. package/dist/runner/modes/branches.js +37 -0
  243. package/dist/runner/modes/demo.d.ts +3 -0
  244. package/dist/runner/modes/demo.js +13 -0
  245. package/dist/runner/modes/report.d.ts +2 -0
  246. package/dist/runner/modes/report.js +54 -0
  247. package/dist/runner/modes/run.d.ts +2 -0
  248. package/dist/runner/modes/run.js +3 -0
  249. package/dist/runner/options.d.ts +31 -0
  250. package/dist/runner/options.js +42 -0
  251. package/dist/runner/plan/find.d.ts +18 -0
  252. package/dist/runner/plan/find.js +65 -0
  253. package/dist/runner/plan/plan.d.ts +11 -0
  254. package/dist/runner/plan/plan.js +97 -0
  255. package/dist/runner/plan/seed-mem.d.ts +12 -0
  256. package/dist/runner/plan/seed-mem.js +98 -0
  257. package/dist/runner/plan/spec.d.ts +5 -0
  258. package/dist/runner/plan/spec.js +17 -0
  259. package/dist/runner/play-steps.d.ts +2 -0
  260. package/dist/runner/play-steps.js +59 -0
  261. package/dist/runner/runner.d.ts +4 -0
  262. package/dist/runner/runner.js +64 -0
  263. package/dist/runner/session.d.ts +9 -0
  264. package/dist/runner/session.js +87 -0
  265. package/dist/{browser.js → runtime/browser.js} +4 -2
  266. package/dist/{env-file.js → runtime/env-file.js} +7 -12
  267. package/dist/{extensions.d.ts → runtime/extensions.d.ts} +1 -5
  268. package/dist/{extensions.js → runtime/extensions.js} +2 -1
  269. package/dist/runtime/full-launch.d.ts +1 -0
  270. package/dist/runtime/full-launch.js +34 -0
  271. package/dist/runtime/global-flag.d.ts +5 -0
  272. package/dist/runtime/global-flag.js +18 -0
  273. package/dist/{playwright-config.d.ts → runtime/playwright-config.d.ts} +1 -1
  274. package/dist/{playwright.config.js → runtime/playwright.config.js} +3 -2
  275. package/dist/runtime/run-log.d.ts +2 -0
  276. package/dist/runtime/run-log.js +17 -0
  277. package/dist/{video-dir.js → runtime/video-dir.js} +3 -2
  278. package/dist/{config.d.ts → runtime/waygraph-config.d.ts} +6 -9
  279. package/dist/{config.js → runtime/waygraph-config.js} +21 -51
  280. package/dist/{webserver.js → runtime/webserver.js} +5 -30
  281. package/examples/routed-demo/config/waygraph.config.ts +20 -0
  282. package/examples/routed-demo/package.json +1 -4
  283. package/examples/routed-demo/scripts/fixture-server.mjs +1 -1
  284. package/examples/routed-demo/src/flows/routed-demo-map.flow.ts +2 -4
  285. package/examples/routed-demo/src/flows/routed-demo.flow.ts +1 -2
  286. package/examples/routed-demo/src/map/(app_base)/dashboard/_methods/click-widget.block.ts +5 -4
  287. package/examples/routed-demo/src/map/(app_base)/dashboard/_nav.block.ts +3 -3
  288. package/examples/routed-demo/src/map/(app_base)/dashboard/_page.block.ts +3 -3
  289. package/examples/routed-demo/src/map/(external)/docs/_nav.block.ts +3 -3
  290. package/examples/routed-demo/src/map/(external)/docs/_page.block.ts +3 -3
  291. package/examples/routed-demo/src/states/routed-demo.states.ts +5 -3
  292. package/examples/routed-demo/tests/routed-demo.spec.ts +4 -4
  293. package/examples/routed-demo/tsconfig.json +1 -1
  294. package/examples/saucedemo/docs/CONVENTION.md +4 -5
  295. package/examples/saucedemo/docs/HELPERS.md +11 -11
  296. package/examples/saucedemo/src/blocks/SITE-MAP.md +0 -1
  297. package/examples/saucedemo/src/blocks/saucedemo-web/NAV.md +1 -5
  298. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
  299. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  300. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  301. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  302. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  303. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  304. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
  305. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
  306. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  307. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
  308. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  309. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  310. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  311. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  312. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  313. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  314. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
  315. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
  316. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
  317. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  318. package/examples/saucedemo/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  319. package/examples/saucedemo/src/flows/api-demo.flow.ts +12 -10
  320. package/examples/saucedemo/src/states/checkout.states.ts +21 -11
  321. package/examples/saucedemo/src/stubs/device-showcase.ts +8 -10
  322. package/examples/saucedemo/tests/auto-graph.spec.ts +4 -12
  323. package/package.json +10 -6
  324. package/templates/agents/waygraph-planner.agent.md +2 -2
  325. package/templates/quickstart/docs/CONVENTION.md +4 -4
  326. package/templates/quickstart/docs/HELPERS.md +10 -8
  327. package/templates/quickstart/package.json +0 -3
  328. package/templates/quickstart/src/blocks/SITE-MAP.md +0 -1
  329. package/templates/quickstart/src/blocks/saucedemo-web/NAV.md +1 -5
  330. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
  331. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  332. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  333. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  334. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  335. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  336. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
  337. package/templates/quickstart/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
  338. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  339. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
  340. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  341. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  342. package/templates/quickstart/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  343. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  344. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  345. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  346. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
  347. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
  348. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
  349. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  350. package/templates/quickstart/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  351. package/templates/quickstart/src/flows/api-demo.flow.ts +12 -10
  352. package/templates/quickstart/src/states/checkout.states.ts +21 -11
  353. package/templates/quickstart/src/stubs/device-showcase.ts +8 -10
  354. package/templates/scaffold/README.md +2 -1
  355. package/templates/scaffold/STRUCTURE.md +5 -4
  356. package/templates/scaffold/config/waygraph.config.ts +1 -0
  357. package/templates/scaffold/gitignore +1 -0
  358. package/templates/scaffold/src/flows/README.md +2 -2
  359. package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +3 -3
  360. package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +3 -3
  361. package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -4
  362. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +3 -3
  363. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +3 -3
  364. package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +5 -4
  365. package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +4 -4
  366. package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -3
  367. package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +3 -3
  368. package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +4 -4
  369. package/templates/scaffold/src/map/(external)/hoppscotch/_keys.ts +21 -0
  370. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +4 -4
  371. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +4 -4
  372. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +4 -4
  373. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +5 -4
  374. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +6 -5
  375. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +6 -5
  376. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +5 -4
  377. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +6 -5
  378. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +6 -5
  379. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +6 -5
  380. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +6 -5
  381. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +6 -5
  382. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +6 -5
  383. package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +3 -3
  384. package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +3 -3
  385. package/templates/scaffold/src/map/(external)/hoppscotch/_states.ts +6 -0
  386. package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +3 -3
  387. package/templates/scaffold/src/map/(external)/mailpit/_keys.ts +13 -0
  388. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +4 -4
  389. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +4 -4
  390. package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +6 -5
  391. package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +6 -5
  392. package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +3 -3
  393. package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +3 -3
  394. package/templates/scaffold/src/map/(external)/mailpit/_states.ts +9 -0
  395. package/templates/scaffold/src/map/README.md +7 -0
  396. package/templates/scaffold/src/states/README.md +4 -1
  397. package/templates/scaffold/src/states/demo.mem-keys.ts +1 -29
  398. package/templates/scaffold/src/states/demo.states.ts +14 -20
  399. package/templates/scaffold/tests/hoppscotch.spec.ts +1 -11
  400. package/templates/scaffold/tests/mail-verify.spec.ts +2 -2
  401. package/templates/skills/waygraph-blind-pilot.skill.md +2 -6
  402. package/templates/skills/waygraph-convention.skill.md +23 -14
  403. package/templates/skills/waygraph-pilot.skill.md +7 -4
  404. package/dist/auto-session/verbose-log.js +0 -16
  405. package/dist/auto-session.d.ts +0 -2
  406. package/dist/auto-session.js +0 -3
  407. package/dist/cli/discover.d.ts +0 -40
  408. package/dist/cli/discover.js +0 -148
  409. package/dist/commands/agent-dive.js +0 -52
  410. package/dist/commands/check.js +0 -192
  411. package/dist/commands/map.js +0 -29
  412. package/dist/commands/run.js +0 -104
  413. package/dist/commands/traverse.js +0 -177
  414. package/dist/core/block.d.ts +0 -109
  415. package/dist/core/blocks/effect.js +0 -23
  416. package/dist/core/config.js +0 -17
  417. package/dist/core/engine.d.ts +0 -198
  418. package/dist/core/flow.d.ts +0 -294
  419. package/dist/core/flow.js +0 -432
  420. package/dist/core.d.ts +0 -14
  421. package/dist/core.js +0 -15
  422. package/dist/highlights/merge.d.ts +0 -8
  423. package/dist/highlights/merge.js +0 -173
  424. package/dist/highlights/stub-ctx.d.ts +0 -10
  425. package/dist/highlights/stub-ctx.js +0 -331
  426. package/dist/highlights/types.d.ts +0 -613
  427. package/dist/highlights.d.ts +0 -9
  428. package/dist/highlights.js +0 -10
  429. package/dist/pilot-overlay.d.ts +0 -5
  430. package/dist/pilot-overlay.js +0 -6
  431. package/dist/runner/banner-log.js +0 -63
  432. package/dist/runner/chain-run.js +0 -102
  433. package/dist/runner/cursor.js +0 -140
  434. package/dist/runner/demo-log.js +0 -316
  435. package/dist/runner/device-stage.d.ts +0 -9
  436. package/dist/runner/device-stage.js +0 -420
  437. package/dist/runner/discovery.js +0 -105
  438. package/dist/runner/index.js +0 -2
  439. package/dist/runner/inpage/banner.d.ts +0 -21
  440. package/dist/runner/inpage/banner.js +0 -156
  441. package/dist/runner/inpage/caption.d.ts +0 -3
  442. package/dist/runner/inpage/caption.js +0 -23
  443. package/dist/runner/inpage/core.d.ts +0 -4
  444. package/dist/runner/inpage/core.js +0 -316
  445. package/dist/runner/inpage/device.d.ts +0 -3
  446. package/dist/runner/inpage/device.js +0 -211
  447. package/dist/runner/inpage/network.d.ts +0 -15
  448. package/dist/runner/inpage/network.js +0 -217
  449. package/dist/runner/inpage/panel-chrome.js +0 -192
  450. package/dist/runner/inpage/stamp.js +0 -46
  451. package/dist/runner/inpage/swipe-zoom.js +0 -220
  452. package/dist/runner/inpage/todos.js +0 -337
  453. package/dist/runner/interaction-patch.js +0 -384
  454. package/dist/runner/main.js +0 -469
  455. package/dist/runner/network-capture.d.ts +0 -9
  456. package/dist/runner/network-capture.js +0 -126
  457. package/dist/runner/overlay-css.d.ts +0 -3
  458. package/dist/runner/overlay-css.js +0 -377
  459. package/dist/runner/overlay-install.js +0 -90
  460. package/dist/runner/overlay-stage.js +0 -110
  461. package/dist/runner/rings.js +0 -514
  462. package/dist/runner/seed-mem.js +0 -110
  463. package/dist/runner/slides.js +0 -278
  464. package/dist/runner/step-mode.js +0 -703
  465. package/dist/runner/step-panels.js +0 -729
  466. package/dist/runner/teardown.js +0 -202
  467. package/dist/runner/todo-dock.js +0 -142
  468. package/dist/session/step-overlay.d.ts +0 -37
  469. package/dist/session/step-overlay.js +0 -244
  470. package/examples/routed-demo/playwright.config.ts +0 -21
  471. package/examples/saucedemo/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  472. package/templates/quickstart/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  473. /package/dist/{commands → cli/commands}/agent-dive-scaffold.d.ts +0 -0
  474. /package/dist/{commands → cli/commands}/agent-dive.d.ts +0 -0
  475. /package/dist/{commands → cli/commands}/extensions.d.ts +0 -0
  476. /package/dist/{commands → cli/commands}/init.d.ts +0 -0
  477. /package/dist/{commands → cli/commands}/list.d.ts +0 -0
  478. /package/dist/{commands → cli/commands}/map.d.ts +0 -0
  479. /package/dist/{commands → cli/commands}/session.d.ts +0 -0
  480. /package/dist/{commands → cli/commands}/test.d.ts +0 -0
  481. /package/dist/{commands → cli/commands}/traverse.d.ts +0 -0
  482. /package/dist/{commands → cli/commands}/try.d.ts +0 -0
  483. /package/dist/{commands → cli/commands}/upgrade.d.ts +0 -0
  484. /package/dist/{highlights → demo/narration}/shorthand.js +0 -0
  485. /package/dist/{session/overlay-beacon.d.ts → demo/overlay/beacon.d.ts} +0 -0
  486. /package/dist/{session/overlay-beacon.js → demo/overlay/beacon.js} +0 -0
  487. /package/dist/{pilot-overlay/action-ring.d.ts → demo/overlay/pilot/actions.d.ts} +0 -0
  488. /package/dist/{ui → demo/overlay/ui}/components/ring.d.ts +0 -0
  489. /package/dist/{ui → demo/overlay/ui}/stylesheet.d.ts +0 -0
  490. /package/dist/{ui → demo/overlay/ui}/stylesheet.js +0 -0
  491. /package/dist/{ui → demo/overlay/ui}/tokens.d.ts +0 -0
  492. /package/dist/{ui → demo/overlay/ui}/tokens.js +0 -0
  493. /package/dist/{highlights → demo}/types.js +0 -0
  494. /package/dist/{auto-session → demo}/verbose-log.d.ts +0 -0
  495. /package/dist/{selector.d.ts → engine/trait/selector.d.ts} +0 -0
  496. /package/dist/{selector.js → engine/trait/selector.js} +0 -0
  497. /package/dist/{trait.js → engine/trait/trait.js} +0 -0
  498. /package/dist/{traverse → live/traverse}/coverage.d.ts +0 -0
  499. /package/dist/{traverse → live/traverse}/coverage.js +0 -0
  500. /package/dist/{traverse → live/traverse}/lease.d.ts +0 -0
  501. /package/dist/{traverse → live/traverse}/lease.js +0 -0
  502. /package/dist/{session/block-inject.d.ts → manifest/roots.d.ts} +0 -0
  503. /package/dist/{blocks-select.d.ts → manifest/select.d.ts} +0 -0
  504. /package/dist/{blocks-select.js → manifest/select.js} +0 -0
  505. /package/dist/{browser.d.ts → runtime/browser.d.ts} +0 -0
  506. /package/dist/{env-file.d.ts → runtime/env-file.d.ts} +0 -0
  507. /package/dist/{playwright-config.js → runtime/playwright-config.js} +0 -0
  508. /package/dist/{playwright.config.d.ts → runtime/playwright.config.d.ts} +0 -0
  509. /package/dist/{video-dir.d.ts → runtime/video-dir.d.ts} +0 -0
  510. /package/dist/{webserver.d.ts → runtime/webserver.d.ts} +0 -0
@@ -1,14 +1,8 @@
1
- import {
2
- defineEffectBlock,
3
- checkpoint,
4
- type Checkpoint,
5
- type WaygraphInstanceOption,
6
- } from "waygraph";
7
- import type { ItemInCart } from "../../../../states/checkout.states.js";
1
+ import { defineEffectBlock, type WaygraphInstanceOption } from "waygraph";
2
+ import { ItemInCart } from "../../../../states/checkout.states.js";
8
3
  import { SelectedItem } from "../../../../states/checkout.mem-keys.js";
9
4
  import { collectAddableItems, InventorySel } from "./inventory-items.js";
10
5
 
11
-
12
6
  /**
13
7
  * Kind: Effect
14
8
  * Helper: defineEffectBlock
@@ -17,40 +11,38 @@ import { collectAddableItems, InventorySel } from "./inventory-items.js";
17
11
  * Mutates cart for the mem-picked product. waygraph auto lists one
18
12
  * "Add ..." row per live Add button via instanceOptions.
19
13
  */
20
- export const AddToCartBlock = defineEffectBlock<Checkpoint<string>, ItemInCart>(
21
- {
22
- name: "add-to-cart",
23
- description:
24
- "Adds the item named by mem (saucedemo.selectedItem) to the cart.",
25
- requires: [SelectedItem.key],
26
- instruction: {
27
- async act(page, _input, mem) {
28
- const { id } = mem.get(SelectedItem.key);
29
- await page.locator(InventorySel.addBtn(id)).click();
30
- },
31
- resolve: () => checkpoint("ItemInCart"),
32
- verify: [
33
- {
34
- name: "item-added-to-cart",
35
- async check(page, mem) {
36
- const { id } = mem.get(SelectedItem.key);
37
- return await page
38
- .locator(InventorySel.removeBtn(id))
39
- .first()
40
- .isVisible();
41
- },
42
- },
43
- ],
44
- },
45
- async instanceOptions(page): Promise<readonly WaygraphInstanceOption[]> {
46
- const items = await collectAddableItems(page);
47
- return items.map((item) => ({
48
- id: item.id,
49
- label: `Add "${item.name}" to cart`,
50
- key: SelectedItem.key,
51
- value: item,
52
- highlight: InventorySel.addBtn(item.id),
53
- }));
14
+ export const AddToCartBlock = defineEffectBlock({
15
+ name: "add-to-cart",
16
+ description:
17
+ "Adds the item named by mem (saucedemo.selectedItem) to the cart.",
18
+ to: ItemInCart,
19
+ requires: [SelectedItem.key],
20
+ instruction: {
21
+ async act(page, _input, mem) {
22
+ const { id } = mem.get(SelectedItem.key);
23
+ await page.locator(InventorySel.addBtn(id)).click();
54
24
  },
25
+ verify: [
26
+ {
27
+ name: "item-added-to-cart",
28
+ async check(page, mem) {
29
+ const { id } = mem.get(SelectedItem.key);
30
+ return await page
31
+ .locator(InventorySel.removeBtn(id))
32
+ .first()
33
+ .isVisible();
34
+ },
35
+ },
36
+ ],
37
+ },
38
+ async instanceOptions(page): Promise<readonly WaygraphInstanceOption[]> {
39
+ const items = await collectAddableItems(page);
40
+ return items.map((item) => ({
41
+ id: item.id,
42
+ label: `Add "${item.name}" to cart`,
43
+ key: SelectedItem.key,
44
+ value: item,
45
+ highlight: InventorySel.addBtn(item.id),
46
+ }));
55
47
  },
56
- );
48
+ });
@@ -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 { collectRemovableItems, InventorySel } from "./inventory-items.js";
4
4
 
5
5
  type BulkObserve = "still-has-items" | "cart-empty";
@@ -14,12 +14,10 @@ type BulkObserve = "still-has-items" | "cart-empty";
14
14
  * single-item remove. Out: LoggedIn when cart empty; ItemInCart if anything
15
15
  * remains (partial failure / race).
16
16
  */
17
- export const RemoveAllFromCartBlock = defineMethodBlock<
18
- Checkpoint<string>,
19
- RemoveFromCartOutcome
20
- >({
17
+ export const RemoveAllFromCartBlock = defineMethodBlock({
21
18
  name: "remove-all-from-cart",
22
19
  description: "Removes every product still showing Remove on this page.",
20
+ to: RemoveFromCartOutcome,
23
21
  instruction: {
24
22
  async act(page) {
25
23
  const items = await collectRemovableItems(page);
@@ -1,5 +1,5 @@
1
- import { defineEffectBlock, checkpoint, type Checkpoint, type WaygraphInstanceOption } from "waygraph";
2
- import type { RemoveFromCartOutcome } from "../../../../states/checkout.states.js";
1
+ import { defineEffectBlock, checkpoint, type WaygraphInstanceOption } from "waygraph";
2
+ import { RemoveFromCartOutcome } from "../../../../states/checkout.states.js";
3
3
  import { SelectedItem } from "../../../../states/checkout.mem-keys.js";
4
4
  import { collectRemovableItems, InventorySel } from "./inventory-items.js";
5
5
 
@@ -13,9 +13,10 @@ type RemoveObserve = "still-has-items" | "cart-empty";
13
13
  * Removes the mem-picked product. After Add, waygraph auto shows matching
14
14
  * "Remove ..." rows from live Remove buttons.
15
15
  */
16
- export const RemoveFromCartBlock = defineEffectBlock<Checkpoint<string>, RemoveFromCartOutcome>({
16
+ export const RemoveFromCartBlock = defineEffectBlock({
17
17
  name: "remove-from-cart",
18
18
  description: "Removes the item named by mem (saucedemo.selectedItem) from the cart.",
19
+ to: RemoveFromCartOutcome,
19
20
  requires: [SelectedItem.key],
20
21
  instruction: {
21
22
  async act(page, _input, mem) {
@@ -1,5 +1,5 @@
1
1
  import { defineMemNavBlock, Trait, type WaygraphInstanceOption } from "waygraph";
2
- import type { ItemDetailPage } from "../../../states/checkout.states.js";
2
+ import { ItemDetailPage } from "../../../states/checkout.states.js";
3
3
  import { SelectedItem } from "../../../states/checkout.mem-keys.js";
4
4
  import {
5
5
  collectInventoryItems,
@@ -14,10 +14,10 @@ import {
14
14
  * Opens the mem-picked product detail page. waygraph auto lists one
15
15
  * "Open ... details" row per inventory card via instanceOptions.
16
16
  */
17
- export const NavItemDetailBlock = defineMemNavBlock<ItemDetailPage>({
17
+ export const NavItemDetailBlock = defineMemNavBlock({
18
18
  name: "nav-item-detail",
19
19
  description: "Opens the product named by mem (saucedemo.selectedItem) on its detail page.",
20
- checkpoint: "ItemDetailPage",
20
+ checkpoint: ItemDetailPage,
21
21
  requires: [SelectedItem.key],
22
22
  click: (mem) => InventorySel.title(mem.get(SelectedItem.key).id),
23
23
  verify: [Trait.url({ pathname: "/inventory-item.html" })],
@@ -1,5 +1,5 @@
1
1
  import { defineNavClickBlock, Trait } from "waygraph";
2
- import type { LoggedIn } from "../../../states/checkout.states.js";
2
+ import { LoggedIn } from "../../../states/checkout.states.js";
3
3
  import { ItemDetailSel } from "./item-detail.sel.js";
4
4
 
5
5
  /**
@@ -10,10 +10,10 @@ import { ItemDetailSel } from "./item-detail.sel.js";
10
10
  * click, not url - detail page "Back to products". Separate Block from
11
11
  * nav-back-to-products (different From Checkpoint; atomic convention).
12
12
  */
13
- export const NavBackToInventoryBlock = defineNavClickBlock<LoggedIn>({
13
+ export const NavBackToInventoryBlock = defineNavClickBlock({
14
14
  name: "nav-back-to-inventory",
15
15
  description: "Clicks 'Back to products' on the item detail page.",
16
- checkpoint: "LoggedIn",
16
+ checkpoint: LoggedIn,
17
17
  click: ItemDetailSel.backToProductsBtn,
18
18
  verify: [Trait.url({ pathname: "/inventory.html" })],
19
19
  });
@@ -1,5 +1,5 @@
1
1
  import { defineNavClickBlock, Trait } from "waygraph";
2
- import type { LoggedIn } from "../../../states/checkout.states.js";
2
+ import { LoggedIn } from "../../../states/checkout.states.js";
3
3
  import { ItemDetailSel } from "./item-detail.sel.js";
4
4
 
5
5
  /**
@@ -10,10 +10,10 @@ import { ItemDetailSel } from "./item-detail.sel.js";
10
10
  * click, not url - order-complete "Back Home" proves the button path
11
11
  * (a url NavBlock would teleport without exercising the control).
12
12
  */
13
- export const NavBackToProductsBlock = defineNavClickBlock<LoggedIn>({
13
+ export const NavBackToProductsBlock = defineNavClickBlock({
14
14
  name: "nav-back-to-products",
15
15
  description: "Clicks 'Back Home' on the order confirmation page.",
16
- checkpoint: "LoggedIn",
16
+ checkpoint: LoggedIn,
17
17
  click: ItemDetailSel.backToProductsBtn,
18
18
  verify: [Trait.url({ pathname: "/inventory.html" })],
19
19
  });
@@ -1,5 +1,5 @@
1
1
  import { defineNavClickBlock, Trait } from "waygraph";
2
- import type { LoggedIn } from "../../../states/checkout.states.js";
2
+ import { LoggedIn } from "../../../states/checkout.states.js";
3
3
  import { ItemDetailSel } from "./item-detail.sel.js";
4
4
 
5
5
  /**
@@ -9,10 +9,10 @@ import { ItemDetailSel } from "./item-detail.sel.js";
9
9
  *
10
10
  * click, not url - cart page "Continue Shopping" proves the app's own path.
11
11
  */
12
- export const NavContinueShoppingBlock = defineNavClickBlock<LoggedIn>({
12
+ export const NavContinueShoppingBlock = defineNavClickBlock({
13
13
  name: "nav-continue-shopping",
14
14
  description: "Clicks 'Continue Shopping' on the cart page.",
15
- checkpoint: "LoggedIn",
15
+ checkpoint: LoggedIn,
16
16
  click: ItemDetailSel.continueShoppingBtn,
17
17
  verify: [Trait.url({ pathname: "/inventory.html" })],
18
18
  });
@@ -1,5 +1,5 @@
1
- import { defineMethodBlock, checkpoint } from "waygraph";
2
- import type { LoginPage } from "../../../states/checkout.states.js";
1
+ import { defineMethodBlock } from "waygraph";
2
+ import { LoginPage } from "../../../states/checkout.states.js";
3
3
  import { LoginCreds } from "../../../states/checkout.mem-keys.js";
4
4
  import { LoginSel } from "./login.sel.js";
5
5
 
@@ -11,15 +11,16 @@ import { LoginSel } from "./login.sel.js";
11
11
  * Fills the password field only - self-loop on LoginPage. See
12
12
  * fill-username.method.block.ts for why this is split from submit.
13
13
  */
14
- export const FillPasswordBlock = defineMethodBlock<LoginPage, LoginPage>({
14
+ export const FillPasswordBlock = defineMethodBlock({
15
15
  name: "fill-password",
16
16
  description: "Fills the password field on the login form.",
17
+ from: LoginPage,
18
+ to: LoginPage,
17
19
  requires: [LoginCreds.key],
18
20
  instruction: {
19
21
  async act(page, _input, mem) {
20
22
  const { password } = mem.get(LoginCreds.key);
21
23
  await page.locator(LoginSel.password).fill(password);
22
24
  },
23
- resolve: () => checkpoint("LoginPage"),
24
25
  },
25
26
  });
@@ -1,5 +1,5 @@
1
- import { defineMethodBlock, checkpoint } from "waygraph";
2
- import type { LoginPage } from "../../../states/checkout.states.js";
1
+ import { defineMethodBlock } from "waygraph";
2
+ import { LoginPage } from "../../../states/checkout.states.js";
3
3
  import { LoginCreds } from "../../../states/checkout.mem-keys.js";
4
4
  import { LoginSel } from "./login.sel.js";
5
5
 
@@ -13,15 +13,16 @@ import { LoginSel } from "./login.sel.js";
13
13
  * graph/demo show fill vs submit as real, distinct steps instead of one
14
14
  * Block doing "input username and password and login at the same time".
15
15
  */
16
- export const FillUsernameBlock = defineMethodBlock<LoginPage, LoginPage>({
16
+ export const FillUsernameBlock = defineMethodBlock({
17
17
  name: "fill-username",
18
18
  description: "Fills the username field on the login form.",
19
+ from: LoginPage,
20
+ to: LoginPage,
19
21
  requires: [LoginCreds.key],
20
22
  instruction: {
21
23
  async act(page, _input, mem) {
22
24
  const { username } = mem.get(LoginCreds.key);
23
25
  await page.locator(LoginSel.username).fill(username);
24
26
  },
25
- resolve: () => checkpoint("LoginPage"),
26
27
  },
27
28
  });
@@ -1,5 +1,5 @@
1
1
  import { defineMethodBlock, checkpoint, Trait } from "waygraph";
2
- import type {
2
+ import {
3
3
  LoginPage,
4
4
  LoginSubmitOutcome,
5
5
  } from "../../../states/checkout.states.js";
@@ -17,12 +17,11 @@ type LoginObserve = "success" | "failure";
17
17
  * already did that). One Block, one action: submit.
18
18
  * Branches: good creds -> LoggedIn; bad/locked -> LoginPage with error banner.
19
19
  */
20
- export const SubmitLoginBlock = defineMethodBlock<
21
- LoginPage,
22
- LoginSubmitOutcome
23
- >({
20
+ export const SubmitLoginBlock = defineMethodBlock({
24
21
  name: "submit-login",
25
22
  description: "Submits the login form; stays on LoginPage when auth fails.",
23
+ from: LoginPage,
24
+ to: LoginSubmitOutcome,
26
25
  instruction: {
27
26
  async act(page) {
28
27
  // noWaitAfter: observe owns the inventory URL wait. Default click
@@ -1,5 +1,5 @@
1
- import { defineMethodBlock, checkpoint, Trait } from "waygraph";
2
- import type { LoggedIn, LoginPage } from "../../../states/checkout.states.js";
1
+ import { defineMethodBlock, Trait } from "waygraph";
2
+ import { LoggedIn, LoginPage } from "../../../states/checkout.states.js";
3
3
  import { LoginSel } from "./login.sel.js";
4
4
 
5
5
  /**
@@ -9,15 +9,16 @@ import { LoginSel } from "./login.sel.js";
9
9
  *
10
10
  * Burger menu Logout - real cycle back to LoginPage (same Checkpoint nav-login lands on).
11
11
  */
12
- export const SubmitLogoutBlock = defineMethodBlock<LoggedIn, LoginPage>({
12
+ export const SubmitLogoutBlock = defineMethodBlock({
13
13
  name: "submit-logout",
14
14
  description: "Opens the burger menu and logs out.",
15
+ from: LoggedIn,
16
+ to: LoginPage,
15
17
  instruction: {
16
18
  async act(page) {
17
19
  await page.locator(LoginSel.burgerMenuButton).click();
18
20
  await page.locator(LoginSel.logoutLink).click();
19
21
  },
20
- resolve: () => checkpoint("LoginPage"),
21
22
  verify: [Trait.visible(LoginSel.loginButton)],
22
23
  },
23
24
  });
@@ -1,5 +1,5 @@
1
1
  import { definePageBlock, Trait } from "waygraph";
2
- import type { LoginPage } from "../../states/checkout.states.js";
2
+ import { LoginPage } from "../../states/checkout.states.js";
3
3
  import { FillUsernameBlock } from "./methods/fill-username.method.block.js";
4
4
  import { FillPasswordBlock } from "./methods/fill-password.method.block.js";
5
5
  import { SubmitLoginBlock } from "./methods/submit-login.method.block.js";
@@ -17,10 +17,10 @@ import { LoginSel } from "./methods/login.sel.js";
17
17
  * and submits. Name stays `nav-login` so existing flows / chain specs keep
18
18
  * working.
19
19
  */
20
- export const NavLoginBlock = definePageBlock<LoginPage>({
20
+ export const NavLoginBlock = definePageBlock({
21
21
  name: "nav-login",
22
22
  description: "Goes to the Swag Labs login page.",
23
- checkpoint: "LoginPage",
23
+ checkpoint: LoginPage,
24
24
  url: "/",
25
25
  verify: [Trait.visible(LoginSel.loginButton)],
26
26
  methods: {
@@ -1,5 +1,4 @@
1
1
  import { checkpoint, defineApiBlock } from "waygraph";
2
- import type { Checkpoint, StubCtx } from "waygraph";
3
2
  import { engine } from "../../config/waygraph.config.js";
4
3
  import { loginFlow } from "./login.flow.js";
5
4
 
@@ -15,24 +14,27 @@ import { loginFlow } from "./login.flow.js";
15
14
  * hits a well-known public REST test API (jsonplaceholder) purely to prove
16
15
  * the mechanism - a real project would point `call` at its own backend.
17
16
  */
18
- export type BackendHealthy = Checkpoint<"BackendHealthy">;
19
- export type BackendDown = Checkpoint<"BackendDown">;
17
+ export const BackendHealthy = checkpoint("BackendHealthy");
18
+ export type BackendHealthy = typeof BackendHealthy;
19
+ export const BackendDown = checkpoint("BackendDown");
20
+ export type BackendDown = typeof BackendDown;
20
21
 
21
- const CheckBackendHealth = defineApiBlock<any, BackendHealthy | BackendDown>({
22
+ const CheckBackendHealth = defineApiBlock({
22
23
  name: "check-backend-health",
24
+ to: [BackendHealthy, BackendDown],
23
25
  call: ({ request }) =>
24
26
  request.get("https://jsonplaceholder.typicode.com/todos/1"),
25
- resolve: (result) =>
26
- result.ok ? checkpoint("BackendHealthy") : checkpoint("BackendDown"),
27
- stubBefore: (ctx: StubCtx<BackendHealthy | BackendDown>) => {
28
- ctx.title("Checking backend health · real HTTP request, no browser");
29
- },
27
+ resolve: (result) => (result.ok ? BackendHealthy : BackendDown),
30
28
  });
31
29
 
32
30
  export const apiDemoEpisode = engine
33
31
  .map()
34
32
  .start()
35
- .method(CheckBackendHealth)
33
+ .method(
34
+ CheckBackendHealth.stubBefore((ctx) => {
35
+ ctx.title("Checking backend health · real HTTP request, no browser");
36
+ }),
37
+ )
36
38
  .end();
37
39
 
38
40
  export const apiDemoFlow = engine
@@ -1,19 +1,29 @@
1
- import type { Checkpoint } from "waygraph";
1
+ import { checkpoint } from "waygraph";
2
2
 
3
3
  // One Checkpoint per real state the target app can be in - kept together so the
4
4
  // whole checkout flow's state space reads in one place, the same reason a
5
5
  // backend keeps its models together instead of scattered across handlers.
6
6
  // `Start` is waygraph's own exported type, not redeclared here.
7
7
 
8
- export type LoginPage = Checkpoint<"LoginPage">;
9
- export type LoggedIn = Checkpoint<"LoggedIn">;
8
+ export const LoginPage = checkpoint("LoginPage");
9
+ export type LoginPage = typeof LoginPage;
10
+ export const LoggedIn = checkpoint("LoggedIn");
11
+ export type LoggedIn = typeof LoggedIn;
10
12
  /** submit-login: inventory on success, login form + error banner on auth failure. */
11
- export type LoginSubmitOutcome = LoggedIn | LoginPage;
12
- export type ItemInCart = Checkpoint<"ItemInCart">;
13
+ export const LoginSubmitOutcome = [LoggedIn, LoginPage] as const;
14
+ export type LoginSubmitOutcome = (typeof LoginSubmitOutcome)[number];
15
+ export const ItemInCart = checkpoint("ItemInCart");
16
+ export type ItemInCart = typeof ItemInCart;
13
17
  /** remove-from-cart: still has items → ItemInCart; empty cart → LoggedIn. */
14
- export type RemoveFromCartOutcome = ItemInCart | LoggedIn;
15
- export type CartPage = Checkpoint<"CartPage">;
16
- export type CheckoutInfoPage = Checkpoint<"CheckoutInfoPage">;
17
- export type CheckoutOverviewPage = Checkpoint<"CheckoutOverviewPage">;
18
- export type ItemDetailPage = Checkpoint<"ItemDetailPage">;
19
- export type OrderComplete = Checkpoint<"OrderComplete">;
18
+ export const RemoveFromCartOutcome = [ItemInCart, LoggedIn] as const;
19
+ export type RemoveFromCartOutcome = (typeof RemoveFromCartOutcome)[number];
20
+ export const CartPage = checkpoint("CartPage");
21
+ export type CartPage = typeof CartPage;
22
+ export const CheckoutInfoPage = checkpoint("CheckoutInfoPage");
23
+ export type CheckoutInfoPage = typeof CheckoutInfoPage;
24
+ export const CheckoutOverviewPage = checkpoint("CheckoutOverviewPage");
25
+ export type CheckoutOverviewPage = typeof CheckoutOverviewPage;
26
+ export const ItemDetailPage = checkpoint("ItemDetailPage");
27
+ export type ItemDetailPage = typeof ItemDetailPage;
28
+ export const OrderComplete = checkpoint("OrderComplete");
29
+ export type OrderComplete = typeof OrderComplete;
@@ -40,7 +40,7 @@ export const deviceShowcase = {
40
40
  before: (ctx: StubCtx) => {
41
41
  ctx.title("Signing in · mobile");
42
42
  ctx.device("mobile");
43
- ctx.portrait();
43
+ ctx.orientation("portrait");
44
44
  ctx.todos("saucedemo", ...checklist(0, 0));
45
45
  ctx.zoom(1.35);
46
46
  const fromMem = ctx.mem?.get(LoginCreds.key)?.username;
@@ -93,8 +93,8 @@ export const deviceShowcase = {
93
93
  });
94
94
  },
95
95
  after: (ctx: StubCtx) => {
96
- ctx.banner("Inventory · landscape");
97
- ctx.landscape();
96
+ ctx.title("Inventory · landscape");
97
+ ctx.orientation("landscape");
98
98
  ctx.todos("saucedemo", ...checklist(3, 3));
99
99
  ctx.ring("shelf", {
100
100
  selector: ".inventory_list",
@@ -111,7 +111,7 @@ export const deviceShowcase = {
111
111
  before: (ctx: StubCtx) => {
112
112
  ctx.title("Pick a product · tablet");
113
113
  ctx.device("tablet");
114
- ctx.portrait();
114
+ ctx.orientation("portrait");
115
115
  ctx.todos("saucedemo", ...checklist(3, 3));
116
116
  ctx.zoom(1.35);
117
117
  ctx.zoomOut(false);
@@ -138,7 +138,7 @@ export const deviceShowcase = {
138
138
  });
139
139
  },
140
140
  after: (ctx: StubCtx) => {
141
- ctx.banner("In the cart");
141
+ ctx.title("In the cart");
142
142
  ctx.todos("saucedemo", ...checklist(4, 4));
143
143
  ctx.zoomOut(false);
144
144
  ctx.ring("badge", {
@@ -155,7 +155,7 @@ export const deviceShowcase = {
155
155
  openCart: {
156
156
  before: (ctx: StubCtx) => {
157
157
  ctx.title("Open cart · landscape");
158
- ctx.landscape();
158
+ ctx.orientation("landscape");
159
159
  ctx.todos("saucedemo", ...checklist(5, 5));
160
160
  ctx.zoom(1.4);
161
161
  ctx.zoomOut(false);
@@ -167,15 +167,14 @@ export const deviceShowcase = {
167
167
  tone: "planned",
168
168
  focus: true,
169
169
  zoomOut: false,
170
- followMouse: false,
171
170
  weight: "bold",
172
171
  gesture: "tap",
173
172
  },
174
173
  });
175
174
  },
176
175
  after: (ctx: StubCtx) => {
177
- ctx.banner("Your cart · desktop");
178
- ctx.clearDevice();
176
+ ctx.title("Your cart · desktop");
177
+ ctx.hideDevice();
179
178
  ctx.hideTodos();
180
179
  ctx.zoomOut(true);
181
180
  ctx.ring("items", {
@@ -185,7 +184,6 @@ export const deviceShowcase = {
185
184
  tone: "success",
186
185
  focus: true,
187
186
  zoomOut: true,
188
- followMouse: false,
189
187
  duration: true,
190
188
  });
191
189
  },
@@ -29,6 +29,7 @@ Change each `_nav.block.ts`'s `url` from the local `file://` path to a real one,
29
29
  `package.json`'s `"waygraph"` field - see the main docs' "Project config" section). That file also
30
30
  holds the test settings (`testDir`, `webServer`, `playwright: { workers, timeout, ... }`), so the
31
31
  project needs no `playwright.config.ts`. Keep each
32
- `src/map/` folder matching the URL it represents (`waygraph map` enforces this).
32
+ `src/map/` folder matching the URL it represents (`waygraph map` enforces this). `(external)/hoppscotch` and
33
+ `(external)/mailpit` keep their own `_states.ts` / `_keys.ts`, so `waygraph map pack <group>` can turn either into a package.
33
34
 
34
35
  Docs: https://deviate-dv8.github.io/waygraph/
@@ -24,9 +24,9 @@ Next.js route groups) and never appear in a URL or Checkpoint name.
24
24
  │ │ │ │ ├── assert-hello.method.block.ts # + stubs + YAP slide
25
25
  │ │ │ │ └── assert-item-added.method.block.ts
26
26
  │ │ │ └── docs/ # a second page, same shape
27
- │ │ ├── (external)/mailpit/ # a different origin (mail catcher)
28
- │ │ └── (external)/hoppscotch/ # API client, REST client, needs the hoppscotch extension
29
- │ ├── states/ # Checkpoint types + mem keys
27
+ │ │ ├── (external)/mailpit/ # a different origin (mail catcher); owns _states.ts + _keys.ts
28
+ │ │ └── (external)/hoppscotch/ # API client, needs the hoppscotch extension; owns _states.ts + _keys.ts
29
+ │ ├── states/ # the app's Checkpoints + mem keys
30
30
  │ └── flows/ # use cases, one file per scenario (see flows/README.md)
31
31
  │ ├── home/ # a page: hello, cart
32
32
  │ ├── (user-stories)/ # flows that cross pages
@@ -45,9 +45,10 @@ page folder uses, so any agent or teammate knows where to look without asking.
45
45
  | Add an action on a page | one file in that page's `_methods/` |
46
46
  | Verify a state (button disabled, error shown) | `defineAssertBlock` + `Trait.disabled` / `Trait.enabled` |
47
47
  | Define a use case (success, failed, bad input) | one `*.flow.ts` in `src/flows/<page>/`, or `(user-stories)/` for one that crosses pages |
48
- | Give a flow fake data | `registerMemStub(key, fake)` + `memStub: true` in the flow's options (docs: docs/REFERENCE.md, "memStub") |
48
+ | Give a flow fake data | `registerMemStub(key, fake)` in a `*.mem-stubs.ts` file + `memStub: true` in the flow's options; live sessions use the same fakes as defaults (docs: the reference, Engine features, "memStub") |
49
49
  | Explore by hand | `npm run auto` (headed) or `npm run auto:cli` |
50
50
  | Check your work | `npm run check`, `npm run graph`, `waygraph map` |
51
+ | Share a tool's map with another project | `waygraph map pack hoppscotch`, then publish `.waygraph/packages/hoppscotch` |
51
52
 
52
53
  `waygraph map` fails if a folder path stops matching the real URL it claims to represent.
53
54
  Full convention: https://deviate-dv8.github.io/waygraph/consumer.html
@@ -26,6 +26,7 @@ const config = defineConfig(({ env }) => ({
26
26
  // video: { viewport: "1920x1080" },
27
27
  // },
28
28
  // webServer: { command: "npm start", port: 3000 }, // started around test / run / demo / auto
29
+ // runLog: false, // each run is logged to .waygraph/runs/ (what Waygraph UI shows)
29
30
 
30
31
  // Another config for another environment: config/waygraph.staging.config.ts, chosen with `waygraph test --config staging`.
31
32
 
@@ -3,3 +3,4 @@ dist/
3
3
  test-results/
4
4
  playwright-report/
5
5
  .waygraph-videos/
6
+ .waygraph/
@@ -32,8 +32,8 @@ src/flows/
32
32
 
33
33
  ## Writing one
34
34
 
35
- - Build it with `engine.map({ memStub })…end()`; nest another with `.flow(sub, { reset: true })`. No `defineFlow([...])`,
36
- no nested `withTitle(withMemStub(...))`, and `.end()` takes nothing.
35
+ - Build it with `engine.map({ memStub })…end()`; nest another with `.flow(sub, { reset: true })`;
36
+ `.end()` takes nothing.
37
37
  - The flow's name and narration are ctx stubs chained on the Block where they apply: `ctx.title("…")`, `ctx.ring(…)`.
38
38
  - A flow expected to fail (a locked-out user) says so in `map({ expectedFailure: "…" })`.
39
39
  - A step's speed in the demo is `{ pace }`: `.method(FillBlock, { pace: "blitz" })`.
@@ -1,11 +1,11 @@
1
1
  import { defineNavBlock, Trait } from "waygraph";
2
- import type { Docs } from "../../../states/demo.states.js";
2
+ import { Docs } from "../../../states/demo.states.js";
3
3
  import { DocsSel, DOCS_URL } from "./_sel.js";
4
4
 
5
- export const NavDocsBlock = defineNavBlock<Docs>({
5
+ export const NavDocsBlock = defineNavBlock({
6
6
  name: "nav-docs",
7
7
  description: "Opens the docs page (Waygraph Map convention demo).",
8
- checkpoint: "Docs",
8
+ checkpoint: Docs,
9
9
  url: DOCS_URL,
10
10
  verify: [Trait.visible(DocsSel.heading)],
11
11
  });
@@ -1,10 +1,10 @@
1
1
  import { definePageBlock, Trait } from "waygraph";
2
- import type { Docs } from "../../../states/demo.states.js";
2
+ import { Docs } from "../../../states/demo.states.js";
3
3
  import { DocsSel } from "./_sel.js";
4
4
 
5
- export const DocsPageBlock = definePageBlock<Docs>({
5
+ export const DocsPageBlock = definePageBlock({
6
6
  name: "page-docs",
7
7
  description: "Docs hub - Waygraph Map convention demo.",
8
- checkpoint: "Docs",
8
+ checkpoint: Docs,
9
9
  verify: [Trait.visible(DocsSel.heading)],
10
10
  });
@@ -1,23 +1,23 @@
1
1
  import {
2
2
  defineEffectBlock,
3
- checkpoint,
4
3
  type WaygraphInstanceOption,
5
4
  } from "waygraph";
6
- import type { CanAddItem, ItemInCart } from "../../../../states/demo.states.js";
5
+ import { CanAddItem, ItemInCart } from "../../../../states/demo.states.js";
7
6
  import { SelectedItem } from "../../../../states/demo.mem-keys.js";
8
7
  import { DemoSel } from "../_sel.js";
9
8
 
10
9
  /** `waygraph auto` lists one "Add …" row per live Add button via `instanceOptions`. */
11
- export const AddItemBlock = defineEffectBlock<CanAddItem, ItemInCart>({
10
+ export const AddItemBlock = defineEffectBlock({
12
11
  name: "add-item",
13
12
  description: "Adds the mem-selected catalog item to the cart.",
13
+ from: CanAddItem,
14
+ to: ItemInCart,
14
15
  requires: [SelectedItem.key],
15
16
  instruction: {
16
17
  async act(page, _input, mem) {
17
18
  const { id } = mem.get(SelectedItem.key);
18
19
  await page.locator(DemoSel.addBtn(id)).click();
19
20
  },
20
- resolve: () => checkpoint("ItemInCart"),
21
21
  verify: [
22
22
  {
23
23
  name: "item-added",
@@ -1,12 +1,12 @@
1
1
  import { defineAssertBlock, Trait } from "waygraph";
2
- import type { Home } from "../../../../states/demo.states.js";
2
+ import { Home } from "../../../../states/demo.states.js";
3
3
  import { DemoSel } from "../_sel.js";
4
4
 
5
5
  /** Heading still shows after arrival; the slide is a YAP caption for the demo overlay. */
6
- export const AssertHelloBlock = defineAssertBlock<Home>({
6
+ export const AssertHelloBlock = defineAssertBlock({
7
7
  name: "assert-hello",
8
8
  description: "Confirms the hello heading is still visible after arrival.",
9
- checkpoint: "Home",
9
+ checkpoint: Home,
10
10
  waitForHeading: "Hello Waygraph",
11
11
  verify: [Trait.text(DemoSel.title, "Hello Waygraph"), Trait.visible(DemoSel.sub)],
12
12
  slides: [