waygraph 0.15.53 → 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 (556) 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 +13 -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 +7 -11
  52. package/dist/{highlights → demo/narration}/demo-pace.js +9 -11
  53. package/dist/{highlights → demo/narration}/device.d.ts +4 -2
  54. package/dist/{highlights → demo/narration}/device.js +3 -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/{session/overlay-beacon.d.ts → demo/overlay/beacon.d.ts} +7 -0
  69. package/dist/{session/overlay-beacon.js → demo/overlay/beacon.js} +5 -0
  70. package/dist/demo/overlay/cursor.d.ts +12 -0
  71. package/dist/demo/overlay/cursor.js +142 -0
  72. package/dist/demo/overlay/device-stage.d.ts +13 -0
  73. package/dist/demo/overlay/device-stage.js +396 -0
  74. package/dist/demo/overlay/inpage/banner.d.ts +1 -0
  75. package/dist/demo/overlay/inpage/banner.js +160 -0
  76. package/dist/demo/overlay/inpage/caption.d.ts +2 -0
  77. package/dist/demo/overlay/inpage/caption.js +24 -0
  78. package/dist/demo/overlay/inpage/core.d.ts +1 -0
  79. package/dist/demo/overlay/inpage/core.js +345 -0
  80. package/dist/demo/overlay/inpage/device-chip.d.ts +1 -0
  81. package/dist/demo/overlay/inpage/device-chip.js +191 -0
  82. package/dist/demo/overlay/inpage/network.d.ts +9 -0
  83. package/dist/demo/overlay/inpage/network.js +200 -0
  84. package/dist/demo/overlay/inpage/panel-chrome.d.ts +1 -0
  85. package/dist/demo/overlay/inpage/panel-chrome.js +203 -0
  86. package/dist/demo/overlay/inpage/stamp.d.ts +1 -0
  87. package/dist/demo/overlay/inpage/stamp.js +46 -0
  88. package/dist/demo/overlay/inpage/swipe-zoom.d.ts +1 -0
  89. package/dist/demo/overlay/inpage/swipe-zoom.js +220 -0
  90. package/dist/demo/overlay/inpage/todos.d.ts +1 -0
  91. package/dist/demo/overlay/inpage/todos.js +294 -0
  92. package/dist/demo/overlay/locator-theater.d.ts +25 -0
  93. package/dist/demo/overlay/locator-theater.js +76 -0
  94. package/dist/demo/overlay/network-capture.d.ts +22 -0
  95. package/dist/demo/overlay/network-capture.js +127 -0
  96. package/dist/demo/overlay/overlay-css.d.ts +3 -0
  97. package/dist/demo/overlay/overlay-css.js +369 -0
  98. package/dist/demo/overlay/overlay-stage.d.ts +23 -0
  99. package/dist/demo/overlay/overlay-stage.js +106 -0
  100. package/dist/demo/overlay/overlay.d.ts +10 -0
  101. package/dist/demo/overlay/overlay.js +89 -0
  102. package/dist/{pilot-overlay/overlay-fixtures.d.ts → demo/overlay/phase-fixtures.d.ts} +2 -2
  103. package/dist/{pilot-overlay/overlay-fixtures.js → demo/overlay/phase-fixtures.js} +2 -2
  104. package/dist/{pilot-overlay/action-ring.js → demo/overlay/pilot/actions.js} +2 -1
  105. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.d.ts +6 -5
  106. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.js +19 -18
  107. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.d.ts +2 -2
  108. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.js +13 -22
  109. package/dist/demo/overlay/reattach.d.ts +7 -0
  110. package/dist/demo/overlay/reattach.js +23 -0
  111. package/dist/demo/overlay/rings.d.ts +33 -0
  112. package/dist/demo/overlay/rings.js +448 -0
  113. package/dist/{ui → demo/overlay/ui}/components/ring.js +2 -2
  114. package/dist/{ui → demo/overlay/ui}/overlay.css +4 -4
  115. package/dist/{ui → demo/overlay/ui}/shadow.d.ts +1 -1
  116. package/dist/{ui → demo/overlay/ui}/shadow.js +39 -2
  117. package/dist/demo/stepper/after.d.ts +3 -0
  118. package/dist/demo/stepper/after.js +113 -0
  119. package/dist/demo/stepper/banner-log.d.ts +37 -0
  120. package/dist/demo/stepper/banner-log.js +63 -0
  121. package/dist/demo/stepper/before.d.ts +4 -0
  122. package/dist/demo/stepper/before.js +110 -0
  123. package/dist/demo/stepper/demo-log.d.ts +31 -0
  124. package/dist/demo/stepper/demo-log.js +309 -0
  125. package/dist/demo/stepper/gate.d.ts +11 -0
  126. package/dist/demo/stepper/gate.js +78 -0
  127. package/dist/demo/stepper/interaction-patch.d.ts +3 -0
  128. package/dist/demo/stepper/interaction-patch.js +323 -0
  129. package/dist/demo/stepper/pacing.d.ts +21 -0
  130. package/dist/demo/stepper/pacing.js +23 -0
  131. package/dist/demo/stepper/slides.d.ts +11 -0
  132. package/dist/demo/stepper/slides.js +233 -0
  133. package/dist/demo/stepper/step-panels.d.ts +21 -0
  134. package/dist/demo/stepper/step-panels.js +589 -0
  135. package/dist/demo/stepper/stepper.d.ts +24 -0
  136. package/dist/demo/stepper/stepper.js +122 -0
  137. package/dist/demo/stepper/teardown.d.ts +48 -0
  138. package/dist/demo/stepper/teardown.js +179 -0
  139. package/dist/demo/stepper/todo-advance.d.ts +14 -0
  140. package/dist/demo/stepper/todo-advance.js +110 -0
  141. package/dist/demo/stepper/view.d.ts +68 -0
  142. package/dist/demo/stepper/view.js +31 -0
  143. package/dist/demo/types.d.ts +17 -0
  144. package/dist/demo/verbose-log.js +15 -0
  145. package/dist/{types.d.ts → engine/block/block.d.ts} +106 -91
  146. package/dist/{core → engine/block}/block.js +10 -53
  147. package/dist/{core → engine/block}/compose.d.ts +10 -7
  148. package/dist/{core → engine/block}/compose.js +1 -1
  149. package/dist/{core/blocks → engine/block/kinds}/api.d.ts +17 -12
  150. package/dist/{core/blocks → engine/block/kinds}/api.js +26 -18
  151. package/dist/{core/blocks → engine/block/kinds}/effect.d.ts +13 -18
  152. package/dist/engine/block/kinds/effect.js +17 -0
  153. package/dist/{core/blocks → engine/block/kinds}/method.d.ts +19 -29
  154. package/dist/{core/blocks → engine/block/kinds}/method.js +7 -21
  155. package/dist/{core/blocks → engine/block/kinds}/nav.d.ts +22 -31
  156. package/dist/{core/blocks → engine/block/kinds}/nav.js +6 -12
  157. package/dist/{core/blocks → engine/block/kinds}/page.d.ts +15 -20
  158. package/dist/{core/blocks → engine/block/kinds}/page.js +5 -7
  159. package/dist/engine/checkpoint/checkpoint.d.ts +22 -0
  160. package/dist/engine/checkpoint/checkpoint.js +8 -0
  161. package/dist/engine/checkpoint/route.d.ts +28 -0
  162. package/dist/engine/checkpoint/route.js +28 -0
  163. package/dist/{core → engine}/config.d.ts +7 -2
  164. package/dist/engine/config.js +6 -0
  165. package/dist/engine/engine.d.ts +45 -0
  166. package/dist/{core → engine}/engine.js +6 -10
  167. package/dist/engine/env.d.ts +59 -0
  168. package/dist/engine/env.js +83 -0
  169. package/dist/{errors.d.ts → engine/errors.d.ts} +23 -22
  170. package/dist/{errors.js → engine/errors.js} +22 -22
  171. package/dist/{core → engine/flow}/branch-regression.d.ts +8 -7
  172. package/dist/{core → engine/flow}/branch-regression.js +4 -3
  173. package/dist/engine/flow/flow.d.ts +162 -0
  174. package/dist/engine/flow/flow.js +244 -0
  175. package/dist/{core → engine/flow}/map-builder.d.ts +42 -40
  176. package/dist/{core → engine/flow}/map-builder.js +46 -48
  177. package/dist/{core → engine}/locate.d.ts +1 -1
  178. package/dist/{core → engine}/locate.js +1 -2
  179. package/dist/{mem-stub.d.ts → engine/mem/mem-stub.d.ts} +9 -8
  180. package/dist/{mem-stub.js → engine/mem/mem-stub.js} +2 -2
  181. package/dist/{mem-page.d.ts → engine/mem/mem.d.ts} +1 -1
  182. package/dist/{mem-page.js → engine/mem/mem.js} +2 -1
  183. package/dist/engine/page-gone.d.ts +5 -0
  184. package/dist/engine/page-gone.js +20 -0
  185. package/dist/engine/run/connect.d.ts +28 -0
  186. package/dist/{types.js → engine/run/connect.js} +11 -10
  187. package/dist/engine/run/events.d.ts +67 -0
  188. package/dist/engine/run/events.js +90 -0
  189. package/dist/engine/run/hooks.d.ts +16 -0
  190. package/dist/engine/run/hooks.js +8 -0
  191. package/dist/engine/run/launch.d.ts +13 -0
  192. package/dist/engine/run/launch.js +27 -0
  193. package/dist/{core/run-graph.d.ts → engine/run/run.d.ts} +9 -11
  194. package/dist/{core/run-graph.js → engine/run/run.js} +22 -11
  195. package/dist/engine/stub/pace.d.ts +12 -0
  196. package/dist/engine/stub/pace.js +2 -0
  197. package/dist/engine/stub/ring.d.ts +130 -0
  198. package/dist/engine/stub/ring.js +41 -0
  199. package/dist/engine/stub/stub.d.ts +268 -0
  200. package/dist/engine/stub/stub.js +1 -0
  201. package/dist/engine/stub/todos.d.ts +104 -0
  202. package/dist/engine/stub/todos.js +2 -0
  203. package/dist/engine/stub/viewport.d.ts +26 -0
  204. package/dist/engine/stub/viewport.js +2 -0
  205. package/dist/{trait.d.ts → engine/trait/trait.d.ts} +1 -1
  206. package/dist/index.d.ts +84 -36
  207. package/dist/index.js +44 -19
  208. package/dist/{session/auto-explore-run.d.ts → live/auto/auto.d.ts} +10 -16
  209. package/dist/{session/auto-explore-run.js → live/auto/auto.js} +164 -248
  210. package/dist/{session/auto-explore.d.ts → live/auto/explore.d.ts} +4 -14
  211. package/dist/{session/auto-explore.js → live/auto/explore.js} +21 -127
  212. package/dist/{auto-session/session.d.ts → live/auto-session/auto-session.d.ts} +1 -1
  213. package/dist/{auto-session/session.js → live/auto-session/auto-session.js} +27 -24
  214. package/dist/{auto-session → live/auto-session}/helpers.d.ts +16 -5
  215. package/dist/{auto-session → live/auto-session}/helpers.js +1 -1
  216. package/dist/{session/auto-session-ipc.d.ts → live/auto-session/ipc.d.ts} +7 -5
  217. package/dist/{session/auto-session-ipc.js → live/auto-session/ipc.js} +31 -16
  218. package/dist/{session/browser.d.ts → live/auto-session/start.d.ts} +1 -2
  219. package/dist/{session/browser.js → live/auto-session/start.js} +2 -3
  220. package/dist/{pilot-overlay → live/pilot}/panel.d.ts +1 -1
  221. package/dist/{pilot-overlay → live/pilot}/panel.js +23 -31
  222. package/dist/{session → live/pilot}/pilot.d.ts +4 -3
  223. package/dist/{session → live/pilot}/pilot.js +4 -4
  224. package/dist/{traverse → live/traverse}/coverage.d.ts +4 -0
  225. package/dist/{traverse → live/traverse}/coverage.js +3 -0
  226. package/dist/{traverse → live/traverse}/lease.d.ts +1 -0
  227. package/dist/{traverse → live/traverse}/lease.js +1 -0
  228. package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +4 -1
  229. package/dist/{traverse/run.js → live/traverse/traverse.js} +26 -43
  230. package/dist/manifest/manifest.d.ts +52 -0
  231. package/dist/manifest/manifest.js +93 -0
  232. package/dist/manifest/map-imports.d.ts +7 -0
  233. package/dist/manifest/map-imports.js +22 -0
  234. package/dist/manifest/maps.d.ts +33 -0
  235. package/dist/manifest/maps.js +62 -0
  236. package/dist/manifest/pack.d.ts +21 -0
  237. package/dist/manifest/pack.js +109 -0
  238. package/dist/manifest/project.d.ts +60 -0
  239. package/dist/manifest/project.js +101 -0
  240. package/dist/{session/block-inject.js → manifest/roots.js} +1 -18
  241. package/dist/manifest/scan.d.ts +19 -0
  242. package/dist/manifest/scan.js +57 -0
  243. package/dist/{blocks-select.d.ts → manifest/select.d.ts} +3 -0
  244. package/dist/{blocks-select.js → manifest/select.js} +2 -0
  245. package/dist/manifest/source.d.ts +23 -0
  246. package/dist/manifest/source.js +86 -0
  247. package/dist/runner/mode.d.ts +71 -0
  248. package/dist/runner/mode.js +1 -0
  249. package/dist/runner/modes/branches.d.ts +5 -0
  250. package/dist/runner/modes/branches.js +37 -0
  251. package/dist/runner/modes/demo.d.ts +3 -0
  252. package/dist/runner/modes/demo.js +13 -0
  253. package/dist/runner/modes/report.d.ts +2 -0
  254. package/dist/runner/modes/report.js +54 -0
  255. package/dist/runner/modes/run.d.ts +2 -0
  256. package/dist/runner/modes/run.js +3 -0
  257. package/dist/runner/options.d.ts +31 -0
  258. package/dist/runner/options.js +42 -0
  259. package/dist/runner/plan/find.d.ts +18 -0
  260. package/dist/runner/plan/find.js +65 -0
  261. package/dist/runner/plan/plan.d.ts +11 -0
  262. package/dist/runner/plan/plan.js +97 -0
  263. package/dist/runner/plan/seed-mem.d.ts +12 -0
  264. package/dist/runner/plan/seed-mem.js +98 -0
  265. package/dist/runner/plan/spec.d.ts +5 -0
  266. package/dist/runner/plan/spec.js +17 -0
  267. package/dist/runner/play-steps.d.ts +2 -0
  268. package/dist/runner/play-steps.js +59 -0
  269. package/dist/runner/runner.d.ts +4 -0
  270. package/dist/runner/runner.js +64 -0
  271. package/dist/runner/session.d.ts +9 -0
  272. package/dist/runner/session.js +87 -0
  273. package/dist/{browser.js → runtime/browser.js} +4 -2
  274. package/dist/{env-file.js → runtime/env-file.js} +7 -12
  275. package/dist/{extensions.d.ts → runtime/extensions.d.ts} +2 -5
  276. package/dist/{extensions.js → runtime/extensions.js} +3 -1
  277. package/dist/runtime/full-launch.d.ts +1 -0
  278. package/dist/runtime/full-launch.js +34 -0
  279. package/dist/runtime/global-flag.d.ts +5 -0
  280. package/dist/runtime/global-flag.js +18 -0
  281. package/dist/{playwright-config.d.ts → runtime/playwright-config.d.ts} +1 -1
  282. package/dist/{playwright.config.js → runtime/playwright.config.js} +3 -2
  283. package/dist/runtime/run-log.d.ts +2 -0
  284. package/dist/runtime/run-log.js +17 -0
  285. package/dist/{video-dir.js → runtime/video-dir.js} +3 -2
  286. package/dist/{config.d.ts → runtime/waygraph-config.d.ts} +8 -9
  287. package/dist/{config.js → runtime/waygraph-config.js} +21 -51
  288. package/dist/{webserver.js → runtime/webserver.js} +5 -30
  289. package/examples/routed-demo/config/waygraph.config.ts +20 -0
  290. package/examples/routed-demo/package.json +1 -4
  291. package/examples/routed-demo/scripts/fixture-server.mjs +1 -1
  292. package/examples/routed-demo/src/flows/routed-demo-map.flow.ts +2 -4
  293. package/examples/routed-demo/src/flows/routed-demo.flow.ts +2 -3
  294. package/examples/routed-demo/src/map/(app_base)/dashboard/_methods/click-widget.block.ts +5 -4
  295. package/examples/routed-demo/src/map/(app_base)/dashboard/_nav.block.ts +3 -3
  296. package/examples/routed-demo/src/map/(app_base)/dashboard/_page.block.ts +3 -3
  297. package/examples/routed-demo/src/map/(external)/docs/_nav.block.ts +3 -3
  298. package/examples/routed-demo/src/map/(external)/docs/_page.block.ts +3 -3
  299. package/examples/routed-demo/src/states/routed-demo.states.ts +5 -3
  300. package/examples/routed-demo/tests/routed-demo.spec.ts +4 -4
  301. package/examples/routed-demo/tsconfig.json +1 -1
  302. package/examples/saucedemo/README.md +11 -12
  303. package/examples/saucedemo/config/waygraph.config.ts +17 -0
  304. package/examples/saucedemo/docs/CONVENTION.md +5 -7
  305. package/examples/saucedemo/docs/HELPERS.md +12 -12
  306. package/examples/saucedemo/package-lock.json +10 -3
  307. package/examples/saucedemo/package.json +12 -29
  308. package/examples/saucedemo/src/blocks/SITE-MAP.md +0 -1
  309. package/examples/saucedemo/src/blocks/saucedemo-web/NAV.md +1 -5
  310. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -52
  311. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  312. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  313. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  314. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  315. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  316. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +21 -27
  317. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -9
  318. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  319. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +10 -76
  320. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  321. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  322. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  323. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  324. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  325. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  326. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -29
  327. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -48
  328. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +13 -77
  329. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  330. package/examples/saucedemo/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  331. package/examples/saucedemo/src/flows/api-demo.flow.ts +26 -18
  332. package/examples/saucedemo/src/flows/cart-bulk.flow.ts +19 -14
  333. package/examples/saucedemo/src/flows/cart-continue.flow.ts +10 -8
  334. package/examples/saucedemo/src/flows/cart-mem.flow.ts +7 -7
  335. package/examples/saucedemo/src/flows/catalog-logout.flow.ts +13 -8
  336. package/examples/saucedemo/src/flows/checkout-then-browse-again.flow.ts +26 -48
  337. package/examples/saucedemo/src/flows/checkout.flow.ts +70 -86
  338. package/examples/saucedemo/src/flows/device-showcase.flow.ts +24 -25
  339. package/examples/saucedemo/src/flows/login.flow.ts +11 -18
  340. package/examples/saucedemo/src/flows/mem-stub-demo.flow.ts +9 -20
  341. package/examples/saucedemo/src/flows/shop.flow.ts +15 -20
  342. package/examples/saucedemo/src/flows/smoke.flow.ts +12 -27
  343. package/examples/saucedemo/src/flows/stub-on-error.flow.ts +24 -43
  344. package/examples/saucedemo/src/flows/viewer-blocked.flow.ts +26 -34
  345. package/examples/saucedemo/src/states/checkout.mem-stubs.ts +11 -0
  346. package/examples/saucedemo/src/states/checkout.states.ts +21 -11
  347. package/examples/saucedemo/src/stubs/device-showcase.ts +191 -0
  348. package/examples/saucedemo/src/stubs/login.ts +37 -0
  349. package/examples/saucedemo/tests/auto-graph.spec.ts +4 -12
  350. package/examples/saucedemo/tests/chain-flow-episodes.spec.ts +7 -9
  351. package/examples/saucedemo/tests/submit-login-branch.spec.ts +18 -5
  352. package/package.json +12 -7
  353. package/templates/agents/waygraph-planner.agent.md +2 -2
  354. package/templates/quickstart/README.md +4 -7
  355. package/templates/quickstart/config/waygraph.config.ts +17 -0
  356. package/templates/quickstart/docs/CONVENTION.md +5 -6
  357. package/templates/quickstart/docs/HELPERS.md +11 -9
  358. package/templates/quickstart/package.json +14 -17
  359. package/templates/quickstart/src/blocks/SITE-MAP.md +13 -3
  360. package/templates/quickstart/src/blocks/saucedemo-web/NAV.md +1 -5
  361. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -52
  362. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  363. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  364. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  365. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  366. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  367. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +21 -27
  368. package/templates/quickstart/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -9
  369. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  370. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +10 -76
  371. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  372. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  373. package/templates/quickstart/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  374. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  375. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  376. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  377. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -29
  378. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -48
  379. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +13 -77
  380. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  381. package/templates/quickstart/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  382. package/templates/quickstart/src/flows/api-demo.flow.ts +45 -0
  383. package/templates/quickstart/src/flows/cart-bulk.flow.ts +19 -14
  384. package/templates/quickstart/src/flows/cart-continue.flow.ts +10 -8
  385. package/templates/quickstart/src/flows/cart-mem.flow.ts +7 -7
  386. package/templates/quickstart/src/flows/catalog-logout.flow.ts +13 -8
  387. package/templates/quickstart/src/flows/checkout-then-browse-again.flow.ts +26 -48
  388. package/templates/quickstart/src/flows/checkout.flow.ts +70 -63
  389. package/templates/quickstart/src/flows/device-showcase.flow.ts +24 -25
  390. package/templates/quickstart/src/flows/login.flow.ts +11 -18
  391. package/templates/quickstart/src/flows/mem-stub-demo.flow.ts +12 -0
  392. package/templates/quickstart/src/flows/shop.flow.ts +15 -20
  393. package/templates/quickstart/src/flows/smoke.flow.ts +12 -27
  394. package/templates/quickstart/src/flows/stub-on-error.flow.ts +31 -0
  395. package/templates/quickstart/src/flows/viewer-blocked.flow.ts +26 -34
  396. package/templates/quickstart/src/states/checkout.mem-stubs.ts +11 -0
  397. package/templates/quickstart/src/states/checkout.states.ts +21 -11
  398. package/templates/quickstart/src/stubs/device-showcase.ts +191 -0
  399. package/templates/quickstart/src/stubs/login.ts +37 -0
  400. package/templates/quickstart/tests/chain-flow.spec.ts +7 -10
  401. package/templates/scaffold/README.md +2 -1
  402. package/templates/scaffold/STRUCTURE.md +5 -4
  403. package/templates/scaffold/config/waygraph.config.ts +1 -0
  404. package/templates/scaffold/gitignore +1 -0
  405. package/templates/scaffold/src/flows/README.md +2 -2
  406. package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +3 -3
  407. package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +3 -3
  408. package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -4
  409. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +3 -3
  410. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +3 -3
  411. package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +5 -4
  412. package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +4 -4
  413. package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -3
  414. package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +3 -3
  415. package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +4 -4
  416. package/templates/scaffold/src/map/(external)/hoppscotch/_keys.ts +21 -0
  417. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +4 -4
  418. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +4 -4
  419. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +4 -4
  420. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +5 -4
  421. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +6 -5
  422. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +6 -5
  423. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +5 -4
  424. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +6 -5
  425. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +6 -5
  426. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +6 -5
  427. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +6 -5
  428. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +6 -5
  429. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +6 -5
  430. package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +3 -3
  431. package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +3 -3
  432. package/templates/scaffold/src/map/(external)/hoppscotch/_states.ts +6 -0
  433. package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +3 -3
  434. package/templates/scaffold/src/map/(external)/mailpit/_keys.ts +13 -0
  435. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +4 -4
  436. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +4 -4
  437. package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +6 -5
  438. package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +6 -5
  439. package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +3 -3
  440. package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +3 -3
  441. package/templates/scaffold/src/map/(external)/mailpit/_states.ts +9 -0
  442. package/templates/scaffold/src/map/README.md +7 -0
  443. package/templates/scaffold/src/states/README.md +4 -1
  444. package/templates/scaffold/src/states/demo.mem-keys.ts +1 -29
  445. package/templates/scaffold/src/states/demo.states.ts +14 -20
  446. package/templates/scaffold/tests/hoppscotch.spec.ts +1 -11
  447. package/templates/scaffold/tests/mail-verify.spec.ts +2 -2
  448. package/templates/skills/waygraph-blind-pilot.skill.md +2 -6
  449. package/templates/skills/waygraph-convention.skill.md +23 -14
  450. package/templates/skills/waygraph-pilot.skill.md +7 -4
  451. package/dist/auto-session/verbose-log.js +0 -16
  452. package/dist/auto-session.d.ts +0 -2
  453. package/dist/auto-session.js +0 -3
  454. package/dist/cli/discover.d.ts +0 -40
  455. package/dist/cli/discover.js +0 -148
  456. package/dist/commands/agent-dive.js +0 -52
  457. package/dist/commands/check.js +0 -192
  458. package/dist/commands/map.js +0 -29
  459. package/dist/commands/run.js +0 -104
  460. package/dist/commands/traverse.js +0 -177
  461. package/dist/core/block.d.ts +0 -109
  462. package/dist/core/blocks/effect.js +0 -23
  463. package/dist/core/config.js +0 -17
  464. package/dist/core/engine.d.ts +0 -198
  465. package/dist/core/flow.d.ts +0 -293
  466. package/dist/core/flow.js +0 -432
  467. package/dist/core.d.ts +0 -14
  468. package/dist/core.js +0 -15
  469. package/dist/highlights/merge.d.ts +0 -8
  470. package/dist/highlights/merge.js +0 -173
  471. package/dist/highlights/stub-ctx.d.ts +0 -10
  472. package/dist/highlights/stub-ctx.js +0 -331
  473. package/dist/highlights/types.d.ts +0 -607
  474. package/dist/highlights.d.ts +0 -9
  475. package/dist/highlights.js +0 -10
  476. package/dist/pilot-overlay.d.ts +0 -5
  477. package/dist/pilot-overlay.js +0 -6
  478. package/dist/runner/banner-log.js +0 -63
  479. package/dist/runner/chain-run.js +0 -102
  480. package/dist/runner/cursor.js +0 -140
  481. package/dist/runner/demo-log.js +0 -316
  482. package/dist/runner/device-stage.d.ts +0 -9
  483. package/dist/runner/device-stage.js +0 -420
  484. package/dist/runner/discovery.js +0 -105
  485. package/dist/runner/index.js +0 -2
  486. package/dist/runner/inpage/banner.d.ts +0 -21
  487. package/dist/runner/inpage/banner.js +0 -156
  488. package/dist/runner/inpage/caption.d.ts +0 -3
  489. package/dist/runner/inpage/caption.js +0 -23
  490. package/dist/runner/inpage/core.d.ts +0 -4
  491. package/dist/runner/inpage/core.js +0 -316
  492. package/dist/runner/inpage/device.d.ts +0 -3
  493. package/dist/runner/inpage/device.js +0 -211
  494. package/dist/runner/inpage/network.d.ts +0 -15
  495. package/dist/runner/inpage/network.js +0 -217
  496. package/dist/runner/inpage/panel-chrome.js +0 -192
  497. package/dist/runner/inpage/stamp.js +0 -46
  498. package/dist/runner/inpage/swipe-zoom.js +0 -220
  499. package/dist/runner/inpage/todos.js +0 -337
  500. package/dist/runner/interaction-patch.js +0 -384
  501. package/dist/runner/main.js +0 -469
  502. package/dist/runner/network-capture.d.ts +0 -9
  503. package/dist/runner/network-capture.js +0 -126
  504. package/dist/runner/overlay-css.d.ts +0 -3
  505. package/dist/runner/overlay-css.js +0 -377
  506. package/dist/runner/overlay-install.js +0 -90
  507. package/dist/runner/overlay-stage.js +0 -110
  508. package/dist/runner/rings.js +0 -514
  509. package/dist/runner/seed-mem.js +0 -110
  510. package/dist/runner/slides.js +0 -278
  511. package/dist/runner/step-mode.js +0 -703
  512. package/dist/runner/step-panels.js +0 -729
  513. package/dist/runner/teardown.js +0 -202
  514. package/dist/runner/todo-dock.js +0 -142
  515. package/dist/session/step-overlay.d.ts +0 -37
  516. package/dist/session/step-overlay.js +0 -244
  517. package/examples/routed-demo/playwright.config.ts +0 -21
  518. package/examples/saucedemo/playwright.config.ts +0 -19
  519. package/examples/saucedemo/scripts/drive-auto-cli.mjs +0 -93
  520. package/examples/saucedemo/scripts/prove-add-to-cart-menu.mjs +0 -126
  521. package/examples/saucedemo/scripts/prove-auto-graph.mjs +0 -92
  522. package/examples/saucedemo/scripts/prove-wrong-login-runtime.mjs +0 -63
  523. package/examples/saucedemo/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  524. package/templates/quickstart/playwright.config.ts +0 -14
  525. package/templates/quickstart/scripts/drive-auto-cli.mjs +0 -93
  526. package/templates/quickstart/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  527. /package/dist/{commands → cli/commands}/agent-dive-scaffold.d.ts +0 -0
  528. /package/dist/{commands → cli/commands}/agent-dive.d.ts +0 -0
  529. /package/dist/{commands → cli/commands}/extensions.d.ts +0 -0
  530. /package/dist/{commands → cli/commands}/init.d.ts +0 -0
  531. /package/dist/{commands → cli/commands}/list.d.ts +0 -0
  532. /package/dist/{commands → cli/commands}/map.d.ts +0 -0
  533. /package/dist/{commands → cli/commands}/session.d.ts +0 -0
  534. /package/dist/{commands → cli/commands}/test.d.ts +0 -0
  535. /package/dist/{commands → cli/commands}/traverse.d.ts +0 -0
  536. /package/dist/{commands → cli/commands}/try.d.ts +0 -0
  537. /package/dist/{commands → cli/commands}/upgrade.d.ts +0 -0
  538. /package/dist/{highlights → demo/narration}/shorthand.js +0 -0
  539. /package/dist/{pilot-overlay/action-ring.d.ts → demo/overlay/pilot/actions.d.ts} +0 -0
  540. /package/dist/{ui → demo/overlay/ui}/components/ring.d.ts +0 -0
  541. /package/dist/{ui → demo/overlay/ui}/stylesheet.d.ts +0 -0
  542. /package/dist/{ui → demo/overlay/ui}/stylesheet.js +0 -0
  543. /package/dist/{ui → demo/overlay/ui}/tokens.d.ts +0 -0
  544. /package/dist/{ui → demo/overlay/ui}/tokens.js +0 -0
  545. /package/dist/{highlights → demo}/types.js +0 -0
  546. /package/dist/{auto-session → demo}/verbose-log.d.ts +0 -0
  547. /package/dist/{selector.d.ts → engine/trait/selector.d.ts} +0 -0
  548. /package/dist/{selector.js → engine/trait/selector.js} +0 -0
  549. /package/dist/{trait.js → engine/trait/trait.js} +0 -0
  550. /package/dist/{session/block-inject.d.ts → manifest/roots.d.ts} +0 -0
  551. /package/dist/{browser.d.ts → runtime/browser.d.ts} +0 -0
  552. /package/dist/{env-file.d.ts → runtime/env-file.d.ts} +0 -0
  553. /package/dist/{playwright-config.js → runtime/playwright-config.js} +0 -0
  554. /package/dist/{playwright.config.d.ts → runtime/playwright.config.d.ts} +0 -0
  555. /package/dist/{video-dir.d.ts → runtime/video-dir.d.ts} +0 -0
  556. /package/dist/{webserver.d.ts → runtime/webserver.d.ts} +0 -0
