waygraph 0.15.50 → 0.15.52

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 (559) hide show
  1. package/dist/analysis/graph.d.ts +1 -1
  2. package/dist/analysis/graph.js +10 -15
  3. package/dist/analysis/map-check.js +5 -2
  4. package/dist/analysis/practices-check.d.ts +0 -1
  5. package/dist/analysis/practices-check.js +17 -17
  6. package/dist/auto-session/session.d.ts +1 -1
  7. package/dist/auto-session/session.js +14 -8
  8. package/dist/blocks-select.d.ts +7 -4
  9. package/dist/blocks-select.js +0 -14
  10. package/dist/browser.d.ts +27 -0
  11. package/dist/browser.js +62 -0
  12. package/dist/cli/run-chain.js +5 -0
  13. package/dist/cli/usage.js +14 -1
  14. package/dist/cli.js +10 -1
  15. package/dist/commands/agent-dive-scaffold.d.ts +5 -0
  16. package/dist/commands/agent-dive-scaffold.js +7 -0
  17. package/dist/commands/extensions.d.ts +1 -0
  18. package/dist/commands/extensions.js +22 -0
  19. package/dist/commands/init.js +45 -2
  20. package/dist/commands/test.js +16 -2
  21. package/dist/commands/try.js +2 -1
  22. package/dist/commands/upgrade.d.ts +6 -0
  23. package/dist/commands/upgrade.js +107 -0
  24. package/dist/config.d.ts +47 -3
  25. package/dist/config.js +45 -12
  26. package/dist/core/block.d.ts +12 -0
  27. package/dist/core/block.js +36 -0
  28. package/dist/core/blocks/effect.d.ts +0 -3
  29. package/dist/core/blocks/method.d.ts +0 -6
  30. package/dist/core/blocks/nav.d.ts +11 -3
  31. package/dist/core/blocks/nav.js +8 -0
  32. package/dist/core/blocks/page.d.ts +0 -3
  33. package/dist/core/config.d.ts +5 -0
  34. package/dist/core/engine.d.ts +17 -16
  35. package/dist/core/engine.js +3 -3
  36. package/dist/core/flow.d.ts +17 -0
  37. package/dist/core/flow.js +44 -24
  38. package/dist/core/map-builder.d.ts +3 -3
  39. package/dist/core/map-builder.js +3 -3
  40. package/dist/env-file.d.ts +7 -7
  41. package/dist/env-file.js +29 -16
  42. package/dist/extensions.d.ts +21 -0
  43. package/dist/extensions.js +178 -0
  44. package/dist/highlights/types.d.ts +3 -2
  45. package/dist/index.d.ts +8 -3
  46. package/dist/index.js +4 -1
  47. package/dist/pilot-overlay/overlay-fixtures.d.ts +0 -7
  48. package/dist/pilot-overlay/overlay-fixtures.js +0 -45
  49. package/dist/playwright-config.d.ts +4 -0
  50. package/dist/playwright-config.js +15 -0
  51. package/dist/playwright.config.d.ts +2 -0
  52. package/dist/playwright.config.js +6 -0
  53. package/dist/runner/demo-log.js +1 -7
  54. package/dist/runner/inpage/banner.js +10 -2
  55. package/dist/runner/inpage/core.d.ts +1 -1
  56. package/dist/runner/inpage/core.js +8 -7
  57. package/dist/runner/main.js +27 -15
  58. package/dist/runner/rings.js +0 -49
  59. package/dist/session/auto-explore-run.js +21 -6
  60. package/dist/session/auto-explore.js +6 -4
  61. package/dist/session/step-overlay.js +3 -1
  62. package/dist/traverse/run.js +4 -1
  63. package/dist/types.d.ts +0 -3
  64. package/dist/ui/components/ring.js +1 -0
  65. package/dist/ui/overlay.css +1 -0
  66. package/dist/ui/shadow.d.ts +1 -3
  67. package/dist/ui/shadow.js +0 -4
  68. package/dist/ui/tokens.d.ts +0 -11
  69. package/dist/ui/tokens.js +0 -5
  70. package/dist/video-dir.d.ts +8 -0
  71. package/dist/video-dir.js +60 -0
  72. package/dist/webserver.d.ts +14 -0
  73. package/dist/webserver.js +95 -0
  74. package/examples/routed-demo/package.json +3 -3
  75. package/examples/routed-demo/playwright.config.ts +8 -8
  76. package/examples/routed-demo/scripts/fixture-server.mjs +12 -31
  77. package/examples/routed-demo/src/map/(app_base)/dashboard/_sel.ts +1 -3
  78. package/examples/routed-demo/src/map/(external)/docs/_sel.ts +1 -3
  79. package/examples/routed-demo/src/pages/dashboard.html +1 -1
  80. package/examples/routed-demo/src/pages/docs.html +1 -1
  81. package/examples/saucedemo/playwright.config.ts +2 -3
  82. package/examples/saucedemo/scripts/prove-add-to-cart-menu.mjs +2 -1
  83. package/examples/saucedemo/scripts/prove-auto-graph.mjs +2 -1
  84. package/examples/saucedemo/scripts/prove-wrong-login-runtime.mjs +2 -1
  85. package/examples/saucedemo/tests/flow-block-verify.spec.ts +2 -7
  86. package/package.json +10 -2
  87. package/templates/quickstart/playwright.config.ts +0 -6
  88. package/templates/scaffold/README.md +7 -3
  89. package/templates/scaffold/STRUCTURE.md +8 -6
  90. package/templates/scaffold/config/waygraph.config.ts +26 -0
  91. package/templates/scaffold/package.json +9 -13
  92. package/templates/scaffold/src/flows/README.md +5 -5
  93. package/templates/scaffold/src/flows/example.flow.ts +31 -17
  94. package/templates/scaffold/src/flows/hoppscotch-auth.flow.ts +35 -0
  95. package/templates/scaffold/src/flows/hoppscotch-get.flow.ts +23 -0
  96. package/templates/scaffold/src/flows/hoppscotch-post.flow.ts +33 -0
  97. package/templates/scaffold/src/flows/mail-verify.flow.ts +36 -75
  98. package/templates/scaffold/src/flows/shop.flow.ts +41 -65
  99. package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +0 -9
  100. package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +0 -5
  101. package/templates/scaffold/src/map/(app_base)/docs/_sel.ts +2 -3
  102. package/templates/scaffold/src/map/(app_base)/docs/{docs.html → index.html} +1 -1
  103. package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -21
  104. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +4 -30
  105. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +2 -19
  106. package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +0 -17
  107. package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +3 -16
  108. package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -14
  109. package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +0 -9
  110. package/templates/scaffold/src/map/(app_base)/home/_sel.ts +4 -4
  111. package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +1 -23
  112. package/templates/scaffold/src/map/(app_base)/index.html +17 -0
  113. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +21 -0
  114. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +19 -0
  115. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +20 -0
  116. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +18 -0
  117. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +21 -0
  118. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +21 -0
  119. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +15 -0
  120. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +20 -0
  121. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +23 -0
  122. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +36 -0
  123. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +17 -0
  124. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +22 -0
  125. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +18 -0
  126. package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +11 -0
  127. package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +36 -0
  128. package/templates/scaffold/src/map/(external)/hoppscotch/_sel.ts +27 -0
  129. package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +10 -0
  130. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +2 -27
  131. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +2 -21
  132. package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +1 -19
  133. package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +1 -11
  134. package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +1 -9
  135. package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +0 -11
  136. package/templates/scaffold/src/states/demo.mem-keys.ts +20 -19
  137. package/templates/scaffold/src/states/demo.mem-stubs.ts +4 -0
  138. package/templates/scaffold/src/states/demo.states.ts +7 -1
  139. package/templates/scaffold/tests/README.md +3 -2
  140. package/templates/scaffold/tests/example.spec.ts +2 -3
  141. package/templates/scaffold/tests/hoppscotch.spec.ts +97 -0
  142. package/templates/scaffold/tests/mail-verify.spec.ts +2 -11
  143. package/templates/scaffold/tsconfig.json +1 -1
  144. package/templates/skills/waygraph-convention.skill.md +37 -6
  145. package/templates/skills/waygraph-pilot.skill.md +5 -6
  146. package/dist/runner/overlay-present.d.ts +0 -8
  147. package/dist/runner/overlay-present.js +0 -57
  148. package/dist/ui/components/banner.d.ts +0 -2
  149. package/dist/ui/components/banner.js +0 -10
  150. package/dist/ui/components/cursor.d.ts +0 -2
  151. package/dist/ui/components/cursor.js +0 -19
  152. package/examples/routed-demo/.waygraph-auto/4d4902b7.log +0 -0
  153. package/examples/routed-demo/.waygraph-auto/51ef462e.log +0 -0
  154. package/examples/routed-demo/.waygraph-auto/71527ad9.log +0 -0
  155. package/examples/routed-demo/.waygraph-auto/ca16778e.log +0 -0
  156. package/examples/routed-demo/scripts/with-fixture.mjs +0 -70
  157. package/examples/saucedemo/.waygraph-auto/00b0c55c.log +0 -22
  158. package/examples/saucedemo/.waygraph-auto/00d147d1.log +0 -21
  159. package/examples/saucedemo/.waygraph-auto/00e5d037.log +0 -5
  160. package/examples/saucedemo/.waygraph-auto/015be8f6.log +0 -6
  161. package/examples/saucedemo/.waygraph-auto/026e188e.log +0 -0
  162. package/examples/saucedemo/.waygraph-auto/02f7dd22.log +0 -20
  163. package/examples/saucedemo/.waygraph-auto/03df352d.log +0 -0
  164. package/examples/saucedemo/.waygraph-auto/0402cfcf.log +0 -6
  165. package/examples/saucedemo/.waygraph-auto/050e5b55.log +0 -0
  166. package/examples/saucedemo/.waygraph-auto/05d76fc3.log +0 -0
  167. package/examples/saucedemo/.waygraph-auto/062b581f.log +0 -20
  168. package/examples/saucedemo/.waygraph-auto/0681582b.log +0 -6
  169. package/examples/saucedemo/.waygraph-auto/07845ed1.log +0 -0
  170. package/examples/saucedemo/.waygraph-auto/07f3e964.log +0 -6
  171. package/examples/saucedemo/.waygraph-auto/0868ae4d.log +0 -0
  172. package/examples/saucedemo/.waygraph-auto/0924ddaa.log +0 -22
  173. package/examples/saucedemo/.waygraph-auto/092d6173.log +0 -5
  174. package/examples/saucedemo/.waygraph-auto/096fea05.log +0 -20
  175. package/examples/saucedemo/.waygraph-auto/09924510.log +0 -0
  176. package/examples/saucedemo/.waygraph-auto/0998c941.log +0 -21
  177. package/examples/saucedemo/.waygraph-auto/0a8c3719.log +0 -0
  178. package/examples/saucedemo/.waygraph-auto/0bf74300.log +0 -21
  179. package/examples/saucedemo/.waygraph-auto/0c01fd29.log +0 -4
  180. package/examples/saucedemo/.waygraph-auto/0c19e232.log +0 -5
  181. package/examples/saucedemo/.waygraph-auto/0c302590.log +0 -0
  182. package/examples/saucedemo/.waygraph-auto/0dee62d6.log +0 -5
  183. package/examples/saucedemo/.waygraph-auto/0eb4c081.log +0 -5
  184. package/examples/saucedemo/.waygraph-auto/0f0cb120.log +0 -0
  185. package/examples/saucedemo/.waygraph-auto/102c38ca.log +0 -0
  186. package/examples/saucedemo/.waygraph-auto/10fd431c.log +0 -0
  187. package/examples/saucedemo/.waygraph-auto/1122c13c.log +0 -0
  188. package/examples/saucedemo/.waygraph-auto/123d1cad.log +0 -5
  189. package/examples/saucedemo/.waygraph-auto/12ed8e28.log +0 -0
  190. package/examples/saucedemo/.waygraph-auto/13c6fe3c.log +0 -0
  191. package/examples/saucedemo/.waygraph-auto/1581b677.log +0 -0
  192. package/examples/saucedemo/.waygraph-auto/161cc8dd.log +0 -22
  193. package/examples/saucedemo/.waygraph-auto/164761a5.log +0 -6
  194. package/examples/saucedemo/.waygraph-auto/1905ceb2.log +0 -0
  195. package/examples/saucedemo/.waygraph-auto/1b1d55c6.log +0 -0
  196. package/examples/saucedemo/.waygraph-auto/1b80fd24.log +0 -6
  197. package/examples/saucedemo/.waygraph-auto/1bd7b7bf.log +0 -0
  198. package/examples/saucedemo/.waygraph-auto/1c30a3c2.log +0 -0
  199. package/examples/saucedemo/.waygraph-auto/1c58a174.log +0 -0
  200. package/examples/saucedemo/.waygraph-auto/1cb6f44c.log +0 -5
  201. package/examples/saucedemo/.waygraph-auto/1d90aa9a.log +0 -0
  202. package/examples/saucedemo/.waygraph-auto/1de7d889.log +0 -0
  203. package/examples/saucedemo/.waygraph-auto/1f233a4c.log +0 -6
  204. package/examples/saucedemo/.waygraph-auto/1fdb2100.log +0 -0
  205. package/examples/saucedemo/.waygraph-auto/20e66801.log +0 -0
  206. package/examples/saucedemo/.waygraph-auto/20e91af6.log +0 -5
  207. package/examples/saucedemo/.waygraph-auto/20ffdb77.log +0 -0
  208. package/examples/saucedemo/.waygraph-auto/22048fff.log +0 -4
  209. package/examples/saucedemo/.waygraph-auto/222d1d09.log +0 -0
  210. package/examples/saucedemo/.waygraph-auto/22f1a704.log +0 -5
  211. package/examples/saucedemo/.waygraph-auto/2324269a.log +0 -0
  212. package/examples/saucedemo/.waygraph-auto/232a1d81.log +0 -0
  213. package/examples/saucedemo/.waygraph-auto/239cced3.log +0 -20
  214. package/examples/saucedemo/.waygraph-auto/25204b46.log +0 -4
  215. package/examples/saucedemo/.waygraph-auto/2553d107.log +0 -0
  216. package/examples/saucedemo/.waygraph-auto/25e2e90f.log +0 -0
  217. package/examples/saucedemo/.waygraph-auto/2708455e.log +0 -22
  218. package/examples/saucedemo/.waygraph-auto/272a96fd.log +0 -20
  219. package/examples/saucedemo/.waygraph-auto/28d7be5d.log +0 -0
  220. package/examples/saucedemo/.waygraph-auto/2a577961.log +0 -0
  221. package/examples/saucedemo/.waygraph-auto/2a6a8266.log +0 -6
  222. package/examples/saucedemo/.waygraph-auto/2b3401cf.log +0 -20
  223. package/examples/saucedemo/.waygraph-auto/2b831907.log +0 -6
  224. package/examples/saucedemo/.waygraph-auto/2b9b56fc.log +0 -20
  225. package/examples/saucedemo/.waygraph-auto/2c79c73a.log +0 -0
  226. package/examples/saucedemo/.waygraph-auto/2c94a05b.log +0 -0
  227. package/examples/saucedemo/.waygraph-auto/2ceccd6d.log +0 -0
  228. package/examples/saucedemo/.waygraph-auto/2e2069e7.log +0 -0
  229. package/examples/saucedemo/.waygraph-auto/2e6bc35e.log +0 -6
  230. package/examples/saucedemo/.waygraph-auto/2efd1983.log +0 -0
  231. package/examples/saucedemo/.waygraph-auto/2f1b0c13.log +0 -6
  232. package/examples/saucedemo/.waygraph-auto/2f4f531e.log +0 -0
  233. package/examples/saucedemo/.waygraph-auto/2f8d4073.log +0 -6
  234. package/examples/saucedemo/.waygraph-auto/2fdbd916.log +0 -0
  235. package/examples/saucedemo/.waygraph-auto/30739278.log +0 -6
  236. package/examples/saucedemo/.waygraph-auto/30a5c848.log +0 -20
  237. package/examples/saucedemo/.waygraph-auto/31cb2e80.log +0 -0
  238. package/examples/saucedemo/.waygraph-auto/322d63cd.log +0 -0
  239. package/examples/saucedemo/.waygraph-auto/3239aa8a.log +0 -6
  240. package/examples/saucedemo/.waygraph-auto/326d87b7.log +0 -6
  241. package/examples/saucedemo/.waygraph-auto/331c6e8e.log +0 -0
  242. package/examples/saucedemo/.waygraph-auto/3351c0b6.log +0 -0
  243. package/examples/saucedemo/.waygraph-auto/33a50dc0.log +0 -0
  244. package/examples/saucedemo/.waygraph-auto/33df0770.log +0 -0
  245. package/examples/saucedemo/.waygraph-auto/340d624d.log +0 -0
  246. package/examples/saucedemo/.waygraph-auto/36367ccf.log +0 -0
  247. package/examples/saucedemo/.waygraph-auto/372536a5.log +0 -6
  248. package/examples/saucedemo/.waygraph-auto/37b56184.log +0 -0
  249. package/examples/saucedemo/.waygraph-auto/38f6799d.log +0 -0
  250. package/examples/saucedemo/.waygraph-auto/3a208bb8.log +0 -20
  251. package/examples/saucedemo/.waygraph-auto/3a412f3c.log +0 -0
  252. package/examples/saucedemo/.waygraph-auto/3a859bd7.log +0 -0
  253. package/examples/saucedemo/.waygraph-auto/3a8674d5.log +0 -6
  254. package/examples/saucedemo/.waygraph-auto/3bdb2f5a.log +0 -0
  255. package/examples/saucedemo/.waygraph-auto/3c1e5fe0.log +0 -22
  256. package/examples/saucedemo/.waygraph-auto/3cb0add7.log +0 -0
  257. package/examples/saucedemo/.waygraph-auto/3e3c0f3b.log +0 -0
  258. package/examples/saucedemo/.waygraph-auto/3e42f0d8.log +0 -0
  259. package/examples/saucedemo/.waygraph-auto/3f088138.log +0 -0
  260. package/examples/saucedemo/.waygraph-auto/401177a3.log +0 -0
  261. package/examples/saucedemo/.waygraph-auto/413d934d.log +0 -0
  262. package/examples/saucedemo/.waygraph-auto/4144071d.log +0 -0
  263. package/examples/saucedemo/.waygraph-auto/4176a3c6.log +0 -0
  264. package/examples/saucedemo/.waygraph-auto/41d0793d.log +0 -4
  265. package/examples/saucedemo/.waygraph-auto/41e6feae.log +0 -0
  266. package/examples/saucedemo/.waygraph-auto/424b4d5d.log +0 -0
  267. package/examples/saucedemo/.waygraph-auto/42e014d1.log +0 -0
  268. package/examples/saucedemo/.waygraph-auto/43253aba.log +0 -0
  269. package/examples/saucedemo/.waygraph-auto/432d09e3.log +0 -22
  270. package/examples/saucedemo/.waygraph-auto/438c6c53.log +0 -22
  271. package/examples/saucedemo/.waygraph-auto/4477db12.log +0 -0
  272. package/examples/saucedemo/.waygraph-auto/47247959.log +0 -0
  273. package/examples/saucedemo/.waygraph-auto/476cff76.log +0 -0
  274. package/examples/saucedemo/.waygraph-auto/4a1258b7.log +0 -0
  275. package/examples/saucedemo/.waygraph-auto/4ad09ece.log +0 -0
  276. package/examples/saucedemo/.waygraph-auto/4adcd179.log +0 -20
  277. package/examples/saucedemo/.waygraph-auto/4c9d9b16.log +0 -21
  278. package/examples/saucedemo/.waygraph-auto/4cebc228.log +0 -20
  279. package/examples/saucedemo/.waygraph-auto/4da39c36.log +0 -6
  280. package/examples/saucedemo/.waygraph-auto/4dbefa7e.log +0 -5
  281. package/examples/saucedemo/.waygraph-auto/4efa7035.log +0 -6
  282. package/examples/saucedemo/.waygraph-auto/505affdc.log +0 -4
  283. package/examples/saucedemo/.waygraph-auto/51bcb60a.log +0 -0
  284. package/examples/saucedemo/.waygraph-auto/527b6d76.log +0 -0
  285. package/examples/saucedemo/.waygraph-auto/5291bc78.log +0 -22
  286. package/examples/saucedemo/.waygraph-auto/535e8922.log +0 -0
  287. package/examples/saucedemo/.waygraph-auto/54274c39.log +0 -5
  288. package/examples/saucedemo/.waygraph-auto/5440ce7e.log +0 -0
  289. package/examples/saucedemo/.waygraph-auto/5738175f.log +0 -22
  290. package/examples/saucedemo/.waygraph-auto/573abedd.log +0 -0
  291. package/examples/saucedemo/.waygraph-auto/57ce5643.log +0 -22
  292. package/examples/saucedemo/.waygraph-auto/5984426b.log +0 -6
  293. package/examples/saucedemo/.waygraph-auto/5a682e7c.log +0 -22
  294. package/examples/saucedemo/.waygraph-auto/5b79320c.log +0 -21
  295. package/examples/saucedemo/.waygraph-auto/5b838485.log +0 -0
  296. package/examples/saucedemo/.waygraph-auto/5c55aaac.log +0 -21
  297. package/examples/saucedemo/.waygraph-auto/5d13bdde.log +0 -0
  298. package/examples/saucedemo/.waygraph-auto/5d285cd3.log +0 -0
  299. package/examples/saucedemo/.waygraph-auto/5ed00b16.log +0 -4
  300. package/examples/saucedemo/.waygraph-auto/60b9c066.log +0 -6
  301. package/examples/saucedemo/.waygraph-auto/610dd127.log +0 -0
  302. package/examples/saucedemo/.waygraph-auto/61105500.log +0 -5
  303. package/examples/saucedemo/.waygraph-auto/61333142.log +0 -5
  304. package/examples/saucedemo/.waygraph-auto/6134afe8.log +0 -20
  305. package/examples/saucedemo/.waygraph-auto/61937e83.log +0 -22
  306. package/examples/saucedemo/.waygraph-auto/625e7f65.log +0 -5
  307. package/examples/saucedemo/.waygraph-auto/62a0bdc9.log +0 -22
  308. package/examples/saucedemo/.waygraph-auto/6376fc15.log +0 -0
  309. package/examples/saucedemo/.waygraph-auto/63b0f4cd.log +0 -0
  310. package/examples/saucedemo/.waygraph-auto/6599cbca.log +0 -22
  311. package/examples/saucedemo/.waygraph-auto/6706ead4.log +0 -0
  312. package/examples/saucedemo/.waygraph-auto/67aaca30.log +0 -0
  313. package/examples/saucedemo/.waygraph-auto/685714af.log +0 -0
  314. package/examples/saucedemo/.waygraph-auto/68b10298.log +0 -0
  315. package/examples/saucedemo/.waygraph-auto/68be5e12.log +0 -0
  316. package/examples/saucedemo/.waygraph-auto/68df05a6.log +0 -22
  317. package/examples/saucedemo/.waygraph-auto/68fa0682.log +0 -0
  318. package/examples/saucedemo/.waygraph-auto/693f67c4.log +0 -20
  319. package/examples/saucedemo/.waygraph-auto/69ae030a.log +0 -6
  320. package/examples/saucedemo/.waygraph-auto/69e73f35.log +0 -6
  321. package/examples/saucedemo/.waygraph-auto/6b2333b0.log +0 -5
  322. package/examples/saucedemo/.waygraph-auto/6c4c3817.log +0 -0
  323. package/examples/saucedemo/.waygraph-auto/6c954911.log +0 -0
  324. package/examples/saucedemo/.waygraph-auto/6d65a439.log +0 -5
  325. package/examples/saucedemo/.waygraph-auto/6d700055.log +0 -0
  326. package/examples/saucedemo/.waygraph-auto/6ead848f.log +0 -0
  327. package/examples/saucedemo/.waygraph-auto/6f05bdc1.log +0 -0
  328. package/examples/saucedemo/.waygraph-auto/70279fc3.log +0 -0
  329. package/examples/saucedemo/.waygraph-auto/70c97639.log +0 -0
  330. package/examples/saucedemo/.waygraph-auto/72675b2d.log +0 -6
  331. package/examples/saucedemo/.waygraph-auto/731a14bd.log +0 -0
  332. package/examples/saucedemo/.waygraph-auto/733dd260.log +0 -5
  333. package/examples/saucedemo/.waygraph-auto/73a41843.log +0 -0
  334. package/examples/saucedemo/.waygraph-auto/75016486.log +0 -0
  335. package/examples/saucedemo/.waygraph-auto/752b01c6.log +0 -22
  336. package/examples/saucedemo/.waygraph-auto/75675227.log +0 -6
  337. package/examples/saucedemo/.waygraph-auto/756fd326.log +0 -20
  338. package/examples/saucedemo/.waygraph-auto/75e2e658.log +0 -0
  339. package/examples/saucedemo/.waygraph-auto/76128a2d.log +0 -0
  340. package/examples/saucedemo/.waygraph-auto/76ac1a86.log +0 -0
  341. package/examples/saucedemo/.waygraph-auto/77605295.log +0 -0
  342. package/examples/saucedemo/.waygraph-auto/7773a809.log +0 -0
  343. package/examples/saucedemo/.waygraph-auto/78043767.log +0 -20
  344. package/examples/saucedemo/.waygraph-auto/792671f4.log +0 -22
  345. package/examples/saucedemo/.waygraph-auto/796ab578.log +0 -0
  346. package/examples/saucedemo/.waygraph-auto/79915adb.log +0 -20
  347. package/examples/saucedemo/.waygraph-auto/7a398774.log +0 -6
  348. package/examples/saucedemo/.waygraph-auto/7a72f66e.log +0 -6
  349. package/examples/saucedemo/.waygraph-auto/7a984334.log +0 -4
  350. package/examples/saucedemo/.waygraph-auto/7b226350.log +0 -5
  351. package/examples/saucedemo/.waygraph-auto/7c6ee793.log +0 -20
  352. package/examples/saucedemo/.waygraph-auto/7c726dc4.log +0 -22
  353. package/examples/saucedemo/.waygraph-auto/7c72e8a5.log +0 -4
  354. package/examples/saucedemo/.waygraph-auto/7c99674f.log +0 -0
  355. package/examples/saucedemo/.waygraph-auto/7dbee625.log +0 -22
  356. package/examples/saucedemo/.waygraph-auto/7df66956.log +0 -0
  357. package/examples/saucedemo/.waygraph-auto/7e053160.log +0 -0
  358. package/examples/saucedemo/.waygraph-auto/7e8a6b62.log +0 -0
  359. package/examples/saucedemo/.waygraph-auto/7effd5b2.log +0 -20
  360. package/examples/saucedemo/.waygraph-auto/7f1b4864.log +0 -0
  361. package/examples/saucedemo/.waygraph-auto/7f94fd02.log +0 -0
  362. package/examples/saucedemo/.waygraph-auto/7fcb512f.log +0 -22
  363. package/examples/saucedemo/.waygraph-auto/7fdd47ee.log +0 -2
  364. package/examples/saucedemo/.waygraph-auto/802a0b5b.log +0 -0
  365. package/examples/saucedemo/.waygraph-auto/80322e0b.log +0 -0
  366. package/examples/saucedemo/.waygraph-auto/80a4978e.log +0 -6
  367. package/examples/saucedemo/.waygraph-auto/81257bf0.log +0 -0
  368. package/examples/saucedemo/.waygraph-auto/81cfe480.log +0 -22
  369. package/examples/saucedemo/.waygraph-auto/832f5add.log +0 -0
  370. package/examples/saucedemo/.waygraph-auto/8337b6ad.log +0 -0
  371. package/examples/saucedemo/.waygraph-auto/8481aa1c.log +0 -0
  372. package/examples/saucedemo/.waygraph-auto/8493928e.log +0 -0
  373. package/examples/saucedemo/.waygraph-auto/849ed45d.log +0 -0
  374. package/examples/saucedemo/.waygraph-auto/84dc6480.log +0 -6
  375. package/examples/saucedemo/.waygraph-auto/853bde43.log +0 -0
  376. package/examples/saucedemo/.waygraph-auto/8598b4c0.log +0 -0
  377. package/examples/saucedemo/.waygraph-auto/859a261d.log +0 -0
  378. package/examples/saucedemo/.waygraph-auto/86350ea6.log +0 -22
  379. package/examples/saucedemo/.waygraph-auto/86bb598a.log +0 -0
  380. package/examples/saucedemo/.waygraph-auto/86d09876.log +0 -22
  381. package/examples/saucedemo/.waygraph-auto/878ad01b.log +0 -4
  382. package/examples/saucedemo/.waygraph-auto/87c88ba5.log +0 -0
  383. package/examples/saucedemo/.waygraph-auto/87cb80ff.log +0 -0
  384. package/examples/saucedemo/.waygraph-auto/880b2e78.log +0 -6
  385. package/examples/saucedemo/.waygraph-auto/88527936.log +0 -5
  386. package/examples/saucedemo/.waygraph-auto/88eda676.log +0 -0
  387. package/examples/saucedemo/.waygraph-auto/893023ea.log +0 -5
  388. package/examples/saucedemo/.waygraph-auto/89416718.log +0 -0
  389. package/examples/saucedemo/.waygraph-auto/8996a857.log +0 -6
  390. package/examples/saucedemo/.waygraph-auto/8a08b68d.log +0 -6
  391. package/examples/saucedemo/.waygraph-auto/8a64ba0f.log +0 -6
  392. package/examples/saucedemo/.waygraph-auto/8b1cc2aa.log +0 -6
  393. package/examples/saucedemo/.waygraph-auto/8b73d13e.log +0 -6
  394. package/examples/saucedemo/.waygraph-auto/8be93021.log +0 -0
  395. package/examples/saucedemo/.waygraph-auto/8d960d31.log +0 -1
  396. package/examples/saucedemo/.waygraph-auto/8d9e5cd2.log +0 -21
  397. package/examples/saucedemo/.waygraph-auto/8e12e34f.log +0 -22
  398. package/examples/saucedemo/.waygraph-auto/8ec7d260.log +0 -0
  399. package/examples/saucedemo/.waygraph-auto/8ed43279.log +0 -0
  400. package/examples/saucedemo/.waygraph-auto/93acae32.log +0 -5
  401. package/examples/saucedemo/.waygraph-auto/94221b2b.log +0 -0
  402. package/examples/saucedemo/.waygraph-auto/96321a08.log +0 -0
  403. package/examples/saucedemo/.waygraph-auto/9742b6c2.log +0 -6
  404. package/examples/saucedemo/.waygraph-auto/9761c4c4.log +0 -6
  405. package/examples/saucedemo/.waygraph-auto/976394cd.log +0 -20
  406. package/examples/saucedemo/.waygraph-auto/982138cf.log +0 -0
  407. package/examples/saucedemo/.waygraph-auto/99cc93eb.log +0 -6
  408. package/examples/saucedemo/.waygraph-auto/9a26134c.log +0 -20
  409. package/examples/saucedemo/.waygraph-auto/9cbfbedc.log +0 -0
  410. package/examples/saucedemo/.waygraph-auto/9d827954.log +0 -20
  411. package/examples/saucedemo/.waygraph-auto/9dc147d2.log +0 -22
  412. package/examples/saucedemo/.waygraph-auto/9dd78c5e.log +0 -0
  413. package/examples/saucedemo/.waygraph-auto/a1ab5d29.log +0 -0
  414. package/examples/saucedemo/.waygraph-auto/a215a395.log +0 -22
  415. package/examples/saucedemo/.waygraph-auto/a23b7086.log +0 -4
  416. package/examples/saucedemo/.waygraph-auto/a35bd5ec.log +0 -0
  417. package/examples/saucedemo/.waygraph-auto/a4b36275.log +0 -0
  418. package/examples/saucedemo/.waygraph-auto/a4f8d355.log +0 -20
  419. package/examples/saucedemo/.waygraph-auto/a68995e9.log +0 -22
  420. package/examples/saucedemo/.waygraph-auto/a6e4f936.log +0 -22
  421. package/examples/saucedemo/.waygraph-auto/a7da862b.log +0 -0
  422. package/examples/saucedemo/.waygraph-auto/a82e2a48.log +0 -0
  423. package/examples/saucedemo/.waygraph-auto/a8645294.log +0 -0
  424. package/examples/saucedemo/.waygraph-auto/a94738b7.log +0 -0
  425. package/examples/saucedemo/.waygraph-auto/a952eb91.log +0 -0
  426. package/examples/saucedemo/.waygraph-auto/a9559653.log +0 -5
  427. package/examples/saucedemo/.waygraph-auto/aa1beafb.log +0 -0
  428. package/examples/saucedemo/.waygraph-auto/aa226dd0.log +0 -22
  429. package/examples/saucedemo/.waygraph-auto/aa478de2.log +0 -0
  430. package/examples/saucedemo/.waygraph-auto/aa7323f8.log +0 -20
  431. package/examples/saucedemo/.waygraph-auto/aaae4fb0.log +0 -20
  432. package/examples/saucedemo/.waygraph-auto/ac350fc7.log +0 -20
  433. package/examples/saucedemo/.waygraph-auto/ac5dde3d.log +0 -0
  434. package/examples/saucedemo/.waygraph-auto/acc1b63a.log +0 -0
  435. package/examples/saucedemo/.waygraph-auto/ad0bfad9.log +0 -5
  436. package/examples/saucedemo/.waygraph-auto/ad12d191.log +0 -0
  437. package/examples/saucedemo/.waygraph-auto/ae3a9b06.log +0 -0
  438. package/examples/saucedemo/.waygraph-auto/af2fae12.log +0 -0
  439. package/examples/saucedemo/.waygraph-auto/b04638f4.log +0 -6
  440. package/examples/saucedemo/.waygraph-auto/b0752c49.log +0 -0
  441. package/examples/saucedemo/.waygraph-auto/b14811d7.log +0 -6
  442. package/examples/saucedemo/.waygraph-auto/b2d2dbb2.log +0 -22
  443. package/examples/saucedemo/.waygraph-auto/b3d172f3.log +0 -0
  444. package/examples/saucedemo/.waygraph-auto/b48863e5.log +0 -22
  445. package/examples/saucedemo/.waygraph-auto/b5569336.log +0 -0
  446. package/examples/saucedemo/.waygraph-auto/b56968e1.log +0 -6
  447. package/examples/saucedemo/.waygraph-auto/b57921c5.log +0 -0
  448. package/examples/saucedemo/.waygraph-auto/b64e0620.log +0 -20
  449. package/examples/saucedemo/.waygraph-auto/b75168f7.log +0 -1
  450. package/examples/saucedemo/.waygraph-auto/b86a6218.log +0 -6
  451. package/examples/saucedemo/.waygraph-auto/b8e9e956.log +0 -22
  452. package/examples/saucedemo/.waygraph-auto/b9ab0983.log +0 -0
  453. package/examples/saucedemo/.waygraph-auto/b9b310ff.log +0 -21
  454. package/examples/saucedemo/.waygraph-auto/bb0e0e46.log +0 -0
  455. package/examples/saucedemo/.waygraph-auto/bc111745.log +0 -22
  456. package/examples/saucedemo/.waygraph-auto/bf7a77a2.log +0 -0
  457. package/examples/saucedemo/.waygraph-auto/bf85a598.log +0 -0
  458. package/examples/saucedemo/.waygraph-auto/bf8693e7.log +0 -0
  459. package/examples/saucedemo/.waygraph-auto/c0d6f353.log +0 -21
  460. package/examples/saucedemo/.waygraph-auto/c0febcf2.log +0 -20
  461. package/examples/saucedemo/.waygraph-auto/c4c52998.log +0 -6
  462. package/examples/saucedemo/.waygraph-auto/c52bac6d.log +0 -0
  463. package/examples/saucedemo/.waygraph-auto/c60cc55e.log +0 -0
  464. package/examples/saucedemo/.waygraph-auto/c809ceb4.log +0 -22
  465. package/examples/saucedemo/.waygraph-auto/c851cc53.log +0 -6
  466. package/examples/saucedemo/.waygraph-auto/c8987b67.log +0 -0
  467. package/examples/saucedemo/.waygraph-auto/c9d76e32.log +0 -0
  468. package/examples/saucedemo/.waygraph-auto/ca6de7e7.log +0 -0
  469. package/examples/saucedemo/.waygraph-auto/ca8561bc.log +0 -0
  470. package/examples/saucedemo/.waygraph-auto/cae91469.log +0 -0
  471. package/examples/saucedemo/.waygraph-auto/cb05d223.log +0 -0
  472. package/examples/saucedemo/.waygraph-auto/cb86d45b.log +0 -0
  473. package/examples/saucedemo/.waygraph-auto/cb9a1978.log +0 -6
  474. package/examples/saucedemo/.waygraph-auto/cbbc689c.log +0 -6
  475. package/examples/saucedemo/.waygraph-auto/cc989184.log +0 -20
  476. package/examples/saucedemo/.waygraph-auto/cd88364b.log +0 -0
  477. package/examples/saucedemo/.waygraph-auto/cd919e1d.log +0 -0
  478. package/examples/saucedemo/.waygraph-auto/ce584949.log +0 -5
  479. package/examples/saucedemo/.waygraph-auto/cf34b895.log +0 -2
  480. package/examples/saucedemo/.waygraph-auto/cfff9eef.log +0 -20
  481. package/examples/saucedemo/.waygraph-auto/d0f59b21.log +0 -4
  482. package/examples/saucedemo/.waygraph-auto/d1195079.log +0 -20
  483. package/examples/saucedemo/.waygraph-auto/d2ef067a.log +0 -5
  484. package/examples/saucedemo/.waygraph-auto/d37719a6.log +0 -0
  485. package/examples/saucedemo/.waygraph-auto/d425471f.log +0 -6
  486. package/examples/saucedemo/.waygraph-auto/d4afe93f.log +0 -5
  487. package/examples/saucedemo/.waygraph-auto/d50e58f0.log +0 -0
  488. package/examples/saucedemo/.waygraph-auto/d5293921.log +0 -0
  489. package/examples/saucedemo/.waygraph-auto/d62a22c2.log +0 -21
  490. package/examples/saucedemo/.waygraph-auto/d6d1761f.log +0 -22
  491. package/examples/saucedemo/.waygraph-auto/d6d5f411.log +0 -22
  492. package/examples/saucedemo/.waygraph-auto/d6df2771.log +0 -6
  493. package/examples/saucedemo/.waygraph-auto/d7075012.log +0 -21
  494. package/examples/saucedemo/.waygraph-auto/d846cd78.log +0 -0
  495. package/examples/saucedemo/.waygraph-auto/d934da78.log +0 -0
  496. package/examples/saucedemo/.waygraph-auto/d9ddc297.log +0 -0
  497. package/examples/saucedemo/.waygraph-auto/da0a06bf.log +0 -0
  498. package/examples/saucedemo/.waygraph-auto/da6ebb31.log +0 -0
  499. package/examples/saucedemo/.waygraph-auto/db4ac845.log +0 -0
  500. package/examples/saucedemo/.waygraph-auto/db6d7774.log +0 -0
  501. package/examples/saucedemo/.waygraph-auto/db81ba7d.log +0 -0
  502. package/examples/saucedemo/.waygraph-auto/db839827.log +0 -5
  503. package/examples/saucedemo/.waygraph-auto/dc58eb72.log +0 -0
  504. package/examples/saucedemo/.waygraph-auto/dddd057c.log +0 -20
  505. package/examples/saucedemo/.waygraph-auto/dde5e859.log +0 -22
  506. package/examples/saucedemo/.waygraph-auto/ddf975e6.log +0 -0
  507. package/examples/saucedemo/.waygraph-auto/de8cac58.log +0 -0
  508. package/examples/saucedemo/.waygraph-auto/de8cb83d.log +0 -6
  509. package/examples/saucedemo/.waygraph-auto/ded5511a.log +0 -6
  510. package/examples/saucedemo/.waygraph-auto/dedfcb18.log +0 -0
  511. package/examples/saucedemo/.waygraph-auto/def4d9b1.log +0 -0
  512. package/examples/saucedemo/.waygraph-auto/e03cfd8e.log +0 -0
  513. package/examples/saucedemo/.waygraph-auto/e1549e40.log +0 -0
  514. package/examples/saucedemo/.waygraph-auto/e1b0676d.log +0 -21
  515. package/examples/saucedemo/.waygraph-auto/e230f24e.log +0 -0
  516. package/examples/saucedemo/.waygraph-auto/e5111463.log +0 -0
  517. package/examples/saucedemo/.waygraph-auto/e5127c03.log +0 -22
  518. package/examples/saucedemo/.waygraph-auto/e5fc1d7c.log +0 -5
  519. package/examples/saucedemo/.waygraph-auto/e6fd2202.log +0 -0
  520. package/examples/saucedemo/.waygraph-auto/eb38d92e.log +0 -22
  521. package/examples/saucedemo/.waygraph-auto/edaa806d.log +0 -0
  522. package/examples/saucedemo/.waygraph-auto/edaf33de.log +0 -0
  523. package/examples/saucedemo/.waygraph-auto/edd40cbb.log +0 -20
  524. package/examples/saucedemo/.waygraph-auto/eddfbffc.log +0 -6
  525. package/examples/saucedemo/.waygraph-auto/ee86203e.log +0 -0
  526. package/examples/saucedemo/.waygraph-auto/ee9fa1ad.log +0 -5
  527. package/examples/saucedemo/.waygraph-auto/ef319474.log +0 -22
  528. package/examples/saucedemo/.waygraph-auto/f1f38eeb.log +0 -22
  529. package/examples/saucedemo/.waygraph-auto/f24b2915.log +0 -0
  530. package/examples/saucedemo/.waygraph-auto/f28eee8d.log +0 -0
  531. package/examples/saucedemo/.waygraph-auto/f2943898.log +0 -0
  532. package/examples/saucedemo/.waygraph-auto/f33bde90.log +0 -0
  533. package/examples/saucedemo/.waygraph-auto/f43de83c.log +0 -0
  534. package/examples/saucedemo/.waygraph-auto/f6ba7cb4.log +0 -6
  535. package/examples/saucedemo/.waygraph-auto/f7ac4d62.log +0 -20
  536. package/examples/saucedemo/.waygraph-auto/f86224c6.log +0 -0
  537. package/examples/saucedemo/.waygraph-auto/f929bb79.log +0 -0
  538. package/examples/saucedemo/.waygraph-auto/f92d4c6c.log +0 -22
  539. package/examples/saucedemo/.waygraph-auto/f92faf40.log +0 -5
  540. package/examples/saucedemo/.waygraph-auto/fa784369.log +0 -21
  541. package/examples/saucedemo/.waygraph-auto/fb55f723.log +0 -20
  542. package/examples/saucedemo/.waygraph-auto/fba3b738.log +0 -0
  543. package/examples/saucedemo/.waygraph-auto/fc917c18.log +0 -0
  544. package/examples/saucedemo/.waygraph-auto/fdf66b74.log +0 -0
  545. package/examples/saucedemo/.waygraph-auto/fe83305d.log +0 -0
  546. package/examples/saucedemo/.waygraph-auto/ff616932.log +0 -0
  547. package/examples/saucedemo/.waygraph-auto/ffdf2854.log +0 -6
  548. package/examples/saucedemo/scripts/capture-auto-headful.mjs +0 -120
  549. package/examples/saucedemo/scripts/capture-wrong-login.mjs +0 -141
  550. package/examples/saucedemo/scripts/demo-device-presets.mjs +0 -188
  551. package/examples/saucedemo/scripts/demo-orientation-gestures-video.mjs +0 -262
  552. package/examples/saucedemo/scripts/show-add-to-cart-menu.mjs +0 -123
  553. package/examples/saucedemo/scripts/show-auto-menu.mjs +0 -72
  554. package/templates/scaffold/playwright.config.ts +0 -28
  555. package/templates/scaffold/scripts/README.md +0 -13
  556. package/templates/scaffold/scripts/fixture-server.mjs +0 -50
  557. package/templates/scaffold/scripts/with-fixture.mjs +0 -69
  558. package/templates/scaffold/test-results/.last-run.json +0 -4
  559. /package/templates/scaffold/src/map/(app_base)/home/{home.html → index.html} +0 -0
