waygraph 0.15.54 → 0.16.1

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 (552) 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/cli/commands/browser.d.ts +2 -0
  21. package/dist/cli/commands/browser.js +109 -0
  22. package/dist/{commands → cli/commands}/check.d.ts +0 -1
  23. package/dist/cli/commands/check.js +104 -0
  24. package/dist/cli/commands/codemod-checkpoints.d.ts +18 -0
  25. package/dist/cli/commands/codemod-checkpoints.js +186 -0
  26. package/dist/cli/commands/codemod-flows.d.ts +18 -0
  27. package/dist/cli/commands/codemod-flows.js +284 -0
  28. package/dist/cli/commands/codemod-stubs.d.ts +10 -0
  29. package/dist/cli/commands/codemod-stubs.js +187 -0
  30. package/dist/{commands → cli/commands}/extensions.js +5 -4
  31. package/dist/{commands → cli/commands}/init.js +1 -2
  32. package/dist/{commands → cli/commands}/list.js +9 -7
  33. package/dist/cli/commands/manifest.d.ts +2 -0
  34. package/dist/cli/commands/manifest.js +20 -0
  35. package/dist/cli/commands/map.js +57 -0
  36. package/dist/cli/commands/pilot.d.ts +2 -0
  37. package/dist/cli/commands/pilot.js +102 -0
  38. package/dist/{commands → cli/commands}/run.d.ts +0 -1
  39. package/dist/cli/commands/run.js +64 -0
  40. package/dist/cli/commands/session-ops.d.ts +3 -0
  41. package/dist/cli/commands/session-ops.js +257 -0
  42. package/dist/cli/commands/session.js +132 -0
  43. package/dist/{commands → cli/commands}/test.js +11 -14
  44. package/dist/cli/commands/traverse.js +105 -0
  45. package/dist/{commands → cli/commands}/try.js +29 -25
  46. package/dist/{commands → cli/commands}/upgrade.js +40 -4
  47. package/dist/cli/flags.d.ts +193 -16
  48. package/dist/cli/flags.js +179 -234
  49. package/dist/cli/run-chain.d.ts +1 -0
  50. package/dist/cli/run-chain.js +42 -7
  51. package/dist/cli/usage.d.ts +1 -1
  52. package/dist/cli/usage.js +21 -53
  53. package/dist/cli/util.d.ts +2 -2
  54. package/dist/cli/util.js +2 -3
  55. package/dist/{highlights → demo/narration}/css.d.ts +1 -1
  56. package/dist/{highlights → demo/narration}/css.js +2 -3
  57. package/dist/{highlights → demo/narration}/demo-pace.d.ts +4 -12
  58. package/dist/{highlights → demo/narration}/demo-pace.js +5 -11
  59. package/dist/{highlights → demo/narration}/device.d.ts +4 -4
  60. package/dist/{highlights → demo/narration}/device.js +1 -1
  61. package/dist/demo/narration/merge.d.ts +10 -0
  62. package/dist/demo/narration/merge.js +67 -0
  63. package/dist/demo/narration/narration.d.ts +39 -0
  64. package/dist/{highlights/run-phase.js → demo/narration/narration.js} +25 -94
  65. package/dist/{highlights → demo/narration}/shorthand.d.ts +1 -1
  66. package/dist/demo/narration/stub-ctx.d.ts +8 -0
  67. package/dist/demo/narration/stub-ctx.js +164 -0
  68. package/dist/{highlights → demo/narration}/style.d.ts +1 -7
  69. package/dist/{highlights → demo/narration}/style.js +1 -41
  70. package/dist/{highlights → demo/narration}/todo-dock.d.ts +8 -8
  71. package/dist/{highlights → demo/narration}/todo-dock.js +13 -30
  72. package/dist/demo/overlay/auto-chrome.d.ts +7 -0
  73. package/dist/demo/overlay/auto-chrome.js +97 -0
  74. package/dist/demo/overlay/cursor.d.ts +19 -0
  75. package/dist/demo/overlay/cursor.js +142 -0
  76. package/dist/demo/overlay/device-stage.d.ts +26 -0
  77. package/dist/demo/overlay/device-stage.js +396 -0
  78. package/dist/demo/overlay/inpage/banner.d.ts +2 -0
  79. package/dist/demo/overlay/inpage/banner.js +160 -0
  80. package/dist/demo/overlay/inpage/caption.d.ts +2 -0
  81. package/dist/demo/overlay/inpage/caption.js +24 -0
  82. package/dist/demo/overlay/inpage/core.d.ts +2 -0
  83. package/dist/demo/overlay/inpage/core.js +345 -0
  84. package/dist/demo/overlay/inpage/device-chip.d.ts +1 -0
  85. package/dist/demo/overlay/inpage/device-chip.js +191 -0
  86. package/dist/demo/overlay/inpage/network.d.ts +10 -0
  87. package/dist/demo/overlay/inpage/network.js +189 -0
  88. package/dist/demo/overlay/inpage/panel-chrome.d.ts +1 -0
  89. package/dist/demo/overlay/inpage/panel-chrome.js +203 -0
  90. package/dist/demo/overlay/inpage/stamp.d.ts +1 -0
  91. package/dist/demo/overlay/inpage/stamp.js +46 -0
  92. package/dist/demo/overlay/inpage/swipe-zoom.d.ts +1 -0
  93. package/dist/demo/overlay/inpage/swipe-zoom.js +220 -0
  94. package/dist/demo/overlay/inpage/todos.d.ts +2 -0
  95. package/dist/demo/overlay/inpage/todos.js +293 -0
  96. package/dist/demo/overlay/locator-theater.d.ts +25 -0
  97. package/dist/demo/overlay/locator-theater.js +76 -0
  98. package/dist/demo/overlay/network-capture.d.ts +22 -0
  99. package/dist/demo/overlay/network-capture.js +127 -0
  100. package/dist/demo/overlay/overlay-css.d.ts +3 -0
  101. package/dist/demo/overlay/overlay-css.js +369 -0
  102. package/dist/demo/overlay/overlay-stage.d.ts +31 -0
  103. package/dist/demo/overlay/overlay-stage.js +106 -0
  104. package/dist/demo/overlay/overlay.d.ts +10 -0
  105. package/dist/demo/overlay/overlay.js +89 -0
  106. package/dist/{pilot-overlay/overlay-fixtures.d.ts → demo/overlay/phase-fixtures.d.ts} +2 -2
  107. package/dist/{pilot-overlay/overlay-fixtures.js → demo/overlay/phase-fixtures.js} +2 -2
  108. package/dist/{pilot-overlay/action-ring.js → demo/overlay/pilot/actions.js} +2 -1
  109. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.d.ts +6 -5
  110. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.js +19 -18
  111. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.d.ts +2 -2
  112. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.js +13 -22
  113. package/dist/demo/overlay/reattach.d.ts +7 -0
  114. package/dist/demo/overlay/reattach.js +23 -0
  115. package/dist/demo/overlay/rings.d.ts +61 -0
  116. package/dist/demo/overlay/rings.js +422 -0
  117. package/dist/{ui → demo/overlay/ui}/components/ring.js +2 -2
  118. package/dist/{ui → demo/overlay/ui}/overlay.css +4 -4
  119. package/dist/{ui → demo/overlay/ui}/shadow.d.ts +1 -1
  120. package/dist/{ui → demo/overlay/ui}/shadow.js +39 -2
  121. package/dist/demo/stepper/after.d.ts +3 -0
  122. package/dist/demo/stepper/after.js +103 -0
  123. package/dist/demo/stepper/banner-log.d.ts +35 -0
  124. package/dist/demo/stepper/banner-log.js +65 -0
  125. package/dist/demo/stepper/before.d.ts +4 -0
  126. package/dist/demo/stepper/before.js +110 -0
  127. package/dist/demo/stepper/demo-log.d.ts +48 -0
  128. package/dist/demo/stepper/demo-log.js +292 -0
  129. package/dist/demo/stepper/gate.d.ts +11 -0
  130. package/dist/demo/stepper/gate.js +78 -0
  131. package/dist/demo/stepper/interaction-patch.d.ts +4 -0
  132. package/dist/demo/stepper/interaction-patch.js +323 -0
  133. package/dist/demo/stepper/pacing.d.ts +21 -0
  134. package/dist/demo/stepper/pacing.js +23 -0
  135. package/dist/demo/stepper/panel-after.d.ts +17 -0
  136. package/dist/demo/stepper/panel-after.js +166 -0
  137. package/dist/demo/stepper/panel-before.d.ts +12 -0
  138. package/dist/demo/stepper/panel-before.js +241 -0
  139. package/dist/demo/stepper/slides.d.ts +23 -0
  140. package/dist/demo/stepper/slides.js +233 -0
  141. package/dist/demo/stepper/step-panels.d.ts +69 -0
  142. package/dist/demo/stepper/step-panels.js +172 -0
  143. package/dist/demo/stepper/stepper.d.ts +24 -0
  144. package/dist/demo/stepper/stepper.js +122 -0
  145. package/dist/demo/stepper/teardown.d.ts +47 -0
  146. package/dist/demo/stepper/teardown.js +178 -0
  147. package/dist/demo/stepper/todo-advance.d.ts +15 -0
  148. package/dist/demo/stepper/todo-advance.js +110 -0
  149. package/dist/demo/stepper/view.d.ts +58 -0
  150. package/dist/demo/stepper/view.js +31 -0
  151. package/dist/demo/types.d.ts +85 -0
  152. package/dist/demo/verbose-log.js +15 -0
  153. package/dist/engine/block/action-page.d.ts +53 -0
  154. package/dist/engine/block/action-page.js +1 -0
  155. package/dist/{types.d.ts → engine/block/block.d.ts} +102 -142
  156. package/dist/{core → engine/block}/block.js +12 -130
  157. package/dist/engine/block/branch.d.ts +17 -0
  158. package/dist/engine/block/branch.js +40 -0
  159. package/dist/{core → engine/block}/compose.d.ts +9 -7
  160. package/dist/{core → engine/block}/compose.js +1 -1
  161. package/dist/engine/block/dialog.d.ts +13 -0
  162. package/dist/engine/block/dialog.js +37 -0
  163. package/dist/{core/blocks → engine/block/kinds}/api.d.ts +16 -12
  164. package/dist/{core/blocks → engine/block/kinds}/api.js +26 -18
  165. package/dist/{core/blocks → engine/block/kinds}/effect.d.ts +13 -18
  166. package/dist/engine/block/kinds/effect.js +17 -0
  167. package/dist/{core/blocks → engine/block/kinds}/method.d.ts +17 -29
  168. package/dist/{core/blocks → engine/block/kinds}/method.js +6 -21
  169. package/dist/{core/blocks → engine/block/kinds}/nav.d.ts +21 -31
  170. package/dist/{core/blocks → engine/block/kinds}/nav.js +6 -12
  171. package/dist/{core/blocks → engine/block/kinds}/page.d.ts +14 -20
  172. package/dist/{core/blocks → engine/block/kinds}/page.js +5 -7
  173. package/dist/engine/checkpoint/checkpoint.d.ts +22 -0
  174. package/dist/engine/checkpoint/checkpoint.js +8 -0
  175. package/dist/engine/checkpoint/route.d.ts +28 -0
  176. package/dist/engine/checkpoint/route.js +28 -0
  177. package/dist/{core → engine}/config.d.ts +7 -2
  178. package/dist/engine/config.js +6 -0
  179. package/dist/engine/engine.d.ts +45 -0
  180. package/dist/{core → engine}/engine.js +6 -10
  181. package/dist/engine/env.d.ts +59 -0
  182. package/dist/engine/env.js +83 -0
  183. package/dist/{errors.d.ts → engine/errors.d.ts} +22 -22
  184. package/dist/{errors.js → engine/errors.js} +22 -22
  185. package/dist/{core → engine/flow}/branch-regression.d.ts +7 -7
  186. package/dist/{core → engine/flow}/branch-regression.js +4 -3
  187. package/dist/engine/flow/flow.d.ts +162 -0
  188. package/dist/engine/flow/flow.js +244 -0
  189. package/dist/engine/flow/map-branch.d.ts +9 -0
  190. package/dist/engine/flow/map-branch.js +57 -0
  191. package/dist/{core → engine/flow}/map-builder.d.ts +34 -54
  192. package/dist/engine/flow/map-builder.js +242 -0
  193. package/dist/engine/flow/map-steps.d.ts +30 -0
  194. package/dist/engine/flow/map-steps.js +87 -0
  195. package/dist/{core → engine}/locate.d.ts +1 -1
  196. package/dist/{core → engine}/locate.js +1 -2
  197. package/dist/{mem-stub.d.ts → engine/mem/mem-stub.d.ts} +9 -8
  198. package/dist/{mem-stub.js → engine/mem/mem-stub.js} +2 -2
  199. package/dist/{mem-page.d.ts → engine/mem/mem.d.ts} +1 -1
  200. package/dist/{mem-page.js → engine/mem/mem.js} +2 -1
  201. package/dist/engine/page-gone.d.ts +5 -0
  202. package/dist/engine/page-gone.js +20 -0
  203. package/dist/engine/run/connect.d.ts +28 -0
  204. package/dist/{types.js → engine/run/connect.js} +11 -10
  205. package/dist/engine/run/events.d.ts +67 -0
  206. package/dist/engine/run/events.js +90 -0
  207. package/dist/engine/run/hooks.d.ts +16 -0
  208. package/dist/engine/run/hooks.js +8 -0
  209. package/dist/engine/run/launch.d.ts +13 -0
  210. package/dist/engine/run/launch.js +27 -0
  211. package/dist/{core/run-graph.d.ts → engine/run/run.d.ts} +8 -12
  212. package/dist/{core/run-graph.js → engine/run/run.js} +22 -12
  213. package/dist/engine/stub/pace.d.ts +12 -0
  214. package/dist/engine/stub/pace.js +2 -0
  215. package/dist/engine/stub/ring.d.ts +130 -0
  216. package/dist/engine/stub/ring.js +41 -0
  217. package/dist/engine/stub/stub.d.ts +268 -0
  218. package/dist/engine/stub/stub.js +1 -0
  219. package/dist/engine/stub/todos.d.ts +104 -0
  220. package/dist/engine/stub/todos.js +2 -0
  221. package/dist/engine/stub/viewport.d.ts +26 -0
  222. package/dist/engine/stub/viewport.js +2 -0
  223. package/dist/{trait.d.ts → engine/trait/trait.d.ts} +1 -1
  224. package/dist/{trait.js → engine/trait/trait.js} +1 -1
  225. package/dist/index.d.ts +88 -36
  226. package/dist/index.js +46 -19
  227. package/dist/live/auto/auto.d.ts +22 -0
  228. package/dist/live/auto/auto.js +207 -0
  229. package/dist/{session/auto-explore.d.ts → live/auto/explore.d.ts} +4 -14
  230. package/dist/{session/auto-explore.js → live/auto/explore.js} +21 -127
  231. package/dist/live/auto/mem.d.ts +11 -0
  232. package/dist/live/auto/mem.js +85 -0
  233. package/dist/live/auto/menu.d.ts +30 -0
  234. package/dist/live/auto/menu.js +335 -0
  235. package/dist/live/auto-session/auto-session.d.ts +113 -0
  236. package/dist/live/auto-session/auto-session.js +452 -0
  237. package/dist/live/auto-session/console.d.ts +4 -0
  238. package/dist/live/auto-session/console.js +41 -0
  239. package/dist/live/auto-session/files.d.ts +44 -0
  240. package/dist/live/auto-session/files.js +145 -0
  241. package/dist/{auto-session → live/auto-session}/helpers.d.ts +9 -5
  242. package/dist/{auto-session → live/auto-session}/helpers.js +18 -1
  243. package/dist/live/auto-session/inspect.d.ts +4 -0
  244. package/dist/live/auto-session/inspect.js +75 -0
  245. package/dist/{session/auto-session-ipc.d.ts → live/auto-session/ipc.d.ts} +8 -25
  246. package/dist/{session/auto-session-ipc.js → live/auto-session/ipc.js} +36 -161
  247. package/dist/live/auto-session/open-browser.d.ts +6 -0
  248. package/dist/live/auto-session/open-browser.js +47 -0
  249. package/dist/{session/browser.d.ts → live/auto-session/start.d.ts} +1 -2
  250. package/dist/{session/browser.js → live/auto-session/start.js} +2 -3
  251. package/dist/{pilot-overlay → live/pilot}/panel.d.ts +1 -1
  252. package/dist/{pilot-overlay → live/pilot}/panel.js +23 -31
  253. package/dist/{session → live/pilot}/pilot.d.ts +3 -3
  254. package/dist/{session → live/pilot}/pilot.js +5 -4
  255. package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +1 -1
  256. package/dist/live/traverse/traverse.js +212 -0
  257. package/dist/live/traverse/worker.d.ts +37 -0
  258. package/dist/live/traverse/worker.js +200 -0
  259. package/dist/manifest/manifest.d.ts +52 -0
  260. package/dist/manifest/manifest.js +93 -0
  261. package/dist/manifest/map-imports.d.ts +7 -0
  262. package/dist/manifest/map-imports.js +22 -0
  263. package/dist/manifest/maps.d.ts +33 -0
  264. package/dist/manifest/maps.js +62 -0
  265. package/dist/manifest/pack.d.ts +21 -0
  266. package/dist/manifest/pack.js +109 -0
  267. package/dist/manifest/project.d.ts +60 -0
  268. package/dist/manifest/project.js +101 -0
  269. package/dist/{session/block-inject.js → manifest/roots.js} +1 -18
  270. package/dist/manifest/scan.d.ts +19 -0
  271. package/dist/manifest/scan.js +57 -0
  272. package/dist/manifest/source.d.ts +23 -0
  273. package/dist/manifest/source.js +86 -0
  274. package/dist/runner/mode.d.ts +71 -0
  275. package/dist/runner/mode.js +1 -0
  276. package/dist/runner/modes/branches.d.ts +5 -0
  277. package/dist/runner/modes/branches.js +37 -0
  278. package/dist/runner/modes/demo.d.ts +3 -0
  279. package/dist/runner/modes/demo.js +13 -0
  280. package/dist/runner/modes/report.d.ts +2 -0
  281. package/dist/runner/modes/report.js +54 -0
  282. package/dist/runner/modes/run.d.ts +2 -0
  283. package/dist/runner/modes/run.js +3 -0
  284. package/dist/runner/options.d.ts +31 -0
  285. package/dist/runner/options.js +42 -0
  286. package/dist/runner/plan/find.d.ts +18 -0
  287. package/dist/runner/plan/find.js +65 -0
  288. package/dist/runner/plan/plan.d.ts +11 -0
  289. package/dist/runner/plan/plan.js +97 -0
  290. package/dist/runner/plan/seed-mem.d.ts +12 -0
  291. package/dist/runner/plan/seed-mem.js +98 -0
  292. package/dist/runner/plan/spec.d.ts +5 -0
  293. package/dist/runner/plan/spec.js +17 -0
  294. package/dist/runner/play-steps.d.ts +2 -0
  295. package/dist/runner/play-steps.js +59 -0
  296. package/dist/runner/runner.d.ts +4 -0
  297. package/dist/runner/runner.js +64 -0
  298. package/dist/runner/session.d.ts +9 -0
  299. package/dist/runner/session.js +87 -0
  300. package/dist/{browser.js → runtime/browser.js} +4 -2
  301. package/dist/{env-file.js → runtime/env-file.js} +7 -12
  302. package/dist/{extensions.d.ts → runtime/extensions.d.ts} +1 -5
  303. package/dist/{extensions.js → runtime/extensions.js} +2 -1
  304. package/dist/runtime/full-launch.d.ts +1 -0
  305. package/dist/runtime/full-launch.js +34 -0
  306. package/dist/runtime/global-flag.d.ts +5 -0
  307. package/dist/runtime/global-flag.js +18 -0
  308. package/dist/{playwright-config.d.ts → runtime/playwright-config.d.ts} +1 -1
  309. package/dist/{playwright.config.js → runtime/playwright.config.js} +3 -2
  310. package/dist/runtime/run-log.d.ts +2 -0
  311. package/dist/runtime/run-log.js +17 -0
  312. package/dist/{video-dir.js → runtime/video-dir.js} +3 -2
  313. package/dist/{config.d.ts → runtime/waygraph-config.d.ts} +6 -9
  314. package/dist/{config.js → runtime/waygraph-config.js} +21 -51
  315. package/dist/{webserver.js → runtime/webserver.js} +5 -30
  316. package/examples/routed-demo/config/waygraph.config.ts +20 -0
  317. package/examples/routed-demo/package.json +1 -4
  318. package/examples/routed-demo/scripts/fixture-server.mjs +1 -1
  319. package/examples/routed-demo/src/flows/routed-demo-map.flow.ts +2 -4
  320. package/examples/routed-demo/src/flows/routed-demo.flow.ts +1 -2
  321. package/examples/routed-demo/src/map/(app_base)/dashboard/_methods/click-widget.block.ts +5 -4
  322. package/examples/routed-demo/src/map/(app_base)/dashboard/_nav.block.ts +3 -3
  323. package/examples/routed-demo/src/map/(app_base)/dashboard/_page.block.ts +3 -3
  324. package/examples/routed-demo/src/map/(external)/docs/_nav.block.ts +3 -3
  325. package/examples/routed-demo/src/map/(external)/docs/_page.block.ts +3 -3
  326. package/examples/routed-demo/src/states/routed-demo.states.ts +5 -3
  327. package/examples/routed-demo/tests/routed-demo.spec.ts +4 -4
  328. package/examples/routed-demo/tsconfig.json +1 -1
  329. package/examples/saucedemo/docs/CONVENTION.md +4 -5
  330. package/examples/saucedemo/docs/HELPERS.md +11 -11
  331. package/examples/saucedemo/src/blocks/SITE-MAP.md +0 -1
  332. package/examples/saucedemo/src/blocks/saucedemo-web/NAV.md +1 -5
  333. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
  334. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  335. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  336. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  337. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  338. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  339. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
  340. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
  341. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  342. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
  343. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  344. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  345. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  346. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  347. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  348. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  349. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
  350. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
  351. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
  352. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  353. package/examples/saucedemo/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  354. package/examples/saucedemo/src/flows/api-demo.flow.ts +12 -10
  355. package/examples/saucedemo/src/states/checkout.states.ts +21 -11
  356. package/examples/saucedemo/src/stubs/device-showcase.ts +8 -10
  357. package/examples/saucedemo/tests/auto-graph.spec.ts +4 -12
  358. package/package.json +14 -6
  359. package/templates/agents/waygraph-planner.agent.md +2 -2
  360. package/templates/quickstart/docs/CONVENTION.md +4 -4
  361. package/templates/quickstart/docs/HELPERS.md +10 -8
  362. package/templates/quickstart/package.json +0 -3
  363. package/templates/quickstart/src/blocks/SITE-MAP.md +0 -1
  364. package/templates/quickstart/src/blocks/saucedemo-web/NAV.md +1 -5
  365. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
  366. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  367. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  368. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  369. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  370. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  371. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
  372. package/templates/quickstart/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
  373. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  374. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
  375. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  376. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  377. package/templates/quickstart/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  378. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  379. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  380. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  381. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
  382. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
  383. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
  384. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  385. package/templates/quickstart/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  386. package/templates/quickstart/src/flows/api-demo.flow.ts +12 -10
  387. package/templates/quickstart/src/states/checkout.states.ts +21 -11
  388. package/templates/quickstart/src/stubs/device-showcase.ts +8 -10
  389. package/templates/scaffold/README.md +2 -1
  390. package/templates/scaffold/STRUCTURE.md +5 -4
  391. package/templates/scaffold/config/waygraph.config.ts +1 -0
  392. package/templates/scaffold/gitignore +1 -0
  393. package/templates/scaffold/src/flows/README.md +2 -2
  394. package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +3 -3
  395. package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +3 -3
  396. package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -4
  397. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +3 -3
  398. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +3 -3
  399. package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +5 -4
  400. package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +4 -4
  401. package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -3
  402. package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +3 -3
  403. package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +4 -4
  404. package/templates/scaffold/src/map/(external)/hoppscotch/_keys.ts +21 -0
  405. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +4 -4
  406. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +4 -4
  407. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +4 -4
  408. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +5 -4
  409. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +6 -5
  410. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +6 -5
  411. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +5 -4
  412. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +6 -5
  413. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +6 -5
  414. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +6 -5
  415. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +6 -5
  416. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +6 -5
  417. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +6 -5
  418. package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +3 -3
  419. package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +3 -3
  420. package/templates/scaffold/src/map/(external)/hoppscotch/_states.ts +6 -0
  421. package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +3 -3
  422. package/templates/scaffold/src/map/(external)/mailpit/_keys.ts +13 -0
  423. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +4 -4
  424. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +4 -4
  425. package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +6 -5
  426. package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +6 -5
  427. package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +3 -3
  428. package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +3 -3
  429. package/templates/scaffold/src/map/(external)/mailpit/_states.ts +9 -0
  430. package/templates/scaffold/src/map/README.md +7 -0
  431. package/templates/scaffold/src/states/README.md +4 -1
  432. package/templates/scaffold/src/states/demo.mem-keys.ts +1 -29
  433. package/templates/scaffold/src/states/demo.states.ts +14 -20
  434. package/templates/scaffold/tests/hoppscotch.spec.ts +1 -11
  435. package/templates/scaffold/tests/mail-verify.spec.ts +2 -2
  436. package/templates/skills/waygraph-blind-pilot.skill.md +2 -6
  437. package/templates/skills/waygraph-convention.skill.md +23 -14
  438. package/templates/skills/waygraph-pilot.skill.md +7 -4
  439. package/dist/auto-session/session.d.ts +0 -193
  440. package/dist/auto-session/session.js +0 -719
  441. package/dist/auto-session/verbose-log.js +0 -16
  442. package/dist/auto-session.d.ts +0 -2
  443. package/dist/auto-session.js +0 -3
  444. package/dist/cli/discover.d.ts +0 -40
  445. package/dist/cli/discover.js +0 -148
  446. package/dist/commands/agent-dive.js +0 -52
  447. package/dist/commands/check.js +0 -192
  448. package/dist/commands/map.js +0 -29
  449. package/dist/commands/run.js +0 -104
  450. package/dist/commands/session.js +0 -600
  451. package/dist/commands/traverse.js +0 -177
  452. package/dist/core/block.d.ts +0 -109
  453. package/dist/core/blocks/effect.js +0 -23
  454. package/dist/core/config.js +0 -17
  455. package/dist/core/engine.d.ts +0 -198
  456. package/dist/core/flow.d.ts +0 -294
  457. package/dist/core/flow.js +0 -432
  458. package/dist/core/map-builder.js +0 -383
  459. package/dist/core.d.ts +0 -14
  460. package/dist/core.js +0 -15
  461. package/dist/highlights/merge.d.ts +0 -8
  462. package/dist/highlights/merge.js +0 -173
  463. package/dist/highlights/run-phase.d.ts +0 -43
  464. package/dist/highlights/stub-ctx.d.ts +0 -10
  465. package/dist/highlights/stub-ctx.js +0 -331
  466. package/dist/highlights/types.d.ts +0 -613
  467. package/dist/highlights.d.ts +0 -9
  468. package/dist/highlights.js +0 -10
  469. package/dist/pilot-overlay.d.ts +0 -5
  470. package/dist/pilot-overlay.js +0 -6
  471. package/dist/runner/banner-log.js +0 -63
  472. package/dist/runner/chain-run.js +0 -102
  473. package/dist/runner/cursor.js +0 -140
  474. package/dist/runner/demo-log.js +0 -316
  475. package/dist/runner/device-stage.d.ts +0 -9
  476. package/dist/runner/device-stage.js +0 -420
  477. package/dist/runner/discovery.js +0 -105
  478. package/dist/runner/index.js +0 -2
  479. package/dist/runner/inpage/banner.d.ts +0 -21
  480. package/dist/runner/inpage/banner.js +0 -156
  481. package/dist/runner/inpage/caption.d.ts +0 -3
  482. package/dist/runner/inpage/caption.js +0 -23
  483. package/dist/runner/inpage/core.d.ts +0 -4
  484. package/dist/runner/inpage/core.js +0 -316
  485. package/dist/runner/inpage/device.d.ts +0 -3
  486. package/dist/runner/inpage/device.js +0 -211
  487. package/dist/runner/inpage/network.d.ts +0 -15
  488. package/dist/runner/inpage/network.js +0 -217
  489. package/dist/runner/inpage/panel-chrome.js +0 -192
  490. package/dist/runner/inpage/stamp.js +0 -46
  491. package/dist/runner/inpage/swipe-zoom.js +0 -220
  492. package/dist/runner/inpage/todos.js +0 -337
  493. package/dist/runner/interaction-patch.js +0 -384
  494. package/dist/runner/main.js +0 -469
  495. package/dist/runner/network-capture.d.ts +0 -9
  496. package/dist/runner/network-capture.js +0 -126
  497. package/dist/runner/overlay-css.d.ts +0 -3
  498. package/dist/runner/overlay-css.js +0 -377
  499. package/dist/runner/overlay-install.js +0 -90
  500. package/dist/runner/overlay-stage.js +0 -110
  501. package/dist/runner/rings.js +0 -514
  502. package/dist/runner/seed-mem.js +0 -110
  503. package/dist/runner/slides.js +0 -278
  504. package/dist/runner/step-mode.js +0 -703
  505. package/dist/runner/step-panels.js +0 -729
  506. package/dist/runner/teardown.js +0 -202
  507. package/dist/runner/todo-dock.js +0 -142
  508. package/dist/session/auto-explore-run.d.ts +0 -40
  509. package/dist/session/auto-explore-run.js +0 -707
  510. package/dist/session/step-overlay.d.ts +0 -37
  511. package/dist/session/step-overlay.js +0 -244
  512. package/dist/traverse/run.js +0 -423
  513. package/examples/routed-demo/playwright.config.ts +0 -21
  514. package/examples/saucedemo/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  515. package/templates/quickstart/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  516. /package/dist/{commands → cli/commands}/agent-dive-scaffold.d.ts +0 -0
  517. /package/dist/{commands → cli/commands}/agent-dive.d.ts +0 -0
  518. /package/dist/{commands → cli/commands}/extensions.d.ts +0 -0
  519. /package/dist/{commands → cli/commands}/init.d.ts +0 -0
  520. /package/dist/{commands → cli/commands}/list.d.ts +0 -0
  521. /package/dist/{commands → cli/commands}/map.d.ts +0 -0
  522. /package/dist/{commands → cli/commands}/session.d.ts +0 -0
  523. /package/dist/{commands → cli/commands}/test.d.ts +0 -0
  524. /package/dist/{commands → cli/commands}/traverse.d.ts +0 -0
  525. /package/dist/{commands → cli/commands}/try.d.ts +0 -0
  526. /package/dist/{commands → cli/commands}/upgrade.d.ts +0 -0
  527. /package/dist/{highlights → demo/narration}/shorthand.js +0 -0
  528. /package/dist/{session/overlay-beacon.d.ts → demo/overlay/beacon.d.ts} +0 -0
  529. /package/dist/{session/overlay-beacon.js → demo/overlay/beacon.js} +0 -0
  530. /package/dist/{pilot-overlay/action-ring.d.ts → demo/overlay/pilot/actions.d.ts} +0 -0
  531. /package/dist/{ui → demo/overlay/ui}/components/ring.d.ts +0 -0
  532. /package/dist/{ui → demo/overlay/ui}/stylesheet.d.ts +0 -0
  533. /package/dist/{ui → demo/overlay/ui}/stylesheet.js +0 -0
  534. /package/dist/{ui → demo/overlay/ui}/tokens.d.ts +0 -0
  535. /package/dist/{ui → demo/overlay/ui}/tokens.js +0 -0
  536. /package/dist/{highlights → demo}/types.js +0 -0
  537. /package/dist/{auto-session → demo}/verbose-log.d.ts +0 -0
  538. /package/dist/{selector.d.ts → engine/trait/selector.d.ts} +0 -0
  539. /package/dist/{selector.js → engine/trait/selector.js} +0 -0
  540. /package/dist/{traverse → live/traverse}/coverage.d.ts +0 -0
  541. /package/dist/{traverse → live/traverse}/coverage.js +0 -0
  542. /package/dist/{traverse → live/traverse}/lease.d.ts +0 -0
  543. /package/dist/{traverse → live/traverse}/lease.js +0 -0
  544. /package/dist/{session/block-inject.d.ts → manifest/roots.d.ts} +0 -0
  545. /package/dist/{blocks-select.d.ts → manifest/select.d.ts} +0 -0
  546. /package/dist/{blocks-select.js → manifest/select.js} +0 -0
  547. /package/dist/{browser.d.ts → runtime/browser.d.ts} +0 -0
  548. /package/dist/{env-file.d.ts → runtime/env-file.d.ts} +0 -0
  549. /package/dist/{playwright-config.js → runtime/playwright-config.js} +0 -0
  550. /package/dist/{playwright.config.d.ts → runtime/playwright.config.d.ts} +0 -0
  551. /package/dist/{video-dir.d.ts → runtime/video-dir.d.ts} +0 -0
  552. /package/dist/{webserver.d.ts → runtime/webserver.d.ts} +0 -0
