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,15 @@
1
1
  // waygraph-ignore: empty-verify (confirmed by AssertEmailContentBlock right after it in mail-verify.flow.ts)
2
- import { defineMethodBlock, checkpoint } from "waygraph";
3
- import type { MailpitInbox, MailpitMessageOpen } from "../../../../states/demo.states.js";
4
- import { ExpectedRecipient } from "../../../../states/demo.mem-keys.js";
2
+ import { defineMethodBlock } from "waygraph";
3
+ import { MailpitInbox, MailpitMessageOpen } from "../_states.js";
4
+ import { ExpectedRecipient } from "../_keys.js";
5
5
  import { MailpitSel } from "../_sel.js";
6
6
 
7
7
  /** Opens the newest message for the expected recipient (matched by email, not position). */
8
- export const OpenMessageBlock = defineMethodBlock<MailpitInbox, MailpitMessageOpen>({
8
+ export const OpenMessageBlock = defineMethodBlock({
9
9
  name: "open-message",
10
10
  description: "Opens the newest message addressed to the expected recipient.",
11
+ from: MailpitInbox,
12
+ to: MailpitMessageOpen,
11
13
  requires: [ExpectedRecipient.key],
12
14
  instruction: {
13
15
  async act(page, _in, mem) {
@@ -25,6 +27,5 @@ export const OpenMessageBlock = defineMethodBlock<MailpitInbox, MailpitMessageOp
25
27
  timeout: 15_000,
26
28
  });
27
29
  },
28
- resolve: () => checkpoint("MailpitMessageOpen"),
29
30
  },
30
31
  });
@@ -1,12 +1,12 @@
1
1
  import { defineNavBlock, Trait } from "waygraph";
2
- import type { MailpitInbox } from "../../../states/demo.states.js";
2
+ import { MailpitInbox } from "./_states.js";
3
3
 
4
4
  // Cross-origin, so it lives under (external)/ and the URL is a function.
5
5
  const mailpitUrl = (): string => process.env.WAYGRAPH_MAIL_URL ?? "http://127.0.0.1:8025";
6
6
 