@@ -13,7 +13,7 @@ export interface WaygraphEdge {
13
13
  block: string;
14
14
  /** Path the Block was discovered in, relative to the project root. */
15
15
  file: string;
16
- /** `"*"` for a NavBlock - reachable from anywhere, by design. */
16
+ /** `"*"` for a NavBlock - reachable from anywhere, unless it declares `from` (then one edge per tag). */
17
17
  from: string;
18
18
  to: string;
19
19
  kind: "nav" | "action";
@@ -53,21 +53,10 @@ function discoverBlocks(projectDir) {
53
53
  function discoverFlows(projectDir) {
54
54
  return walkDir(projectDir, /\.flow\.ts$/);
55
55
  }
56
- /** Block export ids listed inside any `defineFlow([...])` array in flow files. */
56
+ /** Block export ids a flow file uses: every identifier outside its import lines (a Block can sit in the array or in a local like `const AddShown = AddBlock.stubAfter(...)`). */
57
57
  function extractFlowBlockRefs(flowSrc) {
58
- const refs = [];
59
- const re = /defineFlow(?:<[\s\S]*?>)?\s*\(\s*\[([\s\S]*?)\]\s*\)/g;
60
- let m;
61
- while ((m = re.exec(flowSrc)) !== null) {
62
- for (const part of m[1].split(",")) {
63
- const trimmed = part.trim().replace(/\/\/.*$/, "").trim();
64
- const id = trimmed.split(/\s+/)[0];
65
- if (!id || id === "start" || id === "end")
66
- continue;
67
- refs.push(id);
68
- }
69
- }
70
- return refs;
58
+ const body = flowSrc.replace(/^\s*import[\s\S]*?;\s*$/gm, "").replace(/\/\/.*$/gm, "");
59
+ return body.match(/[A-Za-z_$][\w$]*/g) ?? [];
71
60
  }
72
61
  function exportNameToBlockName(exportName) {
73
62
  const base = exportName.replace(/Block$/, "");
@@ -420,7 +409,13 @@ export async function discoverGraph(projectDir, opts) {
420
409
  const deepLink = !isPage ||
421
410
  exported.__waygraphPageDeepLink === true;
422
411
  if (deepLink) {
423
- edges.push({ block: blockName, file: relFile, from: "*", to, kind: "nav" });
412
+ // `from: [...]` on the Nav = only those Checkpoints; otherwise reachable from anywhere.
413
+ const navFrom = exported.__waygraphNavFrom;
414
+ for (const from of navFrom ?? ["*"]) {
415
+ if (from !== "*")
416
+ nodeTags.add(from);
417
+ edges.push({ block: blockName, file: relFile, from, to, kind: "nav" });
418
+ }
424
419
  }
425
420
  }
426
421
  catch {
@@ -117,12 +117,15 @@ export async function checkMap(projectDir) {
117
117
  continue; // only statically-urled Nav/Page Blocks are checkable
118
118
  let pathname;
119
119
  try {
120
- pathname = new URL(navUrl).pathname;
120
+ // Relative URLs (the normal baseUrl case) are paths from the app root.
121
+ pathname = new URL(navUrl, "http://app.invalid/").pathname;
121
122
  }
122
123
  catch {
123
- continue; // a relative/templated URL - not verbatim-checkable
124
+ continue;
124
125
  }
125
126
  const urlSegments = pathname.split("/").filter(Boolean);
127
+ if (urlSegments.at(-1) === "index.html")
128
+ urlSegments.pop(); // /docs/index.html is the docs/ folder
126
129
  const folderSegments = realSegments(relative(mapRoot, file));
127
130
  const matches = urlSegments.length === folderSegments.length && urlSegments.every((s, i) => s === folderSegments[i]);
128
131
  if (!matches) {
@@ -11,4 +11,3 @@ export interface PracticeCheckOptions {
11
11
  }
12
12
  export declare function collectPracticeWarnings(projectDir: string, walkDir: (dir: string, re: RegExp) => string[], opts?: PracticeCheckOptions): PracticeWarning[];
13
13
  export declare function practiceKindLabel(kind: PracticeKind): string;
14
- export declare function formatPracticeWarnings(projectDir: string, warnings: PracticeWarning[]): string[];
@@ -5,8 +5,20 @@
5
5
  */
6
6
  import { readFileSync, readdirSync } from "node:fs";
7
7
  import { dirname, relative } from "node:path";
8
- /** define*Block<…Checkpoint<string>…> — prefer project Checkpoint types. */
9
- const WILDCARD_CHECKPOINT = /\bdefine(?:Method|Effect|Page|Nav|MemNav|NavClick|Action)Block\s*<[^>]*\bCheckpoint\s*<\s*string\s*>/;
8
+ /** Every define*Block<In, Out> / <Out> generic list - args may themselves be Checkpoint<...>. */
9
+ const BLOCK_GENERICS = /\bdefine(?:Method|Effect|MemEffect|Page|Nav|MemNav|NavClick|Action)Block\s*<\s*((?:Checkpoint\s*<[^>]*>|[^,<>])+?)\s*(?:,\s*((?:Checkpoint\s*<[^>]*>|[^,<>])+?)\s*)?>/g;
10
+ /**
11
+ * A wildcard Out (the Block's result is untyped). A wildcard In is fine - it's the documented
12
+ * "reachable from anywhere" form (graph.ts treats it like a NavBlock's "*").
13
+ */
14
+ function hasWildcardOut(src) {
15
+ for (const m of src.matchAll(BLOCK_GENERICS)) {
16
+ const out = (m[2] ?? m[1]).trim();
17
+ if (/^Checkpoint\s*<\s*string\s*>$/.test(out))
18
+ return true;
19
+ }
20
+ return false;
21
+ }
10
22
  /** defineAssertBlock({ … }) with no explicit Out type — defaults to wildcard. */
11
23
  const ASSERT_NO_TYPE_ARG = /\bdefineAssertBlock\s*\(\s*\{/;
12
24
  /** defineAssertBlock, any form - used to scope the empty-verify check below. */
@@ -74,11 +86,12 @@ export function collectPracticeWarnings(projectDir, walkDir, opts) {
74
86
  const rel = relative(projectDir, file).replace(/\\/g, "/");
75
87
  const src = readFileSync(file, "utf-8");
76
88
  const ignore = ignoredKindsForFile(src);
77
- if (!isIgnored("wildcard-checkpoint", ignore) && WILDCARD_CHECKPOINT.test(src)) {
89
+ if (!isIgnored("wildcard-checkpoint", ignore) && hasWildcardOut(src)) {
78
90
  warnings.push({
79
91
  kind: "wildcard-checkpoint",
80
92
  file: rel,
81
- detail: 'uses Checkpoint<string> in a Block helper generic — prefer a typed Checkpoint from src/states/ (e.g. defineMethodBlock<LoginPage, LoginPage>)',
93
+ detail: "the Block's output is Checkpoint<string>, so its result is untyped — use a typed Checkpoint from " +
94
+ "src/states/ (e.g. defineMethodBlock<LoginPage, LoggedIn>); a wildcard input is fine",
82
95
  });
83
96
  }
84
97
  if (!isIgnored("assert-no-type-arg", ignore) && ASSERT_NO_TYPE_ARG.test(src)) {
@@ -180,16 +193,3 @@ export function practiceKindLabel(kind) {
180
193
  }
181
194
  }
182
195
  }
183
- export function formatPracticeWarnings(projectDir, warnings) {
184
- const lines = [];
185
- for (const w of warnings) {
186
- lines.push(`waygraph practices: ${w.file} (${practiceKindLabel(w.kind)}) — ${w.detail}`);
187
- }
188
- if (warnings.length === 0) {
189
- lines.push(`waygraph practices: no bad-practice patterns under ${projectDir}`);
190
- }
191
- else {
192
- lines.push(`waygraph practices: ${warnings.length} bad-practice warning${warnings.length === 1 ? "" : "s"}`);
193
- }
194
- return lines;
195
- }
@@ -16,7 +16,7 @@ export declare class AutoSession {
16
16
  private library;
17
17
  private readonly mem;
18
18
  private readonly engine;
19
- private readonly browser;
19
+ private readonly closeBrowser;
20
20
  private readonly context;
21
21
  private page;
22
22
  private readonly startUrl;
@@ -9,6 +9,8 @@ import { collectKnownInteractionSelectors, unmappedInteractionsPageScript } from
9
9
  import { runStubPhase } from "../highlights.js";
10
10
  import { verboseLog } from "./verbose-log.js";
11
11
  import { findBlockPathDetailed } from "../analysis/graph.js";
12
+ import { configuredExtensions } from "../config.js";
13
+ import { chromiumExecutablePath, launchContext } from "../browser.js";
12
14
  /**
13
15
  * Non-interactive explore session: same graph/library/mem/browser setup
14
16
  * `runAutoExplore` runs in `--cli` mode, driven by `applyPick` instead of a
@@ -25,7 +27,7 @@ export class AutoSession {
25
27
  library;
26
28
  mem;
27
29
  engine;
28
- browser;
30
+ closeBrowser;
29
31
  context;
30
32
  page;
31
33
  startUrl;
@@ -37,7 +39,7 @@ export class AutoSession {
37
39
  knownInteractionSelectors;
38
40
  headless;
39
41
  lastOverlayInfo = null;
40
- constructor(projectDir, inject, blocksSelect, graph, library, mem, engine, browser, context, page, startUrl, sessionId, knownInteractionSelectors, headless) {
42
+ constructor(projectDir, inject, blocksSelect, graph, library, mem, engine, closeBrowser, context, page, startUrl, sessionId, knownInteractionSelectors, headless) {
41
43
  this.projectDir = projectDir;
42
44
  this.inject = inject;
43
45
  this.blocksSelect = blocksSelect;
@@ -45,7 +47,7 @@ export class AutoSession {
45
47
  this.library = library;
46
48
  this.mem = mem;
47
49
  this.engine = engine;
48
- this.browser = browser;
50
+ this.closeBrowser = closeBrowser;
49
51
  this.context = context;
50
52
  this.page = page;
51
53
  this.startUrl = startUrl;
@@ -67,7 +69,7 @@ export class AutoSession {
67
69
  const headless = init.headless ?? true;
68
70
  const engine = new Engine({ headless });
69
71
  const { chromium } = await import("@playwright/test");
70
- const executablePath = process.env.CHROME_PATH || process.env.CHROMIUM_PATH;
72
+ const executablePath = chromiumExecutablePath();
71
73
  // Real gap found live: a headed (--non-headless) session kept a fixed
72
74
  // 1280x720 content area even when the user maximized/fullscreened the
73
75
  // actual window - `viewport: null` alone only makes the PAGE track the
@@ -84,13 +86,17 @@ export class AutoSession {
84
86
  };
85
87
  if (executablePath)
86
88
  launchOpts.executablePath = executablePath;
87
- const browser = await chromium.launch(launchOpts);
88
89
  const contextOpts = {
89
90
  viewport: headless ? { width: 1280, height: 720 } : null,
90
91
  };
91
92
  if (baseURL)
92
93
  contextOpts.baseURL = baseURL;
93
- const context = await browser.newContext(contextOpts);
94
+ const { close: closeBrowser, context } = await launchContext({
95
+ launcher: chromium,
96
+ launch: launchOpts,
97
+ context: contextOpts,
98
+ extensions: await configuredExtensions(init.projectDir),
99
+ });
94
100
  await installPersistentPilotOverlay(context);
95
101
  const page = await context.newPage();
96
102
  instrumentPilotActions(page, headless ? 0 : 450);
@@ -102,7 +108,7 @@ export class AutoSession {
102
108
  await page.goto("about:blank").catch(() => { });
103
109
  }
104
110
  const knownInteractionSelectors = collectKnownInteractionSelectors(init.projectDir, library, init.inject);
105
- const session = new AutoSession(init.projectDir, init.inject, init.blocksSelect, graph, library, mem, engine, browser, context, page, startUrl, init.sessionId, knownInteractionSelectors, headless);
111
+ const session = new AutoSession(init.projectDir, init.inject, init.blocksSelect, graph, library, mem, engine, closeBrowser, context, page, startUrl, init.sessionId, knownInteractionSelectors, headless);
106
112
  page.on("load", () => {
107
113
  void session.repaintOverlayAfterNavigation();
108
114
  });
@@ -708,6 +714,6 @@ export class AutoSession {
708
714
  }
709
715
  async close() {
710
716
  await this.context.close();
711
- await this.browser.close();
717
+ await this.closeBrowser();
712
718
  }
713
719
  }
@@ -1,3 +1,10 @@
1
+ /**
2
+ * Shared `--blocks` select grammar (RFC Phase C).
3
+ *
4
+ * - `/pattern/` -> regex on relative file path OR block name
5
+ * - has `*`/`**` -> glob on relative file path (POSIX-ish)
6
+ * - otherwise -> bare token (flow export / checkpoint / block name) — caller decides
7
+ */
1
8
  export type BlocksSelectKind = "regex" | "glob" | "bare";
2
9
  export interface BlocksSelect {
3
10
  kind: BlocksSelectKind;
@@ -16,7 +23,3 @@ export declare function matchBlocksSelect(select: BlocksSelect, opts: {
16
23
  relFile: string;
17
24
  blockName?: string;
18
25
  }): boolean;
19
- export declare function filterByBlocksSelect<T extends {
20
- file: string;
21
- block?: string;
22
- }>(items: T[], select: BlocksSelect | undefined, projectDir: string): T[];
@@ -5,7 +5,6 @@
5
5
  * - has `*`/`**` -> glob on relative file path (POSIX-ish)
6
6
  * - otherwise -> bare token (flow export / checkpoint / block name) — caller decides
7
7
  */
8
- import { relative } from "node:path";
9
8
  /** True when the token is file-select (glob/regex), not a bare flow/checkpoint name. */
10
9
  export function isFileSelectToken(token) {
11
10
  if (!token)
@@ -70,16 +69,3 @@ export function matchBlocksSelect(select, opts) {
70
69
  return true;
71
70
  return false;
72
71
  }
73
- export function filterByBlocksSelect(items, select, projectDir) {
74
- if (!select)
75
- return items;
76
- return items.filter((it) => {
77
- const relFile = it.file.startsWith(projectDir)
78
- ? relative(projectDir, it.file)
79
- : it.file;
80
- return matchBlocksSelect(select, {
81
- relFile: relFile.replace(/\\/g, "/"),
82
- ...(it.block !== undefined ? { blockName: it.block } : {}),
83
- });
84
- });
85
- }
@@ -0,0 +1,27 @@
1
+ import type { Browser, BrowserContext, BrowserContextOptions, BrowserType, LaunchOptions } from "@playwright/test";
2
+ /**
3
+ * CHROME_PATH / CHROMIUM_PATH, if set and the file exists. A stale path (browser uninstalled)
4
+ * falls back to Playwright's bundled Chromium with a one-time warning instead of failing the run.
5
+ */
6
+ export declare function chromiumExecutablePath(): string | undefined;
7
+ /** Unpacked extension directories, as resolved by `resolveExtensions` - also what `WAYGRAPH_EXTENSIONS` carries to child processes. */
8
+ export declare function extensionPathsFromEnv(): string[];
9
+ export interface LaunchedContext {
10
+ /** Null for a persistent (extension) context. */
11
+ browser: Browser | null;
12
+ context: BrowserContext;
13
+ /** Closes the context and the browser (and the throwaway profile when extensions are loaded). */
14
+ close(): Promise<void>;
15
+ }
16
+ /**
17
+ * Launches a browser and its first context. With `extensions` it uses a persistent context, the only
18
+ * way Chromium loads extensions: new headless (`channel: "chromium"`; the default headless shell
19
+ * ignores them) and Playwright's own Chromium (branded Chrome 137+ ignores `--load-extension`).
20
+ * Extensions are not active in extra contexts made with `browser.newContext()`.
21
+ */
22
+ export declare function launchContext(opts: {
23
+ launcher: BrowserType;
24
+ launch: LaunchOptions;
25
+ context?: BrowserContextOptions;
26
+ extensions?: readonly string[];
27
+ }): Promise<LaunchedContext>;
@@ -0,0 +1,62 @@
1
+ import { existsSync, mkdtempSync, readFileSync, rmSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+ let warned = false;
5
+ /**
6
+ * CHROME_PATH / CHROMIUM_PATH, if set and the file exists. A stale path (browser uninstalled)
7
+ * falls back to Playwright's bundled Chromium with a one-time warning instead of failing the run.
8
+ */
9
+ export function chromiumExecutablePath() {
10
+ const path = process.env.CHROME_PATH || process.env.CHROMIUM_PATH;
11
+ if (!path)
12
+ return undefined;
13
+ if (existsSync(path))
14
+ return path;
15
+ if (!warned) {
16
+ warned = true;
17
+ console.error(`waygraph: CHROME_PATH/CHROMIUM_PATH "${path}" does not exist - using Playwright's bundled Chromium`);
18
+ }
19
+ return undefined;
20
+ }
21
+ /** Unpacked extension directories, as resolved by `resolveExtensions` - also what `WAYGRAPH_EXTENSIONS` carries to child processes. */
22
+ export function extensionPathsFromEnv() {
23
+ return (process.env.WAYGRAPH_EXTENSIONS ?? "").split(",").filter(Boolean);
24
+ }
25
+ /**
26
+ * Launches a browser and its first context. With `extensions` it uses a persistent context, the only
27
+ * way Chromium loads extensions: new headless (`channel: "chromium"`; the default headless shell
28
+ * ignores them) and Playwright's own Chromium (branded Chrome 137+ ignores `--load-extension`).
29
+ * Extensions are not active in extra contexts made with `browser.newContext()`.
30
+ */
31
+ export async function launchContext(opts) {
32
+ const extensions = opts.extensions ?? [];
33
+ if (extensions.length === 0) {
34
+ const browser = await opts.launcher.launch(opts.launch);
35
+ const context = await browser.newContext(opts.context);
36
+ return { browser, context, close: () => browser.close() };
37
+ }
38
+ if (opts.launcher.name() !== "chromium")
39
+ throw new Error("waygraph: extensions only work in Chromium");
40
+ const list = extensions.join(",");
41
+ const { executablePath: _ignored, ...launch } = opts.launch;
42
+ const profile = mkdtempSync(join(tmpdir(), "waygraph-profile-"));
43
+ const context = await opts.launcher.launchPersistentContext(profile, {
44
+ ...launch,
45
+ ...opts.context,
46
+ ...(launch.headless === false ? {} : { channel: "chromium" }),
47
+ args: [...(launch.args ?? []), `--disable-extensions-except=${list}`, `--load-extension=${list}`],
48
+ });
49
+ // An extension's background worker registers its page hooks, so wait for it before the first navigation.
50
+ const hasWorker = extensions.some((dir) => JSON.parse(readFileSync(join(dir, "manifest.json"), "utf-8")).background?.service_worker !== undefined);
51
+ if (hasWorker && context.serviceWorkers().length === 0) {
52
+ await context.waitForEvent("serviceworker", { timeout: 10_000 }).catch(() => undefined);
53
+ }
54
+ return {
55
+ browser: context.browser(),
56
+ context,
57
+ close: async () => {
58
+ await context.close();
59
+ rmSync(profile, { recursive: true, force: true });
60
+ },
61
+ };
62
+ }
@@ -1,4 +1,5 @@
1
1
  // Split out of the former 8,700-line cli.ts (see src/ARCHITECTURE.md). Behavior unchanged.
2
+ import { configuredExtensions } from "../config.js";
2
3
  import { expandSpecFlowFiles, resolveBaseUrl } from "./flags.js";
3
4
  import { join } from "node:path";
4
5
  import { rmSync, writeFileSync } from "node:fs";
@@ -45,10 +46,14 @@ export async function runChain(projectDir, spec) {
45
46
  if (resolved)
46
47
  process.env.WAYGRAPH_BASE_URL = resolved;
47
48
  }
49
+ const extensions = await configuredExtensions(projectDir);
50
+ if (extensions.length > 0)
51
+ process.env.WAYGRAPH_EXTENSIONS = extensions.join(",");
48
52
  const tsxEsm = import.meta.resolve("tsx/esm");
49
53
  const scriptPath = join(projectDir, `.waygraph-chain-${process.pid}.mjs`);
50
54
  writeFileSync(scriptPath, CHAIN_RUNNER_BOOTSTRAP);
51
55
  try {
56
+ // webServer is started inside the child (runner/main.js), never here - see CHAIN_RUNNER_BOOTSTRAP.
52
57
  const code = await new Promise((res, rej) => {
53
58
  const child = spawn(process.execPath, ["--import", tsxEsm, scriptPath, projectDir, expanded], {
54
59
  stdio: "inherit",
package/dist/cli/usage.js CHANGED
@@ -156,7 +156,9 @@ Primary (less is more):
156
156
  --ff-disabled Dispute: expand FF (alias --no-ff); blitz kept on those inners
157
157
  --auto-play-video Unattended + recorded: --auto-next + --video (+ step); headless
158
158
  --auto-play-video-head Same, but keep the browser visible (--non-headless)
159
- --video [dir] Record .webm (demo: headless unless --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
160
162
  --video-viewport WxH Recording size (default demo: 1920x1080)
161
163
  --title / --base-url
162
164
  waygraph run [--blocks <flow|file|spec>] Execute (no overlay unless --step)
@@ -184,6 +186,17 @@ Primary (less is more):
184
186
  has a trace - test report opens it.
185
187
 
186
188
  Also:
189
+ --env <mode> (any command) load .env.<mode> / .env.<mode>.local on top of .env, e.g.
190
+ waygraph test --env staging (default: NODE_ENV, else development)
191
+ waygraph upgrade [project] [paths...] [--apply] [--overwrite] [--diff]
192
+ Compare a project with the scaffold in this waygraph:
193
+ lists new and differing files and a stale waygraph
194
+ dependency. Dry run unless --apply; only the paths you
195
+ name are copied, differing files only with --overwrite.
196
+ waygraph extensions install [project] [--update]
197
+ Download the browser extensions listed in
198
+ waygraph.config.* (extensions: ["hoppscotch"]) into
199
+ the user cache; runs also fetch them on first use.
187
200
  waygraph list | nav | validate | check | typecheck | graph | init <name>
188
201
  check/typecheck --no-practices Skip bad-practice warnings
189
202
  waygraph map [project] Waygraph Map convention enforcement: every static
package/dist/cli.js CHANGED
@@ -15,6 +15,7 @@
15
15
  * "project" defaults to cwd. Flags beat WAYGRAPH_* env.
16
16
  */
17
17
  import { SKILL_FLAG_MAP, printSkillIndex, readSkillMarkdown } from "./commands/agent-dive-scaffold.js";
18
+ import { takeEnvFlag } from "./env-file.js";
18
19
  import { usage } from "./cli/usage.js";
19
20
  import { listCase, navCase } from "./commands/list.js";
20
21
  import { checkCase, typecheckCase, validateCase } from "./commands/check.js";
@@ -25,8 +26,10 @@ import { traverseCase } from "./commands/traverse.js";
25
26
  import { agentDiveCase } from "./commands/agent-dive.js";
26
27
  import { autoServeCase, sessionCase } from "./commands/session.js";
27
28
  import { tryCase } from "./commands/try.js";
29
+ import { upgradeCase } from "./commands/upgrade.js";
30
+ import { extensionsCase } from "./commands/extensions.js";
28
31
  import { mapCase } from "./commands/map.js";
29
- const args = process.argv.slice(2);
32
+ const args = takeEnvFlag(process.argv.slice(2));
30
33
  const command = args[0];
31
34
  async function main() {
32
35
  if (!command || command === "--help" || command === "-h") {
@@ -97,6 +100,12 @@ async function main() {
97
100
  case "map":
98
101
  await mapCase(args);
99
102
  break;
103
+ case "upgrade":
104
+ await upgradeCase(args);
105
+ break;
106
+ case "extensions":
107
+ await extensionsCase(args);
108
+ break;
100
109
  default:
101
110
  console.error(`waygraph: unknown command "${command}"`);
102
111
  process.exit(1);
@@ -28,6 +28,11 @@ export declare const SKILL_FLAG_MAP: {
28
28
  export type SkillFlag = keyof typeof SKILL_FLAG_MAP;
29
29
  /** Raw skill markdown (frontmatter + body), as shipped in the package. */
30
30
  export declare function readSkillMarkdown(stem: string): string;
31
+ /** Every packaged skill as `.agents/skills/<name>/SKILL.md` (relative path + markdown), the cross-agent skills folder. */
32
+ export declare function agentSkillFiles(): {
33
+ rel: string;
34
+ text: string;
35
+ }[];
31
36
  /** Print `--skill` index (available flags + one-line descriptions). */
32
37
  export declare function printSkillIndex(): void;
33
38
  export interface AgentDiveOptions {
@@ -100,6 +100,13 @@ export function readSkillMarkdown(stem) {
100
100
  const raw = readFileSync(path, "utf-8");
101
101
  return raw.endsWith("\n") ? raw : raw + "\n";
102
102
  }
103
+ /** Every packaged skill as `.agents/skills/<name>/SKILL.md` (relative path + markdown), the cross-agent skills folder. */
104
+ export function agentSkillFiles() {
105
+ return Object.values(SKILL_FLAG_MAP).map((stem) => ({
106
+ rel: join(".agents", "skills", stem, "SKILL.md"),
107
+ text: readSkillMarkdown(stem),
108
+ }));
109
+ }
103
110
  /** Print `--skill` index (available flags + one-line descriptions). */
104
111
  export function printSkillIndex() {
105
112
  const skills = loadSkillSpecs();
@@ -0,0 +1 @@
1
+ export declare function extensionsCase(args: string[]): Promise<void>;
@@ -0,0 +1,22 @@
1
+ import { resolve } from "node:path";
2
+ import { loadWaygraphConfig } from "../config.js";
3
+ import { extensionInfo, resolveExtension } from "../extensions.js";
4
+ export async function extensionsCase(args) {
5
+ const update = args.includes("--update");
6
+ const rest = args.slice(2).filter((a) => a !== "--update");
7
+ if (args[1] !== "install") {
8
+ console.error("usage: waygraph extensions install [project] [--update]");
9
+ process.exit(1);
10
+ }
11
+ const proj = resolve(rest[0] ?? process.cwd());
12
+ const specs = (await loadWaygraphConfig(proj))?.extensions ?? [];
13
+ if (specs.length === 0) {
14
+ console.log("waygraph extensions: no `extensions` in waygraph.config.* - nothing to install");
15
+ return;
16
+ }
17
+ for (const spec of specs) {
18
+ const dir = await resolveExtension(spec, proj, { update });
19
+ const { name, version } = extensionInfo(dir);
20
+ console.log(`waygraph extensions: ${name} ${version} -> ${dir}`);
21
+ }
22
+ }
@@ -1,7 +1,34 @@
1
1
  // Split out of the former 8,700-line cli.ts (see src/ARCHITECTURE.md). Behavior unchanged.
2
2
  import { packageRoot } from "../cli/util.js";
3
- import { basename, join, relative, resolve } from "node:path";
3
+ import { agentSkillFiles } from "./agent-dive-scaffold.js";
4
+ import { basename, dirname, join, relative, resolve, sep } from "node:path";
5
+ import { spawnSync } from "node:child_process";
4
6
  import { cpSync, existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from "node:fs";
7
+ import { pathToFileURL } from "node:url";
8
+ /**
9
+ * Running from a checkout (not an installed package), npm doesn't have this build's code, so a plain `^version` would install an
10
+ * older waygraph and break the scaffold's types. Pack this checkout into the project and depend on that file instead.
11
+ */
12
+ function packLocalBuild(targetDir) {
13
+ const root = packageRoot();
14
+ if (root.split(sep).includes("node_modules"))
15
+ return undefined;
16
+ const dir = join(targetDir, ".waygraph-local");
17
+ mkdirSync(dir, { recursive: true });
18
+ const packed = spawnSync("npm", ["pack", "--pack-destination", dir, "--silent"], {
19
+ cwd: root,
20
+ encoding: "utf-8",
21
+ shell: process.platform === "win32",
22
+ });
23
+ const file = packed.stdout?.trim().split("\n").pop();
24
+ if (packed.status !== 0 || !file) {
25
+ console.error("waygraph init: could not pack this checkout; the project will depend on the published waygraph");
26
+ rmSync(dir, { recursive: true, force: true });
27
+ return undefined;
28
+ }
29
+ writeFileSync(join(targetDir, ".gitignore"), readFileSync(join(targetDir, ".gitignore"), "utf-8") + ".waygraph-local/\n");
30
+ return `file:.waygraph-local/${file}`;
31
+ }
5
32
  function initCommand(projectName) {
6
33
  if (!projectName) {
7
34
  console.error("waygraph init: missing <project-name>, e.g. waygraph init my-app");
@@ -30,8 +57,23 @@ function initCommand(projectName) {
30
57
  writeFileSync(join(targetDir, ".gitignore"), readFileSync(gitignoreSrc, "utf-8"));
31
58
  rmSync(gitignoreSrc);
32
59
  }
60
+ // Demo pages open via file://; the absolute path is only known once copied, so it's filled in here.
61
+ const appBaseUrl = pathToFileURL(join(targetDir, "src", "map", "(app_base)", "index.html")).href;
33
62
  const packageJsonPath = join(targetDir, "package.json");
34
- writeFileSync(packageJsonPath, readFileSync(packageJsonPath, "utf-8").replaceAll("__PROJECT_NAME__", pkgName));
63
+ const pkg = JSON.parse(readFileSync(packageJsonPath, "utf-8").replaceAll("__PROJECT_NAME__", pkgName));
64
+ // Pin the project to the waygraph that created it - a stale range here installs an old engine.
65
+ const ownVersion = JSON.parse(readFileSync(join(packageRoot(), "package.json"), "utf-8")).version;
66
+ const local = packLocalBuild(targetDir);
67
+ pkg.dependencies.waygraph = local ?? `^${ownVersion}`;
68
+ if (local)
69
+ console.log(`(running from a waygraph checkout: depending on its local build, ${local})`);
70
+ writeFileSync(packageJsonPath, JSON.stringify(pkg, null, 2) + "\n");
71
+ const configPath = join(targetDir, "config", "waygraph.config.ts");
72
+ writeFileSync(configPath, readFileSync(configPath, "utf-8").replaceAll("__APP_BASE_URL__", appBaseUrl));
73
+ for (const { rel, text } of agentSkillFiles()) {
74
+ mkdirSync(dirname(join(targetDir, rel)), { recursive: true });
75
+ writeFileSync(join(targetDir, rel), text);
76
+ }
35
77
  console.log(`Scaffolded ${pkgName}/`);
36
78
  console.log("");
37
79
  console.log(` cd ${relative(process.cwd(), targetDir) || pkgName}`);
@@ -45,6 +87,7 @@ function initCommand(projectName) {
45
87
  console.log(" waygraph auto --cli # same menus in the terminal");
46
88
  console.log(" waygraph demo --blocks exampleFlow");
47
89
  console.log(" waygraph graph # static state graph JSON");
90
+ console.log(" .agents/skills/ # waygraph skills for coding agents (waygraph agent-dive adds agent personas)");
48
91
  console.log("");
49
92
  console.log(" Layout: see STRUCTURE.md (or https://deviate-dv8.github.io/waygraph/scaffold.html)");
50
93
  }
@@ -1,7 +1,9 @@
1
1
  // Split out of the former 8,700-line cli.ts (see src/ARCHITECTURE.md). Behavior unchanged.
2
+ import { configuredExtensions } from "../config.js";
2
3
  import { runInherited } from "../cli/util.js";
3
4
  import { join } from "node:path";
4
5
  import { existsSync } from "node:fs";
6
+ import { packageRoot } from "../cli/util.js";
5
7
  export async function testCase(args) {
6
8
  const rest = args.slice(1);
7
9
  const proj = process.cwd();
@@ -23,11 +25,23 @@ export async function testCase(args) {
23
25
  process.exitCode = await runPw(["show-trace", ...rest.slice(1)]);
24
26
  return;
25
27
  }
28
+ const extensions = await configuredExtensions(proj);
29
+ if (extensions.length > 0)
30
+ process.env.WAYGRAPH_EXTENSIONS = extensions.join(",");
31
+ // No playwright.config in the project: waygraph builds one from config/waygraph.config.ts.
32
+ const hasOwnConfig = ["ts", "mts", "js", "mjs", "cjs"].some((e) => existsSync(join(proj, `playwright.config.${e}`)));
33
+ if (hasOwnConfig) {
34
+ console.error("waygraph: playwright.config is deprecated - move its settings into config/waygraph.config.ts");
35
+ }
36
+ else {
37
+ process.env.WAYGRAPH_PROJECT_DIR = proj;
38
+ }
39
+ const configArgs = hasOwnConfig ? [] : ["-c", join(packageRoot(), "dist", "playwright.config.js")];
26
40
  const wantsUi = rest[0] === "ui" || rest.includes("--ui");
27
41
  const forwarded = rest[0] === "ui" ? rest.slice(1) : rest;
28
42
  const pwArgs = wantsUi && !forwarded.includes("--ui")
29
- ? ["test", "--ui", ...forwarded]
30
- : ["test", ...forwarded];
43
+ ? ["test", ...configArgs, "--ui", ...forwarded]
44
+ : ["test", ...configArgs, ...forwarded];
31
45
  process.exitCode = await runPw(pwArgs);
32
46
  return;
33
47
  }
@@ -6,6 +6,7 @@ import { packageRoot, runInherited } from "../cli/util.js";
6
6
  import { tmpdir } from "node:os";
7
7
  import { runChain } from "../cli/run-chain.js";
8
8
  import { applyRunFlags, parseRunFlags } from "../cli/flags.js";
9
+ import { resolveVideoDir } from "../video-dir.js";
9
10
  /**
10
11
  * Runs a throwaway probe script rooted at `projectDir` - the exact same
11
12
  * directory the real demo files get copied into, so it resolves "waygraph"
@@ -196,7 +197,7 @@ async function runTryDemo() {
196
197
  const videoTo = process.env.WAYGRAPH_VIDEO;
197
198
  console.log(videoTo
198
199
  ? "waygraph try demo: step-through + record (Sign In -> Shop & Checkout -> blocked Viewer login) - click Next; video -> " +
199
- (videoTo === "1" ? ".waygraph-videos/" : videoTo)
200
+ (videoTo === "1" ? await resolveVideoDir(destDir) : videoTo)
200
201
  : "waygraph try demo: step-through (Sign In -> Shop & Checkout -> blocked Viewer login) - click Next for each step ...");
201
202
  await runChain(destDir, TRY_DEMO_CHAIN);
202
203
  if (process.exitCode)
@@ -0,0 +1,6 @@
1
+ /**
2
+ * `waygraph upgrade [project] [paths...] [--apply] [--overwrite] [--diff]`
3
+ * Compares the project with the scaffold shipped in this waygraph. Dry run by default.
4
+ * Only the paths you name are copied, because a real project deliberately drops parts of the demo.
5
+ */
6
+ export declare function upgradeCase(args: string[]): Promise<void>;