package/dist/cli/flags.js CHANGED
@@ -1,18 +1,54 @@
1
- // Split out of the former 8,700-line cli.ts (see src/ARCHITECTURE.md). Behavior unchanged.
2
1
  import { basename, relative, resolve } from "node:path";
3
- import { existsSync, readFileSync } from "node:fs";
4
- import { walkDir } from "./discover.js";
5
- import { loadWaygraphConfig, resolveBaseUrl } from "../config.js";
6
- function takeFlagValue(argv, i, a, flag) {
7
- if (a.startsWith(flag + "=")) {
8
- return { value: a.slice(flag.length + 1), nextI: i };
9
- }
10
- const v = argv[i + 1];
11
- if (v === undefined || (v.startsWith("-") && !a.includes("="))) {
12
- console.error(`waygraph: ${flag} needs a value`);
13
- process.exit(1);
14
- }
15
- return { value: v, nextI: i + 1 };
2
+ import { helpLines, parseCommand } from "./args.js";
3
+ import { existsSync } from "node:fs";
4
+ import { walkDir } from "../manifest/scan.js";
5
+ import { exportedNames, parseSource } from "../manifest/source.js";
6
+ import { loadWaygraphConfig, resolveBaseUrl } from "../runtime/waygraph-config.js";
7
+ import { envFlag, envString, setEnv } from "../engine/env.js";
8
+ /**
9
+ * Every flag the run-style commands take: `parseArgs` reads them from this table, and `usage.ts` prints the demo / run
10
+ * help from it, so the two can't drift. A flag not listed here is an error, not a stray positional.
11
+ */
12
+ export const RUN_OPTIONS = {
13
+ "blocks": { type: "string", value: "<flow|file|spec>", help: "Flow export, .flow.ts path or \"a then b\" chain; auto: <From> <To> Checkpoints", for: ["demo", "run"] },
14
+ "data": { type: "string", value: "'{...}'", help: "Mem seed JSON (or inline flow({...}))", for: ["demo", "run"] },
15
+ "mem-stub": { type: "boolean", help: "Fill any requires key --data didn't cover from registerMemStub's registry", for: ["demo", "run"] },
16
+ "auto-next": { type: "boolean", help: "Auto-advance steps", for: ["demo"] },
17
+ "no-auto-next": { type: "boolean", help: "Wait for Next on every step (the default)", for: ["demo"] },
18
+ "fast": { type: "boolean", help: "Shorter auto-next / Next gates (keeps the smooth cursor)", for: ["demo"] },
19
+ "full": { type: "boolean", help: "Classic wrap-all block chips (default: carousel)", for: ["demo"] },
20
+ "mini": { type: "boolean", help: "Force the compact mini panel (Hide pill + Next)", for: ["demo"] },
21
+ "todo-left": { type: "boolean", help: "Floating checklist dock on the left (also ctx.todos(id, items, { pos }))", for: ["demo"] },
22
+ "todo-right": { type: "boolean", help: "Floating checklist dock on the right", for: ["demo"] },
23
+ "todo-full": { type: "boolean", help: "Full checklist: no compact / collision / behind-ring", for: ["demo"] },
24
+ "todo-smart": { type: "boolean", help: "Compact + collision + behind-ring (the default)", for: ["demo"] },
25
+ "ff-expand": { type: "boolean", help: "Expand fastForwardComposeBlock inners as separate steps", for: ["demo", "run"] },
26
+ "ff-disabled": { type: "boolean", help: "Dispute: expand FF; blitz kept on those inners", for: ["demo", "run"] },
27
+ "auto-play-video": { type: "boolean", help: "Unattended + recorded: --auto-next + --video (+ step); headless", for: ["demo"] },
28
+ "auto-play-video-head": { type: "boolean", help: "Same, but keep the browser visible (--non-headless)", for: ["demo"] },
29
+ "video": { type: "string", value: "[dir]", help: "Record .webm (default ~/Downloads/waygraph-videos/<project>, video.dir, WAYGRAPH_VIDEO_DIR)", for: ["demo", "run"] },
30
+ "video-viewport": { type: "string", value: "WxH", help: "Recording size (demo 1920x1080, run 1280x720)", for: ["demo", "run"] },
31
+ "step": { type: "boolean", help: "Step through with the overlay", for: ["run"] },
32
+ "no-step": { type: "boolean", help: "No step overlay (demo: plain run with narration off)", for: ["demo"] },
33
+ "all-branches": { type: "boolean", help: "Bare Flow ref only: explore every branch() path, cloning the session at each", for: ["run"] },
34
+ "shared-session": { type: "boolean", help: "With --all-branches: one shared session (follows only the live path)", for: ["run"] },
35
+ "non-headless": { type: "boolean", help: "Show the browser", for: ["demo", "run"] },
36
+ "title": { type: "string", value: "<text>", help: "Banner title", for: ["demo", "run"] },
37
+ "base-url": { type: "string", value: "<url>", help: "Base URL (beats WAYGRAPH_BASE_URL and the config)", for: ["demo", "run", "session"] },
38
+ "inject": { type: "string", multiple: true, value: "<preset|path>", help: "Merge an external Block library (repeatable)", for: ["session"] },
39
+ "goto": { type: "string", value: "<url>", help: "Navigate on start (disables the blank page)", for: ["session"] },
40
+ "blank": { type: "boolean", help: "Force about:blank on start (default)", for: ["session"] },
41
+ "headless": { type: "boolean", help: "Headless session (default: visible browser)", for: ["session"] },
42
+ "cli": { type: "boolean", help: "Terminal picker instead of the browser panel", for: ["session"] },
43
+ "json": { type: "boolean", help: "Machine-readable JSON", for: ["session"] },
44
+ "mermaid": { type: "boolean", help: "Print the graph as Mermaid" },
45
+ "map": { type: "boolean", help: "Print the map" },
46
+ "no-practices": { type: "boolean", help: "check / typecheck: skip bad-practice warnings" },
47
+ "session-id": { type: "string", help: "Internal: the id a detached session child serves (set by browser start)" },
48
+ };
49
+ /** The help lines for one command's options, from {@link RUN_OPTIONS}. */
50
+ export function optionHelp(command, indent = 17) {
51
+ return helpLines(Object.fromEntries(Object.entries(RUN_OPTIONS).filter(([, o]) => "for" in o && o.for.includes(command))), indent);
16
52
  }
17
53
  /**
18
54
  * Looks like a Checkpoint tag for auto --blocks From To (PascalCase).
@@ -27,171 +63,94 @@ function looksLikeCheckpointArg(s) {
27
63
  return false;
28
64
  return /^[A-Z][A-Za-z0-9_]*$/.test(s);
29
65
  }
30
- /**
31
- * Pulls run/demo/auto flags out of argv. Unknown bare `--*` that are not
32
- * recognized stay as positionals only when they are project paths; known
33
- * explore flags (--cli/--mermaid/--map) are parsed here.
34
- */
35
- export function parseRunFlags(argv) {
36
- const out = { positionals: [] };
37
- for (let i = 0; i < argv.length; i++) {
38
- const a = argv[i];
39
- if (a === "--step") {
40
- out.step = true;
41
- }
42
- else if (a === "--no-step") {
43
- out.step = false;
44
- }
45
- else if (a === "--auto-next" || a === "--autoplay") {
46
- out.autoplay = true;
47
- }
48
- else if (a === "--no-auto-next" || a === "--no-autoplay") {
49
- out.autoplay = false;
50
- }
51
- else if (a === "--auto-play-video") {
52
- out.autoPlayVideo = true;
53
- }
54
- else if (a === "--auto-play-video-head") {
55
- out.autoPlayVideo = true;
56
- out.nonHeadless = true;
57
- }
58
- else if (a === "--fast") {
59
- out.fast = true;
60
- }
61
- else if (a === "--full") {
62
- out.fullStepper = true;
63
- }
64
- else if (a === "--mini" || a === "--stepper-mini") {
65
- out.miniStepper = true;
66
- }
67
- else if (a === "--todo-left") {
68
- out.todoPos = "left";
69
- }
70
- else if (a === "--todo-right") {
71
- out.todoPos = "right";
72
- }
73
- else if (a === "--todo-full" || a === "--no-todo-smart") {
74
- out.todoUiFull = true;
75
- }
76
- else if (a === "--todo-smart") {
77
- out.todoUiSmart = true;
78
- }
79
- else if (a === "--ff-expand") {
80
- out.ffExpand = true;
81
- }
82
- else if (a === "--ff-disabled" || a === "--no-ff") {
83
- out.ffDisabled = true;
84
- out.ffExpand = true;
85
- }
86
- else if (a === "--non-headless") {
87
- out.nonHeadless = true;
88
- }
89
- else if (a === "--headless") {
90
- out.headlessBrowser = true;
91
- }
92
- else if (a === "--json") {
93
- out.json = true;
94
- }
95
- else if (a === "--no-practices") {
96
- out.noPractices = true;
97
- }
98
- else if (a === "--blank") {
99
- out.blank = true;
100
- }
101
- else if (a === "--goto" || a.startsWith("--goto=")) {
102
- const t = takeFlagValue(argv, i, a, "--goto");
103
- out.goto = t.value;
104
- i = t.nextI;
105
- }
106
- else if (a === "--inject" || a.startsWith("--inject=")) {
107
- const t = takeFlagValue(argv, i, a, "--inject");
108
- out.inject ??= [];
109
- out.inject.push(t.value);
110
- i = t.nextI;
111
- }
112
- else if (a === "--cli") {
113
- out.cli = true;
114
- }
115
- else if (a === "--detach") {
116
- out.detach = true;
117
- }
118
- else if (a === "--headed") {
119
- out.headed = true;
120
- }
121
- else if (a === "--mermaid") {
122
- out.mermaid = true;
123
- }
124
- else if (a === "--map") {
125
- out.map = true;
126
- }
127
- else if (a === "--base-url" || a.startsWith("--base-url=")) {
128
- const t = takeFlagValue(argv, i, a, "--base-url");
129
- out.baseUrl = t.value;
130
- i = t.nextI;
131
- }
132
- else if (a === "--title" || a.startsWith("--title=")) {
133
- const t = takeFlagValue(argv, i, a, "--title");
134
- out.title = t.value;
135
- i = t.nextI;
136
- }
137
- else if (a === "--data" || a.startsWith("--data=")) {
138
- const t = takeFlagValue(argv, i, a, "--data");
139
- out.data = t.value;
140
- i = t.nextI;
141
- }
142
- else if (a === "--mem-stub") {
143
- out.memStub = true;
144
- }
145
- else if (a === "--all-branches") {
146
- out.allBranches = true;
147
- }
148
- else if (a === "--shared-session") {
149
- out.sharedSession = true;
150
- }
151
- else if (a === "--video" || a.startsWith("--video=")) {
152
- if (a.startsWith("--video=")) {
153
- out.video = a.slice("--video=".length);
154
- }
155
- else {
156
- const v = argv[i + 1];
157
- if (v === undefined || v.startsWith("-")) {
158
- out.video = "";
159
- }
160
- else {
161
- out.video = v;
162
- i++;
163
- }
164
- }
165
- }
166
- else if (a === "--video-viewport" || a.startsWith("--video-viewport=")) {
167
- const t = takeFlagValue(argv, i, a, "--video-viewport");
168
- out.videoViewport = t.value;
169
- i = t.nextI;
170
- }
171
- else if (a === "--blocks" || a.startsWith("--blocks=")) {
172
- if (a.startsWith("--blocks=")) {
173
- out.blocks = a.slice("--blocks=".length);
174
- }
175
- else {
176
- const v1 = argv[++i];
177
- if (!v1 || v1.startsWith("-")) {
178
- console.error("waygraph: --blocks needs a flow/spec or <from> <to> checkpoints");
179
- process.exit(1);
180
- }
181
- const v2 = argv[i + 1];
182
- if (v2 && looksLikeCheckpointArg(v1) && looksLikeCheckpointArg(v2)) {
183
- out.blocksFromTo = [v1, v2];
184
- i++;
185
- }
186
- else {
187
- out.blocks = v1;
188
- }
189
- }
190
- }
191
- else {
192
- out.positionals.push(a);
193
- }
194
- }
66
+ /** Reads run/demo/auto/session flags with `node:util`'s parseArgs; an unknown flag or a missing value exits with the reason. */
67
+ export function parseRunFlags(argv, command) {
68
+ if (argv.includes("--help") || argv.includes("-h")) {
69
+ const forHelp = command === "demo" || command === "run" ? command : ["browser", "pilot", "auto"].includes(command) ? "session" : undefined;
70
+ console.log(`waygraph ${command} flags:\n${forHelp ? optionHelp(forHelp, 2) : helpLines(RUN_OPTIONS)}\n\nwaygraph --help lists every command.`);
71
+ process.exit(0);
72
+ }
73
+ // `--video` takes an optional folder: bare (end of args, or another flag next) means the default folder.
74
+ const args = argv.map((a, i) => (a === "--video" && (argv[i + 1] === undefined || argv[i + 1].startsWith("-")) ? "--video=" : a));
75
+ const parsed = parseCommand(command, RUN_OPTIONS, args);
76
+ const v = parsed.values;
77
+ const positionals = [...parsed.positionals];
78
+ const out = { positionals };
79
+ // `--blocks <From> <To>`: two Checkpoints in a row are a path to find, not a spec and a project path.
80
+ const blocksToken = parsed.tokens.find((t) => t.kind === "option" && t.name === "blocks" && !t.inlineValue);
81
+ const after = blocksToken && parsed.tokens.find((t) => t.kind === "positional" && t.index === blocksToken.index + 2);
82
+ if (v.blocks !== undefined && after?.kind === "positional" && looksLikeCheckpointArg(v.blocks) && looksLikeCheckpointArg(after.value)) {
83
+ out.blocksFromTo = [v.blocks, after.value];
84
+ positionals.splice(positionals.indexOf(after.value), 1);
85
+ }
86
+ else if (v.blocks !== undefined)
87
+ out.blocks = v.blocks;
88
+ if (v.step)
89
+ out.step = true;
90
+ if (v["no-step"])
91
+ out.step = false;
92
+ if (v["auto-next"])
93
+ out.autoplay = true;
94
+ if (v["no-auto-next"])
95
+ out.autoplay = false;
96
+ if (v["auto-play-video"] || v["auto-play-video-head"])
97
+ out.autoPlayVideo = true;
98
+ if (v["non-headless"] || v["auto-play-video-head"])
99
+ out.nonHeadless = true;
100
+ if (v.fast)
101
+ out.fast = true;
102
+ if (v.full)
103
+ out.fullStepper = true;
104
+ if (v.mini)
105
+ out.miniStepper = true;
106
+ if (v["todo-left"])
107
+ out.todoPos = "left";
108
+ if (v["todo-right"])
109
+ out.todoPos = "right";
110
+ if (v["todo-full"])
111
+ out.todoUiFull = true;
112
+ if (v["todo-smart"])
113
+ out.todoUiSmart = true;
114
+ if (v["ff-expand"] || v["ff-disabled"])
115
+ out.ffExpand = true;
116
+ if (v["ff-disabled"])
117
+ out.ffDisabled = true;
118
+ if (v.headless)
119
+ out.headlessBrowser = true;
120
+ if (v.json)
121
+ out.json = true;
122
+ if (v["no-practices"])
123
+ out.noPractices = true;
124
+ if (v["session-id"] !== undefined)
125
+ out.sessionId = v["session-id"];
126
+ if (v.blank)
127
+ out.blank = true;
128
+ if (v.goto !== undefined)
129
+ out.goto = v.goto;
130
+ if (v.inject !== undefined)
131
+ out.inject = [...v.inject];
132
+ if (v.cli)
133
+ out.cli = true;
134
+ if (v.mermaid)
135
+ out.mermaid = true;
136
+ if (v.map)
137
+ out.map = true;
138
+ if (v["base-url"] !== undefined)
139
+ out.baseUrl = v["base-url"];
140
+ if (v.title !== undefined)
141
+ out.title = v.title;
142
+ if (v.data !== undefined)
143
+ out.data = v.data;
144
+ if (v["mem-stub"])
145
+ out.memStub = true;
146
+ if (v["all-branches"])
147
+ out.allBranches = true;
148
+ if (v["shared-session"])
149
+ out.sharedSession = true;
150
+ if (v.video !== undefined)
151
+ out.video = v.video;
152
+ if (v["video-viewport"] !== undefined)
153
+ out.videoViewport = v["video-viewport"];
195
154
  return out;
196
155
  }
197
156
  /** Parses WAYGRAPH_VIDEO_VIEWPORT / --video-viewport: "1920x1080" or "1920,1080". */
@@ -226,9 +185,9 @@ export function applyRunFlags(flags, opts) {
226
185
  // capture the right thing. Headless by default; --non-headless (or the
227
186
  // --auto-play-video-head alias, parsed above) opts back into a
228
187
  // visible browser for someone who wants to watch it live too.
229
- process.env.WAYGRAPH_STEP = "1";
230
- if (!flags.nonHeadless && process.env.WAYGRAPH_HEADED === undefined) {
231
- process.env.WAYGRAPH_HEADED = "0";
188
+ setEnv("WAYGRAPH_STEP", "1");
189
+ if (!flags.nonHeadless && envString("WAYGRAPH_HEADED") === undefined) {
190
+ setEnv("WAYGRAPH_HEADED", "0");
232
191
  }
233
192
  }
234
193
  if ((flags.fast || flags.fullStepper || flags.miniStepper || flags.todoPos || flags.todoUiFull || flags.todoUiSmart) &&
@@ -237,86 +196,79 @@ export function applyRunFlags(flags, opts) {
237
196
  process.exit(1);
238
197
  }
239
198
  if (flags.step === true) {
240
- process.env.WAYGRAPH_STEP = "1";
241
- process.env.WAYGRAPH_HEADED = "1";
199
+ setEnv("WAYGRAPH_STEP", "1");
200
+ setEnv("WAYGRAPH_HEADED", "1");
242
201
  }
243
202
  else if (flags.step === false) {
244
- process.env.WAYGRAPH_STEP = "0";
203
+ setEnv("WAYGRAPH_STEP", "0");
245
204
  }
246
205
  if (flags.autoplay === true) {
247
- process.env.WAYGRAPH_AUTOPLAY = "1";
206
+ setEnv("WAYGRAPH_AUTOPLAY", "1");
248
207
  }
249
208
  else if (flags.autoplay === false) {
250
- process.env.WAYGRAPH_AUTOPLAY = "0";
209
+ setEnv("WAYGRAPH_AUTOPLAY", "0");
251
210
  }
252
211
  if (flags.nonHeadless) {
253
- process.env.WAYGRAPH_HEADED = "1";
212
+ setEnv("WAYGRAPH_HEADED", "1");
254
213
  }
255
214
  // Any --video on demo/run: headless unless --non-headless already won.
256
- if (flags.video !== undefined && !flags.nonHeadless && process.env.WAYGRAPH_HEADED === undefined) {
257
- process.env.WAYGRAPH_HEADED = "0";
215
+ if (flags.video !== undefined && !flags.nonHeadless && envString("WAYGRAPH_HEADED") === undefined) {
216
+ setEnv("WAYGRAPH_HEADED", "0");
258
217
  }
259
218
  if (flags.baseUrl !== undefined) {
260
- process.env.WAYGRAPH_BASE_URL = flags.baseUrl;
219
+ setEnv("WAYGRAPH_BASE_URL", flags.baseUrl);
261
220
  }
262
221
  if (flags.title !== undefined) {
263
- process.env.WAYGRAPH_TITLE = flags.title;
222
+ setEnv("WAYGRAPH_TITLE", flags.title);
264
223
  }
265
224
  if (flags.video !== undefined) {
266
- process.env.WAYGRAPH_VIDEO = flags.video || "1";
225
+ setEnv("WAYGRAPH_VIDEO", flags.video || "1");
267
226
  }
268
227
  if (flags.videoViewport !== undefined) {
269
228
  if (!parseVideoViewportFlag(flags.videoViewport)) {
270
229
  console.error('waygraph: --video-viewport must look like "1920x1080"');
271
230
  process.exit(1);
272
231
  }
273
- process.env.WAYGRAPH_VIDEO_VIEWPORT = flags.videoViewport;
232
+ setEnv("WAYGRAPH_VIDEO_VIEWPORT", flags.videoViewport);
274
233
  }
275
234
  if (flags.data !== undefined) {
276
- process.env.WAYGRAPH_DATA = flags.data;
235
+ setEnv("WAYGRAPH_DATA", flags.data);
277
236
  }
278
237
  if (flags.memStub) {
279
- process.env.WAYGRAPH_MEM_STUB = "1";
238
+ setEnv("WAYGRAPH_MEM_STUB", "1");
280
239
  }
281
240
  if (flags.allBranches) {
282
- process.env.WAYGRAPH_ALL_BRANCHES = "1";
241
+ setEnv("WAYGRAPH_ALL_BRANCHES", "1");
283
242
  }
284
243
  if (flags.sharedSession) {
285
- process.env.WAYGRAPH_SHARED_SESSION = "1";
244
+ setEnv("WAYGRAPH_SHARED_SESSION", "1");
286
245
  }
287
246
  if (flags.fast) {
288
- process.env.WAYGRAPH_DEMO_FAST = "1";
247
+ setEnv("WAYGRAPH_DEMO_FAST", "1");
289
248
  }
290
249
  if (flags.fullStepper) {
291
- process.env.WAYGRAPH_STEPPER = "full";
250
+ setEnv("WAYGRAPH_STEPPER", "full");
292
251
  }
293
252
  if (flags.miniStepper) {
294
- process.env.WAYGRAPH_MINI = "1";
253
+ setEnv("WAYGRAPH_MINI", "1");
295
254
  }
296
255
  if (flags.todoPos === "left" || flags.todoPos === "right") {
297
- process.env.WAYGRAPH_TODO_POS = flags.todoPos;
256
+ setEnv("WAYGRAPH_TODO_POS", flags.todoPos);
298
257
  }
299
258
  if (flags.todoUiFull) {
300
- process.env.WAYGRAPH_TODO_UI = "full";
259
+ setEnv("WAYGRAPH_TODO_UI", "full");
301
260
  }
302
261
  else if (flags.todoUiSmart) {
303
- process.env.WAYGRAPH_TODO_UI = "smart";
262
+ setEnv("WAYGRAPH_TODO_UI", "smart");
304
263
  }
305
264
  if (flags.ffExpand) {
306
- process.env.WAYGRAPH_FF_EXPAND = "1";
265
+ setEnv("WAYGRAPH_FF_EXPAND", "1");
307
266
  }
308
267
  if (flags.ffDisabled) {
309
- process.env.WAYGRAPH_FF_DISABLED = "1";
310
- process.env.WAYGRAPH_FF_EXPAND = "1";
268
+ setEnv("WAYGRAPH_FF_DISABLED", "1");
269
+ setEnv("WAYGRAPH_FF_EXPAND", "1");
311
270
  }
312
271
  }
313
- /**
314
- * BASE_URL when neither --base-url nor WAYGRAPH_BASE_URL is set - see `../config.js`'s own
315
- * `resolveBaseUrl` for the full resolution order (env / `.env` / `waygraph.config.*` /
316
- * package.json / playwright.config). Re-exported here so existing importers of this module
317
- * don't need to change their import path.
318
- */
319
- export { resolveBaseUrl };
320
272
  /**
321
273
  * Friendly demo defaults: STEP on; headed only for live watch (no --video).
322
274
  * --video / --auto-play-video => headless unless --non-headless.
@@ -325,26 +277,26 @@ export { resolveBaseUrl };
325
277
  export async function applyDemoDefaults(projectDir) {
326
278
  // Config first: its defaults (headed, autoNext, pace...) must land before the demo defaults below fill the same variables.
327
279
  await loadWaygraphConfig(projectDir);
328
- if (process.env.WAYGRAPH_STEP === undefined)
329
- process.env.WAYGRAPH_STEP = "1";
330
- if (process.env.WAYGRAPH_STEP === "1" && process.env.WAYGRAPH_HEADED === undefined) {
280
+ if (envString("WAYGRAPH_STEP") === undefined)
281
+ setEnv("WAYGRAPH_STEP", "1");
282
+ if (envFlag("WAYGRAPH_STEP") && envString("WAYGRAPH_HEADED") === undefined) {
331
283
  // Recording locks headless - a live window fights fixed video viewport /
332
284
  // device shell centering. Watch live only with --non-headless.
333
- process.env.WAYGRAPH_HEADED = process.env.WAYGRAPH_VIDEO ? "0" : "1";
285
+ setEnv("WAYGRAPH_HEADED", envString("WAYGRAPH_VIDEO") ? "0" : "1");
334
286
  }
335
287
  // Manual Next by default. --auto-next / --auto-play-video flip this.
336
- if (process.env.WAYGRAPH_AUTOPLAY === undefined) {
337
- if (process.env.WAYGRAPH_VIDEO && process.env.WAYGRAPH_STEP === "0") {
338
- process.env.WAYGRAPH_AUTOPLAY = "1";
288
+ if (envString("WAYGRAPH_AUTOPLAY") === undefined) {
289
+ if (envString("WAYGRAPH_VIDEO") && envString("WAYGRAPH_STEP") === "0") {
290
+ setEnv("WAYGRAPH_AUTOPLAY", "1");
339
291
  }
340
292
  else {
341
- process.env.WAYGRAPH_AUTOPLAY = "0";
293
+ setEnv("WAYGRAPH_AUTOPLAY", "0");
342
294
  }
343
295
  }
344
- if (!process.env.WAYGRAPH_BASE_URL) {
296
+ if (!envString("WAYGRAPH_BASE_URL")) {
345
297
  const resolved = await resolveBaseUrl(projectDir);
346
298
  if (resolved)
347
- process.env.WAYGRAPH_BASE_URL = resolved;
299
+ setEnv("WAYGRAPH_BASE_URL", resolved);
348
300
  }
349
301
  }
350
302
  export function resolveProjectDir(flags, fallbackIndex = 0) {
@@ -386,17 +338,10 @@ async function resolveFlowFileToExport(projectDir, fileArg) {
386
338
  }
387
339
  }
388
340
  const expected = flowExportNameFromBasename(abs);
389
- const src = readFileSync(abs, "utf-8");
390
- if (new RegExp(`\\bexport\\s+(?:const|let|var|async\\s+function|function)\\s+${expected}\\b`).test(src)) {
341
+ const exported = exportedNames(parseSource(abs));
342
+ if (exported.includes(expected))
391
343
  return expected;
392
- }
393
- if (new RegExp(`\\bexport\\s*\\{[^}]*\\b${expected}\\b`).test(src)) {
394
- return expected;
395
- }
396
- const flowNames = [
397
- ...src.matchAll(/\bexport\s+(?:const|let|var|async\s+function|function)\s+(\w*Flow)\b/g),
398
- ].map((m) => m[1]);
399
- const unique = [...new Set(flowNames)];
344
+ const unique = [...new Set(exported.filter((n) => n.endsWith("Flow")))];
400
345
  if (unique.length === 1)
401
346
  return unique[0];
402
347
  if (unique.includes(expected))
@@ -6,3 +6,4 @@
6
6
  * `WAYGRAPH_SLOWMO=<ms>` pass straight through from this process's own env.
7
7
  */
8
8
  export declare function runChain(projectDir: string, spec: string): Promise<void>;
9
+ export declare function runChainAuto(projectDir: string, fromTag: string, toTag: string): Promise<void>;
@@ -1,9 +1,12 @@
1
- // Split out of the former 8,700-line cli.ts (see src/ARCHITECTURE.md). Behavior unchanged.
2
- import { configuredExtensions } from "../config.js";
3
- import { expandSpecFlowFiles, resolveBaseUrl } from "./flags.js";
1
+ import { configuredExtensions } from "../runtime/waygraph-config.js";
2
+ import { defaultRunLogDir } from "../runtime/run-log.js";
3
+ import { expandSpecFlowFiles } from "./flags.js";
4
+ import { resolveBaseUrl } from "../runtime/waygraph-config.js";
5
+ import { discoverGraph, findBlockPath, findOrphanBlocks } from "../analysis/graph.js";
4
6
  import { join } from "node:path";
5
7
  import { rmSync, writeFileSync } from "node:fs";
6
8
  import { spawn } from "node:child_process";
9
+ import { envString, setEnv } from "../engine/env.js";
7
10
  // ---------------------------------------------------------------------------
8
11
  // `chain`
9
12
  // ---------------------------------------------------------------------------
@@ -41,19 +44,21 @@ mod.startRunner();
41
44
  */
42
45
  export async function runChain(projectDir, spec) {
43
46
  const expanded = await expandSpecFlowFiles(projectDir, spec);
44
- if (process.env.WAYGRAPH_VIDEO && !process.env.WAYGRAPH_BASE_URL) {
47
+ if (envString("WAYGRAPH_VIDEO") && !envString("WAYGRAPH_BASE_URL")) {
45
48
  const resolved = await resolveBaseUrl(projectDir);
46
49
  if (resolved)
47
- process.env.WAYGRAPH_BASE_URL = resolved;
50
+ setEnv("WAYGRAPH_BASE_URL", resolved);
48
51
  }
49
52
  const extensions = await configuredExtensions(projectDir);
53
+ if (envString("WAYGRAPH_RUN_LOG") === undefined)
54
+ setEnv("WAYGRAPH_RUN_LOG", defaultRunLogDir(projectDir));
50
55
  if (extensions.length > 0)
51
- process.env.WAYGRAPH_EXTENSIONS = extensions.join(",");
56
+ setEnv("WAYGRAPH_EXTENSIONS", extensions.join(","));
52
57
  const tsxEsm = import.meta.resolve("tsx/esm");
53
58
  const scriptPath = join(projectDir, `.waygraph-chain-${process.pid}.mjs`);
54
59
  writeFileSync(scriptPath, CHAIN_RUNNER_BOOTSTRAP);
55
60
  try {
56
- // webServer is started inside the child (runner/main.js), never here - see CHAIN_RUNNER_BOOTSTRAP.
61
+ // webServer is started inside the child (runner/runner.ts), never here - see CHAIN_RUNNER_BOOTSTRAP.
57
62
  const code = await new Promise((res, rej) => {
58
63
  const child = spawn(process.execPath, ["--import", tsxEsm, scriptPath, projectDir, expanded], {
59
64
  stdio: "inherit",
@@ -70,3 +75,33 @@ export async function runChain(projectDir, spec) {
70
75
  rmSync(scriptPath, { force: true });
71
76
  }
72
77
  }
78
+ async function requireNoOrphans(projectDir, forCommand) {
79
+ const orphans = await findOrphanBlocks(projectDir);
80
+ if (orphans.length === 0)
81
+ return true;
82
+ console.error(`waygraph ${forCommand}: ${orphans.length} orphan Block(s) - wire every Block into a .flow.ts before auto shorthand. Run: waygraph check ${projectDir === process.cwd() ? "." : JSON.stringify(projectDir)}`);
83
+ for (const o of orphans) {
84
+ console.error(` - ${o.file} (${o.exportName} / "${o.block}")`);
85
+ }
86
+ process.exitCode = 1;
87
+ return false;
88
+ }
89
+ export async function runChainAuto(projectDir, fromTag, toTag) {
90
+ if (!(await requireNoOrphans(projectDir, "chain auto")))
91
+ return;
92
+ const graph = await discoverGraph(projectDir);
93
+ const path = findBlockPath(graph, fromTag, toTag);
94
+ if (!path) {
95
+ console.error(`waygraph chain auto: no Block path from "${fromTag}" to "${toTag}" in the discovered graph`);
96
+ process.exitCode = 1;
97
+ return;
98
+ }
99
+ const spec = path.join(" then ");
100
+ console.error(`waygraph chain auto: ${fromTag} -> ${toTag} via ${spec}`);
101
+ if (!envString("WAYGRAPH_BASE_URL")) {
102
+ const resolved = await resolveBaseUrl(projectDir);
103
+ if (resolved)
104
+ setEnv("WAYGRAPH_BASE_URL", resolved);
105
+ }
106
+ await runChain(projectDir, spec);
107
+ }
@@ -1,4 +1,4 @@
1
- import type { SessionMeta } from "../session/browser.js";
1
+ import type { SessionMeta } from "../live/auto-session/ipc.js";
2
2
  export declare function printBrowserUsage(): void;
3
3
  export declare function printBrowserSessionsList(sessions: SessionMeta[], projectDir: string): void;
4
4
  export declare function usage(): void;