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
@@ -0,0 +1,20 @@
1
+ // Every command's flags, read with node:util's parseArgs from the command's own table, which also prints its help. An
2
+ // unknown flag or a flag missing its value stops the command with the reason.
3
+ import { parseArgs } from "node:util";
4
+ export function parseCommand(command, table, argv) {
5
+ const options = Object.fromEntries(Object.entries(table).map(([name, o]) => [name, { type: o.type, multiple: o.multiple === true }]));
6
+ try {
7
+ const { values, positionals, tokens } = parseArgs({ args: argv, options, allowPositionals: true, strict: true, tokens: true });
8
+ return { values: values, positionals, tokens };
9
+ }
10
+ catch (err) {
11
+ console.error(`waygraph ${command}: ${err instanceof Error ? err.message : String(err)}`);
12
+ process.exit(1);
13
+ }
14
+ }
15
+ /** The table as aligned help lines (`--name <value> help`). */
16
+ export function helpLines(table, indent = 2) {
17
+ const rows = Object.entries(table).map(([name, o]) => [`--${name}${o.value ? " " + o.value : ""}`, o.help]);
18
+ const width = Math.max(...rows.map(([flag]) => flag.length)) + 2;
19
+ return rows.map(([flag, help]) => " ".repeat(indent) + flag.padEnd(width) + help).join("\n");
20
+ }
@@ -10,7 +10,6 @@
10
10
  *
11
11
  * Also: list / nav / validate / check / graph / init / agent-dive / traverse / try
12
12
  * Skills: --skill / --skill-pilot / --skill-pilot-blind / --skill-convention
13
- * Aliases (one release): `chain` -> run/demo --blocks; `--autoplay` -> `--auto-next`
14
13
  *
15
14
  * "project" defaults to cwd. Flags beat WAYGRAPH_* env.
16
15
  */
@@ -10,17 +10,16 @@
10
10
  *
11
11
  * Also: list / nav / validate / check / graph / init / agent-dive / traverse / try
12
12
  * Skills: --skill / --skill-pilot / --skill-pilot-blind / --skill-convention
13
- * Aliases (one release): `chain` -> run/demo --blocks; `--autoplay` -> `--auto-next`
14
13
  *
15
14
  * "project" defaults to cwd. Flags beat WAYGRAPH_* env.
16
15
  */
17
16
  import { SKILL_FLAG_MAP, printSkillIndex, readSkillMarkdown } from "./commands/agent-dive-scaffold.js";
18
- import { takeEnvFlag } from "./env-file.js";
19
- import { takeConfigFlag } from "./config.js";
20
- import { usage } from "./cli/usage.js";
17
+ import { takeEnvFlag } from "../runtime/env-file.js";
18
+ import { takeConfigFlag } from "../runtime/waygraph-config.js";
19
+ import { usage } from "./usage.js";
21
20
  import { listCase, navCase } from "./commands/list.js";
22
21
  import { checkCase, typecheckCase, validateCase } from "./commands/check.js";
23
- import { chainCase, demoCase, runCase } from "./commands/run.js";
22
+ import { demoCase, runCase } from "./commands/run.js";
24
23
  import { testCase } from "./commands/test.js";
25
24
  import { initCase } from "./commands/init.js";
26
25
  import { traverseCase } from "./commands/traverse.js";
@@ -28,12 +27,14 @@ import { agentDiveCase } from "./commands/agent-dive.js";
28
27
  import { autoServeCase, sessionCase } from "./commands/session.js";
29
28
  import { tryCase } from "./commands/try.js";
30
29
  import { upgradeCase } from "./commands/upgrade.js";
30
+ import { manifestCase } from "./commands/manifest.js";
31
31
  import { extensionsCase } from "./commands/extensions.js";
32
32
  import { mapCase } from "./commands/map.js";
33
+ import { setEnv } from "../engine/env.js";
33
34
  const args = takeConfigFlag(takeEnvFlag(process.argv.slice(2)));
34
35
  const command = args[0];
35
36
  if (command)
