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
package/dist/cli/usage.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { optionHelp } from "./flags.js";
1
2
  export function printBrowserUsage() {
2
3
  console.log(`waygraph browser — persistent Playwright sessions (headful by default)
3
4
 
@@ -36,26 +37,22 @@ export function usage() {
36
37
  Primary (less is more):
37
38
  waygraph auto [project|.flow.ts] Interactive explore (picker)
38
39
  --cli Terminal menu instead of browser panel
39
- --cli --detach Run the --cli session as a background socket
40
- server; prints {sessionId, socketPath} and exits
41
40
  --blocks <From> <To> Graph path-find From->To, then run
42
41
  --data '{...}' Mem seed (same as demo/run)
43
42
  (pass a .flow.ts to run that flow - same as run)
44
- --cli --detach --non-headless Detached session with a real visible browser
45
- (same --non-headless flag run/demo already use)
46
- waygraph auto send <sessionId> "<pick>" Send one pick to a --detach session, print
43
+ waygraph auto send <sessionId> "<pick>" Send one pick to a session (browser start / pilot start), print
47
44
  the resulting state as JSON (no TTY needed).
48
45
  <pick> is a 1-based menu index, a Block name
49
46
  (exact match; ambiguous names refuse rather than
50
47
  guess), or "q"/"quit". Same command as
51
48
  browser send <sessionId> "<pick>" (prefer that
52
- prefix for a --detach/persistent session).
49
+ prefix for a persistent session).
53
50
  --timeout <ms> Override the 15s default wait for this one call -
54
51
  a single Block can legitimately run a slow real
55
52
  interaction (e.g. a multi-step mouse drag)
56
- waygraph auto status <sessionId> Read a --detach session's state (no side effects)
53
+ waygraph auto status <sessionId> Read a session's state (no side effects)
57
54
  waygraph auto attach <sessionId> Reopen an interactive terminal against a
58
- running --detach session
55
+ running session
59
56
  waygraph auto dom <sessionId> Read the live page's structure (no side effects)
60
57
  --mode aria|full Default aria (Playwright ariaSnapshotJSON, AI mode);
61
58
  full = bounded raw DOM walk (tag/attrs/text/children)
@@ -114,8 +111,8 @@ Primary (less is more):
114
111
  todoTitle?, holdMs? (0=until next), clear:true.
115
112
  Missing selectors listed in response, not fatal.
116
113
  Same command as browser highlight <sessionId>
117
- '<json>' (prefer that prefix for a --detach/
118
- persistent session).
114
+ '<json>' (prefer that prefix for a persistent
115
+ session).
119
116
  <selector>|<label>[|<tone>] Shorthand for 1-3 rings, no JSON braces/quotes
120
117
  to escape - rings separated by ";", e.g.
121
118
  "#x|Login button|warning; .err|Error banner|danger".
@@ -124,11 +121,7 @@ Primary (less is more):
124
121
  form above.
125
122
  waygraph browser Show browser subcommands
126
123
  waygraph browser start Open a new session (headful by default, about:blank)
127
- --inject preset|path Merge an external Block library (e.g. saucedemo)
128
- --goto <url> Navigate on start (disables blank page)
129
- --blank Force about:blank on start (default)
130
- --headless Headless session (default is visible browser)
131
- --cli After start, open the terminal picker (auto attach)
124
+ ${optionHelp("session")}
132
125
  waygraph browser sessions [project] List live browser sessions (attach/status/stop by id)
133
126
  waygraph browser send|status|attach|… Same session control as auto (see auto send/status/…)
134
127
  waygraph pilot start Bootstrap: browser session + whole-project graph +
@@ -140,40 +133,9 @@ Primary (less is more):
140
133
  waygraph auto Interactive explore (picker) — NOT the persistent browser
141
134
  layer; use browser/pilot for agent-driven sessions.
142
135
  waygraph demo [--blocks <flow|file|spec>] Watch with step overlay (QA path)
143
- --data '{...}' Mem seed JSON (or inline flow({...}))
144
- --mem-stub Fill any requires key --data didn't cover from
145
- registerMemStub's registry (needs the key
146
- registered, or the flow's own withMemStub - a
147
- key with neither still fails preflight)
148
- --auto-next Auto-advance steps (alias: --autoplay)
149
- --fast Shorter auto-next / Next gates (keeps smooth cursor)
150
- --full Classic wrap-all block chips (default: carousel)
151
- --mini Force compact mini panel (Hide pill + Next); alias --stepper-mini
152
- --todo-left|--todo-right Floating checklist dock side (also ctx.todoPos / WAYGRAPH_TODO_POS)
153
- --todo-full Opt out: full checklist, no compact/collision/behind-ring
154
- --todo-smart Opt in: compact + collision + behind-ring (default)
155
- --ff-expand Expand fastForwardComposeBlock inners as separate steps
156
- --ff-disabled Dispute: expand FF (alias --no-ff); blitz kept on those inners
157
- --auto-play-video Unattended + recorded: --auto-next + --video (+ step); headless
158
- --auto-play-video-head Same, but keep the browser visible (--non-headless)
159
- --video [dir] Record .webm (demo: headless unless --non-headless);
160
- default folder ~/Downloads/waygraph-videos/<project>,
161
- or video.dir in the config / WAYGRAPH_VIDEO_DIR
162
- --video-viewport WxH Recording size (default demo: 1920x1080)
163
- --title / --base-url
136
+ ${optionHelp("demo")}
164
137
  waygraph run [--blocks <flow|file|spec>] Execute (no overlay unless --step)
165
- --data '{...}'
166
- --mem-stub Same as demo's --mem-stub
167
- --all-branches Bare Flow ref only: explore every MapBuilder.branch()
168
- path, cloning the session (storageState+URL) at each
169
- branch point - see runBranchRegression()
170
- --shared-session With --all-branches: one shared session instead of
171
- cloning (follows only the live-dispatch path)
172
- --non-headless Show browser
173
- --video [dir] Record .webm
174
- --video-viewport WxH Recording size (default run: 1280x720)
175
- --ff-expand Same as demo (expand FFCompose inners)
176
- --ff-disabled Same as demo (dispute: expand FF)
138
+ ${optionHelp("run")}
177
139
  waygraph test Runs the project's @playwright/test suite (cwd) -
178
140
  thin wrapper: forwards to the local playwright
179
141
  binary (or npx playwright as a fallback)
@@ -186,6 +148,11 @@ Primary (less is more):
186
148
  has a trace - test report opens it.
187
149
 
188
150
  Also:
151
+ waygraph manifest [project] [--out <file>]
152
+ Every Block (kind, route from -> to, requires, map
153
+ group), Flow (use case, steps, settings) and
154
+ Checkpoint of the project, as JSON - what Waygraph UI
155
+ and map packages read.
189
156
  --config <name|file> (any command) use another config instead of waygraph.config.ts, e.g.
190
157
  waygraph test --config staging (config/waygraph.staging.config.ts)
191
158
  --env <mode> (any command) load .env.<mode> / .env.<mode>.local on top of .env, e.g.
@@ -196,6 +163,8 @@ Also:
196
163
  dependency. Dry run unless --apply; only the paths you
197
164
  name are copied, differing files only with --overwrite.
198
165
  --skills refreshes .agents/skills to this waygraph's.
166
+ --codemod checkpoints rewrites tag strings and <In, Out>
167
+ to Checkpoint values (checkpoint: Home, from/to).
199
168
  waygraph extensions install [project] [--update]
200
169
  Download the browser extensions listed in
201
170
  waygraph.config.* (extensions: ["hoppscotch"]) into
@@ -208,6 +177,9 @@ Also:
208
177
  violation, unlike check's warnings-only stance. A
209
178
  no-op (exit 0, informational) if the project has no
210
179
  src/map/ directory at all.
180
+ waygraph map pack <group> [project] Pack a src/map/ group that owns its _states.ts into
181
+ --out <dir> --name <pkg> a package (.waygraph/packages/<group>); installed
182
+ --version <x.y.z> elsewhere, its Blocks join the scan
211
183
  waygraph traverse [project] Graph crawl (Phase B-E)
212
184
  --blocks <glob|/re/|sub> Phase C: filter *.block.ts discovery
213
185
  --parallel N Phase D: N clone workers (max 4)
@@ -222,7 +194,6 @@ Also:
222
194
  waygraph try [demo|auto|auto:cli] One-shot saucedemo in a temp dir
223
195
  try auto Headed browser panel (default)
224
196
  try auto:cli / --cli Terminal menu instead
225
- try auto --headed Same as try auto (compat)
226
197
 
227
198
  Skills (print packaged skill markdown to stdout - for agents / paste):
228
199
  waygraph --skill List available skills
@@ -246,10 +217,7 @@ Examples:
246
217
  waygraph traverse --parallel 2 --session clone # Phase D clone workers
247
218
  waygraph run --blocks "loginFlow then add-all-to-cart" --data '{...}' --video
248
219
 
249
- Aliases (compat): \`chain <spec>\` -> run --blocks; \`chain auto A B\` -> auto --blocks A B;
250
- --autoplay -> --auto-next. Prefer the primary verbs above.
251
-
252
- Project path optional (defaults to cwd). Flags beat WAYGRAPH_* env.
220
+ Project path optional (defaults to cwd). Flags beat WAYGRAPH_* env. \`waygraph <command> --help\`: that command's flags.
253
221
  \`run\`/\`demo\`/\`auto\`: Flow export, .flow.ts path, or "a then b" chain (auto also explores).
254
222
  Hide stepper = compact "N / M · block" pill. Collapses while a step runs (clicks hit the page). Video mode stays compact.
255
223
  `);
@@ -2,9 +2,9 @@
2
2
  * This package's own installed root (contains `templates/`, sibling to `dist/`) - this file
3
3
  * compiles to `dist/cli/util.js`, so it's TWO levels up, not one. Real regression once, from the
4
4
  * 0.15.24 cli.ts split: this function was copied verbatim from its old top-level `src/cli.ts`
5
- * location (one level: `dist/cli.js` -> `..`) into `src/cli/util.ts` (compiles one level deeper)
5
+ * location (one level: `dist/cli/cli.js` -> `..`) into `src/cli/util.ts` (compiles one level deeper)
6
6
  * without adjusting the path math - silently broke `waygraph init`/`try` (no build-level test
7
- * caught it, since tests never ran the actual compiled dist/cli.js for these two commands).
7
+ * caught it, since tests never ran the actual compiled dist/cli/cli.js for these two commands).
8
8
  */
