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,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
  },
@@ -5,7 +5,7 @@ import { dirname, join } from "node:path";
5
5
 
6
6
  const projectDir = join(dirname(fileURLToPath(import.meta.url)), "..");
7
7
 
8
- test("waygraph auto discovers the decomposed saucedemo graph, skipping only the FFCompose auth step", async () => {
8
+ test("waygraph auto discovers the decomposed saucedemo graph, with no Block skipped", async () => {
9
9
  const graph = await discoverGraph(projectDir);
10
10
 
11
11
  expect(graph.nodes.map((n) => n.checkpoint).sort()).toEqual(
@@ -22,9 +22,7 @@ test("waygraph auto discovers the decomposed saucedemo graph, skipping only the
22
22
  );
23
23
  // 24 vs the earlier 15: checkout-info split into fill-first-name/
24
24
  // fill-last-name/fill-postal-code (+2 net) plus the atomic login Blocks
25
- // (fill-username/fill-password/submit-login's 2 branches) that static
26
- // discovery still sees even though checkoutFlow itself now drives them
27
- // through the ff-owner-auth composition below.
25
+ // (fill-username/fill-password/submit-login's 2 branches).
28
26
  expect(graph.edges.length).toBe(24);
29
27
  const removeEdges = graph.edges.filter((e) => e.block === "remove-from-cart");
30
28
  expect(removeEdges).toEqual(
@@ -37,14 +35,8 @@ test("waygraph auto discovers the decomposed saucedemo graph, skipping only the
37
35
  const loginFail = graph.edges.find((e) => e.block === "submit-login" && e.to === "LoginPage");
38
36
  expect(loginFail).toMatchObject({ from: "LoginPage", to: "LoginPage", kind: "action" });
39
37
 
40
- // ff-owner-auth (fastForwardComposeBlock) collapses nav-login + fill-username
41
- // + fill-password + submit-login into one opaque demo/run step - discoverGraph
42
- // only understands plain defineMethodBlock/defineEffectBlock<In, Out> generic
43
- // calls, so this one Block is expected to be skipped by static discovery even
44
- // though it's a real, used step (see src/blocks/saucedemo-web/ff-owner-auth.block.ts).
45
- expect(graph.skipped).toEqual([
46
- expect.objectContaining({ block: "ff-owner-auth" }),
47
- ]);
38
+ // Every Block has a route, so nothing is skipped.
39
+ expect(graph.skipped).toEqual([]);
48
40
 
49
41
  const logout = graph.edges.find((e) => e.block === "submit-logout");
50
42
  expect(logout).toMatchObject({ from: "LoggedIn", to: "LoginPage", kind: "action" });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "waygraph",
3
- "version": "0.15.54",
3
+ "version": "0.16.0",
4
4
  "type": "module",
5
5
  "description": "A typed graph of reusable Blocks for driving a browser through E2E flows.",
6
6
  "license": "MIT",
@@ -12,7 +12,7 @@
12
12
  "default": "./dist/index.js"
13
13
  },
14
14
  "./runner": {
15
- "default": "./dist/runner/index.js"
15
+ "default": "./dist/runner/runner.js"
16
16
  }
17
17
  },
18
18
  "bin": {
@@ -38,7 +38,9 @@
38
38
  "!**/playwright-report",
39
39
  "!**/playwright-report/**",
40
40
  "!**/.waygraph-chain-*.mjs",
41
- "!**/*.log"
41
+ "!**/*.log",
42
+ "!examples/**/.waygraph",
43
+ "!examples/**/.waygraph/**"
42
44
  ],
43
45
  "repository": {
44
46
  "type": "git",
@@ -46,7 +48,7 @@
46
48
  },
47
49
  "scripts": {
48
50
  "clean": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"",
49
- "build": "npm run clean && tsc -p tsconfig.build.json && node scripts/copy-runner.mjs && node scripts/copy-ui-css.mjs",
51
+ "build": "npm run clean && tsc -p tsconfig.build.json && node scripts/copy-ui-css.mjs",
50
52
  "typecheck": "node bin/waygraph typecheck .",
51
53
  "test": "npm run check:structure && npm run knip && npm run test:unit && playwright test",
52
54
  "test:ui": "playwright test --ui",
@@ -58,7 +60,7 @@
58
60
  "docs:dev": "npm run docs:api && vitepress dev docs",
59
61
  "docs:build": "npm run docs:api && vitepress build docs",
60
62
  "docs:preview": "vitepress preview docs",
61
- "docs:api": "typedoc && node scripts/gen-deprecated.mjs",
63
+ "docs:api": "typedoc && node scripts/gen-deprecated.mjs && node --import tsx scripts/gen-env.mjs",
62
64
  "knip": "knip",
63
65
  "sync:quickstart": "node scripts/sync-quickstart.mjs"
64
66
  },
@@ -67,8 +69,10 @@
67
69
  },
68
70
  "dependencies": {
69
71
  "open-props": "^1.7.23",
72
+ "ts-morph": "^28.0.0",
70
73
  "tsx": "^4.0.0",
71
- "urlpattern-polyfill": "^10.1.0"
74
+ "urlpattern-polyfill": "^10.1.0",
75
+ "yaml": "^2.9.1"
72
76
  },
73
77
  "devDependencies": {
74
78
  "@playwright/test": "^1.63.0",
@@ -50,9 +50,9 @@ When there is no app codebase to read - a production target, or a deliberately
50
50
  codebase-blind engagement - discover the route/interaction structure live instead, using the
51
51
  `waygraph auto` session tools rather than skipping planning:
52
52
 
53
- 1. `waygraph auto --cli --detach [--base-url <url>]` against a throwaway project dir (or the
53
+ 1. `waygraph browser start --headless [--base-url <url>] --goto /` against a throwaway project dir (or the
54
54
  target project once a `src/map/` or `src/blocks/` tree exists) - starts a driveable session, prints
55
- `{sessionId, socketPath}`.
55
+ `{sessionId, socketPath, headless}`.
56
56
  2. `waygraph auto status <sessionId>` to read the current menu (what Blocks/edges are already
57
57
  discoverable) and `waygraph auto dom <sessionId>` (default `aria` mode) to see the live
58
58
  page's actual interactive elements by role/name - this is how you find real routes and
@@ -74,12 +74,12 @@ edges (including cycles via logout / continue-shopping / back-to-products).
74
74
  Prefer flags (or npm scripts) over a pile of `WAYGRAPH_*` env vars:
75
75
 
76
76
  ```bash
77
- npm run demo # waygraph demo shopFlow (STEP+headed; BASE_URL from package.json / playwright)
78
- npm run demo:autoplay # --autoplay --title "Shop demo"
77
+ npm run demo # waygraph demo --blocks "loginFlow then shopFlow" (headed; baseUrl from config/waygraph.config.ts)
78
+ npm run demo:auto-next # the same, advancing on its own
79
79
  waygraph demo shopFlow --base-url https://www.saucedemo.com --title "Shop"
80
- waygraph chain "loginFlow" --step --no-autoplay
80
+ waygraph demo loginFlow --no-auto-next
81
81
  ```
82
82
 
83
- Flags beat env: `--step` / `--no-step`, `--autoplay` / `--no-autoplay`,
83
+ Flags beat env: `--auto-next` / `--no-auto-next`,
84
84
  `--base-url <url>`, `--title <text>`. Default BASE_URL resolution order for
85
85
  `demo`: `--base-url` > `WAYGRAPH_BASE_URL` > `baseUrl` in `config/waygraph.config.ts`.
@@ -11,9 +11,8 @@ Runtime is always a `Block`. Helpers are TypeScript salt + clear intent.
11
11
  | `defineMethodBlock` | One-shot non-nav app step | `*.method.block.ts` under `methods/` |
12
12
  | `defineEffectBlock` | Instance mutate + auto menu rows | `*.effect.block.ts` under `methods/` |
13
13
  | `defineBlock` | Escape hatch: tests, unsure, probes | any |
14
- | `defineActionBlock` | **Deprecated** alias of `defineMethodBlock` | — |
15
14
 
16
- `defineNavBlock({ click })` still works (compat) - prefer `defineNavClickBlock` in app code.
15
+ `defineNavBlock({ click })` and `defineNavClickBlock` build the same Block; app code reads better with `defineNavClickBlock`.
17
16
 
18
17
  ---
19
18
 
@@ -30,7 +29,7 @@ export const InventorySel = {
30
29
 
31
30
  export const InventoryPageBlock = definePageBlock({
32
31
  name: "page-inventory",
33
- checkpoint: "LoggedIn",
32
+ checkpoint: LoggedIn,
34
33
  verify: [Trait.url({ pathname: "/inventory.html" }), Trait.visible(InventorySel.list)],
35
34
  methods: {
36
35
  addToCart: () => AddToCartBlock,
@@ -73,8 +72,10 @@ Checkpoint = place on the map. `branch()` = which road to take from that place.
73
72
  Conditional Out (no `branch()` needed for auto/graph):
74
73
 
75
74
  ```ts
76
- defineMethodBlock<LoginPage, LoggedIn | LoginPage>({
75
+ defineMethodBlock({
77
76
  name: "submit-login",
77
+ from: LoginPage,
78
+ to: [LoggedIn, LoginPage],
78
79
  instruction: {
79
80
  async act(page, _in, mem) { /* fill + click */ },
80
81
  async observe(page) {
@@ -93,7 +94,7 @@ defineMethodBlock<LoginPage, LoggedIn | LoginPage>({
93
94
  Optional routing for `runGraph`:
94
95
 
95
96
  ```ts
96
- branch(SubmitLoginActionBlock, {
97
+ branch(SubmitLoginBlock, {
97
98
  LoggedIn: AddToCartBlock,
98
99
  LoginPage: null, // stop
99
100
  });
@@ -112,8 +113,9 @@ then run the Block (act reads mem as usual).
112
113
  ### Effect - spawn Method-like rows (Add / Remove)
113
114
 
114
115
  ```ts
115
- defineEffectBlock<Checkpoint<string>, ItemInCart>({
116
+ defineEffectBlock({
116
117
  name: "add-to-cart",
118
+ to: ItemInCart, // no `from`: runs from anywhere
117
119
  requires: [SelectedItem.key],
118
120
  instruction: {
119
121
  async act(page, _in, mem) {
@@ -140,9 +142,9 @@ Auto shows: `Add "Sauce Labs Backpack" to cart`, `Add "Bike Light"…`, …
140
142
  ### MemNav - spawn Nav rows (Open details)
141
143
 
142
144
  ```ts
143
- defineMemNavBlock<ItemDetailPage>({
145
+ defineMemNavBlock({
144
146
  name: "nav-item-detail",
145
- checkpoint: "ItemDetailPage",
147
+ checkpoint: ItemDetailPage,
146
148
  requires: [SelectedItem.key],
147
149
  click: (mem) => InventorySel.title(mem.get(SelectedItem.key).id),
148
150
  verify: [Trait.url({ pathname: "/inventory-item.html" })],
@@ -23,9 +23,6 @@
23
23
  "record": "waygraph run --blocks \"loginFlow then shopFlow\" --video --no-step",
24
24
  "traverse": "waygraph traverse --max-steps 40"
25
25
  },
26
- "waygraph": {
27
- "baseUrl": "https://www.saucedemo.com"
28
- },
29
26
  "dependencies": {
30
27
  "waygraph": "latest"
31
28
  },
@@ -9,7 +9,6 @@ src/blocks/
9
9
  saucedemo-web/ # URL /
10
10
  NAV.md
11
11
  nav-login.block.ts # Page definePageBlock url:/
12
- ff-owner-auth.block.ts # FFCompose (nav-login + fill-username + fill-password + submit-login)
13
12
  methods/
14
13
  fill-username.method.block.ts # Method defineMethodBlock (self-loop on LoginPage)
15
14
  fill-password.method.block.ts # Method defineMethodBlock (self-loop on LoginPage)
@@ -27,11 +27,7 @@ Fill and submit are three separate Blocks (not one that fills both fields and
27
27
  clicks Login) so the graph/demo show each as its own step - no Block does
28
28
  more than one distinct action.
29
29
 
30
- ## Other
31
-
32
- | File | Kind | Notes |
33
- |------|------|-------|
34
- | `ff-owner-auth.block.ts` | FFCompose | Collapses nav-login + fill-username + fill-password + submit-login into one opaque demo/run step (`--ff-expand` shows all 4 again) |
30
+ A flow that wants to skip watching auth marks those steps `{ ff: true }` (see `src/flows/checkout.flow.ts`).
35
31
 
36
32
  ## Related mem keys / checkpoints
37
33
 
@@ -1,5 +1,5 @@
1
1
  import { defineNavClickBlock, Trait } from "waygraph";
2
- import type { CartPage } from "../../../states/checkout.states.js";
2
+ import { CartPage } from "../../../states/checkout.states.js";
3
3
  import { CartSel } from "./cart.sel.js";
4
4
 
5
5
  /**
@@ -9,10 +9,10 @@ import { CartSel } from "./cart.sel.js";
9
9
  *
10
10
  * click, not url - header cart link from inventory-adjacent pages.
11
11
  */
12
- export const NavCartBlock = defineNavClickBlock<CartPage>({
12
+ export const NavCartBlock = defineNavClickBlock({
13
13
  name: "nav-cart",
14
14
  description: "Clicks the cart link in the header.",
15
- checkpoint: "CartPage",
15
+ checkpoint: CartPage,
16
16
  click: CartSel.cartLink,
17
17
  verify: [Trait.url({ pathname: "/cart.html" })],
18
18
  });
@@ -1,5 +1,5 @@
1
1
  import { defineNavClickBlock, Trait } from "waygraph";
2
- import type { CheckoutInfoPage } from "../../../states/checkout.states.js";
2
+ import { CheckoutInfoPage } from "../../../states/checkout.states.js";
3
3
  import { CartSel } from "./cart.sel.js";
4
4
 
5
5
  /**
@@ -9,10 +9,10 @@ import { CartSel } from "./cart.sel.js";
9
9
  *
10
10
  * Cart page "Checkout" button - owns the nav into step one.
11
11
  */
12
- export const NavCheckoutInfoBlock = defineNavClickBlock<CheckoutInfoPage>({
12
+ export const NavCheckoutInfoBlock = defineNavClickBlock({
13
13
  name: "nav-checkout-info",
14
14
  description: "Clicks 'Checkout' on the cart page.",
15
- checkpoint: "CheckoutInfoPage",
15
+ checkpoint: CheckoutInfoPage,
16
16
  click: CartSel.checkoutBtn,
17
17
  verify: [Trait.url({ pathname: "/checkout-step-one.html" })],
18
18
  });
@@ -1,5 +1,5 @@
1
- import { defineMethodBlock, checkpoint } from "waygraph";
2
- import type { CheckoutInfoPage } from "../../../../states/checkout.states.js";
1
+ import { defineMethodBlock } from "waygraph";
2
+ import { CheckoutInfoPage } from "../../../../states/checkout.states.js";
3
3
  import { CheckoutInfoSel } from "./checkout-info.sel.js";
4
4
 
5
5
  /**
@@ -10,13 +10,14 @@ import { CheckoutInfoSel } from "./checkout-info.sel.js";
10
10
  * Fills the first name field only - self-loop on CheckoutInfoPage. Continue
11
11
  * is its own Block (submit-checkout-info.method.block.ts).
12
12
  */
13
- export const FillFirstNameBlock = defineMethodBlock<CheckoutInfoPage, CheckoutInfoPage>({
13
+ export const FillFirstNameBlock = defineMethodBlock({
14
14
  name: "fill-first-name",
15
15
  description: "Fills the first name field on the shipping info form.",
16
+ from: CheckoutInfoPage,
17
+ to: CheckoutInfoPage,
16
18
  instruction: {
17
19
  async act(page) {
18
20
  await page.locator(CheckoutInfoSel.firstName).fill("Ada");
19
21
  },
20
- resolve: () => checkpoint("CheckoutInfoPage"),
21
22
  },
22
23
  });
@@ -1,5 +1,5 @@
1
- import { defineMethodBlock, checkpoint } from "waygraph";
2
- import type { CheckoutInfoPage } from "../../../../states/checkout.states.js";
1
+ import { defineMethodBlock } from "waygraph";
2
+ import { CheckoutInfoPage } from "../../../../states/checkout.states.js";
3
3
  import { CheckoutInfoSel } from "./checkout-info.sel.js";
4
4
 
5
5
  /**
@@ -9,13 +9,14 @@ import { CheckoutInfoSel } from "./checkout-info.sel.js";
9
9
  *
10
10
  * Fills the last name field only - self-loop on CheckoutInfoPage.
11
11
  */
12
- export const FillLastNameBlock = defineMethodBlock<CheckoutInfoPage, CheckoutInfoPage>({
12
+ export const FillLastNameBlock = defineMethodBlock({
13
13
  name: "fill-last-name",
14
14
  description: "Fills the last name field on the shipping info form.",
15
+ from: CheckoutInfoPage,
16
+ to: CheckoutInfoPage,
15
17
  instruction: {
16
18
  async act(page) {
17
19
  await page.locator(CheckoutInfoSel.lastName).fill("Lovelace");
18
20
  },
19
- resolve: () => checkpoint("CheckoutInfoPage"),
20
21
  },
21
22
  });
@@ -1,5 +1,5 @@
1
- import { defineMethodBlock, checkpoint } from "waygraph";
2
- import type { CheckoutInfoPage } from "../../../../states/checkout.states.js";
1
+ import { defineMethodBlock } from "waygraph";
2
+ import { CheckoutInfoPage } from "../../../../states/checkout.states.js";
3
3
  import { CheckoutInfoSel } from "./checkout-info.sel.js";
4
4
 
5
5
  /**
@@ -9,13 +9,14 @@ import { CheckoutInfoSel } from "./checkout-info.sel.js";
9
9
  *
10
10
  * Fills the postal code field only - self-loop on CheckoutInfoPage.
11
11
  */
12
- export const FillPostalCodeBlock = defineMethodBlock<CheckoutInfoPage, CheckoutInfoPage>({
12
+ export const FillPostalCodeBlock = defineMethodBlock({
13
13
  name: "fill-postal-code",
14
14
  description: "Fills the postal code field on the shipping info form.",
15
+ from: CheckoutInfoPage,
16
+ to: CheckoutInfoPage,
15
17
  instruction: {
16
18
  async act(page) {
17
19
  await page.locator(CheckoutInfoSel.postalCode).fill("1000");
18
20
  },
19
- resolve: () => checkpoint("CheckoutInfoPage"),
20
21
  },
21
22
  });
@@ -1,5 +1,5 @@
1
- import { defineMethodBlock, checkpoint, Trait } from "waygraph";
2
- import type { CheckoutInfoPage, CheckoutOverviewPage } from "../../../../states/checkout.states.js";
1
+ import { defineMethodBlock, Trait } from "waygraph";
2
+ import { CheckoutInfoPage, CheckoutOverviewPage } from "../../../../states/checkout.states.js";
3
3
  import { CheckoutInfoSel } from "./checkout-info.sel.js";
4
4
 
5
5
  /**
@@ -11,14 +11,15 @@ import { CheckoutInfoSel } from "./checkout-info.sel.js";
11
11
  * fill-last-name / fill-postal-code (each its own Block). One Block, one
12
12
  * action: submit.
13
13
  */
14
- export const SubmitCheckoutInfoBlock = defineMethodBlock<CheckoutInfoPage, CheckoutOverviewPage>({
14
+ export const SubmitCheckoutInfoBlock = defineMethodBlock({
15
15
  name: "submit-checkout-info",
16
16
  description: "Continues from the shipping info form to the order overview.",
17
+ from: CheckoutInfoPage,
18
+ to: CheckoutOverviewPage,
17
19
  instruction: {
18
20
  async act(page) {
19
21
  await page.locator(CheckoutInfoSel.continueBtn).click();
20
22
  },
21
- resolve: () => checkpoint("CheckoutOverviewPage"),
22
23
  verify: [Trait.url({ pathname: "/checkout-step-two.html" })],
23
24
  },
24
25
  });
@@ -1,5 +1,5 @@
1
- import { defineMethodBlock, checkpoint, Trait, narrate } from "waygraph";
2
- import type {
1
+ import { defineMethodBlock, Trait, narrate } from "waygraph";
2
+ import {
3
3
  CheckoutOverviewPage,
4
4
  OrderComplete,
5
5
  } from "../../../../states/checkout.states.js";
@@ -11,15 +11,13 @@ import { CheckoutOverviewSel } from "./checkout-overview.sel.js";
11
11
  * Route: saucedemo-web/checkout-step-two/methods/ (= /checkout-step-two.html)
12
12
  *
13
13
  * Places the order on the overview page - form/finish click, not a NavBlock.
14
- * Stubs use open ctx lifecycles (preferred) - not static slot maps.
15
14
  */
16
- export const FinishOrderBlock = defineMethodBlock<
17
- CheckoutOverviewPage,
18
- OrderComplete
19
- >({
15
+ export const FinishOrderBlock = defineMethodBlock({
20
16
  name: "finish-order",
21
17
  description:
22
18
  "Places the order and confirms the 'Thank you for your order!' completion page.",
19
+ from: CheckoutOverviewPage,
20
+ to: OrderComplete,
23
21
  instruction: {
24
22
  async act(page) {
25
23
  const finishButton = page.locator(CheckoutOverviewSel.finishBtn);
@@ -27,7 +25,6 @@ export const FinishOrderBlock = defineMethodBlock<
27
25
  finishButton.click(),
28
26
  );
29
27
  },
30
- resolve: () => checkpoint("OrderComplete"),
31
28
  verify: [
32
29
  Trait.text(
33
30
  CheckoutOverviewSel.completeHeader,
@@ -1,5 +1,5 @@
1
1
  import { definePageBlock, Trait } from "waygraph";
2
- import type { LoggedIn } from "../../../states/checkout.states.js";
2
+ import { LoggedIn } from "../../../states/checkout.states.js";
3
3
  import { AddToCartBlock } from "./methods/add-to-cart.effect.block.js";
4
4
  import { RemoveFromCartBlock } from "./methods/remove-from-cart.effect.block.js";
5
5
  import { AddAllToCartBlock } from "./methods/add-all-to-cart.method.block.js";
@@ -18,11 +18,11 @@ import { InventorySel } from "./methods/inventory-items.js";
18
18
  * to LoggedIn. Cart Effects/Methods use In Checkpoint<string> (from: "*") so
19
19
  * auto still offers them after leave/return - menu follows live DOM buttons.
20
20
  */
21
- export const InventoryPageBlock = definePageBlock<LoggedIn>({
21
+ export const InventoryPageBlock = definePageBlock({
22
22
  name: "page-inventory",
23
23
  description:
24
24
  "Inventory catalog hub - per-item and bulk add/remove, open item detail.",
25
- checkpoint: "LoggedIn",
25
+ checkpoint: LoggedIn,
26
26
  verify: [
27
27
  Trait.url({ pathname: "/inventory.html" }),
28
28
  Trait.visible(InventorySel.list),
@@ -1,5 +1,5 @@
1
- import { defineMethodBlock, checkpoint, type Checkpoint } from "waygraph";
2
- import type { RemoveFromCartOutcome } from "../../../../states/checkout.states.js";
1
+ import { defineMethodBlock, checkpoint } from "waygraph";
2
+ import { RemoveFromCartOutcome } from "../../../../states/checkout.states.js";
3
3
  import { collectAddableItems, InventorySel } from "./inventory-items.js";
4
4
 
5
5
  type BulkObserve = "added" | "nothing";
@@ -14,12 +14,10 @@ type BulkObserve = "added" | "nothing";
14
14
  * leave inventory and return, collectors re-read Add buttons from the DOM.
15
15
  * Out: ItemInCart if the cart has items after; LoggedIn if still empty.
16
16
  */
17
- export const AddAllToCartBlock = defineMethodBlock<
18
- Checkpoint<string>,
19
- RemoveFromCartOutcome
20
- >({
17
+ export const AddAllToCartBlock = defineMethodBlock({
21
18
  name: "add-all-to-cart",
22
19
  description: "Adds every product still showing Add to cart on this page.",
20
+ to: RemoveFromCartOutcome,
23
21
  instruction: {
24
22
  async act(page) {
25
23
  const items = await collectAddableItems(page);