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,13 +1,16 @@
1
- import { Engine, start, end, locate } from "../core.js";
2
- import { MemPage } from "../mem-page.js";
3
- import { buildExploreContext, buildExploreMenu, } from "../session/auto-explore.js";
4
- import { defaultMemValueForKey } from "../session/auto-explore-run.js";
5
- import { resolveBaseUrl } from "../config.js";
1
+ import { Engine } from "../../engine/engine.js";
2
+ import { buildFlow } from "../../engine/flow/flow.js";
3
+ import { MemPage } from "../../engine/mem/mem.js";
4
+ import { buildExploreContext, buildExploreMenu, } from "../auto/explore.js";
5
+ import { detectHere, memStubValue } from "../auto/auto.js";
6
+ import { resolveBaseUrl } from "../../runtime/waygraph-config.js";
6
7
  import { EdgeLeaseCoordinator } from "./lease.js";
7
8
  import { buildCoverageReport, collectGraphEdgeKeys, defaultCoverageOutPath, formatCoverageLine, writeCoverageReport, } from "./coverage.js";
8
- import { chromiumExecutablePath } from "../browser.js";
9
+ import { chromiumExecutablePath } from "../../runtime/browser.js";
10
+ import { envFlag, envString } from "../../engine/env.js";
11
+ import { ignorePageGone, ignoreTimeout } from "../../engine/page-gone.js";
9
12
  function seedMem(library, mem, dataJson) {
10
- const raw = dataJson ?? process.env.WAYGRAPH_DATA ?? process.env.WAYGRAPH_AUTO_MEM;
13
+ const raw = dataJson ?? envString("WAYGRAPH_DATA") ?? envString("WAYGRAPH_AUTO_MEM");
11
14
  let envParsed = {};
12
15
  if (raw) {
13
16
  try {
@@ -25,7 +28,7 @@ function seedMem(library, mem, dataJson) {
25
28
  mem.set(k, envParsed[k.name]);
26
29
  continue;
27
30
  }
28
- const def = defaultMemValueForKey(k.name);
31
+ const def = memStubValue(k);
29
32
  if (def !== undefined)
30
33
  mem.set(k, def);
31
34
  }
@@ -36,12 +39,7 @@ function snapshotMem(library, mem) {
36
39
  for (const entry of library.values()) {
37
40
  for (const k of entry.block.requires ?? []) {
38
41
  if (mem.has(k) && !(k.name in out)) {
39
- try {
40
- out[k.name] = mem.get(k);
41
- }
42
- catch {
43
- /* skip */
44
- }
42
+ out[k.name] = mem.get(k);
45
43
  }
46
44
  }
47
45
  }
@@ -71,23 +69,8 @@ function edgeKey(edge) {
71
69
  const id = edge.instanceOption?.id;
72
70
  return id ? `${edge.block}::${id}` : edge.block;
73
71
  }
74
- async function detectHere(page, navBlocks) {
75
- try {
76
- const url = page.url();
77
- if (url.includes("/login"))
78
- return "PiaLogin";
79
- if (url.includes("mailpit") || url.includes(":54324") || url.includes("/mailhog")) {
80
- return "PiaMailpitGui";
81
- }
82
- }
83
- catch {
84
- /* ignore */
85
- }
86
- const tags = navBlocks.map((n) => n.block);
87
- return locate(page, tags, { timeoutMs: 1500 });
88
- }
89
72
  async function runOneBlock(engine, entry, context, page, mem) {
90
- const flow = engine.defineFlow([start, entry.block, end]);
73
+ const flow = buildFlow([entry.block], engine.config);
91
74
  const BLOCK_TIMEOUT_MS = 45_000;
92
75
  let timer;
93
76
  try {
@@ -131,7 +114,7 @@ async function runTraverseWorker(opts) {
131
114
  if (page.isClosed()) {
132
115
  page = await context.newPage();
133
116
  if (startUrl) {
134
- await page.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(() => { });
117
+ await page.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(ignorePageGone);
135
118
  }
136
119
  }
137
120
  const detected = await detectHere(page, library.navBlocks);
@@ -238,8 +221,8 @@ export async function runTraverse(projectDir, options = {}) {
238
221
  const maxVisitsPerNode = options.maxVisitsPerNode ?? 2;
239
222
  const maxVisitsPerEdge = options.maxVisitsPerEdge ?? 1;
240
223
  const timeoutMs = options.timeoutMs ?? 15 * 60_000;
241
- const headed = options.headed === true || process.env.WAYGRAPH_HEADED === "1";
242
- const baseURL = options.baseURL ?? (await resolveBaseUrl(projectDir)) ?? process.env.WAYGRAPH_BASE_URL;
224
+ const headed = options.headed === true || envFlag("WAYGRAPH_HEADED");
225
+ const baseURL = options.baseURL ?? (await resolveBaseUrl(projectDir)) ?? envString("WAYGRAPH_BASE_URL");
243
226
  const startUrl = options.startUrl ?? baseURL;
244
227
  const minEdgeCoverage = options.minEdgeCoverage != null && Number.isFinite(options.minEdgeCoverage)
245
228
  ? options.minEdgeCoverage
@@ -253,7 +236,7 @@ export async function runTraverse(projectDir, options = {}) {
253
236
  const allEdgeKeys = collectGraphEdgeKeys(graph.edges);
254
237
  const leases = new EdgeLeaseCoordinator({ projectDir, persist: parallel > 1 });
255
238
  const engine = new Engine({ headless: !headed, slowMo: headed ? 100 : 0 });
256
- if (process.env.WAYGRAPH_EXTENSIONS)
239
+ if (envString("WAYGRAPH_EXTENSIONS"))
257
240
  console.error("waygraph traverse: extensions are not loaded (workers use plain contexts)");
258
241
  const { chromium } = await import("@playwright/test");
259
242
  const executablePath = chromiumExecutablePath();
@@ -318,8 +301,8 @@ export async function runTraverse(projectDir, options = {}) {
318
301
  const mem = new MemPage();
319
302
  seedMem(library.byName, mem, options.data);
320
303
  if (startUrl) {
321
- await page.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(() => { });
322
- await page.waitForLoadState("load").catch(() => { });
304
+ await page.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(ignorePageGone);
305
+ await page.waitForLoadState("load").catch(ignoreTimeout);
323
306
  }
324
307
  const traverseId = options.traverseId ?? "traverse-1";
325
308
  const result = await runTraverseWorker({
@@ -342,7 +325,7 @@ export async function runTraverse(projectDir, options = {}) {
342
325
  mem,
343
326
  leases,
344
327
  });
345
- await context.close().catch(() => { });
328
+ await context.close().catch(ignorePageGone);
346
329
  const coverageCode = emitCoverage([{ traverseId, result }]);
347
330
  if (result.exitCode !== 0)
348
331
  return result.exitCode;
@@ -359,12 +342,12 @@ export async function runTraverse(projectDir, options = {}) {
359
342
  const bootMem = new MemPage();
360
343
  seedMem(library.byName, bootMem, options.data);
361
344
  if (startUrl) {
362
- await bootPage.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(() => { });
363
- await bootPage.waitForLoadState("load").catch(() => { });
345
+ await bootPage.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(ignorePageGone);
346
+ await bootPage.waitForLoadState("load").catch(ignoreTimeout);
364
347
  }
365
348
  const storageState = await bootContext.storageState();
366
349
  const memSnap = snapshotMem(library.byName, bootMem);
367
- await bootContext.close().catch(() => { });
350
+ await bootContext.close().catch(ignorePageGone);
368
351
  console.error(`waygraph traverse: forked ${parallel} clone workers (storageState + mem snapshot)`);
369
352
  const workerMeta = await Promise.all(Array.from({ length: parallel }, async (_, i) => {
370
353
  const traverseId = `traverse-${i + 1}`;
@@ -379,7 +362,7 @@ export async function runTraverse(projectDir, options = {}) {
379
362
  const mem = new MemPage();
380
363
  restoreMem(library.byName, mem, memSnap, options.data);
381
364
  if (startUrl) {
382
- await page.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(() => { });
365
+ await page.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(ignorePageGone);
383
366
  }
384
367
  try {
385
368
  const result = await runTraverseWorker({
@@ -405,7 +388,7 @@ export async function runTraverse(projectDir, options = {}) {
405
388
  return { traverseId, result };
406
389
  }
407
390
  finally {
408
- await context.close().catch(() => { });
391
+ await context.close().catch(ignorePageGone);
409
392
  }
410
393
  }));
411
394
  const results = workerMeta.map((w) => w.result);
@@ -418,6 +401,6 @@ export async function runTraverse(projectDir, options = {}) {
418
401
  return coverageCode;
419
402
  }
420
403
  finally {
421
- await browser.close().catch(() => { });
404
+ await browser.close().catch(ignorePageGone);
422
405
  }
423
406
  }
@@ -0,0 +1,52 @@
1
+ import type { BlockKind, ProjectScan, ScanOptions } from "./project.js";
2
+ export declare const MANIFEST_VERSION = 1;
3
+ export interface ManifestBlock {
4
+ /** `file#exportName`, unique across the project. */
5
+ id: string;
6
+ name: string;
7
+ exportName: string;
8
+ kind: BlockKind;
9
+ description: string;
10
+ from: string[];
11
+ to: string[];
12
+ requires: string[];
13
+ file: string;
14
+ /** The `src/map/` group folder the Block lives in (e.g. `(external)/hoppscotch`), or the map package it came from. */
15
+ map?: string;
16
+ }
17
+ export interface ManifestFlow {
18
+ /** `file#exportName`. */
19
+ id: string;
20
+ exportName: string;
21
+ file: string;
22
+ /** The folders under `src/flows/` (the page or `(user-story)` it belongs to) and the file's name (the outcome). */
23
+ useCase: {
24
+ path: string[];
25
+ outcome: string;
26
+ };
27
+ /** Block names in run order, nested flows flattened. */
28
+ steps: string[];
29
+ settings: {
30
+ memStub?: true;
31
+ expectedFailure?: string;
32
+ sessionReset?: true;
33
+ demoPace?: unknown;
34
+ };
35
+ }
36
+ export interface Manifest {
37
+ version: number;
38
+ project: {
39
+ name: string;
40
+ dir: string;
41
+ waygraph: string;
42
+ };
43
+ checkpoints: string[];
44
+ maps: string[];
45
+ blocks: ManifestBlock[];
46
+ flows: ManifestFlow[];
47
+ skipped: ProjectScan["skipped"];
48
+ }
49
+ /** Builds the manifest from a scan. */
50
+ export declare function manifestFromScan(scan: ProjectScan): Manifest;
51
+ /** Scans the project and returns its manifest. */
52
+ export declare function buildManifest(projectDir: string, opts?: ScanOptions): Promise<Manifest>;
@@ -0,0 +1,93 @@
1
+ // The manifest: everything a project defines, as plain JSON. `waygraph manifest` prints it; Waygraph UI and map packages
2
+ // read it instead of importing the project.
3
+ import { readFileSync } from "node:fs";
4
+ import { dirname, join } from "node:path";
5
+ import { scanProject } from "./project.js";
6
+ export const MANIFEST_VERSION = 1;
7
+ function packageVersion() {
8
+ try {
9
+ return JSON.parse(readFileSync(join(dirname(new URL(import.meta.url).pathname), "..", "..", "package.json"), "utf8")).version;
10
+ }
11
+ catch {
12
+ return "unknown";
13
+ }
14
+ }
15
+ function projectName(dir) {
16
+ try {
17
+ return JSON.parse(readFileSync(join(dir, "package.json"), "utf8")).name ?? dir;
18
+ }
19
+ catch {
20
+ return dir;
21
+ }
22
+ }
23
+ /** `(external)/hoppscotch` for `src/map/(external)/hoppscotch/_methods/x.block.ts`: the group plus its first folder. */
24
+ function mapGroupOf(file) {
25
+ const parts = file.split(/[\\/]/);
26
+ const i = parts.indexOf("map");
27
+ if (i < 0 || parts[i - 1] !== "src")
28
+ return undefined;
29
+ const rest = parts.slice(i + 1, -1);
30
+ if (rest.length === 0)
31
+ return undefined;
32
+ return /^\(.*\)$/.test(rest[0]) && rest[1] && !rest[1].startsWith("_") ? `${rest[0]}/${rest[1]}` : rest[0];
33
+ }
34
+ function useCaseOf(file) {
35
+ const parts = file.split(/[\\/]/);
36
+ const i = parts.indexOf("flows");
37
+ const folders = i >= 0 ? parts.slice(i + 1, -1) : [];
38
+ return { path: folders, outcome: parts[parts.length - 1].replace(/\.flow\.ts$/, "") };
39
+ }
40
+ /** Builds the manifest from a scan. */
41
+ export function manifestFromScan(scan) {
42
+ const checkpoints = new Set();
43
+ const maps = new Set();
44
+ const blocks = scan.blocks.map((b) => {
45
+ for (const t of [...b.from, ...b.to])
46
+ if (t !== "*")
47
+ checkpoints.add(t);
48
+ const map = b.map ?? mapGroupOf(b.file);
49
+ if (map)
50
+ maps.add(map);
51
+ return {
52
+ id: `${b.file}#${b.exportName}`,
53
+ name: b.name,
54
+ exportName: b.exportName,
55
+ kind: b.kind,
56
+ description: b.description,
57
+ from: b.from,
58
+ to: b.to,
59
+ requires: b.requires,
60
+ file: b.file,
61
+ ...(map ? { map } : {}),
62
+ };
63
+ });
64
+ const flows = scan.flows.map((f) => {
65
+ const flow = f.flow;
66
+ return {
67
+ id: `${f.file}#${f.exportName}`,
68
+ exportName: f.exportName,
69
+ file: f.file,
70
+ useCase: useCaseOf(f.file),
71
+ steps: flow.blocks().map((s) => s.name),
72
+ settings: {
73
+ ...(flow.memStub ? { memStub: true } : {}),
74
+ ...(flow.expectedFailureReason ? { expectedFailure: flow.expectedFailureReason } : {}),
75
+ ...(flow.resetSession ? { sessionReset: true } : {}),
76
+ ...(flow.demoPace !== undefined ? { demoPace: flow.demoPace } : {}),
77
+ },
78
+ };
79
+ });
80
+ return {
81
+ version: MANIFEST_VERSION,
82
+ project: { name: projectName(scan.projectDir), dir: scan.projectDir, waygraph: packageVersion() },
83
+ checkpoints: [...checkpoints].sort(),
84
+ maps: [...maps].sort(),
85
+ blocks,
86
+ flows,
87
+ skipped: scan.skipped,
88
+ };
89
+ }
90
+ /** Scans the project and returns its manifest. */
91
+ export async function buildManifest(projectDir, opts = {}) {
92
+ return manifestFromScan(await scanProject(projectDir, opts));
93
+ }
@@ -0,0 +1,7 @@
1
+ import type { MapGroup } from "./maps.js";
2
+ export interface MapImportProblem {
3
+ file: string;
4
+ spec: string;
5
+ }
6
+ /** Imports in a group that reach outside it. */
7
+ export declare function mapGroupImportProblems(group: MapGroup): MapImportProblem[];
@@ -0,0 +1,22 @@
1
+ // The rule that makes a map group packable: its files import only waygraph, Playwright, `node:` modules and each other.
2
+ import { dirname, resolve, sep } from "node:path";
3
+ import { walkDir } from "./scan.js";
4
+ import { importSpecifiers, parseSource } from "./source.js";
5
+ const ALLOWED_BARE = /^(waygraph|@playwright\/test|playwright|playwright-core)(\/.*)?$|^node:/;
6
+ /** Imports in a group that reach outside it. */
7
+ export function mapGroupImportProblems(group) {
8
+ const problems = [];
9
+ for (const file of walkDir(group.dir, /\.ts$/)) {
10
+ for (const spec of importSpecifiers(parseSource(file))) {
11
+ if (spec.startsWith(".")) {
12
+ const target = resolve(dirname(file), spec);
13
+ if (target === group.dir || target.startsWith(group.dir + sep))
14
+ continue;
15
+ }
16
+ else if (ALLOWED_BARE.test(spec))
17
+ continue;
18
+ problems.push({ file, spec });
19
+ }
20
+ }
21
+ return problems;
22
+ }
@@ -0,0 +1,33 @@
1
+ export interface MapGroup {
2
+ /** Path under `src/map/`, e.g. `(external)/hoppscotch`. */
3
+ group: string;
4
+ dir: string;
5
+ }
6
+ /** Every packable group: a folder under `src/map/` with its own `_states.ts`. */
7
+ export declare function mapGroups(projectDir: string): MapGroup[];
8
+ /** Finds a group by its full path (`(external)/hoppscotch`) or its last folder (`hoppscotch`). */
9
+ export declare function findMapGroup(projectDir: string, name: string): MapGroup | undefined;
10
+ export interface MapPackageJson {
11
+ version: number;
12
+ name: string;
13
+ group: string;
14
+ checkpoints: string[];
15
+ blocks: {
16
+ name: string;
17
+ exportName: string;
18
+ kind: string;
19
+ from: string[];
20
+ to: string[];
21
+ requires: string[];
22
+ file: string;
23
+ }[];
24
+ }
25
+ export interface InstalledMapPackage {
26
+ name: string;
27
+ dir: string;
28
+ map: MapPackageJson;
29
+ }
30
+ /** Map packages the project depends on: dependencies whose root holds a `waygraph.map.json`. */
31
+ export declare function installedMapPackages(projectDir: string): InstalledMapPackage[];
32
+ /** The compiled Block files of an installed map package. */
33
+ export declare function mapPackageBlockFiles(pkg: InstalledMapPackage): string[];
@@ -0,0 +1,62 @@
1
+ // Map groups as packages. A group is a `src/map/` folder that owns its Checkpoints (`_states.ts`); it may import only
2
+ // `waygraph`, Playwright, `node:` modules and its own files, so it can be packed (`waygraph map pack`) and installed in
3
+ // another project, where the scanner finds it by its `waygraph.map.json`.
4
+ import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
5
+ import { dirname, join, relative, resolve, sep } from "node:path";
6
+ import { walkDir } from "./scan.js";
7
+ /** Every packable group: a folder under `src/map/` with its own `_states.ts`. */
8
+ export function mapGroups(projectDir) {
9
+ const mapRoot = join(resolve(projectDir), "src", "map");
10
+ if (!existsSync(mapRoot))
11
+ return [];
12
+ return walkDir(mapRoot, /^_states\.ts$/)
13
+ .map((f) => dirname(f))
14
+ .map((dir) => ({ group: relative(mapRoot, dir).split(sep).join("/"), dir }))
15
+ .sort((a, b) => a.group.localeCompare(b.group));
16
+ }
17
+ /** Finds a group by its full path (`(external)/hoppscotch`) or its last folder (`hoppscotch`). */
18
+ export function findMapGroup(projectDir, name) {
19
+ const groups = mapGroups(projectDir);
20
+ return groups.find((g) => g.group === name) ?? groups.find((g) => g.group.split("/").pop() === name);
21
+ }
22
+ /** Map packages the project depends on: dependencies whose root holds a `waygraph.map.json`. */
23
+ export function installedMapPackages(projectDir) {
24
+ let pkg;
25
+ try {
26
+ pkg = JSON.parse(readFileSync(join(projectDir, "package.json"), "utf8"));
27
+ }
28
+ catch {
29
+ return [];
30
+ }
31
+ const out = [];
32
+ for (const name of Object.keys({ ...pkg.dependencies, ...pkg.devDependencies }).sort()) {
33
+ const dir = join(projectDir, "node_modules", name);
34
+ const file = join(dir, "waygraph.map.json");
35
+ if (!existsSync(file))
36
+ continue;
37
+ try {
38
+ out.push({ name, dir, map: JSON.parse(readFileSync(file, "utf8")) });
39
+ }
40
+ catch {
41
+ /* a broken waygraph.map.json is skipped, like a Block file that fails to import */
42
+ }
43
+ }
44
+ return out;
45
+ }
46
+ /** The compiled Block files of an installed map package. */
47
+ export function mapPackageBlockFiles(pkg) {
48
+ const files = [];
49
+ const walk = (dir) => {
50
+ for (const name of readdirSync(dir)) {
51
+ const p = join(dir, name);
52
+ if (name === "node_modules")
53
+ continue;
54
+ if (statSync(p).isDirectory())
55
+ walk(p);
56
+ else if (/\.block\.js$/.test(name))
57
+ files.push(p);
58
+ }
59
+ };
60
+ walk(pkg.dir);
61
+ return files.sort();
62
+ }
@@ -0,0 +1,21 @@
1
+ import type { MapImportProblem } from "./map-imports.js";
2
+ export interface PackOptions {
3
+ /** Output folder. Default `.waygraph/packages/<group>`. */
4
+ out?: string | undefined;
5
+ /** Package name. Default `waygraph-map-<group>`. */
6
+ name?: string | undefined;
7
+ version?: string | undefined;
8
+ }
9
+ export type PackResult = {
10
+ ok: true;
11
+ name: string;
12
+ dir: string;
13
+ group: string;
14
+ blocks: number;
15
+ } | {
16
+ ok: false;
17
+ reason: string;
18
+ problems?: MapImportProblem[];
19
+ };
20
+ /** Packs a map group (by `(external)/hoppscotch` or `hoppscotch`) into an installable package folder. */
21
+ export declare function packMapGroup(projectDir: string, groupName: string, opts?: PackOptions): Promise<PackResult>;
@@ -0,0 +1,109 @@
1
+ // `waygraph map pack <group>`: compiles one map group with the project's own TypeScript into an installable package
2
+ // (JavaScript + types, an index re-exporting everything, and `waygraph.map.json` for the scanner and Waygraph UI).
3
+ import { spawnSync } from "node:child_process";
4
+ import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
5
+ import { createRequire } from "node:module";
6
+ import { dirname, join, relative, resolve, sep } from "node:path";
7
+ import { fileURLToPath } from "node:url";
8
+ import { findMapGroup, mapGroups } from "./maps.js";
9
+ import { mapGroupImportProblems } from "./map-imports.js";
10
+ import { MANIFEST_VERSION } from "./manifest.js";
11
+ import { scanProject } from "./project.js";
12
+ import { walkDir } from "./scan.js";
13
+ function waygraphVersion() {
14
+ const pkg = join(dirname(fileURLToPath(import.meta.url)), "..", "..", "package.json");
15
+ return JSON.parse(readFileSync(pkg, "utf8")).version;
16
+ }
17
+ function compile(projectDir, group, out) {
18
+ let tsc;
19
+ try {
20
+ tsc = createRequire(join(projectDir, "package.json")).resolve("typescript/bin/tsc");
21
+ }
22
+ catch {
23
+ return "TypeScript is not installed in this project (npm i -D typescript)";
24
+ }
25
+ const base = join(projectDir, "tsconfig.json");
26
+ const config = join(out, "tsconfig.pack.json");
27
+ writeFileSync(config, JSON.stringify({
28
+ ...(existsSync(base) ? { extends: base } : {}),
29
+ compilerOptions: {
30
+ ...(existsSync(base) ? {} : { target: "ES2022", module: "NodeNext", moduleResolution: "NodeNext", strict: true, skipLibCheck: true }),
31
+ noEmit: false,
32
+ declaration: true,
33
+ rootDir: group.dir,
34
+ outDir: out,
35
+ },
36
+ include: [join(group.dir, "**", "*.ts")],
37
+ exclude: [],
38
+ }, null, 2));
39
+ const run = spawnSync(process.execPath, [tsc, "-p", config], { cwd: projectDir, encoding: "utf8" });
40
+ rmSync(config, { force: true });
41
+ if (run.status !== 0)
42
+ return `tsc failed:\n${run.stdout}${run.stderr}`;
43
+ return undefined;
44
+ }
45
+ /** Packs a map group (by `(external)/hoppscotch` or `hoppscotch`) into an installable package folder. */
46
+ export async function packMapGroup(projectDir, groupName, opts = {}) {
47
+ const group = findMapGroup(projectDir, groupName);
48
+ if (!group) {
49
+ const known = mapGroups(projectDir).map((g) => g.group);
50
+ return {
51
+ ok: false,
52
+ reason: `no map group "${groupName}" (a src/map/ folder with its own _states.ts)${known.length ? `; groups: ${known.join(", ")}` : ""}`,
53
+ };
54
+ }
55
+ const problems = mapGroupImportProblems(group);
56
+ if (problems.length > 0)
57
+ return { ok: false, reason: `${group.group} imports files outside the group`, problems };
58
+ const slug = group.group.split("/").pop().replace(/[()]/g, "");
59
+ const name = opts.name ?? `waygraph-map-${slug}`;
60
+ const out = resolve(projectDir, opts.out ?? join(".waygraph", "packages", slug));
61
+ rmSync(out, { recursive: true, force: true });
62
+ mkdirSync(out, { recursive: true });
63
+ const failed = compile(projectDir, group, out);
64
+ if (failed)
65
+ return { ok: false, reason: failed };
66
+ const scan = await scanProject(projectDir, { flows: false, maps: false });
67
+ const blocks = scan.blocks.filter((b) => b.absFile.startsWith(group.dir + sep));
68
+ const checkpoints = new Set();
69
+ for (const b of blocks)
70
+ for (const t of [...b.from, ...b.to])
71
+ if (t !== "*")
72
+ checkpoints.add(t);
73
+ const map = {
74
+ version: MANIFEST_VERSION,
75
+ name,
76
+ group: group.group,
77
+ checkpoints: [...checkpoints].sort(),
78
+ blocks: blocks.map((b) => ({
79
+ name: b.name,
80
+ exportName: b.exportName,
81
+ kind: b.kind,
82
+ from: b.from,
83
+ to: b.to,
84
+ requires: b.requires,
85
+ file: relative(group.dir, b.absFile).split(sep).join("/").replace(/\.ts$/, ".js"),
86
+ })),
87
+ };
88
+ writeFileSync(join(out, "waygraph.map.json"), JSON.stringify(map, null, 2) + "\n");
89
+ const modules = walkDir(out, /\.js$/)
90
+ .map((f) => "./" + relative(out, f).split(sep).join("/"))
91
+ .filter((f) => f !== "./index.js")
92
+ .sort();
93
+ const index = modules.map((m) => `export * from "${m}";`).join("\n") + "\n";
94
+ writeFileSync(join(out, "index.js"), index);
95
+ writeFileSync(join(out, "index.d.ts"), index);
96
+ writeFileSync(join(out, "package.json"), JSON.stringify({
97
+ name,
98
+ version: opts.version ?? "0.1.0",
99
+ description: `waygraph map: ${group.group}`,
100
+ type: "module",
101
+ main: "./index.js",
102
+ types: "./index.d.ts",
103
+ exports: { ".": { types: "./index.d.ts", default: "./index.js" }, "./*": "./*" },
104
+ files: ["**/*.js", "**/*.d.ts", "waygraph.map.json"],
105
+ keywords: ["waygraph", "waygraph-map"],
106
+ peerDependencies: { waygraph: `^${waygraphVersion()}` },
107
+ }, null, 2) + "\n");
108
+ return { ok: true, name, dir: out, group: group.group, blocks: blocks.length };
109
+ }
@@ -0,0 +1,60 @@
1
+ import type { BlocksSelect } from "./select.js";
2
+ import type { AnyBlock } from "./scan.js";
3
+ export type BlockKind = "nav" | "page" | "assert" | "method" | "effect" | "api" | "block";
4
+ export interface ScannedBlock {
5
+ block: AnyBlock;
6
+ name: string;
7
+ exportName: string;
8
+ kind: BlockKind;
9
+ description: string;
10
+ /** Checkpoint tags it runs from (`"*"` = anywhere) and lands on. Empty `to` = route unknown (see `skipped`). */
11
+ from: string[];
12
+ to: string[];
13
+ requires: string[];
14
+ /** Project-relative path; Blocks from an injected library are tagged `@label/...`. */
15
+ file: string;
16
+ absFile: string;
17
+ /** The installed map package it came from (its `file` is then `<package>/<path>`). */
18
+ map?: string;
19
+ }
20
+ export interface ScannedFlow {
21
+ flow: {
22
+ run: (...args: unknown[]) => Promise<unknown>;
23
+ blocks: () => unknown[];
24
+ };
25
+ exportName: string;
26
+ file: string;
27
+ absFile: string;
28
+ }
29
+ /** A Block as the live menus (auto, pilot) hold it: navigation or action. */
30
+ export interface BlockEntry {
31
+ block: AnyBlock;
32
+ exportName: string;
33
+ file: string;
34
+ kind: "nav" | "action";
35
+ description: string;
36
+ }
37
+ export interface ProjectScan {
38
+ projectDir: string;
39
+ blocks: ScannedBlock[];
40
+ flows: ScannedFlow[];
41
+ skipped: {
42
+ block: string;
43
+ file: string;
44
+ reason: string;
45
+ }[];
46
+ }
47
+ export interface ScanOptions {
48
+ blocksSelect?: BlocksSelect | undefined;
49
+ inject?: string[] | undefined;
50
+ /** Also import `*.flow.ts` files. Default true. */
51
+ flows?: boolean;
52
+ /** Also scan installed map packages (dependencies with a `waygraph.map.json`). Default true. */
53
+ maps?: boolean;
54
+ /** Called when a file fails to import (default: a one-line warning for Playwright double-install errors). */
55
+ onImportError?: (relFile: string, err: unknown) => void;
56
+ }
57
+ /** A file that fails to import is left out of the scan, and said so: a silent skip reads as "nothing there". */
58
+ export declare function reportImportError(relFile: string, err: unknown): void;
59
+ /** Imports every `*.block.ts` (and `*.flow.ts`) under the project and its injected roots. */
60
+ export declare function scanProject(projectDir: string, opts?: ScanOptions): Promise<ProjectScan>;