36
- process.env.WAYGRAPH_COMMAND = command;
37
+ setEnv("WAYGRAPH_COMMAND", command);
37
38
  async function main() {
38
39
  if (!command || command === "--help" || command === "-h") {
39
40
  usage();
@@ -73,9 +74,6 @@ async function main() {
73
74
  case "init-agents":
74
75
  await agentDiveCase(args);
75
76
  break;
76
- case "chain":
77
- await chainCase(args);
78
- break;
79
77
  case "demo":
80
78
  await demoCase(args);
81
79
  break;
@@ -106,6 +104,9 @@ async function main() {
106
104
  case "upgrade":
107
105
  await upgradeCase(args);
108
106
  break;
107
+ case "manifest":
108
+ await manifestCase(args);
109
+ break;
109
110
  case "extensions":
110
111
  await extensionsCase(args);
111
112
  break;
@@ -5,9 +5,10 @@
5
5
  import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, } from "node:fs";
6
6
  import { basename, dirname, join, resolve } from "node:path";
7
7
  import { fileURLToPath } from "node:url";
8
+ import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
8
9
  function packageRoot() {
9
10
  // dist/commands/agent-dive-scaffold.js -> ../..
10
- return resolve(dirname(fileURLToPath(import.meta.url)), "..", "..");
11
+ return resolve(dirname(fileURLToPath(import.meta.url)), "..", "..", "..");
11
12
  }
12
13
  function agentsTemplateDir() {
13
14
  return join(packageRoot(), "templates", "agents");
@@ -15,46 +16,33 @@ function agentsTemplateDir() {
15
16
  function skillsTemplateDir() {
16
17
  return join(packageRoot(), "templates", "skills");
17
18
  }
18
- /** Minimal YAML-ish frontmatter parser for `*.agent.md` templates. */
19
- function parseAgentSpec(filePath) {
19
+ /** A markdown file's YAML frontmatter (between the leading `---` lines) and its body. */
20
+ function readFrontmatter(filePath) {
20
21
  const raw = readFileSync(filePath, "utf-8");
21
- if (!raw.startsWith("---\n")) {
22
- throw new Error(`agent-dive: missing frontmatter in ${filePath}`);
23
- }
24
- const end = raw.indexOf("\n---\n", 4);
25
- if (end < 0)
26
- throw new Error(`agent-dive: unclosed frontmatter in ${filePath}`);
27
- const fm = raw.slice(4, end);
28
- const body = raw.slice(end + 5).trim();
29
- const meta = {};
30
- let listKey = null;
31
- const lists = {};
32
- for (const line of fm.split("\n")) {
33
- if (/^\s+-\s+/.test(line) && listKey) {
34
- lists[listKey].push(line.replace(/^\s+-\s+/, "").trim());
35
- continue;
36
- }
37
- listKey = null;
38
- const m = /^([A-Za-z0-9_-]+):\s*(.*)$/.exec(line);
39
- if (!m)
40
- continue;
41
- const key = m[1];
42
- const val = m[2].trim();
43
- if (val === "") {
44
- listKey = key;
45
- lists[key] = [];
46
- }
47
- else {
48
- meta[key] = val;
49
- }
50
- }
51
- const name = meta.name || basename(filePath).replace(/\.agent\.md$/, "");
22
+ const m = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/.exec(raw);
23
+ if (!m)
24
+ throw new Error(`agent-dive: missing or unclosed frontmatter in ${filePath}`);
25
+ const data = parseYaml(m[1]);
26
+ if (data === null || typeof data !== "object" || Array.isArray(data))
27
+ throw new Error(`agent-dive: frontmatter in ${filePath} is not a mapping`);
28
+ return { data: data, body: m[2].trim() };
29
+ }
30
+ /** Markdown with `data` as YAML frontmatter. */
31
+ function withFrontmatter(data, body) {
32
+ return `---\n${stringifyYaml(data, { lineWidth: 0 })}---\n\n${body}\n`;
33
+ }
34
+ function parseAgentSpec(filePath) {
35
+ const { data, body } = readFrontmatter(filePath);
36
+ const text = (k) => (typeof data[k] === "string" && data[k] !== "" ? data[k] : undefined);
37
+ const name = text("name") ?? basename(filePath).replace(/\.(agent|skill)\.md$/, "");
38
+ const model = text("model");
39
+ const color = text("color");
52
40
  return {
53
41
  name,
54
- description: meta.description || name,
55
- ...(meta.model ? { model: meta.model } : {}),
56
- ...(meta.color ? { color: meta.color } : {}),
57
- tools: lists.tools ?? [],
42
+ description: text("description") ?? name,
43
+ ...(model ? { model } : {}),
44
+ ...(color ? { color } : {}),
45
+ tools: Array.isArray(data.tools) ? data.tools.map(String) : [],
58
46
  instructions: body,
59
47
  };
60
48
  }
@@ -126,42 +114,25 @@ function writeFileLogged(path, content, kind) {
126
114
  console.log(` wrote ${path} (${kind})`);
127
115
  }
128
116
  function claudeAgentMd(agent) {
129
- const tools = agent.tools.join(", ");
130
- const lines = [
131
- "---",
132
- `name: ${agent.name}`,
133
- `description: ${agent.description}`,
134
- ...(agent.model ? [`model: ${agent.model}`] : []),
135
- ...(agent.color ? [`color: ${agent.color}`] : []),
136
- ...(tools ? [`tools: ${tools}`] : []),
137
- "---",
138
- "",
139
- agent.instructions,
140
- "",
141
- ];
142
- return lines.join("\n");
117
+ return withFrontmatter({
118
+ name: agent.name,
119
+ description: agent.description,
120
+ ...(agent.model ? { model: agent.model } : {}),
121
+ ...(agent.color ? { color: agent.color } : {}),
122
+ ...(agent.tools.length ? { tools: agent.tools.join(", ") } : {}),
123
+ }, agent.instructions);
143
124
  }
144
125
  function opencodePromptMd(agent) {
145
126
  return `${agent.instructions}\n`;
146
127
  }
147
128
  function cursorRuleMdc(agent) {
148
- return `---
149
- description: ${agent.description}
150
- globs:
151
- alwaysApply: false
152
- ---
153
-
154
- # ${agent.name}
155
-
156
- ${agent.instructions}
157
- `;
129
+ return withFrontmatter({ description: agent.description, globs: null, alwaysApply: false }, `# ${agent.name}\n\n${agent.instructions}`);
158
130
  }
159
131
  function vscodeAgentMd(agent) {
160
132
  return claudeAgentMd(agent);
161
133
  }
162
134
  function claudeSkillMd(skill) {
163
- const lines = ["---", `name: ${skill.name}`, `description: ${skill.description}`, "---", "", skill.instructions, ""];
164
- return lines.join("\n");
135
+ return withFrontmatter({ name: skill.name, description: skill.description }, skill.instructions);
165
136
  }
166
137
  export function runAgentDive(opts) {
167
138
  const agents = loadAgentSpecs();
@@ -0,0 +1,42 @@
1
+ import { runAgentDive } from "./agent-dive-scaffold.js";
2
+ import { resolve } from "node:path";
3
+ import { existsSync, statSync } from "node:fs";
4
+ import { helpLines, parseCommand } from "../args.js";
5
+ const LOOPS = ["claude", "opencode", "cursor", "vscode"];
6
+ const OPTIONS = {
7
+ loop: { type: "string", value: "claude|opencode|cursor|vscode", help: "Which agent tool to write for (default claude)" },
8
+ prompts: { type: "boolean", help: "Also copy docs/waygraph-agents/*.md" },
9
+ help: { type: "boolean", help: "This help" },
10
+ };
11
+ export async function agentDiveCase(args) {
12
+ // Playwright analogue: npx playwright init-agents --loop <provider>
13
+ const { values, positionals } = parseCommand("agent-dive", OPTIONS, args.slice(1));
14
+ if (values.help) {
15
+ console.log(`waygraph agent-dive [--loop claude|opencode|cursor|vscode] [--prompts] [project]
16
+
17
+ Initialize coding-agent definitions for diving an app into waygraph Blocks
18
+ (Playwright \`init-agents\` analogue).
19
+
20
+ ${helpLines(OPTIONS)}
21
+
22
+ --loop claude writes .claude/agents/*.md, opencode .opencode/prompts/*.md,
23
+ cursor .cursor/rules/waygraph-*.mdc, vscode .github/agents/*.md.
24
+
25
+ Agents shipped: waygraph-planner, waygraph-author, waygraph-healer.
26
+ `);
27
+ process.exit(0);
28
+ }
29
+ const loop = (values.loop ?? "claude");
30
+ if (!LOOPS.includes(loop)) {
31
+ console.error("waygraph agent-dive: --loop must be claude | opencode | cursor | vscode");
32
+ process.exit(1);
33
+ }
34
+ const prompts = values.prompts === true;
35
+ const projectDir = resolve(positionals[0] ?? process.cwd());
36
+ if (!existsSync(projectDir) || !statSync(projectDir).isDirectory()) {
37
+ console.error(`waygraph agent-dive: no such directory: ${projectDir}`);
38
+ process.exit(1);
39
+ }
40
+ runAgentDive({ loop, projectDir, prompts });
41
+ return;
42
+ }
@@ -1,4 +1,3 @@
1
- export declare function runChainAuto(projectDir: string, fromTag: string, toTag: string): Promise<void>;
2
1
  export declare function validateCase(args: string[]): Promise<void>;
3
2
  export declare function typecheckCase(args: string[]): Promise<void>;
4
3
  export declare function checkCase(args: string[]): Promise<void>;
@@ -0,0 +1,104 @@
1
+ import { relative, resolve } from "node:path";
2
+ import { findOrphanBlocks } from "../../analysis/graph.js";
3
+ import { checkMapGroups, checkProject, validateFlows } from "../../analysis/check.js";
4
+ import { parseRunFlags } from "../flags.js";
5
+ import { walkDir } from "../../manifest/scan.js";
6
+ import { collectPracticeWarnings, practiceKindLabel } from "../../analysis/practices-check.js";
7
+ function printOrphanReport(projectDir, orphans) {
8
+ if (orphans.length === 0) {
9
+ console.log(`waygraph check: no orphan Blocks (every *.block.ts export is wired into a flow)`);
10
+ return;
11
+ }
12
+ for (const o of orphans) {
13
+ console.warn(`waygraph check: orphan Block ${o.file} (${o.exportName} / "${o.block}") is not used in any flow - wire it into a .flow.ts before chain auto shorthand`);
14
+ }
15
+ console.log(`waygraph check: ${orphans.length} orphan Block${orphans.length === 1 ? "" : "s"}`);
16
+ }
17
+ function printPracticeReport(projectDir, practiceWarnings) {
18
+ if (practiceWarnings.length === 0) {
19
+ console.log(`waygraph check: no bad-practice patterns under ${projectDir}`);
20
+ return;
21
+ }
22
+ for (const w of practiceWarnings) {
23
+ console.warn(`waygraph check: ${w.file} (${practiceKindLabel(w.kind)}) — ${w.detail}`);
24
+ }
25
+ console.log(`waygraph check: ${practiceWarnings.length} bad-practice warning${practiceWarnings.length === 1 ? "" : "s"}`);
26
+ }
27
+ async function runTypecheckCommand(projectDir, noPractices) {
28
+ const { spawnSync } = await import("node:child_process");
29
+ const tsc = spawnSync("npx", ["tsc", "--noEmit"], {
30
+ cwd: projectDir,
31
+ stdio: "inherit",
32
+ shell: false,
33
+ });
34
+ if (tsc.status !== 0) {
35
+ process.exit(tsc.status === null ? 1 : tsc.status);
36
+ }
37
+ if (noPractices)
38
+ return;
39
+ const practiceWarnings = collectPracticeWarnings(projectDir, walkDir);
40
+ printPracticeReport(projectDir, practiceWarnings);
41
+ }
42
+ export async function validateCase(args) {
43
+ const proj = resolve(args[1] ?? process.cwd());
44
+ const results = await validateFlows(proj);
45
+ let failed = 0;
46
+ for (const r of results) {
47
+ const rel = relative(proj, r.file);
48
+ if (r.valid) {
49
+ console.log(`OK ${rel} ${r.name}`);
50
+ }
51
+ else {
52
+ failed++;
53
+ console.log(`FAIL ${rel} ${r.name} -- ${r.error}`);
54
+ }
55
+ }
56
+ if (failed > 0)
57
+ process.exitCode = 1;
58
+ return;
59
+ }
60
+ export async function typecheckCase(args) {
61
+ const flags = parseRunFlags(args.slice(1), args[0] ?? "check");
62
+ const proj = resolve(flags.positionals[0] ?? process.cwd());
63
+ await runTypecheckCommand(proj, flags.noPractices === true);
64
+ return;
65
+ }
66
+ export async function checkCase(args) {
67
+ const flags = parseRunFlags(args.slice(1), args[0] ?? "check");
68
+ const proj = resolve(flags.positionals[0] ?? process.cwd());
69
+ const { navWarnings, selWarnings, practiceWarnings } = await checkProject(proj, flags.noPractices ? { noPractices: true } : undefined);
70
+ if (navWarnings.length === 0) {
71
+ console.log(`waygraph check: no navigation found outside NavBlocks under ${proj}`);
72
+ }
73
+ else {
74
+ for (const w of navWarnings) {
75
+ const rel = relative(proj, w.file);
76
+ console.warn(`waygraph check: ${rel} (${w.blockName}) calls page.goto/reload/goBack/goForward outside a NavBlock - consider defineNavBlock instead`);
77
+ }
78
+ console.log(`waygraph check: ${navWarnings.length} nav warning${navWarnings.length === 1 ? "" : "s"}`);
79
+ }
80
+ if (selWarnings.length === 0) {
81
+ console.log(`waygraph check: no inline selectors found in verify arrays under ${proj}`);
82
+ }
83
+ else {
84
+ for (const w of selWarnings) {
85
+ const rel = relative(proj, w.file);
86
+ console.warn(`waygraph check: ${rel} (${w.blockName}) has an inline selector literal in verify - move it into a *Sel object`);
87
+ }
88
+ console.log(`waygraph check: ${selWarnings.length} inline-selector warning${selWarnings.length === 1 ? "" : "s"}`);
89
+ }
90
+ if (!flags.noPractices) {
91
+ printPracticeReport(proj, practiceWarnings);
92
+ }
93
+ const groupProblems = checkMapGroups(proj);
94
+ for (const p of groupProblems) {
95
+ console.warn(`waygraph check: ${relative(proj, p.file)} imports "${p.spec}" from outside map group ${p.group} - a group imports only waygraph and its own files, so it can be packed`);
96
+ }
97
+ if (groupProblems.length > 0)
98
+ console.log(`waygraph check: ${groupProblems.length} map group import warning${groupProblems.length === 1 ? "" : "s"}`);
99
+ const orphans = await findOrphanBlocks(proj);
100
+ printOrphanReport(proj, orphans);
101
+ // Warnings only - never fail exit code. Orphans are reported for
102
+ // human/agent cleanup; chain auto refuses while any remain.
103
+ return;
104
+ }
@@ -0,0 +1,18 @@
1
+ /** Checkpoint name -> tag, and union aliases -> member names, found in the states files. */
2
+ interface StatesInfo {
3
+ tags: Map<string, string>;
4
+ unions: Map<string, string[]>;
5
+ }
6
+ /** Rewrites one states file; returns the new text and what it declared. */
7
+ export declare function convertStates(text: string, info: StatesInfo): string;
8
+ /** Rewrites one Block file. Calls whose Checkpoints are not plain declared names are left as they are. */
9
+ export declare function convertBlocks(text: string, info: StatesInfo): {
10
+ text: string;
11
+ skipped: string[];
12
+ };
13
+ /** Runs the codemod over a project; returns the files changed and the calls it left alone. */
14
+ export declare function codemodCheckpoints(projectDir: string): {
15
+ changed: string[];
16
+ skipped: string[];
17
+ };
18
+ export {};
@@ -0,0 +1,186 @@
1
+ // `waygraph upgrade --codemod checkpoints`: rewrites a project from tag strings and `<In, Out>` type arguments to
2
+ // Checkpoint values (`export const Home = checkpoint("Home")`, `checkpoint: Home`, `from: Home, to: ItemInCart`). Works
3
+ // on the TypeScript AST (ts-morph), so formatting, comments and odd line breaks don't fool it.
4
+ import { readFileSync, writeFileSync } from "node:fs";
5
+ import { relative } from "node:path";
6
+ import { IndentationText, Node, Project, SyntaxKind } from "ts-morph";
7
+ import { walkDir } from "../../manifest/scan.js";
8
+ function parse(text) {
9
+ const indentationText = /\n\t/.test(text) ? IndentationText.Tab : /\n {4}\S/.test(text) && !/\n {2}\S/.test(text) ? IndentationText.FourSpaces : IndentationText.TwoSpaces;
10
+ return new Project({ useInMemoryFileSystem: true, manipulationSettings: { indentationText } }).createSourceFile("/file.ts", text);
11
+ }
12
+ /** Whether `name` is still used anywhere outside import statements. */
13
+ function usedOutsideImports(sf, name) {
14
+ return sf.getDescendantsOfKind(SyntaxKind.Identifier).some((id) => {
15
+ if (id.getText() !== name || id.getFirstAncestorByKind(SyntaxKind.ImportDeclaration))
16
+ return false;
17
+ const parent = id.getParent();
18
+ return !(Node.isPropertyAccessExpression(parent) && parent.getNameNode() === id) && !(Node.isPropertyAssignment(parent) && parent.getNameNode() === id);
19
+ });
20
+ }
21
+ /** Drops a named import from "waygraph" that nothing uses any more (and the import, when it ends up empty). */
22
+ function dropUnusedWaygraphImport(sf, name) {
23
+ if (usedOutsideImports(sf, name))
24
+ return;
25
+ for (const imp of sf.getImportDeclarations().filter((d) => d.getModuleSpecifierValue() === "waygraph")) {
26
+ imp.getNamedImports().find((n) => n.getName() === name)?.remove();
27
+ if (imp.getNamedImports().length === 0 && !imp.getDefaultImport() && !imp.getNamespaceImport())
28
+ imp.remove();
29
+ }
30
+ }
31
+ /** Learns Checkpoint declarations already in value form, so the codemod can run again after a partial run. */
32
+ function learnValues(sf, info) {
33
+ for (const decl of sf.getVariableDeclarations()) {
34
+ const init = decl.getInitializer();
35
+ if (Node.isCallExpression(init) && init.getExpression().getText() === "checkpoint") {
36
+ const tag = init.getArguments()[0];
37
+ if (Node.isStringLiteral(tag))
38
+ info.tags.set(decl.getName(), tag.getLiteralValue());
39
+ }
40
+ else if (Node.isAsExpression(init) && Node.isArrayLiteralExpression(init.getExpression())) {
41
+ info.unions.set(decl.getName(), init.getExpression().asKindOrThrow(SyntaxKind.ArrayLiteralExpression).getElements().map((e) => e.getText()));
42
+ }
43
+ }
44
+ }
45
+ /** Rewrites one states file; returns the new text and what it declared. */
46
+ export function convertStates(text, info) {
47
+ const sf = parse(text);
48
+ learnValues(sf, info);
49
+ let changed = false;
50
+ for (const alias of sf.getTypeAliases()) {
51
+ if (!alias.isExported())
52
+ continue;
53
+ const name = alias.getName();
54
+ const type = alias.getTypeNodeOrThrow();
55
+ if (Node.isTypeReference(type) && type.getTypeName().getText() === "Checkpoint") {
56
+ const arg = type.getTypeArguments()[0];
57
+ if (!Node.isLiteralTypeNode(arg) || !Node.isStringLiteral(arg.getLiteral()))
58
+ continue;
59
+ const tag = arg.getLiteral().asKindOrThrow(SyntaxKind.StringLiteral).getLiteralValue();
60
+ info.tags.set(name, tag);
61
+ alias.replaceWithText(`export const ${name} = checkpoint("${tag}");\nexport type ${name} = typeof ${name};`);
62
+ changed = true;
63
+ }
64
+ else if (Node.isUnionTypeNode(type)) {
65
+ const names = type.getTypeNodes().map((t) => t.getText());
66
+ if (!names.every((n) => info.tags.has(n) || info.unions.has(n)))
67
+ continue;
68
+ const flat = names.flatMap((n) => info.unions.get(n) ?? [n]);
69
+ info.unions.set(name, flat);
70
+ alias.replaceWithText(`export const ${name} = [${flat.join(", ")}] as const;\nexport type ${name} = (typeof ${name})[number];`);
71
+ changed = true;
72
+ }
73
+ }
74
+ if (!changed)
75
+ return text;
76
+ // `checkpoint` is now used as a value; `Checkpoint` stays only while something still names the type.
77
+ const wg = sf.getImportDeclarations().find((d) => d.getModuleSpecifierValue() === "waygraph");
78
+ if (!wg)
79
+ sf.insertImportDeclaration(0, { moduleSpecifier: "waygraph", namedImports: ["checkpoint"] });
80
+ else if (wg.isTypeOnly())
81
+ sf.insertImportDeclaration(wg.getChildIndex(), { moduleSpecifier: "waygraph", namedImports: ["checkpoint"] });
82
+ else if (!wg.getNamedImports().some((n) => n.getName() === "checkpoint"))
83
+ wg.addNamedImport("checkpoint");
84
+ dropUnusedWaygraphImport(sf, "Checkpoint");
85
+ return sf.getFullText();
86
+ }
87
+ const SINGLE_CHECKPOINT = ["defineNavBlock", "defineNavClickBlock", "defineMemNavBlock", "definePageBlock", "defineAssertBlock"];
88
+ const ROUTED = ["defineMethodBlock", "defineEffectBlock"];
89
+ function optionsOf(call) {
90
+ const arg = call.getArguments()[0];
91
+ return Node.isObjectLiteralExpression(arg) ? arg : undefined;
92
+ }
93
+ /** `checkpoint: "Home"` with `<Home>` becomes `checkpoint: Home`. */
94
+ function convertSingle(call, fn, info, skipped) {
95
+ const typeArg = call.getTypeArguments()[0];
96
+ const prop = optionsOf(call)?.getProperty("checkpoint");
97
+ const value = Node.isPropertyAssignment(prop) ? prop.getInitializer() : undefined;
98
+ if (!typeArg || !Node.isPropertyAssignment(prop) || !Node.isStringLiteral(value))
99
+ return;
100
+ const name = typeArg.getText();
101
+ if (info.tags.get(name) !== value.getLiteralValue()) {
102
+ skipped.push(`${fn}<${name}>`);
103
+ return;
104
+ }
105
+ call.removeTypeArgument(typeArg);
106
+ prop.setInitializer(name);
107
+ }
108
+ /** `<In, Out>` becomes `from: In, to: Out` (right after the name and description); a resolve that only returns `to` goes. */
109
+ function convertRouted(call, fn, info, skipped) {
110
+ const [fromArg, toArg] = call.getTypeArguments();
111
+ const options = optionsOf(call);
112
+ if (!fromArg || !toArg || !options)
113
+ return;
114
+ const from = fromArg.getText();
115
+ const to = toArg.getText();
116
+ const known = (n) => info.tags.has(n) || info.unions.has(n);
117
+ const anywhere = from === "Checkpoint<string>";
118
+ if ((!anywhere && !known(from)) || !known(to)) {
119
+ skipped.push(`${fn}<${from}, ${to}>`);
120
+ return;
121
+ }
122
+ call.removeTypeArgument(toArg);
123
+ call.removeTypeArgument(fromArg);
124
+ const props = options.getProperties();
125
+ const after = Math.max(...["name", "description"].map((n) => props.findIndex((p) => Node.isPropertyAssignment(p) && p.getName() === n)));
126
+ options.insertPropertyAssignments(after + 1, [...(anywhere ? [] : [{ name: "from", initializer: from }]), { name: "to", initializer: to }]);
127
+ const tag = info.tags.get(to);
128
+ const instruction = options.getProperty("instruction");
129
+ const body = Node.isPropertyAssignment(instruction) ? instruction.getInitializer() : undefined;
130
+ const resolve = Node.isObjectLiteralExpression(body) ? body.getProperty("resolve") : undefined;
131
+ if (tag && Node.isPropertyAssignment(resolve) && resolve.getInitializer()?.getText().replace(/\s/g, "") === `()=>checkpoint("${tag}")`)
132
+ resolve.remove();
133
+ // Inserting and removing properties leaves the object's indentation uneven; tidy just this call.
134
+ call.formatText({ indentSize: call.getSourceFile().getProject().manipulationSettings.getIndentationText().length, convertTabsToSpaces: !call.getSourceFile().getFullText().includes("\n\t") });
135
+ }
136
+ /** Rewrites one Block file. Calls whose Checkpoints are not plain declared names are left as they are. */
137
+ export function convertBlocks(text, info) {
138
+ const sf = parse(text);
139
+ const skipped = [];
140
+ for (const call of sf.getDescendantsOfKind(SyntaxKind.CallExpression).reverse()) {
141
+ if (call.wasForgotten())
142
+ continue;
143
+ const fn = call.getExpression().getText();
144
+ if (SINGLE_CHECKPOINT.includes(fn))
145
+ convertSingle(call, fn, info, skipped);
146
+ else if (ROUTED.includes(fn))
147
+ convertRouted(call, fn, info, skipped);
148
+ }
149
+ if (sf.getFullText() === text)
150
+ return { text, skipped };
151
+ dropUnusedWaygraphImport(sf, "Checkpoint");
152
+ dropUnusedWaygraphImport(sf, "checkpoint");
153
+ // Checkpoints are now used as values: import them as values.
154
+ const known = (n) => info.tags.has(n) || info.unions.has(n);
155
+ for (const imp of sf.getImportDeclarations()) {
156
+ if (imp.isTypeOnly() && /states/.test(imp.getModuleSpecifierValue()) && imp.getNamedImports().some((n) => known(n.getName())))
157
+ imp.setIsTypeOnly(false);
158
+ }
159
+ return { text: sf.getFullText(), skipped };
160
+ }
161
+ /** Runs the codemod over a project; returns the files changed and the calls it left alone. */
162
+ export function codemodCheckpoints(projectDir) {
163
+ const info = { tags: new Map(), unions: new Map() };
164
+ const files = walkDir(projectDir, /\.ts$/).filter((f) => !f.endsWith(".d.ts"));
165
+ const states = files.filter((f) => /\.states\.ts$|[/\\]_states\.ts$/.test(f));
166
+ const changed = [];
167
+ const skipped = [];
168
+ for (const f of states) {
169
+ const before = readFileSync(f, "utf8");
170
+ const after = convertStates(before, info);
171
+ if (after !== before) {
172
+ writeFileSync(f, after);
173
+ changed.push(relative(projectDir, f));
174
+ }
175
+ }
176
+ for (const f of files.filter((x) => !states.includes(x))) {
177
+ const before = readFileSync(f, "utf8");
178
+ const { text, skipped: s } = convertBlocks(before, info);
179
+ skipped.push(...s.map((c) => `${relative(projectDir, f)}: ${c}`));
180
+ if (text !== before) {
181
+ writeFileSync(f, text);
182
+ changed.push(relative(projectDir, f));
183
+ }
184
+ }
185
+ return { changed, skipped };
186
+ }
@@ -0,0 +1,18 @@
1
+ import { Project } from "ts-morph";
2
+ import type { SourceFile } from "ts-morph";
3
+ /** A Block's kind by the file and export it is declared in; undefined when it isn't a known Block. */
4
+ export type KindOf = (file: string, exportName: string) => string | undefined;
5
+ /** Rewrites the old flow forms in a project's source files; returns problems it left for a person. */
6
+ export declare function convertFlows(project: Project, kindOf: KindOf): {
7
+ changed: SourceFile[];
8
+ problems: {
9
+ file: string;
10
+ line: number;
11
+ reason: string;
12
+ }[];
13
+ };
14
+ /** Runs the codemod over a project's TypeScript files, using its runtime scan for each Block's kind. */
15
+ export declare function codemodFlows(projectDir: string): Promise<{
16
+ changed: string[];
17
+ problems: string[];
18
+ }>;