7
- export const NavMailpitInboxBlock = defineNavBlock<MailpitInbox>({
7
+ export const NavMailpitInboxBlock = defineNavBlock({
8
8
  name: "nav-mailpit-inbox",
9
- checkpoint: "MailpitInbox",
9
+ checkpoint: MailpitInbox,
10
10
  url: mailpitUrl,
11
11
  verify: [Trait.url({ pathname: "/" })],
12
12
  });
@@ -1,14 +1,14 @@
1
1
  import { definePageBlock, Trait } from "waygraph";
2
- import type { MailpitInbox } from "../../../states/demo.states.js";
2
+ import { MailpitInbox } from "./_states.js";
3
3
  import { AssertEmailReceivedBlock } from "./_methods/assert-email-received.method.block.js";
4
4
  import { OpenMessageBlock } from "./_methods/open-message.method.block.js";
5
5
  import { AssertEmailContentBlock } from "./_methods/assert-email-content.method.block.js";
6
6
  import { ExtractEmailLinkBlock } from "./_methods/extract-email-link.method.block.js";
7
7
 
8
- export const MailpitInboxPageBlock = definePageBlock<MailpitInbox>({
8
+ export const MailpitInboxPageBlock = definePageBlock({
9
9
  name: "page-mailpit-inbox",
10
10
  description: "Mailpit dev inbox hub - confirm arrival/content, open the expected message, read its link.",
11
- checkpoint: "MailpitInbox",
11
+ checkpoint: MailpitInbox,
12
12
  verify: [Trait.url({ pathname: "/" })],
13
13
  methods: {
14
14
  assertEmailReceived: () => AssertEmailReceivedBlock,
@@ -0,0 +1,9 @@
1
+ import { checkpoint } from "waygraph";
2
+
3
+ /** Mailpit inbox UI reached; message list visible. */
4
+ export const MailpitInbox = checkpoint("MailpitInbox");
5
+ export type MailpitInbox = typeof MailpitInbox;
6
+
7
+ /** The message addressed to the expected recipient is open; preview iframe visible. */
8
+ export const MailpitMessageOpen = checkpoint("MailpitMessageOpen");
9
+ export type MailpitMessageOpen = typeof MailpitMessageOpen;
@@ -24,6 +24,13 @@ real URL. `waygraph map`/`waygraph check` fail loudly if a page folder's real UR
24
24
  matching its own name - that's the point of this layout: drift becomes a build failure, not a
25
25
  silent surprise months later.
26
26
 
27
+ ## A group that owns its states: a map package
28
+
29
+ A folder with its own `_states.ts` (and `_keys.ts`), like `(external)/hoppscotch/`, is a self-contained map: its files
30
+ import only `waygraph` and each other (`waygraph check` warns otherwise). `waygraph map pack hoppscotch` compiles it into
31
+ `.waygraph/packages/hoppscotch` - publish that, `npm i` it in another project, and its Blocks show up there in `graph`,
32
+ `auto`, the manifest and flows (`import { SetUrlBlock } from "waygraph-map-hoppscotch"`).
33
+
27
34
  ## Adding a page
28
35
 
29
36
  Copy an existing page folder, keep the four fixed names, update `_nav`/`_page`/`_sel` for the
@@ -3,7 +3,7 @@
3
3
  Checkpoint types and Mem keys - the typed vocabulary every Block in `src/map/` is written
4
4
  against. Nothing here drives the browser; this is pure data shape.
5
5
 
6
- - `*.states.ts` - `type X = Checkpoint<"X">` declarations. One per real app state
6
+ - `*.states.ts` - Checkpoint values: `export const X = checkpoint("X"); export type X = typeof X;`. One per real app state
7
7
  (`LoginPage`, `LoggedIn`), never `Checkpoint<string>` (a wildcard - `waygraph check` warns
8
8
  on it; a Block should say exactly which states it moves between).
9
9
  - `*.mem-keys.ts` - `key<T>("...")` / `keyGroup<T>("...")` declarations. A Mem key stores a
@@ -13,3 +13,6 @@ against. Nothing here drives the browser; this is pure data shape.
13
13
 
14
14
  Add a new Checkpoint or Mem key here before writing the Block that needs it - Blocks import
15
15
  from this directory, this directory never imports from `src/map/`.
16
+
17
+ A tool on another origin (`src/map/(external)/mailpit/`, `.../hoppscotch/`) keeps its own Checkpoints and keys in its
18
+ folder (`_states.ts`, `_keys.ts`) instead, so the folder can be packed and reused: `waygraph map pack mailpit`.
@@ -1,32 +1,4 @@
1
- import { key, keyGroup } from "waygraph";
1
+ import { keyGroup } from "waygraph";
2
2
 
3
3
  /** The catalog row `add-item` / `remove-item` act on; `waygraph auto` fills it from `instanceOptions`. */
4
4
  export const SelectedItem = keyGroup<{ id: string; name: string }>("demo.selectedItem");
5
-
6
- /** The link read out of the opened message - set by extract-email-link. */
7
- export const EmailLink = keyGroup<{ url: string }>("demo.emailLink");
8
-
9
- /** Matched by email, not inbox position, so one inbox can hold several recipients' mail. */
10
- export const ExpectedRecipient = keyGroup<{ email: string }>("demo.expectedRecipient");
11
-
12
- /** Substring the link's `href` must contain; mem varies per scenario, the Blocks do not. */
13
- export const ExpectedLinkPattern = key<string>("demo.expectedLinkPattern");
14
-
15
- /** Substring the open message's body must contain. */
16
- export const ExpectedEmailContent = key<string>("demo.expectedEmailContent");
17
-
18
- export const RequestMethod = key<string>("demo.requestMethod");
19
- export const RequestUrl = key<string>("demo.requestUrl");
20
- export const RequestHeaders = key<Record<string, string>>("demo.requestHeaders");
21
- export const RequestParams = key<Record<string, string>>("demo.requestParams");
22
- export const RequestBearerToken = key<string>("demo.requestBearerToken");
23
- /** Raw JSON text typed into the request body editor. */
24
- export const RequestBody = key<string>("demo.requestBody");
25
- export const ExpectedStatus = key<number>("demo.expectedStatus");
26
- /** Substring the response body must contain. */
27
- export const ExpectedResponseText = key<string>("demo.expectedResponseText");
28
- /** The raw response body, set by read-response-body. */
29
- export const ResponseBody = key<string>("demo.responseBody");
30
- /** Response headers (lower-cased names), set by read-response-headers. */
31
- export const ResponseHeaders = key<Record<string, string>>("demo.responseHeaders");
32
- export const ExpectedResponseHeader = keyGroup<{ name: string; value: string }>("demo.expectedResponseHeader");
@@ -1,23 +1,17 @@
1
- import type { Checkpoint } from "waygraph";
1
+ import { checkpoint } from "waygraph";
2
2
 
3
- export type Home = Checkpoint<"Home">;
4
- export type HomeVerified = Checkpoint<"HomeVerified">;
5
- export type ItemInCart = Checkpoint<"ItemInCart">;
6
- export type CartEmpty = Checkpoint<"CartEmpty">;
7
- /** Anywhere an item can be added from: fresh on Home, or after the cart was emptied. */
8
- export type CanAddItem = Home | CartEmpty;
9
-
10
- // --- Mailpit (external tool surface, src/map/(external)/mailpit/) ---
11
-
12
- /** Mailpit inbox UI reached; message list visible. */
13
- export type MailpitInbox = Checkpoint<"MailpitInbox">;
3
+ export const Home = checkpoint("Home");
4
+ export type Home = typeof Home;
5
+ export const HomeVerified = checkpoint("HomeVerified");
6
+ export type HomeVerified = typeof HomeVerified;
7
+ export const ItemInCart = checkpoint("ItemInCart");
8
+ export type ItemInCart = typeof ItemInCart;
9
+ export const CartEmpty = checkpoint("CartEmpty");
10
+ export type CartEmpty = typeof CartEmpty;
14
11
 
15
- /** The message addressed to the expected recipient is open; preview iframe visible. */
16
- export type MailpitMessageOpen = Checkpoint<"MailpitMessageOpen">;
17
-
18
- // --- Hoppscotch (external API client, src/map/(external)/hoppscotch/) ---
19
-
20
- export type HoppscotchSettings = Checkpoint<"HoppscotchSettings">;
21
- export type HoppscotchRest = Checkpoint<"HoppscotchRest">;
12
+ /** Anywhere an item can be added from: fresh on Home, or after the cart was emptied. */
13
+ export const CanAddItem = [Home, CartEmpty] as const;
14
+ export type CanAddItem = (typeof CanAddItem)[number];
22
15
 
23
- export type Docs = Checkpoint<"Docs">;
16
+ export const Docs = checkpoint("Docs");
17
+ export type Docs = typeof Docs;
@@ -5,17 +5,7 @@ import config from "../config/waygraph.config.js";
5
5
  import { hoppscotchGetFlow } from "../src/flows/(external)/hoppscotch/get.flow.js";
6
6
  import { hoppscotchAuthFlow } from "../src/flows/(external)/hoppscotch/auth.flow.js";
7
7
  import { hoppscotchPostFlow } from "../src/flows/(external)/hoppscotch/post.flow.js";
8
- import {
9
- ExpectedResponseHeader,
10
- ExpectedResponseText,
11
- ExpectedStatus,
12
- RequestBearerToken,
13
- RequestBody,
14
- RequestHeaders,
15
- RequestMethod,
16
- RequestParams,
17
- RequestUrl,
18
- } from "../src/states/demo.mem-keys.js";
8
+ import { ExpectedResponseHeader, ExpectedResponseText, ExpectedStatus, RequestBearerToken, RequestBody, RequestHeaders, RequestMethod, RequestParams, RequestUrl } from "../src/map/(external)/hoppscotch/_keys.js";
19
9
 
20
10
  // The API under test: no CORS headers, so only the extension can reach it from hoppscotch.io.
21
11
  let server: Server;
@@ -3,7 +3,7 @@ import { spawnSync } from "node:child_process";
3
3
  import net from "node:net";
4
4
  import { MemPage, checkpoint } from "waygraph";
5
5
  import { emailVerificationFlow } from "../src/flows/(user-stories)/email-verification.flow.js";
6
- import { ExpectedRecipient, ExpectedLinkPattern, ExpectedEmailContent } from "../src/states/demo.mem-keys.js";
6
+ import { ExpectedRecipient, ExpectedLinkPattern, ExpectedEmailContent } from "../src/map/(external)/mailpit/_keys.js";
7
7
  import { HOME_URL } from "../src/map/(app_base)/home/_sel.js";
8
8
 
9
9
  // Plays "the app sent a verification email": starts a throwaway Mailpit container, sends a real SMTP message,
@@ -144,7 +144,7 @@ test("assert-email-received fails loud, naming itself, when no email ever arrive
144
144
  mem.set(ExpectedRecipient({ email: "nobody-sent-this-one@example.com" }));
145
145
  mem.set(ExpectedLinkPattern, "verified=1");
146
146
  mem.set(ExpectedEmailContent, VERIFICATION_CONTENT);
147
- // A defineFlow chain's verify-failure error names the whole path taken so
147
+ // A flow's verify-failure error names the whole path taken so
148
148
  // far (each composed Block's own name accumulates through connect()),
149
149
  // not just the leaf Block - real, useful QA context, not a bug - so this
150
150
  // matches the accumulated name ending at assert-email-received, not an
@@ -52,12 +52,8 @@ Session control works as `browser …` or `auto …` with the same `<sessionId>`
52
52
  Block file can simply vanish from the graph with no error printed anywhere obvious - if a
53
53
  Block you just wrote doesn't show up after `browser reload`, check `waygraph graph`'s own
54
54
  `skipped` list and the file's syntax directly, don't assume it just needs more time.
55
- - **`defineAssertBlock` needs no `<In, Out>` generic to type-check** (`checkpoint: "X"` alone
56
- is enough for TypeScript to infer it) - but older/naive static-graph discovery logic may
57
- rely on parsing an explicit generic from source text. If a freshly-written
58
- `defineAssertBlock` Block is missing from `waygraph graph`'s edges (silently, no error),
59
- check whether this package's own `graph.ts` has the matching-marker fix for it, or add an
60
- explicit generic type argument as a workaround.
55
+ - **Pass Checkpoint values** (`checkpoint: X`, `from: X, to: Y`) so a freshly-written Block shows up in the graph from its
56
+ runtime route. The graph reads routes at runtime, never from source text.
61
57
  - **A `<p>`/text-based selector often needs scoping**, not just a class name - a sibling
62
58
  "chat list item" and "message preview" frequently share the exact same CSS classes in real
63
59
  apps, distinguished only by DOM position (first vs second child of a specific wrapper).
@@ -45,13 +45,15 @@ against a live site, use `--skill-pilot-blind`.
45
45
  hand-supplied every time, `registerMemStub(key, fake)` + `memStub: true` on the flow (or
46
46
  `--mem-stub`) fills it from a registry instead - a key with no registration still fails
47
47
  preflight exactly as before, so this narrows what needs real input, never removes the guard.
48
- 6. **Keep Checkpoints typed.** Block helpers take concrete Checkpoint types from `src/states/`
49
- (e.g. `defineMethodBlock<LoginPage, LoggedIn>`). A Block's **output** must never be
50
- `Checkpoint<string>` — `waygraph check` / `waygraph typecheck` warn. When a Block runs from a
51
- few known states, name them as a union in `src/states/` (`type CanAddItem = Home | CartEmpty`);
52
- a `Checkpoint<string>` **input** is only for a Block that's genuinely reachable from anywhere.
53
- Same for `defineAssertBlock({…})` without an explicit type arg — use
54
- `defineAssertBlock<YourCheckpoint>({…})`.
48
+ Put those `registerMemStub` calls in a `*.mem-stubs.ts` file (`src/states/demo.mem-stubs.ts`): live sessions (`auto`,
49
+ `pilot`, `traverse`) load every one and use them as the default for a Block's `requires`.
50
+ 6. **Checkpoints are values.** Declare each once in `src/states/`: `export const Home = checkpoint("Home");
51
+ export type Home = typeof Home;` (a union: `export const CanAddItem = [Home, CartEmpty] as const`). Blocks take
52
+ the values, never tag strings or `<In, Out>` type arguments: `defineNavBlock({ checkpoint: Home, … })`,
53
+ `defineAssertBlock({ checkpoint: ItemInCart, … })`, `defineMethodBlock({ from: CanAddItem, to: ItemInCart, … })`
54
+ (leave `from` out for "from anywhere"; `resolve` is implied when `to` is one Checkpoint). The Block then carries its
55
+ route at runtime, so `waygraph graph`, `auto` and the manifest read it exactly. Older projects:
56
+ `waygraph upgrade --codemod checkpoints`.
55
57
  7. **One input/action per Method Block.** No block that `.fill()`s two fields or `.fill()` + `.click()` in one
56
58
  `act()` — split like saucedemo login (`fill-username`, `fill-password`, `submit-login`). Opt out per file:
57
59
  `// waygraph-ignore: multi-input` or `// waygraph-ignore-practices`.
@@ -69,22 +71,23 @@ against a live site, use `--skill-pilot-blind`.
69
71
  ## Flows, stubs and config (the scaffold's shape)
70
72
 
71
73
  - **Build flows with `map()`** (`engine.map({ memStub }).start().gotoPage(Nav).method(B, { pace }).assert(A).end()`;
72
- `.gotoExternal` for another origin), never a raw `defineFlow([start, ...])`. Flow settings (`memStub`, `expectedFailure`, `demoPace`, `sessionReset`) go in `map({ … })` before the chain
73
- and `.end()` takes nothing. The flow's title is `ctx.title(...)` in a stub. **Nest flows with `.flow(sub, { reset: true })`**,
74
- not `chainFlow` / `withSessionReset`. No `withMemStub(withTitle(...))` wrappers.
74
+ `.gotoExternal` for another origin); it is the only way to build one. Flow settings (`memStub`, `expectedFailure`, `demoPace`, `sessionReset`) go in `map({ … })` before the chain
75
+ and `.end()` takes nothing. The flow's title is `ctx.title(...)` in a stub. **Nest flows with `.flow(sub, { reset: true })`**.
76
+ `defineFlow`, `chainFlow` and the `with*` flow wrappers were removed in 0.16.0; `waygraph upgrade --codemod flows` converts them.
75
77
  - **`src/flows/` holds use cases and mirrors the front end's endpoints**: a folder per page (`flows/auth/login/`) with one
76
78
  file per scenario named for its outcome (`success.flow.ts`, `wrong-password.flow.ts`, `empty-fields.flow.ts`), and
77
79
  `(user-stories)/` (any `(group)`) for flows that cross pages. Export names are `<page><Outcome>Flow`. Not one file per
78
80
  Block chain, not a flat folder of unrelated flows.
79
81
  - **Blocks carry no stubs; the flow does.** Demo highlights are ctx stubs chained on the Block where the flow uses it:
80
82
  `AddItemBlock.stubAfter((ctx) => { ctx.ring("cart", { selector: DemoSel.cartCount, label: "AC · item in cart" }); })`.
81
- Not a static `withHighlightFixtures({ "add-item": { stubAfter: {...} } })` map, and not an inline
82
- `instruction: { stubAfter() {} }`. A Block used twice gets one `const AddShown = AddItemBlock.stubAfter(...)`.
83
+ That chained function is the only form: a Block's definition (its options or `instruction`) takes no stub, and a stub
84
+ is never a slot map. A Block used twice gets one `const AddShown = AddItemBlock.stubAfter(...)`. A stub that throws
85
+ fails its step in the demo, named.
83
86
  - **Reading a value into `mem` happens in `act`** (`mem.set(Key, value)`), like Mailpit's `extract-email-link`.
84
87
  `observe` is only for a Block that branches (it feeds `resolve`); an empty `act(){}` plus an `observe` that
85
88
  writes `mem` is a misuse.
86
89
  - **Demo pace is a map option or config, never a wrapper.** `.method(SetBearerTokenBlock, { pace: "blitz" })` speeds one step,
87
- `map({ demoPace: "fast" })` a flow, `demo: { pace, typingMs, slowMo }` in the config the whole project. Not `withBlockPace(...)`.
90
+ `map({ demoPace: "fast" })` a flow, `demo: { pace, typingMs, slowMo }` in the config the whole project.
88
91
  - **Per-environment values** (a different `baseUrl` for staging) come from `.env` files read in the config function:
89
92
  `defineConfig(({ env }) => ({ baseUrl: env.BASE_URL }))`; `--env staging` loads `.env.staging`. Never edit the config to switch.
90
93
  - **More than one config** (staging, another app) is another file, `config/waygraph.<name>.config.ts`, chosen with `--config <name>`.
@@ -93,7 +96,7 @@ against a live site, use `--skill-pilot-blind`.
93
96
  Block's `act`; the click Block stays a plain click.
94
97
  - **Project settings live in `config/waygraph.config.ts`** (`defineConfig({ baseUrl, testDir, webServer,
95
98
  extensions, playwright: {...} })`). The config file also exports `engine = new Engine(config)`; flows `import { engine } from "../../config/waygraph.config.js"`; a project needs no
96
- `playwright.config.ts` - `waygraph test` builds one from it. A leftover `playwright.config.*` is deprecated.
99
+ `playwright.config.ts` - `waygraph test` builds one from it (a project's own `playwright.config.*` is not read).
97
100
  - **Another origin the test needs is a Map external** under `src/map/(external)/<tool>/`. For REST API
98
101
  tests, `(external)/hoppscotch` (list `extensions: ["hoppscotch"]` in the config) drives hoppscotch.io's client
99
102
  with the extension, so requests skip CORS: `set-method`, `set-url`, `set-headers`, `set-json-body`,
@@ -110,6 +113,7 @@ against a live site, use `--skill-pilot-blind`.
110
113
  | Effect | `*.effect.block.ts` in `methods/` / `_methods/` | `defineEffectBlock` | No |
111
114
  | Method | `*.method.block.ts` in `methods/` / `_methods/` | `defineMethodBlock` | No |
112
115
  | Assert | with Method/Effect peers | `defineAssertBlock` | No |
116
+ | API | `*.api.block.ts` in `methods/` | `defineApiBlock({ from, to, call })` (a real HTTP request; `map().method(...)`) | No |
113
117
 
114
118
  Effects that appear in `waygraph auto` menus need `instanceOptions` that scan the live DOM
115
119
  (or mem) for labeled rows.
@@ -165,9 +169,14 @@ npx waygraph check --no-practices . # skip bad-practice scan only
165
169
  npx waygraph map . # exit 1 if src/map/ folder path != real static url
166
170
  npx waygraph validate . # every .flow.ts loads
167
171
  npx waygraph graph . # nodes/edges/skipped/orphans - counts should make sense
172
+ npx waygraph manifest . # JSON of every Block (kind, from/to, requires), Flow and Checkpoint
173
+ npx waygraph map pack <group> # a src/map/ group with its own _states.ts/_keys.ts -> installable package
168
174
  npm run typecheck # when the consumer has it
169
175
  ```
170
176
 
177
+ Every `run`/`demo`/`test` also writes `.waygraph/runs/<runId>.jsonl` (step start/end/error, artifacts): read the
178
+ newest one to see which Block failed and with what error, instead of re-running.
179
+
171
180
  `waygraph check` should report zero nav warnings. Orphan Blocks (not in any `.flow.ts`)
172
181
  are still runnable in Pilot's live menu - orphan status only blocks
173
182
  `auto --blocks <From> <To>` pathfinding.
@@ -50,6 +50,11 @@ waygraph auto highlight <sessionId> '<json>' # paint rings/todos on the live pa
50
50
  just what's reachable from here - use it to plan several steps ahead before you start
51
51
  sending picks.
52
52
 
53
+ A Block's `requires` are filled from `--data '{...}'` first, then from the project's mem stubs: the session loads
54
+ every `*.mem-stubs.ts` and uses each `registerMemStub` fake as that key's default. A start URL that can't be opened
55
+ (server down, DNS) fails `browser start` / `pilot start` with the reason; it never starts a blank session silently.
56
+ An unknown flag is an error, not a project path.
57
+
53
58
  ## Bad practices (`waygraph check` / `waygraph typecheck`)
54
59
 
55
60
  Run `waygraph typecheck .` (or `npm run typecheck`) — runs `tsc --noEmit` then bad-practice warnings.
@@ -58,8 +63,6 @@ Use `--no-practices` on either command to skip the practice scan.
58
63
 
59
64
  Patterns warned (does not fail `check`; fails `typecheck` only when `tsc` fails):
60
65
 
61
- - **`Checkpoint<string>` as a Block's output** — e.g. `defineMethodBlock<…, Checkpoint<string>>` instead of a project Checkpoint type from `src/states/` (a wildcard *input* means "reachable from anywhere" and is allowed).
62
- - **`defineAssertBlock({…})` without an explicit type arg** — use `defineAssertBlock<YourCheckpoint>({…})` so `defineFlow` typing stays honest.
63
66
  - **Multiple `.fill()` in one Method** — split into one Block per input (fill-username, fill-password, …).
64
67
  - **`.fill()` + `.click()` in one Method** — split fill and submit into separate Blocks.
65
68
 
@@ -105,7 +108,7 @@ thing that differs from demo is *who* triggers the paint:
105
108
  | Mode | Who paints | How |
106
109
  |------|------------|-----|
107
110
  | `waygraph demo` | Engine, automatically | ctx stubs chained in the flow run each step |
108
- | Pilot / `auto --detach` | **You (the agent)** | `waygraph auto highlight <sessionId> '<json>'` before (or between) sends |
111
+ | Pilot / `browser start` session | **You (the agent)** | `waygraph auto highlight <sessionId> '<json>'` before (or between) sends |
109
112
 
110
113
  The ctx stubs a flow chains onto Blocks show up in Pilot's `auto trace` as metadata, but they do **not**
111
114
  auto-draw. You re-express the same intent with `auto highlight` (copy selectors/labels from the flow's stubs or
@@ -133,7 +136,7 @@ waygraph auto highlight <sessionId> '{"clear":true}'
133
136
  Supported fields (demo parity):
134
137
  - `rings[]`: `selector`, `label`, `detail`, `tag`, `tone`, `size`, `weight`, `color`, `zoom`, `zoomOut`, `focus`
135
138
  - `todos` / `todoIndex` / `todoTitle` / `todoPos` (`right` default | `left`)
136
- - `todoUi`: `{ compact?, cap?, expandCap?, collision?, behindRing? }` — same dock UX as demo (defaults smart-on; see docs/REFERENCE.md "Todo dock UI")
139
+ - `todoUi`: `{ compact?, cap?, expandCap?, collision?, behindRing? }` — same dock UX as demo (defaults smart-on; see docs/reference/cli.md "Todo dock UI")
137
140
  - `zoom` / `zoomSelector` / `zoomOut` - scroll + zoom badge (not CSS page scale)
138
141
  - `device`: `mobile` | `tablet` | `desktop` (Playwright viewport)
139
142
  - `holdMs`: ms to keep fixtures; `0` = until the next highlight / clear (default 30000)
@@ -1,16 +0,0 @@
1
- /**
2
- * One log format for every overlay surface (demo / auto / browser / pilot): `waygraph <surface>: ...`
3
- * with a `HH:MM:SS.mmm` prefix, same shape as `runner/demo-log.js`'s (demo stays on the JS copy since
4
- * it runs in the target project's own process; this one is for TS-side code — pilot/auto/browser —
5
- * that can't import a plain .js runner module). Silenced by WAYGRAPH_JSON=1, same convention as demo.
6
- */
7
- function ts() {
8
- const d = new Date();
9
- const p = (n) => String(n).padStart(2, "0");
10
- return `${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())}.${String(d.getMilliseconds()).padStart(3, "0")}`;
11
- }
12
- export function verboseLog(surface, msg) {
13
- if (process.env.WAYGRAPH_JSON === "1")
14
- return;
15
- console.log(`[${ts()}] waygraph ${surface}: ${msg}`);
16
- }
@@ -1,2 +0,0 @@
1
- export * from "./auto-session/helpers.js";
2
- export * from "./auto-session/session.js";
@@ -1,3 +0,0 @@
1
- // Barrel: auto-session lives in src/auto-session/ (see src/ARCHITECTURE.md). Kept so existing imports of "./auto-session.js" don't change.
2
- export * from "./auto-session/helpers.js";
3
- export * from "./auto-session/session.js";
@@ -1,40 +0,0 @@
1
- export declare function walkDir(dir: string, pattern: RegExp): string[];
2
- export declare function discoverFlows(projectDir: string): string[];
3
- export declare function extractFlowNames(filePath: string): string[];
4
- /** `LoginBlock` -> `"login"`; `OverviewMetricsBlock` -> `"overview-metrics"`. */
5
- export declare function blockExportToLabel(exportId: string): string;
6
- /** Every `...Block` identifier a `.flow.ts` file imports, in source order. */
7
- export declare function parseBlockImports(filePath: string): string[];
8
- /** Every `page.goto("...")` string literal in a file, in source order. */
9
- export declare function extractGotos(filePath: string): string[];
10
- /** Every `Trait.url({ pathname: "..." })` target in a file, in source order. */
11
- export declare function extractUrlTraits(filePath: string): string[];
12
- export declare function importModule(filePath: string): Promise<Record<string, unknown>>;
13
- /** Kept as a named alias - `run`/`validate` below were written against this name first. */
14
- export declare const importFlowFile: typeof importModule;
15
- export declare function isFlowLike(val: unknown): val is {
16
- run: (...args: unknown[]) => Promise<unknown>;
17
- };
18
- export declare function discoverBlocks(projectDir: string): string[];
19
- export declare function isBlockLike(val: unknown): val is {
20
- name: string;
21
- instruction: {
22
- act: unknown;
23
- };
24
- };
25
- /** Set by `defineNavBlock` (non-enumerable) - see src/core.ts. */
26
- export declare function isNavBlockMarked(val: Record<string, unknown>): boolean;
27
- export declare const NAV_METHOD_CALLS: readonly ["page.goto(", "page.reload(", "page.goBack(", "page.goForward("];
28
- /**
29
- * Matches a selector-taking Trait factory call whose first argument is a
30
- * literal string/template, not an identifier or property access - the exact
31
- * shape found repeatedly in hand-written assertion Blocks
32
- * (`Trait.visible("#some-id")` instead of `Trait.visible(SomeSel.thing)`).
33
- * `Trait.url(...)` is deliberately excluded - it takes a URLPatternInit, never
34
- * a DOM selector. Same file-scoped-regex bluntness the nav-escape sweep above
35
- * already accepts (see openspec/specs/nav-block-and-check/spec.md) - a known
36
- * blind spot on string concatenation/template-built selectors, not solved
37
- * here for the same "recipe before promotion" reason that check accepts its
38
- * own shared-helper blind spot.
39
- */
40
- export declare const INLINE_SELECTOR_CALL: RegExp;
@@ -1,148 +0,0 @@
1
- // Split out of the former 8,700-line cli.ts (see src/ARCHITECTURE.md). Behavior unchanged.
2
- import { readFileSync, readdirSync } from "node:fs";
3
- import { join, resolve } from "node:path";
4
- // ---------------------------------------------------------------------------
5
- // Filesystem
6
- // ---------------------------------------------------------------------------
7
- export function walkDir(dir, pattern) {
8
- const results = [];
9
- let entries;
10
- try {
11
- entries = readdirSync(dir, { withFileTypes: true });
12
- }
13
- catch {
14
- return results;
15
- }
16
- for (const entry of entries) {
17
- const full = join(dir, entry.name);
18
- if (entry.isDirectory()) {
19
- if (entry.name === "node_modules" || entry.name === "dist" || entry.name === ".git")
20
- continue;
21
- results.push(...walkDir(full, pattern));
22
- }
23
- else if (pattern.test(entry.name)) {
24
- results.push(full);
25
- }
26
- }
27
- return results;
28
- }
29
- export function discoverFlows(projectDir) {
30
- return walkDir(projectDir, /\.flow\.ts$/);
31
- }
32
- // ---------------------------------------------------------------------------
33
- // Static analysis for `list`/`nav` (no import, regex only)
34
- // ---------------------------------------------------------------------------
35
- export function extractFlowNames(filePath) {
36
- const src = readFileSync(filePath, "utf-8");
37
- const names = [];
38
- const re = /export\s+const\s+([A-Za-z_$][A-Za-z0-9_$]*)\s*[=:]/g;
39
- let m;
40
- while ((m = re.exec(src)) !== null) {
41
- const name = m[1];
42
- if (name !== undefined)
43
- names.push(name);
44
- }
45
- return names;
46
- }
47
- /** `LoginBlock` -> `"login"`; `OverviewMetricsBlock` -> `"overview-metrics"`. */
48
- export function blockExportToLabel(exportId) {
49
- const base = exportId.replace(/Block$/, "");
50
- return base
51
- .replace(/([a-z0-9])([A-Z])/g, "$1-$2")
52
- .replace(/([A-Z]+)([A-Z][a-z])/g, "$1-$2")
53
- .toLowerCase();
54
- }
55
- /** Every `...Block` identifier a `.flow.ts` file imports, in source order. */
56
- export function parseBlockImports(filePath) {
57
- const src = readFileSync(filePath, "utf-8");
58
- const names = [];
59
- const re = /import\s*\{([^}]*)\}\s*from\s*["'][^"']*\.block(?:\.js)?["']/g;
60
- let m;
61
- while ((m = re.exec(src)) !== null) {
62
- for (const part of m[1].split(",")) {
63
- const name = part.trim().split(/\s+as\s+/)[0]?.trim();
64
- if (name)
65
- names.push(name);
66
- }
67
- }
68
- return names;
69
- }
70
- /** Every `page.goto("...")` string literal in a file, in source order. */
71
- export function extractGotos(filePath) {
72
- const src = readFileSync(filePath, "utf-8");
73
- const results = [];
74
- const re = /\.goto\(\s*["'`]([^"'`]*)["'`]/g;
75
- let m;
76
- while ((m = re.exec(src)) !== null) {
77
- const url = m[1];
78
- if (url !== undefined)
79
- results.push(url);
80
- }
81
- return results;
82
- }
83
- /** Every `Trait.url({ pathname: "..." })` target in a file, in source order. */
84
- export function extractUrlTraits(filePath) {
85
- const src = readFileSync(filePath, "utf-8");
86
- const results = [];
87
- const re = /Trait\.url\(\s*\{[^}]*pathname:\s*["'`]([^"'`]*)["'`]/g;
88
- let m;
89
- while ((m = re.exec(src)) !== null) {
90
- const url = m[1];
91
- if (url !== undefined)
92
- results.push(url);
93
- }
94
- return results;
95
- }
96
- // ---------------------------------------------------------------------------
97
- // Dynamic import + validation
98
- // ---------------------------------------------------------------------------
99
- export async function importModule(filePath) {
100
- const url = new URL(`file://${resolve(filePath)}`);
101
- return (await import(url.href));
102
- }
103
- /** Kept as a named alias - `run`/`validate` below were written against this name first. */
104
- export const importFlowFile = importModule;
105
- export function isFlowLike(val) {
106
- if (val === null || typeof val !== "object")
107
- return false;
108
- const obj = val;
109
- return typeof obj.run === "function";
110
- }
111
- // ---------------------------------------------------------------------------
112
- // `check` - secondary/complementary to the ActionPage @deprecated warning
113
- // (src/types.ts). That's the primary, always-on signal an editor shows the
114
- // instant a regular Block's act() calls a navigation method; this command
115
- // sweeps a whole project in one shot for contexts with no editor watching
116
- // (CI, an autonomous agent writing Block files without a language server).
117
- // See openspec/specs/nav-block-and-check/spec.md for the full rationale.
118
- // ---------------------------------------------------------------------------
119
- export function discoverBlocks(projectDir) {
120
- return walkDir(projectDir, /\.block\.ts$/);
121
- }
122
- export function isBlockLike(val) {
123
- if (val === null || typeof val !== "object")
124
- return false;
125
- const obj = val;
126
- if (typeof obj.name !== "string")
127
- return false;
128
- const instruction = obj.instruction;
129
- return instruction !== null && typeof instruction === "object" && typeof instruction?.act === "function";
130
- }
131
- /** Set by `defineNavBlock` (non-enumerable) - see src/core.ts. */
132
- export function isNavBlockMarked(val) {
133
- return val.__waygraphKind === "nav";
134
- }
135
- export const NAV_METHOD_CALLS = ["page.goto(", "page.reload(", "page.goBack(", "page.goForward("];
136
- /**
137
- * Matches a selector-taking Trait factory call whose first argument is a
138
- * literal string/template, not an identifier or property access - the exact
139
- * shape found repeatedly in hand-written assertion Blocks
140
- * (`Trait.visible("#some-id")` instead of `Trait.visible(SomeSel.thing)`).
141
- * `Trait.url(...)` is deliberately excluded - it takes a URLPatternInit, never
142
- * a DOM selector. Same file-scoped-regex bluntness the nav-escape sweep above
143
- * already accepts (see openspec/specs/nav-block-and-check/spec.md) - a known
144
- * blind spot on string concatenation/template-built selectors, not solved
145
- * here for the same "recipe before promotion" reason that check accepts its
146
- * own shared-helper blind spot.
147
- */
148
- export const INLINE_SELECTOR_CALL = /\b(?:Trait\.visible|Trait\.text|textEquals|visible)\(\s*["'`]/;
@@ -1,52 +0,0 @@
1
- // Split out of the former 8,700-line cli.ts (see src/ARCHITECTURE.md). Behavior unchanged.
2
- import { runAgentDive } from "./agent-dive-scaffold.js";
3
- import { resolve } from "node:path";
4
- import { existsSync, statSync } from "node:fs";
5
- export async function agentDiveCase(args) {
6
- // Playwright analogue: npx playwright init-agents --loop <provider>
7
- const rest = args.slice(1);
8
- let loop = "claude";
9
- let prompts = false;
10
- let projectDir = process.cwd();
11
- for (let i = 0; i < rest.length; i++) {
12
- const a = rest[i];
13
- if (a === "--prompts") {
14
- prompts = true;
15
- continue;
16
- }
17
- if (a === "--loop" || a.startsWith("--loop=")) {
18
- const v = a.startsWith("--loop=") ? a.slice("--loop=".length) : rest[++i];
19
- if (!v || !["claude", "opencode", "cursor", "vscode"].includes(v)) {
20
- console.error("waygraph agent-dive: --loop must be claude | opencode | cursor | vscode");
21
- process.exit(1);
22
- }
23
- loop = v;
24
- continue;
25
- }
26
- if (a === "--help" || a === "-h") {
27
- console.log(`waygraph agent-dive [--loop claude|opencode|cursor|vscode] [--prompts] [project]
28
-
29
- Initialize coding-agent definitions for diving an app into waygraph Blocks
30
- (Playwright \`init-agents\` analogue).
31
-
32
- --loop claude write .claude/agents/*.md (default)
33
- --loop opencode write .opencode/prompts/*.md
34
- --loop cursor write .cursor/rules/waygraph-*.mdc
35
- --loop vscode write .github/agents/*.md
36
- --prompts also copy docs/waygraph-agents/*.md
37
-
38
- Agents shipped: waygraph-planner, waygraph-author, waygraph-healer.
39
- `);
40
- process.exit(0);
41
- }
42
- if (!a.startsWith("-")) {
43
- projectDir = resolve(a);
44
- }
45
- }
46
- if (!existsSync(projectDir) || !statSync(projectDir).isDirectory()) {
47
- console.error(`waygraph agent-dive: no such directory: ${projectDir}`);
48
- process.exit(1);
49
- }
50
- runAgentDive({ loop, projectDir, prompts });
51
- return;
52
- }