9
9
  export declare function packageRoot(): string;
10
10
  /** Spawns with inherited stdio (the real npm/playwright output, visible) and resolves to its exit code. */
package/dist/cli/util.js CHANGED
@@ -1,4 +1,3 @@
1
- // Split out of the former 8,700-line cli.ts (see src/ARCHITECTURE.md). Behavior unchanged.
2
1
  import { dirname, resolve } from "node:path";
3
2
  import { fileURLToPath } from "node:url";
4
3
  import { spawn } from "node:child_process";
@@ -14,9 +13,9 @@ import { spawn } from "node:child_process";
14
13
  * This package's own installed root (contains `templates/`, sibling to `dist/`) - this file
15
14
  * compiles to `dist/cli/util.js`, so it's TWO levels up, not one. Real regression once, from the
16
15
  * 0.15.24 cli.ts split: this function was copied verbatim from its old top-level `src/cli.ts`
17
- * location (one level: `dist/cli.js` -> `..`) into `src/cli/util.ts` (compiles one level deeper)
16
+ * location (one level: `dist/cli/cli.js` -> `..`) into `src/cli/util.ts` (compiles one level deeper)
18
17
  * without adjusting the path math - silently broke `waygraph init`/`try` (no build-level test
19
- * caught it, since tests never ran the actual compiled dist/cli.js for these two commands).
18
+ * caught it, since tests never ran the actual compiled dist/cli/cli.js for these two commands).
20
19
  */