@@ -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>;
@@ -0,0 +1,101 @@
1
+ // Scans a project (and any injected Block libraries) into its Blocks and Flows, with each Block's route.
2
+ import { relative } from "node:path";
3
+ import { matchBlocksSelect } from "./select.js";
4
+ import { exploreRoots, injectTaggedFile } from "./roots.js";
5
+ import { blockKind, importFresh, isBlockLike, isFlowLike, walkDir } from "./scan.js";
6
+ import { installedMapPackages, mapPackageBlockFiles } from "./maps.js";
7
+ function kindOf(block) {
8
+ const kind = blockKind(block);
9
+ if (kind === "nav" || kind === "page" || kind === "assert" || kind === "api")
10
+ return kind;
11
+ const salt = block.__waygraphSalt;
12
+ if (salt === "effect" || salt === "method" || salt === "api")
13
+ return salt;
14
+ return "block";
15
+ }
16
+ /** A file that fails to import is left out of the scan, and said so: a silent skip reads as "nothing there". */
17
+ export function reportImportError(relFile, err) {
18
+ const msg = err instanceof Error ? err.message : String(err);
19
+ console.error(`waygraph: skip ${relFile}: ${msg.split("\n")[0]}`);
20
+ }
21
+ /** Imports every `*.block.ts` (and `*.flow.ts`) under the project and its injected roots. */
22
+ export async function scanProject(projectDir, opts = {}) {
23
+ const select = opts.blocksSelect;
24
+ const onError = opts.onImportError ?? reportImportError;
25
+ const blocks = [];
26
+ const flows = [];
27
+ const skipped = [];
28
+ const scanBlockFile = async (absFile, rel, file, map) => {
29
+ let mod;
30
+ try {
31
+ mod = await importFresh(absFile);
32
+ }
33
+ catch (err) {
34
+ onError(rel, err);
35
+ return;
36
+ }
37
+ for (const [exportName, exported] of Object.entries(mod)) {
38
+ if (!isBlockLike(exported))
39
+ continue;
40
+ if (select && !matchBlocksSelect(select, { relFile: file, blockName: exported.name }))
41
+ continue;
42
+ const marked = exported;
43
+ const from = marked.__waygraphFrom ?? [];
44
+ const to = marked.__waygraphTo ?? [];
45
+ // Every factory records a route; only a bare defineBlock has none.
46
+ if (to.length === 0)
47
+ skipped.push({ block: exported.name, file, reason: "no route: build it with a define*Block factory and Checkpoint values" });
48
+ blocks.push({
49
+ block: exported,
50
+ name: exported.name,
51
+ exportName,
52
+ kind: kindOf(exported),
53
+ description: typeof exported.description === "string" ? exported.description : "",
54
+ from: [...from],
55
+ to: [...to],
56
+ requires: (exported.requires ?? []).map((k) => k.name),
57
+ file,
58
+ absFile,
59
+ ...(map ? { map } : {}),
60
+ });
61
+ }
62
+ };
63
+ for (const root of exploreRoots(projectDir, opts.inject)) {
64
+ let files = walkDir(root, /\.block\.ts$/);
65
+ if (select && select.kind !== "regex") {
66
+ files = files.filter((f) => matchBlocksSelect(select, { relFile: relative(root, f).replace(/\\/g, "/") }));
67
+ }
68
+ for (const absFile of files) {
69
+ const rel = relative(root, absFile).replace(/\\/g, "/");
70
+ await scanBlockFile(absFile, rel, injectTaggedFile(projectDir, root, rel));
71
+ }
72
+ if (opts.flows === false)
73
+ continue;
74
+ for (const absFile of walkDir(root, /\.flow\.ts$/)) {
75
+ const rel = relative(root, absFile).replace(/\\/g, "/");
76
+ let mod;
77
+ try {
78
+ mod = await importFresh(absFile);
79
+ }
80
+ catch (err) {
81
+ onError(rel, err);
82
+ continue;
83
+ }
84
+ for (const [exportName, exported] of Object.entries(mod)) {
85
+ if (isFlowLike(exported))
86
+ flows.push({ flow: exported, exportName, file: injectTaggedFile(projectDir, root, rel), absFile });
87
+ }
88
+ }
89
+ }
90
+ if (opts.maps !== false) {
91
+ for (const pkg of installedMapPackages(projectDir)) {
92
+ for (const absFile of mapPackageBlockFiles(pkg)) {
93
+ const rel = relative(pkg.dir, absFile).replace(/\\/g, "/");
94
+ if (select && select.kind !== "regex" && !matchBlocksSelect(select, { relFile: `${pkg.name}/${rel}` }))
95
+ continue;
96
+ await scanBlockFile(absFile, rel, `${pkg.name}/${rel}`, pkg.name);
97
+ }
98
+ }
99
+ }
100
+ return { projectDir, blocks, flows, skipped };
101
+ }
@@ -5,12 +5,9 @@
5
5
  import { existsSync } from "node:fs";
6
6
  import { basename, dirname, join, resolve } from "node:path";
7
7
  import { fileURLToPath } from "node:url";
8
- import { homedir } from "node:os";
9
8
  /**
10
9
  * This package's own installed root (contains `templates/`/`examples/`, sibling to `dist/`) -
11
- * this file compiles to `dist/session/block-inject.js`, two levels down, not one. Same class of
12
- * bug as `cli/util.ts`'s own `packageRoot()` (see its comment) - self-inflicted here by moving
13
- * this file into `src/session/` without updating the path math to match the new depth.
10
+ * this file compiles to `dist/manifest/roots.js`, two levels down.
14
11
  */
15
12
  function packageRoot() {
16
13
  return resolve(dirname(fileURLToPath(import.meta.url)), "..", "..");
@@ -32,20 +29,6 @@ export function injectTaggedFile(hostDir, root, relFile) {
32
29
  }
33
30
  const PRESETS = {
34
31
  saucedemo: () => join(packageRoot(), "examples", "saucedemo"),
35
- demosauce: () => join(packageRoot(), "examples", "saucedemo"),
36
- veciro: () => {
37
- if (process.env.WAYGRAPH_INJECT_VECIRO) {
38
- return resolve(process.env.WAYGRAPH_INJECT_VECIRO);
39
- }
40
- for (const c of [
41
- join(homedir(), "Desktop", "Work", "veciro-waygraph"),
42
- join(homedir(), "Desktop", "Projects", "veciro-waygraph"),
43
- ]) {
44
- if (existsSync(c))
45
- return c;
46
- }
47
- return null;
48
- },
49
32
  };
50
33
  /**
51
34
  * Resolve one `--inject` token to an absolute directory (preset name or path).
@@ -0,0 +1,19 @@
1
+ import type { Block } from "../engine/block/block.js";
2
+ import type { Checkpoint } from "../engine/checkpoint/checkpoint.js";
3
+ /** Every file under `dir` whose name matches, skipping `node_modules`, `dist` and `.git`. */
4
+ export declare function walkDir(dir: string, pattern: RegExp): string[];
5
+ /**
6
+ * Imports a project file. The file's mtime is part of the URL: Node caches an ESM import per specifier for the life of the
7
+ * process, so a long-running session reloading an edited Block would otherwise keep the first version.
8
+ */
9
+ export declare function importFresh(filePath: string): Promise<Record<string, unknown>>;
10
+ export type AnyBlock = Block<Checkpoint<string>, Checkpoint<string>> & {
11
+ description?: string;
12
+ };
13
+ export declare function isBlockLike(val: unknown): val is AnyBlock;
14
+ export declare function isFlowLike(val: unknown): val is {
15
+ run: (...args: unknown[]) => Promise<unknown>;
16
+ blocks: () => unknown[];
17
+ };
18
+ /** The factory kind a Block was built with (`nav`, `page`, `assert`), or undefined for Methods and Effects. */
19
+ export declare function blockKind(block: object): string | undefined;