21
20
  export function packageRoot() {
22
21
  return resolve(dirname(fileURLToPath(import.meta.url)), "..", "..");
@@ -5,7 +5,7 @@
5
5
  * SAME "waygraph vision" ring can import pure CSS text, not the rendering
6
6
  * engine around it - `cli.ts` runs `main().catch(...)` unconditionally at
7
7
  * module load with no `import.meta.url` guard, so importing anything from it
8
- * is unsafe as a library dependency (see `pilot-overlay.ts`'s own doc
8
+ * is unsafe as a library dependency (see `overlay/pilot-shell.ts`'s own doc
9
9
  * comment for the same reasoning re: the badge/panel). This file has always
10
10
  * been the pure, side-effect-free home for tone/size/weight - the CSS that
11
11
  * renders them belongs alongside it for the same reason. `cli.ts` imports
@@ -1,5 +1,4 @@
1
- import { ringCss } from "../ui/components/ring.js";
2
- // Split out of the former 2,100-line highlights.ts (see src/ARCHITECTURE.md). Behavior unchanged.
1
+ import { ringCss } from "../overlay/ui/components/ring.js";
3
2
  /**
4
3
  * The `#wg-ring` / `#wg-ring-label` CSS (tone/size/weight variants) - the
5
4
  * actual visual language `cli.ts`'s own demo stepper paints with. Extracted
@@ -7,7 +6,7 @@ import { ringCss } from "../ui/components/ring.js";
7
6
  * SAME "waygraph vision" ring can import pure CSS text, not the rendering
8
7
  * engine around it - `cli.ts` runs `main().catch(...)` unconditionally at
9
8
  * module load with no `import.meta.url` guard, so importing anything from it
10
- * is unsafe as a library dependency (see `pilot-overlay.ts`'s own doc
9
+ * is unsafe as a library dependency (see `overlay/pilot-shell.ts`'s own doc
11
10
  * comment for the same reasoning re: the badge/panel). This file has always
12
11
  * been the pure, side-effect-free home for tone/size/weight - the CSS that
13
12
  * renders them belongs alongside it for the same reason. `cli.ts` imports
@@ -1,14 +1,11 @@
1
- import type { DemoPace, FixtureDurationFields } from "./types.js";
1
+ import type { DemoPace } from "../../engine/stub/pace.js";
2
+ import type { FixtureDurationFields } from "../../engine/stub/ring.js";
2
3
  /** Default fixture dwell when `duration: true`. */
3
4
  export declare const FIXTURE_DURATION_MS_DEFAULT = 2000;
4
5
  /** Default fixture dwell under `--fast` when duration is enabled. */
5
6
  export declare const FIXTURE_DURATION_FAST_MS_DEFAULT = 600;
6
7
  /** Default fixture dwell under demo pace `slow` (gaps / wrongs review). */
7
8
  export declare const FIXTURE_DURATION_SLOW_MS_DEFAULT = 4000;
8
- /** @deprecated Prefer FIXTURE_DURATION_MS_DEFAULT */
9
- export declare const SLIDE_DURATION_MS_DEFAULT = 2000;
10
- /** @deprecated Prefer FIXTURE_DURATION_FAST_MS_DEFAULT */
11
- export declare const SLIDE_DURATION_FAST_MS_DEFAULT = 600;
12
9
  /** Turns any accepted pace spelling into a `DemoPace`; unknown values mean normal. */
13
10
  export declare function normalizeDemoPace(raw: unknown): DemoPace;
14
11
  /** The multiplier a pace applies to dwell and gate time (1 = normal); `demo.speeds` redefines the named ones. */
@@ -33,7 +30,7 @@ export declare function formatDemoPaceBadge(pace: DemoPace, baseAutoplayMs?: num
33
30
  export declare function formatDemoPaceLabel(pace: DemoPace, baseAutoplayMs?: number): string;
34
31
  /**
35
32
  * Resolve min dwell ms for any fixture (stub / flow fixture / yap slide),
36
- * or `null` when duration is unset (caller keeps legacy timing).
33
+ * or `null` when duration is unset (caller keeps its default timing).
37
34
  *
38
35
  * Authoring wins: an explicit slow/numeric pace is not crushed by CLI `--fast`
39
36
  * (`gatesFast`). `--fast` only shortens when pace is unset/normal.
@@ -42,11 +39,6 @@ export declare function resolveFixtureDwellMs(fixture: FixtureDurationFields, op
42
39
  gatesFast?: boolean;
43
40
  pace?: DemoPace;
44
41
  }): number | null;
45
- /** @deprecated Prefer {@link resolveFixtureDwellMs} */
46
- export declare function resolveSlideDwellMs(slide: FixtureDurationFields, opts?: {
47
- gatesFast?: boolean;
48
- pace?: DemoPace;
49
- }): number | null;
50
42
  /**
51
43
  * Effective demo pace for a step: block override > flow episode > normal.
52
44
  * Opaque FF / wasFastForward always win as blitz.
@@ -1,13 +1,10 @@
1
+ import { envString } from "../../engine/env.js";
1
2
  /** Default fixture dwell when `duration: true`. */
2
3
  export const FIXTURE_DURATION_MS_DEFAULT = 2000;
3
4
  /** Default fixture dwell under `--fast` when duration is enabled. */
4
5
  export const FIXTURE_DURATION_FAST_MS_DEFAULT = 600;
5
6
  /** Default fixture dwell under demo pace `slow` (gaps / wrongs review). */
6
7
  export const FIXTURE_DURATION_SLOW_MS_DEFAULT = 4000;
7
- /** @deprecated Prefer FIXTURE_DURATION_MS_DEFAULT */
8
- export const SLIDE_DURATION_MS_DEFAULT = FIXTURE_DURATION_MS_DEFAULT;
9
- /** @deprecated Prefer FIXTURE_DURATION_FAST_MS_DEFAULT */
10
- export const SLIDE_DURATION_FAST_MS_DEFAULT = FIXTURE_DURATION_FAST_MS_DEFAULT;
11
8
  /** Turns any accepted pace spelling into a `DemoPace`; unknown values mean normal. */
12
9
  export function normalizeDemoPace(raw) {
13
10
  if (typeof raw === "number" && Number.isFinite(raw) && raw > 0)
@@ -42,7 +39,8 @@ export function normalizeDemoPace(raw) {
42
39
  function paceSpeeds() {
43
40
  const out = { blitz: 0.05, fast: 0.33, slow: 2 };
44
41
  try {
45
- const raw = process.env.WAYGRAPH_PACE_SPEEDS ? JSON.parse(process.env.WAYGRAPH_PACE_SPEEDS) : {};
42
+ const speeds = envString("WAYGRAPH_PACE_SPEEDS");
43
+ const raw = speeds ? JSON.parse(speeds) : {};
46
44
  for (const k of ["blitz", "fast", "slow"]) {
47
45
  if (typeof raw[k] === "number" && raw[k] > 0)
48
46
  out[k] = Math.min(10, raw[k]);
@@ -95,7 +93,7 @@ export function demoPaceIsSlow(pace) {
95
93
  }
96
94
  /** Autoplay / Next-gate ms for this pace (base is WAYGRAPH_AUTOPLAY_MS or 1800). */
97
95
  export function demoPaceGateMs(pace, baseAutoplayMs) {
98
- if (pace === "blitz" && process.env.WAYGRAPH_PACE_SPEEDS) {
96
+ if (pace === "blitz" && envString("WAYGRAPH_PACE_SPEEDS")) {
99
97
  return Math.min(30000, Math.max(20, Math.round(baseAutoplayMs * paceSpeeds().blitz)));
100
98
  }
101
99
  if (demoPaceIsBlitz(pace))
@@ -153,7 +151,7 @@ export function formatDemoPaceLabel(pace, baseAutoplayMs = 1800) {
153
151
  }
154
152
  /**
155
153
  * Resolve min dwell ms for any fixture (stub / flow fixture / yap slide),
156
- * or `null` when duration is unset (caller keeps legacy timing).
154
+ * or `null` when duration is unset (caller keeps its default timing).
157
155
  *
158
156
  * Authoring wins: an explicit slow/numeric pace is not crushed by CLI `--fast`
159
157
  * (`gatesFast`). `--fast` only shortens when pace is unset/normal.
@@ -188,10 +186,6 @@ export function resolveFixtureDwellMs(fixture, opts) {
188
186
  return Math.max(normalMs, FIXTURE_DURATION_SLOW_MS_DEFAULT);
189
187
  return normalMs;
190
188
  }
191
- /** @deprecated Prefer {@link resolveFixtureDwellMs} */
192
- export function resolveSlideDwellMs(slide, opts) {
193
- return resolveFixtureDwellMs(slide, opts);
194
- }
195
189
  /**
196
190
  * Effective demo pace for a step: block override > flow episode > normal.
197
191
  * Opaque FF / wasFastForward always win as blitz.
@@ -1,4 +1,4 @@
1
- import type { DeviceOrientation, DevicePreset, DeviceState, DeviceViewport } from "./types.js";
1
+ import type { DeviceOrientation, DevicePreset, DeviceState, DeviceViewport } from "../../engine/stub/viewport.js";
2
2
  /** Built-in preset sizes (CSS pixels) — stored in portrait for mobile/tablet. */
3
3
  export declare const DEVICE_PRESETS: Record<DevicePreset, Omit<DeviceState, "touchMode"> & {
4
4
  touchMode?: boolean;
@@ -18,7 +18,7 @@ export declare function applyOrientation(state: DeviceState, orientation: Device
18
18
  export declare function resolveDeviceState(input: DevicePreset | DeviceState | DeviceViewport | undefined, touchOverride?: boolean, orientationOverride?: DeviceOrientation): DeviceState | undefined;
19
19
  /**
20
20
  * Carry-forward for device fixtures (mirror {@link applyTodoPhase}).
21
- * - clear: hideDevice / clearDevice / device("desktop") with clear intent
21
+ * - clear: hideDevice / device("desktop") with clear intent
22
22
  * - set: author set device/viewport/touch this phase
23
23
  * - keep: omit - preserve previous (whole episode remain)
24
24
  */
@@ -154,7 +154,7 @@ export function resolveDeviceState(input, touchOverride, orientationOverride) {
154
154
  }
155
155
  /**
156
156
  * Carry-forward for device fixtures (mirror {@link applyTodoPhase}).
157
- * - clear: hideDevice / clearDevice / device("desktop") with clear intent
157
+ * - clear: hideDevice / device("desktop") with clear intent
158
158
  * - set: author set device/viewport/touch this phase
159
159
  * - keep: omit - preserve previous (whole episode remain)
160
160
  */
@@ -0,0 +1,8 @@
1
+ import type { HighlightStubPhase, ResolvedHighlight } from "../../engine/stub/ring.js";
2
+ import type { HighlightStubPhaseName, StubLifecycleFn } from "../../engine/stub/stub.js";
3
+ import type { Block } from "../../engine/block/block.js";
4
+ export declare function applyDefaultZoom(slots: ResolvedHighlight[], defaultZoom?: number): ResolvedHighlight[];
5
+ export declare function applyDefaultZoomOut(slots: ResolvedHighlight[], defaultZoomOut?: boolean): ResolvedHighlight[];
6
+ /** A stub phase's slot map as an ordered list of resolved highlights. */
7
+ export declare function resolvePhaseMap(phaseMap: HighlightStubPhase): ResolvedHighlight[];
8
+ export declare function readStubRaw(block: Block<any, any>, phase: HighlightStubPhaseName): StubLifecycleFn<any> | undefined;
@@ -0,0 +1,71 @@
1
+ import { normalizeHighlightSize, normalizeHighlightTone, normalizeHighlightWeight } from "../../engine/stub/ring.js";
2
+ function zoomOf(slot) {
3
+ return slot.zoom !== undefined && Number.isFinite(slot.zoom) && slot.zoom > 0 ? { zoom: slot.zoom } : {};
4
+ }
5
+ function fxOf(slot) {
6
+ const out = {};
7
+ if (slot.focus !== undefined)
8
+ out.focus = !!slot.focus;
9
+ if (slot.color !== undefined && String(slot.color).trim())
10
+ out.color = String(slot.color).trim();
11
+ if (slot.cursor !== undefined)
12
+ out.cursor = !!slot.cursor;
13
+ if (slot.todo !== undefined && String(slot.todo).trim())
14
+ out.todo = String(slot.todo).trim();
15
+ if (slot.gesture === "tap" || slot.gesture === "hold" || slot.gesture === "click" || slot.gesture === "swipe") {
16
+ out.gesture = slot.gesture;
17
+ }
18
+ return out;
19
+ }
20
+ /** A Block's own stub slot with its style fields normalized. */
21
+ function normalizeSlot(slot) {
22
+ if (!slot)
23
+ return null;
24
+ return {
25
+ ...slot,
26
+ ...(slot.tone ? { tone: normalizeHighlightTone(slot.tone) } : {}),
27
+ ...(slot.size ? { size: normalizeHighlightSize(slot.size) } : {}),
28
+ ...(slot.weight ? { weight: normalizeHighlightWeight(slot.weight) } : {}),
29
+ ...zoomOf(slot),
30
+ ...fxOf(slot),
31
+ };
32
+ }
33
+ export function applyDefaultZoom(slots, defaultZoom) {
34
+ if (defaultZoom === undefined || !(defaultZoom > 0))
35
+ return slots;
36
+ return slots.map((h) => (h.zoom !== undefined && h.zoom > 0 ? h : { ...h, zoom: defaultZoom }));
37
+ }
38
+ export function applyDefaultZoomOut(slots, defaultZoomOut) {
39
+ if (defaultZoomOut === undefined)
40
+ return slots;
41
+ return slots.map((h) => h.zoomOut !== undefined ? h : { ...h, zoomOut: defaultZoomOut });
42
+ }
43
+ /** A stub phase's slot map as an ordered list of resolved highlights. */
44
+ export function resolvePhaseMap(phaseMap) {
45
+ const phaseKeys = Object.keys(phaseMap);
46
+ const allNumeric = phaseKeys.length > 0 && phaseKeys.every((k) => Number.isFinite(Number(k)) && String(Number(k)) === k);
47
+ // Numeric stub ids ("0", "1") sort by number. Named stubs keep author
48
+ // insertion order - localeCompare used to reorder password/submit/username
49
+ // and advance the wrong todo index on fill.
50
+ const ordered = allNumeric ? [...phaseKeys].sort((a, b) => Number(a) - Number(b)) : phaseKeys;
51
+ const resolved = [];
52
+ for (const id of ordered) {
53
+ const merged = normalizeSlot(phaseMap[id]);
54
+ if (merged) {
55
+ resolved.push({
56
+ ...merged,
57
+ slotId: id,
58
+ ...(merged.todo ? { todo: merged.todo } : {}),
59
+ });
60
+ }
61
+ }
62
+ return resolved;
63
+ }
64
+ export function readStubRaw(block, phase) {
65
+ const instr = block.instruction;
66
+ if (phase === "stubBefore")
67
+ return instr.stubBefore;
68
+ if (phase === "stubAfter")
69
+ return instr.stubAfter;
70
+ return instr.stubOnError;
71
+ }
@@ -1,19 +1,20 @@
1
- import type { HighlightFixtureMap, HighlightStubPhaseName, ResolvedHighlight, StubPhaseResult, WaygraphSlide } from "./types.js";
2
- import type { Block, Checkpoint } from "../types.js";
3
- import type { MemPage } from "../mem-page.js";
1
+ import type { HighlightStubPhaseName, StubPhaseResult } from "../../engine/stub/stub.js";
2
+ import type { ResolvedHighlight, WaygraphSlide } from "../../engine/stub/ring.js";
3
+ import type { Block } from "../../engine/block/block.js";
4
+ import type { Checkpoint } from "../../engine/checkpoint/checkpoint.js";
5
+ import type { MemPage } from "../../engine/mem/mem.js";
4
6
  /**
5
7
  * Run an open stub lifecycle (preferred) or resolve a static slot map.
6
8
  * Returns rings + episode fixtures (todos / todoIndex / zoom).
7
9
  *
8
10
  * @example
9
- * const before = await runStubPhase(block, "stubBefore", { fixtures });
11
+ * const before = await runStubPhase(block, "stubBefore", { mem });
10
12
  * // before.todos, before.highlights
11
13
  */
12
14
  export declare function runStubPhase(block: Block<any, any>, phase: HighlightStubPhaseName, opts?: {
13
15
  out?: Checkpoint<string>;
14
16
  error?: unknown;
15
17
  mem?: MemPage;
16
- fixtures?: HighlightFixtureMap;
17
18
  }): Promise<StubPhaseResult>;
18
19
  /**
19
20
  * Sync resolve of highlight slots. Prefer {@link runStubPhase} for open
@@ -21,23 +22,18 @@ export declare function runStubPhase(block: Block<any, any>, phase: HighlightStu
21
22
  */
22
23
  export declare function resolveHighlightSlots(block: Block<any, any>, phase: HighlightStubPhaseName, opts?: {
23
24
  out?: Checkpoint<string>;
24
- fixtures?: HighlightFixtureMap;
25
25
  }): ResolvedHighlight[];
26
- /**
27
- * Resolve multi-step yap slides: flow fixture `slides` wins when present,
28
- * else `instruction.slides` (function form allowed).
29
- */
26
+ /** Resolve multi-step yap slides from `instruction.slides` (function form allowed). */
30
27
  export declare function resolveSlides(block: Block<any, any>, opts?: {
31
28
  out?: Checkpoint<string>;
32
- fixtures?: HighlightFixtureMap;
33
29
  }): WaygraphSlide[];
34
30
  /**
35
- * True when the block authored stubAfter (lifecycle fn, slots, fixtures, or legacy highlights).
31
+ * True when the block authored stubAfter (lifecycle fn or slots).
36
32
  * When true, demo should not use verify-trait fallback.
37
33
  */
38
- export declare function hasAuthoredStubAfter(block: Block<any, any>, out?: Checkpoint<string>, fixtures?: HighlightFixtureMap): boolean;
34
+ export declare function hasAuthoredStubAfter(block: Block<any, any>, out?: Checkpoint<string>): boolean;
39
35
  /**
40
36
  * True when stubOnError is authored (lifecycle fn and/or rings).
41
37
  * Demo fail path only - success never consults this.
42
38
  */
43
- export declare function hasAuthoredStubOnError(block: Block<any, any>, fixtures?: HighlightFixtureMap): boolean;
39
+ export declare function hasAuthoredStubOnError(block: Block<any, any>): boolean;
@@ -1,5 +1,5 @@
1
- import { createStubCtx, liftLegacySlotTodos } from "./stub-ctx.js";
2
- import { applyDefaultZoom, applyDefaultZoomOut, applyLegacyHighlightsShim, isStubPhase, mergePhaseMaps, readStubRaw } from "./merge.js";
1
+ import { createStubCtx } from "./stub-ctx.js";
2
+ import { applyDefaultZoom, applyDefaultZoomOut, readStubRaw, resolvePhaseMap } from "./merge.js";
3
3
  import { buildTodoDock, normalizeTodoStyle, normalizeTodos } from "./todo-dock.js";
4
4
  import { resolveDeviceState } from "./device.js";
5
5
  /**
@@ -7,7 +7,7 @@ import { resolveDeviceState } from "./device.js";
7
7
  * Returns rings + episode fixtures (todos / todoIndex / zoom).
8
8
  *
9
9
  * @example
10
- * const before = await runStubPhase(block, "stubBefore", { fixtures });
10
+ * const before = await runStubPhase(block, "stubBefore", { mem });
11
11
  * // before.todos, before.highlights
12
12
  */
13
13
  export async function runStubPhase(block, phase, opts) {
@@ -18,43 +18,16 @@ export async function runStubPhase(block, phase, opts) {
18
18
  ...(opts?.mem !== undefined ? { mem: opts.mem } : {}),
19
19
  });
20
20
  const raw = readStubRaw(block, phase);
21
- if (typeof raw === "function") {
21
+ if (raw) {
22
22
  try {
23
- const ret = await raw(ctx);
24
- if (isStubPhase(ret)) {
25
- bag.highlights = { ...bag.highlights, ...ret };
26
- }
27
- }
28
- catch {
29
- /* best-effort */
23
+ await raw(ctx);
30
24
  }
31
- // Compat: legacy `(out) => map` that expected Checkpoint (__state on arg). Only worth trying
32
- // when the real ctx call genuinely did nothing - checked against the WHOLE bag, not just
33
- // highlights/todos, so a stubBefore that only calls e.g. ctx.caption()/ctx.title()/ctx.zoom()
34
- // (no highlights, no todos) isn't mistaken for "didn't run" and re-invoked with a bare
35
- // Checkpoint that has none of StubCtx's methods - a real, previously-triggered bug (caught via
36
- // examples/saucedemo/src/flows/checkout.flow.ts's own stubBefore(ctx) { ctx.caption(...) }).
37
- const bagUntouched = Object.keys(bag).length === 1 && Object.keys(bag.highlights).length === 0;
38
- if (bagUntouched) {
39
- try {
40
- const legacyOut = (opts?.out ?? { __state: "" });
41
- const ret2 = raw(legacyOut);
42
- if (isStubPhase(ret2))
43
- bag.highlights = { ...ret2 };
44
- }
45
- catch {
46
- /* ignore */
47
- }
25
+ catch (err) {
26
+ // A mistake in the author's stub: shown on the step (the demo's failure panel), never dropped.
27
+ throw new Error(`${block.name}: its ${phase} stub threw: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
48
28
  }
49
29
  }
50
- else if (isStubPhase(raw)) {
51
- bag.highlights = { ...raw };
52
- }
53
- bag.highlights = applyLegacyHighlightsShim(block, phase, bag.highlights, opts?.out);
54
- liftLegacySlotTodos(bag);
55
- const fixturePhase = opts?.fixtures?.[block.name]?.[phase];
56
- let highlights = mergePhaseMaps(bag.highlights, fixturePhase);
57
- highlights = applyDefaultZoom(highlights, bag.zoom);
30
+ let highlights = applyDefaultZoom(resolvePhaseMap(bag.highlights), bag.zoom);
58
31
  highlights = applyDefaultZoomOut(highlights, bag.zoomOut);
59
32
  const todoDock = bag.hideTodos
60
33
  ? undefined
@@ -134,45 +107,19 @@ export async function runStubPhase(block, phase, opts) {
134
107
  export function resolveHighlightSlots(block, phase, opts) {
135
108
  const bag = { highlights: {} };
136
109
  const raw = readStubRaw(block, phase);
137
- if (typeof raw === "function") {
110
+ if (raw) {
111
+ // Synchronous read: the rings a stub paints before its first await.
138
112
  try {
139
- const ctx = createStubCtx(bag, {
140
- ...(opts?.out !== undefined ? { out: opts.out } : {}),
141
- });
142
- const ret = raw(ctx);
143
- if (isStubPhase(ret)) {
144
- bag.highlights = { ...bag.highlights, ...ret };
145
- }
113
+ void raw(createStubCtx(bag, { ...(opts?.out !== undefined ? { out: opts.out } : {}) }));
146
114
  }
147
- catch {
148
- try {
149
- const legacyOut = (opts?.out ?? { __state: "" });
150
- const ret2 = raw(legacyOut);
151
- if (isStubPhase(ret2))
152
- bag.highlights = { ...ret2 };
153
- }
154
- catch {
155
- bag.highlights = {};
156
- }
115
+ catch (err) {
116
+ throw new Error(`${block.name}: its ${phase} stub threw: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
157
117
  }
158
118
  }
159
- else if (isStubPhase(raw)) {
160
- bag.highlights = { ...raw };
161
- }
162
- bag.highlights = applyLegacyHighlightsShim(block, phase, bag.highlights, opts?.out);
163
- liftLegacySlotTodos(bag);
164
- const fixturePhase = opts?.fixtures?.[block.name]?.[phase];
165
- return applyDefaultZoom(mergePhaseMaps(bag.highlights, fixturePhase), bag.zoom);
119
+ return applyDefaultZoom(resolvePhaseMap(bag.highlights), bag.zoom);
166
120
  }
167
- /**
168
- * Resolve multi-step yap slides: flow fixture `slides` wins when present,
169
- * else `instruction.slides` (function form allowed).
170
- */
121
+ /** Resolve multi-step yap slides from `instruction.slides` (function form allowed). */
171
122
  export function resolveSlides(block, opts) {
172
- const fromFixture = opts?.fixtures?.[block.name]?.slides;
173
- if (fromFixture && fromFixture.length > 0) {
174
- return [...fromFixture];
175
- }
176
123
  const instr = block.instruction;
177
124
  let raw = instr.slides;
178
125
  if (typeof raw === "function") {
@@ -187,40 +134,24 @@ export function resolveSlides(block, opts) {
187
134
  return [];
188
135
  return raw.filter((s) => s && typeof s.caption === "string" && s.caption.length > 0);
189
136
  }
190
- function stubPhaseLooksAuthored(block, phase, fixtures) {
191
- const raw = readStubRaw(block, phase);
192
- if (typeof raw === "function")
193
- return true;
194
- if (isStubPhase(raw) && Object.keys(raw).length > 0)
195
- return true;
196
- const fx = fixtures?.[block.name]?.[phase];
197
- if (fx && Object.keys(fx).length > 0)
198
- return true;
199
- return false;
137
+ function stubPhaseLooksAuthored(block, phase) {
138
+ return readStubRaw(block, phase) !== undefined;
200
139
  }
201
140
  /**
202
- * True when the block authored stubAfter (lifecycle fn, slots, fixtures, or legacy highlights).
141
+ * True when the block authored stubAfter (lifecycle fn or slots).
203
142
  * When true, demo should not use verify-trait fallback.
204
143
  */
205
- export function hasAuthoredStubAfter(block, out, fixtures) {
206
- if (stubPhaseLooksAuthored(block, "stubAfter", fixtures))
207
- return true;
208
- const instr = block.instruction;
209
- if (instr.highlights)
144
+ export function hasAuthoredStubAfter(block, out) {
145
+ if (stubPhaseLooksAuthored(block, "stubAfter"))
210
146
  return true;
211
- return resolveHighlightSlots(block, "stubAfter", {
212
- ...(out !== undefined ? { out } : {}),
213
- ...(fixtures !== undefined ? { fixtures } : {}),
214
- }).length > 0;
147
+ return resolveHighlightSlots(block, "stubAfter", out !== undefined ? { out } : {}).length > 0;
215
148
  }
216
149
  /**
217
150
  * True when stubOnError is authored (lifecycle fn and/or rings).
218
151
  * Demo fail path only - success never consults this.
219
152
  */
220
- export function hasAuthoredStubOnError(block, fixtures) {
221
- if (stubPhaseLooksAuthored(block, "stubOnError", fixtures))
153
+ export function hasAuthoredStubOnError(block) {
154
+ if (stubPhaseLooksAuthored(block, "stubOnError"))
222
155
  return true;
223
- return (resolveHighlightSlots(block, "stubOnError", {
224
- ...(fixtures !== undefined ? { fixtures } : {}),
225
- }).length > 0);
156
+ return resolveHighlightSlots(block, "stubOnError").length > 0;
226
157
  }