waygraph 0.15.49 → 0.15.51

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 (466) hide show
  1. package/dist/analysis/map-check.js +5 -2
  2. package/dist/analysis/practices-check.js +17 -4
  3. package/dist/auto-session/session.js +3 -2
  4. package/dist/browser-path.d.ts +5 -0
  5. package/dist/browser-path.js +18 -0
  6. package/dist/cli/flags.d.ts +7 -5
  7. package/dist/cli/flags.js +9 -32
  8. package/dist/cli/run-chain.js +2 -1
  9. package/dist/commands/check.js +1 -1
  10. package/dist/commands/init.js +5 -0
  11. package/dist/commands/run.js +4 -4
  12. package/dist/commands/session.js +7 -7
  13. package/dist/config.d.ts +34 -0
  14. package/dist/config.js +94 -0
  15. package/dist/core/blocks/effect.d.ts +0 -3
  16. package/dist/core/blocks/method.d.ts +0 -6
  17. package/dist/core/blocks/nav.d.ts +0 -3
  18. package/dist/core/blocks/page.d.ts +0 -3
  19. package/dist/core/flow.js +3 -6
  20. package/dist/env-file.d.ts +10 -0
  21. package/dist/env-file.js +58 -0
  22. package/dist/highlights/types.d.ts +9 -8
  23. package/dist/index.d.ts +5 -0
  24. package/dist/index.js +3 -0
  25. package/dist/runner/inpage/banner.js +10 -2
  26. package/dist/runner/inpage/caption.js +2 -2
  27. package/dist/runner/main.js +10 -6
  28. package/dist/session/auto-explore-run.d.ts +4 -1
  29. package/dist/session/auto-explore-run.js +18 -28
  30. package/dist/traverse/run.js +4 -22
  31. package/dist/types.d.ts +0 -3
  32. package/dist/webserver.d.ts +14 -0
  33. package/dist/webserver.js +91 -0
  34. package/examples/routed-demo/package.json +3 -3
  35. package/examples/routed-demo/playwright.config.ts +8 -8
  36. package/examples/routed-demo/scripts/fixture-server.mjs +12 -31
  37. package/examples/routed-demo/src/map/(app_base)/dashboard/_sel.ts +1 -3
  38. package/examples/routed-demo/src/map/(external)/docs/_sel.ts +1 -3
  39. package/examples/routed-demo/src/pages/dashboard.html +1 -1
  40. package/examples/routed-demo/src/pages/docs.html +1 -1
  41. package/examples/saucedemo/playwright.config.ts +2 -3
  42. package/examples/saucedemo/scripts/prove-add-to-cart-menu.mjs +2 -1
  43. package/examples/saucedemo/scripts/prove-auto-graph.mjs +2 -1
  44. package/examples/saucedemo/scripts/prove-wrong-login-runtime.mjs +2 -1
  45. package/examples/saucedemo/tests/flow-block-verify.spec.ts +2 -7
  46. package/package.json +10 -2
  47. package/templates/quickstart/playwright.config.ts +0 -6
  48. package/templates/scaffold/README.md +5 -3
  49. package/templates/scaffold/STRUCTURE.md +3 -4
  50. package/templates/scaffold/package.json +8 -12
  51. package/templates/scaffold/playwright.config.ts +2 -18
  52. package/templates/scaffold/src/flows/shop.flow.ts +42 -27
  53. package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +1 -1
  54. package/templates/scaffold/src/map/(app_base)/docs/_sel.ts +2 -3
  55. package/templates/scaffold/src/map/(app_base)/docs/{docs.html → index.html} +1 -1
  56. package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +12 -13
  57. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +19 -22
  58. package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +7 -8
  59. package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +4 -8
  60. package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +10 -10
  61. package/templates/scaffold/src/map/(app_base)/home/_sel.ts +2 -4
  62. package/templates/scaffold/src/map/(app_base)/index.html +17 -0
  63. package/templates/scaffold/src/states/demo.states.ts +2 -0
  64. package/templates/scaffold/tests/README.md +3 -2
  65. package/templates/scaffold/tsconfig.json +1 -1
  66. package/templates/skills/waygraph-convention.skill.md +5 -3
  67. package/templates/skills/waygraph-pilot.skill.md +1 -1
  68. package/examples/routed-demo/.waygraph-auto/4d4902b7.log +0 -0
  69. package/examples/routed-demo/.waygraph-auto/51ef462e.log +0 -0
  70. package/examples/routed-demo/.waygraph-auto/71527ad9.log +0 -0
  71. package/examples/routed-demo/.waygraph-auto/ca16778e.log +0 -0
  72. package/examples/routed-demo/scripts/with-fixture.mjs +0 -70
  73. package/examples/saucedemo/.waygraph-auto/00b0c55c.log +0 -22
  74. package/examples/saucedemo/.waygraph-auto/00d147d1.log +0 -21
  75. package/examples/saucedemo/.waygraph-auto/00e5d037.log +0 -5
  76. package/examples/saucedemo/.waygraph-auto/015be8f6.log +0 -6
  77. package/examples/saucedemo/.waygraph-auto/026e188e.log +0 -0
  78. package/examples/saucedemo/.waygraph-auto/02f7dd22.log +0 -20
  79. package/examples/saucedemo/.waygraph-auto/03df352d.log +0 -0
  80. package/examples/saucedemo/.waygraph-auto/0402cfcf.log +0 -6
  81. package/examples/saucedemo/.waygraph-auto/050e5b55.log +0 -0
  82. package/examples/saucedemo/.waygraph-auto/05d76fc3.log +0 -0
  83. package/examples/saucedemo/.waygraph-auto/062b581f.log +0 -20
  84. package/examples/saucedemo/.waygraph-auto/0681582b.log +0 -6
  85. package/examples/saucedemo/.waygraph-auto/07845ed1.log +0 -0
  86. package/examples/saucedemo/.waygraph-auto/07f3e964.log +0 -6
  87. package/examples/saucedemo/.waygraph-auto/0868ae4d.log +0 -0
  88. package/examples/saucedemo/.waygraph-auto/0924ddaa.log +0 -22
  89. package/examples/saucedemo/.waygraph-auto/092d6173.log +0 -5
  90. package/examples/saucedemo/.waygraph-auto/096fea05.log +0 -20
  91. package/examples/saucedemo/.waygraph-auto/09924510.log +0 -0
  92. package/examples/saucedemo/.waygraph-auto/0998c941.log +0 -21
  93. package/examples/saucedemo/.waygraph-auto/0a8c3719.log +0 -0
  94. package/examples/saucedemo/.waygraph-auto/0bf74300.log +0 -21
  95. package/examples/saucedemo/.waygraph-auto/0c01fd29.log +0 -4
  96. package/examples/saucedemo/.waygraph-auto/0c19e232.log +0 -5
  97. package/examples/saucedemo/.waygraph-auto/0c302590.log +0 -0
  98. package/examples/saucedemo/.waygraph-auto/0dee62d6.log +0 -5
  99. package/examples/saucedemo/.waygraph-auto/0eb4c081.log +0 -5
  100. package/examples/saucedemo/.waygraph-auto/0f0cb120.log +0 -0
  101. package/examples/saucedemo/.waygraph-auto/102c38ca.log +0 -0
  102. package/examples/saucedemo/.waygraph-auto/10fd431c.log +0 -0
  103. package/examples/saucedemo/.waygraph-auto/1122c13c.log +0 -0
  104. package/examples/saucedemo/.waygraph-auto/123d1cad.log +0 -5
  105. package/examples/saucedemo/.waygraph-auto/12ed8e28.log +0 -0
  106. package/examples/saucedemo/.waygraph-auto/13c6fe3c.log +0 -0
  107. package/examples/saucedemo/.waygraph-auto/1581b677.log +0 -0
  108. package/examples/saucedemo/.waygraph-auto/164761a5.log +0 -6
  109. package/examples/saucedemo/.waygraph-auto/1905ceb2.log +0 -0
  110. package/examples/saucedemo/.waygraph-auto/1b1d55c6.log +0 -0
  111. package/examples/saucedemo/.waygraph-auto/1b80fd24.log +0 -6
  112. package/examples/saucedemo/.waygraph-auto/1bd7b7bf.log +0 -0
  113. package/examples/saucedemo/.waygraph-auto/1c30a3c2.log +0 -0
  114. package/examples/saucedemo/.waygraph-auto/1c58a174.log +0 -0
  115. package/examples/saucedemo/.waygraph-auto/1cb6f44c.log +0 -5
  116. package/examples/saucedemo/.waygraph-auto/1d90aa9a.log +0 -0
  117. package/examples/saucedemo/.waygraph-auto/1de7d889.log +0 -0
  118. package/examples/saucedemo/.waygraph-auto/1f233a4c.log +0 -6
  119. package/examples/saucedemo/.waygraph-auto/1fdb2100.log +0 -0
  120. package/examples/saucedemo/.waygraph-auto/20e66801.log +0 -0
  121. package/examples/saucedemo/.waygraph-auto/20e91af6.log +0 -5
  122. package/examples/saucedemo/.waygraph-auto/20ffdb77.log +0 -0
  123. package/examples/saucedemo/.waygraph-auto/222d1d09.log +0 -0
  124. package/examples/saucedemo/.waygraph-auto/22f1a704.log +0 -5
  125. package/examples/saucedemo/.waygraph-auto/2324269a.log +0 -0
  126. package/examples/saucedemo/.waygraph-auto/232a1d81.log +0 -0
  127. package/examples/saucedemo/.waygraph-auto/239cced3.log +0 -20
  128. package/examples/saucedemo/.waygraph-auto/25204b46.log +0 -4
  129. package/examples/saucedemo/.waygraph-auto/2553d107.log +0 -0
  130. package/examples/saucedemo/.waygraph-auto/25e2e90f.log +0 -0
  131. package/examples/saucedemo/.waygraph-auto/2708455e.log +0 -22
  132. package/examples/saucedemo/.waygraph-auto/272a96fd.log +0 -20
  133. package/examples/saucedemo/.waygraph-auto/28d7be5d.log +0 -0
  134. package/examples/saucedemo/.waygraph-auto/2a577961.log +0 -0
  135. package/examples/saucedemo/.waygraph-auto/2a6a8266.log +0 -6
  136. package/examples/saucedemo/.waygraph-auto/2b3401cf.log +0 -20
  137. package/examples/saucedemo/.waygraph-auto/2b831907.log +0 -6
  138. package/examples/saucedemo/.waygraph-auto/2b9b56fc.log +0 -20
  139. package/examples/saucedemo/.waygraph-auto/2c79c73a.log +0 -0
  140. package/examples/saucedemo/.waygraph-auto/2c94a05b.log +0 -0
  141. package/examples/saucedemo/.waygraph-auto/2ceccd6d.log +0 -0
  142. package/examples/saucedemo/.waygraph-auto/2e2069e7.log +0 -0
  143. package/examples/saucedemo/.waygraph-auto/2e6bc35e.log +0 -6
  144. package/examples/saucedemo/.waygraph-auto/2efd1983.log +0 -0
  145. package/examples/saucedemo/.waygraph-auto/2f1b0c13.log +0 -6
  146. package/examples/saucedemo/.waygraph-auto/2f4f531e.log +0 -0
  147. package/examples/saucedemo/.waygraph-auto/2f8d4073.log +0 -6
  148. package/examples/saucedemo/.waygraph-auto/2fdbd916.log +0 -0
  149. package/examples/saucedemo/.waygraph-auto/30739278.log +0 -6
  150. package/examples/saucedemo/.waygraph-auto/30a5c848.log +0 -20
  151. package/examples/saucedemo/.waygraph-auto/31cb2e80.log +0 -0
  152. package/examples/saucedemo/.waygraph-auto/322d63cd.log +0 -0
  153. package/examples/saucedemo/.waygraph-auto/3239aa8a.log +0 -6
  154. package/examples/saucedemo/.waygraph-auto/326d87b7.log +0 -6
  155. package/examples/saucedemo/.waygraph-auto/331c6e8e.log +0 -0
  156. package/examples/saucedemo/.waygraph-auto/3351c0b6.log +0 -0
  157. package/examples/saucedemo/.waygraph-auto/33a50dc0.log +0 -0
  158. package/examples/saucedemo/.waygraph-auto/33df0770.log +0 -0
  159. package/examples/saucedemo/.waygraph-auto/340d624d.log +0 -0
  160. package/examples/saucedemo/.waygraph-auto/36367ccf.log +0 -0
  161. package/examples/saucedemo/.waygraph-auto/372536a5.log +0 -6
  162. package/examples/saucedemo/.waygraph-auto/37b56184.log +0 -0
  163. package/examples/saucedemo/.waygraph-auto/38f6799d.log +0 -0
  164. package/examples/saucedemo/.waygraph-auto/3a208bb8.log +0 -20
  165. package/examples/saucedemo/.waygraph-auto/3a412f3c.log +0 -0
  166. package/examples/saucedemo/.waygraph-auto/3a859bd7.log +0 -0
  167. package/examples/saucedemo/.waygraph-auto/3a8674d5.log +0 -6
  168. package/examples/saucedemo/.waygraph-auto/3bdb2f5a.log +0 -0
  169. package/examples/saucedemo/.waygraph-auto/3c1e5fe0.log +0 -22
  170. package/examples/saucedemo/.waygraph-auto/3cb0add7.log +0 -0
  171. package/examples/saucedemo/.waygraph-auto/3e3c0f3b.log +0 -0
  172. package/examples/saucedemo/.waygraph-auto/3e42f0d8.log +0 -0
  173. package/examples/saucedemo/.waygraph-auto/3f088138.log +0 -0
  174. package/examples/saucedemo/.waygraph-auto/401177a3.log +0 -0
  175. package/examples/saucedemo/.waygraph-auto/413d934d.log +0 -0
  176. package/examples/saucedemo/.waygraph-auto/4144071d.log +0 -0
  177. package/examples/saucedemo/.waygraph-auto/4176a3c6.log +0 -0
  178. package/examples/saucedemo/.waygraph-auto/41d0793d.log +0 -4
  179. package/examples/saucedemo/.waygraph-auto/41e6feae.log +0 -0
  180. package/examples/saucedemo/.waygraph-auto/424b4d5d.log +0 -0
  181. package/examples/saucedemo/.waygraph-auto/42e014d1.log +0 -0
  182. package/examples/saucedemo/.waygraph-auto/43253aba.log +0 -0
  183. package/examples/saucedemo/.waygraph-auto/432d09e3.log +0 -22
  184. package/examples/saucedemo/.waygraph-auto/438c6c53.log +0 -22
  185. package/examples/saucedemo/.waygraph-auto/4477db12.log +0 -0
  186. package/examples/saucedemo/.waygraph-auto/47247959.log +0 -0
  187. package/examples/saucedemo/.waygraph-auto/476cff76.log +0 -0
  188. package/examples/saucedemo/.waygraph-auto/4a1258b7.log +0 -0
  189. package/examples/saucedemo/.waygraph-auto/4ad09ece.log +0 -0
  190. package/examples/saucedemo/.waygraph-auto/4adcd179.log +0 -20
  191. package/examples/saucedemo/.waygraph-auto/4c9d9b16.log +0 -21
  192. package/examples/saucedemo/.waygraph-auto/4cebc228.log +0 -20
  193. package/examples/saucedemo/.waygraph-auto/4da39c36.log +0 -6
  194. package/examples/saucedemo/.waygraph-auto/4dbefa7e.log +0 -5
  195. package/examples/saucedemo/.waygraph-auto/4efa7035.log +0 -6
  196. package/examples/saucedemo/.waygraph-auto/505affdc.log +0 -4
  197. package/examples/saucedemo/.waygraph-auto/51bcb60a.log +0 -0
  198. package/examples/saucedemo/.waygraph-auto/527b6d76.log +0 -0
  199. package/examples/saucedemo/.waygraph-auto/5291bc78.log +0 -22
  200. package/examples/saucedemo/.waygraph-auto/535e8922.log +0 -0
  201. package/examples/saucedemo/.waygraph-auto/54274c39.log +0 -5
  202. package/examples/saucedemo/.waygraph-auto/5440ce7e.log +0 -0
  203. package/examples/saucedemo/.waygraph-auto/5738175f.log +0 -22
  204. package/examples/saucedemo/.waygraph-auto/573abedd.log +0 -0
  205. package/examples/saucedemo/.waygraph-auto/57ce5643.log +0 -22
  206. package/examples/saucedemo/.waygraph-auto/5984426b.log +0 -6
  207. package/examples/saucedemo/.waygraph-auto/5a682e7c.log +0 -22
  208. package/examples/saucedemo/.waygraph-auto/5b79320c.log +0 -21
  209. package/examples/saucedemo/.waygraph-auto/5b838485.log +0 -0
  210. package/examples/saucedemo/.waygraph-auto/5c55aaac.log +0 -21
  211. package/examples/saucedemo/.waygraph-auto/5d13bdde.log +0 -0
  212. package/examples/saucedemo/.waygraph-auto/5ed00b16.log +0 -4
  213. package/examples/saucedemo/.waygraph-auto/60b9c066.log +0 -6
  214. package/examples/saucedemo/.waygraph-auto/610dd127.log +0 -0
  215. package/examples/saucedemo/.waygraph-auto/61105500.log +0 -5
  216. package/examples/saucedemo/.waygraph-auto/61333142.log +0 -5
  217. package/examples/saucedemo/.waygraph-auto/6134afe8.log +0 -20
  218. package/examples/saucedemo/.waygraph-auto/61937e83.log +0 -22
  219. package/examples/saucedemo/.waygraph-auto/625e7f65.log +0 -5
  220. package/examples/saucedemo/.waygraph-auto/62a0bdc9.log +0 -22
  221. package/examples/saucedemo/.waygraph-auto/6376fc15.log +0 -0
  222. package/examples/saucedemo/.waygraph-auto/63b0f4cd.log +0 -0
  223. package/examples/saucedemo/.waygraph-auto/6599cbca.log +0 -22
  224. package/examples/saucedemo/.waygraph-auto/6706ead4.log +0 -0
  225. package/examples/saucedemo/.waygraph-auto/67aaca30.log +0 -0
  226. package/examples/saucedemo/.waygraph-auto/685714af.log +0 -0
  227. package/examples/saucedemo/.waygraph-auto/68b10298.log +0 -0
  228. package/examples/saucedemo/.waygraph-auto/68be5e12.log +0 -0
  229. package/examples/saucedemo/.waygraph-auto/68df05a6.log +0 -22
  230. package/examples/saucedemo/.waygraph-auto/68fa0682.log +0 -0
  231. package/examples/saucedemo/.waygraph-auto/693f67c4.log +0 -20
  232. package/examples/saucedemo/.waygraph-auto/69ae030a.log +0 -6
  233. package/examples/saucedemo/.waygraph-auto/69e73f35.log +0 -6
  234. package/examples/saucedemo/.waygraph-auto/6b2333b0.log +0 -5
  235. package/examples/saucedemo/.waygraph-auto/6c4c3817.log +0 -0
  236. package/examples/saucedemo/.waygraph-auto/6c954911.log +0 -0
  237. package/examples/saucedemo/.waygraph-auto/6d65a439.log +0 -5
  238. package/examples/saucedemo/.waygraph-auto/6d700055.log +0 -0
  239. package/examples/saucedemo/.waygraph-auto/6ead848f.log +0 -0
  240. package/examples/saucedemo/.waygraph-auto/6f05bdc1.log +0 -0
  241. package/examples/saucedemo/.waygraph-auto/70279fc3.log +0 -0
  242. package/examples/saucedemo/.waygraph-auto/70c97639.log +0 -0
  243. package/examples/saucedemo/.waygraph-auto/72675b2d.log +0 -6
  244. package/examples/saucedemo/.waygraph-auto/731a14bd.log +0 -0
  245. package/examples/saucedemo/.waygraph-auto/733dd260.log +0 -5
  246. package/examples/saucedemo/.waygraph-auto/73a41843.log +0 -0
  247. package/examples/saucedemo/.waygraph-auto/75016486.log +0 -0
  248. package/examples/saucedemo/.waygraph-auto/752b01c6.log +0 -22
  249. package/examples/saucedemo/.waygraph-auto/75675227.log +0 -6
  250. package/examples/saucedemo/.waygraph-auto/756fd326.log +0 -20
  251. package/examples/saucedemo/.waygraph-auto/75e2e658.log +0 -0
  252. package/examples/saucedemo/.waygraph-auto/76128a2d.log +0 -0
  253. package/examples/saucedemo/.waygraph-auto/76ac1a86.log +0 -0
  254. package/examples/saucedemo/.waygraph-auto/77605295.log +0 -0
  255. package/examples/saucedemo/.waygraph-auto/7773a809.log +0 -0
  256. package/examples/saucedemo/.waygraph-auto/78043767.log +0 -20
  257. package/examples/saucedemo/.waygraph-auto/792671f4.log +0 -22
  258. package/examples/saucedemo/.waygraph-auto/796ab578.log +0 -0
  259. package/examples/saucedemo/.waygraph-auto/79915adb.log +0 -20
  260. package/examples/saucedemo/.waygraph-auto/7a398774.log +0 -6
  261. package/examples/saucedemo/.waygraph-auto/7a72f66e.log +0 -6
  262. package/examples/saucedemo/.waygraph-auto/7a984334.log +0 -4
  263. package/examples/saucedemo/.waygraph-auto/7b226350.log +0 -5
  264. package/examples/saucedemo/.waygraph-auto/7c6ee793.log +0 -20
  265. package/examples/saucedemo/.waygraph-auto/7c726dc4.log +0 -22
  266. package/examples/saucedemo/.waygraph-auto/7c72e8a5.log +0 -4
  267. package/examples/saucedemo/.waygraph-auto/7c99674f.log +0 -0
  268. package/examples/saucedemo/.waygraph-auto/7dbee625.log +0 -22
  269. package/examples/saucedemo/.waygraph-auto/7df66956.log +0 -0
  270. package/examples/saucedemo/.waygraph-auto/7e053160.log +0 -0
  271. package/examples/saucedemo/.waygraph-auto/7e8a6b62.log +0 -0
  272. package/examples/saucedemo/.waygraph-auto/7effd5b2.log +0 -20
  273. package/examples/saucedemo/.waygraph-auto/7f1b4864.log +0 -0
  274. package/examples/saucedemo/.waygraph-auto/7f94fd02.log +0 -0
  275. package/examples/saucedemo/.waygraph-auto/7fdd47ee.log +0 -2
  276. package/examples/saucedemo/.waygraph-auto/802a0b5b.log +0 -0
  277. package/examples/saucedemo/.waygraph-auto/80322e0b.log +0 -0
  278. package/examples/saucedemo/.waygraph-auto/80a4978e.log +0 -6
  279. package/examples/saucedemo/.waygraph-auto/81257bf0.log +0 -0
  280. package/examples/saucedemo/.waygraph-auto/81cfe480.log +0 -22
  281. package/examples/saucedemo/.waygraph-auto/832f5add.log +0 -0
  282. package/examples/saucedemo/.waygraph-auto/8337b6ad.log +0 -0
  283. package/examples/saucedemo/.waygraph-auto/8481aa1c.log +0 -0
  284. package/examples/saucedemo/.waygraph-auto/8493928e.log +0 -0
  285. package/examples/saucedemo/.waygraph-auto/849ed45d.log +0 -0
  286. package/examples/saucedemo/.waygraph-auto/853bde43.log +0 -0
  287. package/examples/saucedemo/.waygraph-auto/8598b4c0.log +0 -0
  288. package/examples/saucedemo/.waygraph-auto/859a261d.log +0 -0
  289. package/examples/saucedemo/.waygraph-auto/86350ea6.log +0 -22
  290. package/examples/saucedemo/.waygraph-auto/86bb598a.log +0 -0
  291. package/examples/saucedemo/.waygraph-auto/86d09876.log +0 -22
  292. package/examples/saucedemo/.waygraph-auto/878ad01b.log +0 -4
  293. package/examples/saucedemo/.waygraph-auto/87c88ba5.log +0 -0
  294. package/examples/saucedemo/.waygraph-auto/87cb80ff.log +0 -0
  295. package/examples/saucedemo/.waygraph-auto/880b2e78.log +0 -6
  296. package/examples/saucedemo/.waygraph-auto/88527936.log +0 -5
  297. package/examples/saucedemo/.waygraph-auto/893023ea.log +0 -5
  298. package/examples/saucedemo/.waygraph-auto/89416718.log +0 -0
  299. package/examples/saucedemo/.waygraph-auto/8996a857.log +0 -6
  300. package/examples/saucedemo/.waygraph-auto/8a64ba0f.log +0 -6
  301. package/examples/saucedemo/.waygraph-auto/8b1cc2aa.log +0 -6
  302. package/examples/saucedemo/.waygraph-auto/8b73d13e.log +0 -6
  303. package/examples/saucedemo/.waygraph-auto/8be93021.log +0 -0
  304. package/examples/saucedemo/.waygraph-auto/8d960d31.log +0 -1
  305. package/examples/saucedemo/.waygraph-auto/8d9e5cd2.log +0 -21
  306. package/examples/saucedemo/.waygraph-auto/8e12e34f.log +0 -22
  307. package/examples/saucedemo/.waygraph-auto/8ec7d260.log +0 -0
  308. package/examples/saucedemo/.waygraph-auto/8ed43279.log +0 -0
  309. package/examples/saucedemo/.waygraph-auto/93acae32.log +0 -5
  310. package/examples/saucedemo/.waygraph-auto/94221b2b.log +0 -0
  311. package/examples/saucedemo/.waygraph-auto/96321a08.log +0 -0
  312. package/examples/saucedemo/.waygraph-auto/9742b6c2.log +0 -6
  313. package/examples/saucedemo/.waygraph-auto/9761c4c4.log +0 -6
  314. package/examples/saucedemo/.waygraph-auto/976394cd.log +0 -20
  315. package/examples/saucedemo/.waygraph-auto/982138cf.log +0 -0
  316. package/examples/saucedemo/.waygraph-auto/99cc93eb.log +0 -6
  317. package/examples/saucedemo/.waygraph-auto/9a26134c.log +0 -20
  318. package/examples/saucedemo/.waygraph-auto/9cbfbedc.log +0 -0
  319. package/examples/saucedemo/.waygraph-auto/9d827954.log +0 -20
  320. package/examples/saucedemo/.waygraph-auto/9dc147d2.log +0 -22
  321. package/examples/saucedemo/.waygraph-auto/9dd78c5e.log +0 -0
  322. package/examples/saucedemo/.waygraph-auto/a1ab5d29.log +0 -0
  323. package/examples/saucedemo/.waygraph-auto/a215a395.log +0 -22
  324. package/examples/saucedemo/.waygraph-auto/a23b7086.log +0 -4
  325. package/examples/saucedemo/.waygraph-auto/a35bd5ec.log +0 -0
  326. package/examples/saucedemo/.waygraph-auto/a4b36275.log +0 -0
  327. package/examples/saucedemo/.waygraph-auto/a4f8d355.log +0 -20
  328. package/examples/saucedemo/.waygraph-auto/a68995e9.log +0 -22
  329. package/examples/saucedemo/.waygraph-auto/a6e4f936.log +0 -22
  330. package/examples/saucedemo/.waygraph-auto/a7da862b.log +0 -0
  331. package/examples/saucedemo/.waygraph-auto/a82e2a48.log +0 -0
  332. package/examples/saucedemo/.waygraph-auto/a8645294.log +0 -0
  333. package/examples/saucedemo/.waygraph-auto/a94738b7.log +0 -0
  334. package/examples/saucedemo/.waygraph-auto/a952eb91.log +0 -0
  335. package/examples/saucedemo/.waygraph-auto/a9559653.log +0 -5
  336. package/examples/saucedemo/.waygraph-auto/aa1beafb.log +0 -0
  337. package/examples/saucedemo/.waygraph-auto/aa226dd0.log +0 -22
  338. package/examples/saucedemo/.waygraph-auto/aa478de2.log +0 -0
  339. package/examples/saucedemo/.waygraph-auto/aa7323f8.log +0 -20
  340. package/examples/saucedemo/.waygraph-auto/aaae4fb0.log +0 -20
  341. package/examples/saucedemo/.waygraph-auto/ac350fc7.log +0 -20
  342. package/examples/saucedemo/.waygraph-auto/ac5dde3d.log +0 -0
  343. package/examples/saucedemo/.waygraph-auto/acc1b63a.log +0 -0
  344. package/examples/saucedemo/.waygraph-auto/ad0bfad9.log +0 -5
  345. package/examples/saucedemo/.waygraph-auto/ad12d191.log +0 -0
  346. package/examples/saucedemo/.waygraph-auto/ae3a9b06.log +0 -0
  347. package/examples/saucedemo/.waygraph-auto/af2fae12.log +0 -0
  348. package/examples/saucedemo/.waygraph-auto/b04638f4.log +0 -6
  349. package/examples/saucedemo/.waygraph-auto/b0752c49.log +0 -0
  350. package/examples/saucedemo/.waygraph-auto/b14811d7.log +0 -6
  351. package/examples/saucedemo/.waygraph-auto/b2d2dbb2.log +0 -22
  352. package/examples/saucedemo/.waygraph-auto/b3d172f3.log +0 -0
  353. package/examples/saucedemo/.waygraph-auto/b48863e5.log +0 -22
  354. package/examples/saucedemo/.waygraph-auto/b5569336.log +0 -0
  355. package/examples/saucedemo/.waygraph-auto/b56968e1.log +0 -6
  356. package/examples/saucedemo/.waygraph-auto/b57921c5.log +0 -0
  357. package/examples/saucedemo/.waygraph-auto/b64e0620.log +0 -20
  358. package/examples/saucedemo/.waygraph-auto/b75168f7.log +0 -1
  359. package/examples/saucedemo/.waygraph-auto/b86a6218.log +0 -6
  360. package/examples/saucedemo/.waygraph-auto/b8e9e956.log +0 -22
  361. package/examples/saucedemo/.waygraph-auto/b9ab0983.log +0 -0
  362. package/examples/saucedemo/.waygraph-auto/b9b310ff.log +0 -21
  363. package/examples/saucedemo/.waygraph-auto/bb0e0e46.log +0 -0
  364. package/examples/saucedemo/.waygraph-auto/bc111745.log +0 -22
  365. package/examples/saucedemo/.waygraph-auto/bf7a77a2.log +0 -0
  366. package/examples/saucedemo/.waygraph-auto/bf85a598.log +0 -0
  367. package/examples/saucedemo/.waygraph-auto/bf8693e7.log +0 -0
  368. package/examples/saucedemo/.waygraph-auto/c0d6f353.log +0 -21
  369. package/examples/saucedemo/.waygraph-auto/c0febcf2.log +0 -20
  370. package/examples/saucedemo/.waygraph-auto/c4c52998.log +0 -6
  371. package/examples/saucedemo/.waygraph-auto/c52bac6d.log +0 -0
  372. package/examples/saucedemo/.waygraph-auto/c60cc55e.log +0 -0
  373. package/examples/saucedemo/.waygraph-auto/c809ceb4.log +0 -22
  374. package/examples/saucedemo/.waygraph-auto/c851cc53.log +0 -6
  375. package/examples/saucedemo/.waygraph-auto/c8987b67.log +0 -0
  376. package/examples/saucedemo/.waygraph-auto/c9d76e32.log +0 -0
  377. package/examples/saucedemo/.waygraph-auto/ca6de7e7.log +0 -0
  378. package/examples/saucedemo/.waygraph-auto/ca8561bc.log +0 -0
  379. package/examples/saucedemo/.waygraph-auto/cae91469.log +0 -0
  380. package/examples/saucedemo/.waygraph-auto/cb05d223.log +0 -0
  381. package/examples/saucedemo/.waygraph-auto/cb86d45b.log +0 -0
  382. package/examples/saucedemo/.waygraph-auto/cb9a1978.log +0 -6
  383. package/examples/saucedemo/.waygraph-auto/cbbc689c.log +0 -6
  384. package/examples/saucedemo/.waygraph-auto/cc989184.log +0 -20
  385. package/examples/saucedemo/.waygraph-auto/cd88364b.log +0 -0
  386. package/examples/saucedemo/.waygraph-auto/cd919e1d.log +0 -0
  387. package/examples/saucedemo/.waygraph-auto/ce584949.log +0 -5
  388. package/examples/saucedemo/.waygraph-auto/cf34b895.log +0 -2
  389. package/examples/saucedemo/.waygraph-auto/cfff9eef.log +0 -20
  390. package/examples/saucedemo/.waygraph-auto/d0f59b21.log +0 -4
  391. package/examples/saucedemo/.waygraph-auto/d1195079.log +0 -20
  392. package/examples/saucedemo/.waygraph-auto/d2ef067a.log +0 -5
  393. package/examples/saucedemo/.waygraph-auto/d37719a6.log +0 -0
  394. package/examples/saucedemo/.waygraph-auto/d425471f.log +0 -6
  395. package/examples/saucedemo/.waygraph-auto/d4afe93f.log +0 -5
  396. package/examples/saucedemo/.waygraph-auto/d50e58f0.log +0 -0
  397. package/examples/saucedemo/.waygraph-auto/d5293921.log +0 -0
  398. package/examples/saucedemo/.waygraph-auto/d62a22c2.log +0 -21
  399. package/examples/saucedemo/.waygraph-auto/d6d1761f.log +0 -22
  400. package/examples/saucedemo/.waygraph-auto/d6d5f411.log +0 -22
  401. package/examples/saucedemo/.waygraph-auto/d6df2771.log +0 -6
  402. package/examples/saucedemo/.waygraph-auto/d7075012.log +0 -21
  403. package/examples/saucedemo/.waygraph-auto/d846cd78.log +0 -0
  404. package/examples/saucedemo/.waygraph-auto/d934da78.log +0 -0
  405. package/examples/saucedemo/.waygraph-auto/d9ddc297.log +0 -0
  406. package/examples/saucedemo/.waygraph-auto/da0a06bf.log +0 -0
  407. package/examples/saucedemo/.waygraph-auto/da6ebb31.log +0 -0
  408. package/examples/saucedemo/.waygraph-auto/db4ac845.log +0 -0
  409. package/examples/saucedemo/.waygraph-auto/db6d7774.log +0 -0
  410. package/examples/saucedemo/.waygraph-auto/db81ba7d.log +0 -0
  411. package/examples/saucedemo/.waygraph-auto/db839827.log +0 -5
  412. package/examples/saucedemo/.waygraph-auto/dc58eb72.log +0 -0
  413. package/examples/saucedemo/.waygraph-auto/dddd057c.log +0 -20
  414. package/examples/saucedemo/.waygraph-auto/dde5e859.log +0 -22
  415. package/examples/saucedemo/.waygraph-auto/ddf975e6.log +0 -0
  416. package/examples/saucedemo/.waygraph-auto/de8cac58.log +0 -0
  417. package/examples/saucedemo/.waygraph-auto/de8cb83d.log +0 -6
  418. package/examples/saucedemo/.waygraph-auto/ded5511a.log +0 -6
  419. package/examples/saucedemo/.waygraph-auto/dedfcb18.log +0 -0
  420. package/examples/saucedemo/.waygraph-auto/def4d9b1.log +0 -0
  421. package/examples/saucedemo/.waygraph-auto/e03cfd8e.log +0 -0
  422. package/examples/saucedemo/.waygraph-auto/e1549e40.log +0 -0
  423. package/examples/saucedemo/.waygraph-auto/e1b0676d.log +0 -21
  424. package/examples/saucedemo/.waygraph-auto/e230f24e.log +0 -0
  425. package/examples/saucedemo/.waygraph-auto/e5111463.log +0 -0
  426. package/examples/saucedemo/.waygraph-auto/e5127c03.log +0 -22
  427. package/examples/saucedemo/.waygraph-auto/e5fc1d7c.log +0 -5
  428. package/examples/saucedemo/.waygraph-auto/e6fd2202.log +0 -0
  429. package/examples/saucedemo/.waygraph-auto/eb38d92e.log +0 -22
  430. package/examples/saucedemo/.waygraph-auto/edaa806d.log +0 -0
  431. package/examples/saucedemo/.waygraph-auto/edaf33de.log +0 -0
  432. package/examples/saucedemo/.waygraph-auto/edd40cbb.log +0 -20
  433. package/examples/saucedemo/.waygraph-auto/eddfbffc.log +0 -6
  434. package/examples/saucedemo/.waygraph-auto/ee86203e.log +0 -0
  435. package/examples/saucedemo/.waygraph-auto/ee9fa1ad.log +0 -5
  436. package/examples/saucedemo/.waygraph-auto/ef319474.log +0 -22
  437. package/examples/saucedemo/.waygraph-auto/f1f38eeb.log +0 -22
  438. package/examples/saucedemo/.waygraph-auto/f24b2915.log +0 -0
  439. package/examples/saucedemo/.waygraph-auto/f28eee8d.log +0 -0
  440. package/examples/saucedemo/.waygraph-auto/f2943898.log +0 -0
  441. package/examples/saucedemo/.waygraph-auto/f33bde90.log +0 -0
  442. package/examples/saucedemo/.waygraph-auto/f43de83c.log +0 -0
  443. package/examples/saucedemo/.waygraph-auto/f6ba7cb4.log +0 -6
  444. package/examples/saucedemo/.waygraph-auto/f7ac4d62.log +0 -20
  445. package/examples/saucedemo/.waygraph-auto/f86224c6.log +0 -0
  446. package/examples/saucedemo/.waygraph-auto/f929bb79.log +0 -0
  447. package/examples/saucedemo/.waygraph-auto/f92d4c6c.log +0 -22
  448. package/examples/saucedemo/.waygraph-auto/f92faf40.log +0 -5
  449. package/examples/saucedemo/.waygraph-auto/fa784369.log +0 -21
  450. package/examples/saucedemo/.waygraph-auto/fb55f723.log +0 -20
  451. package/examples/saucedemo/.waygraph-auto/fba3b738.log +0 -0
  452. package/examples/saucedemo/.waygraph-auto/fc917c18.log +0 -0
  453. package/examples/saucedemo/.waygraph-auto/fe83305d.log +0 -0
  454. package/examples/saucedemo/.waygraph-auto/ff616932.log +0 -0
  455. package/examples/saucedemo/.waygraph-auto/ffdf2854.log +0 -6
  456. package/examples/saucedemo/scripts/capture-auto-headful.mjs +0 -120
  457. package/examples/saucedemo/scripts/capture-wrong-login.mjs +0 -141
  458. package/examples/saucedemo/scripts/demo-device-presets.mjs +0 -188
  459. package/examples/saucedemo/scripts/demo-orientation-gestures-video.mjs +0 -262
  460. package/examples/saucedemo/scripts/show-add-to-cart-menu.mjs +0 -123
  461. package/examples/saucedemo/scripts/show-auto-menu.mjs +0 -72
  462. package/templates/scaffold/scripts/README.md +0 -13
  463. package/templates/scaffold/scripts/fixture-server.mjs +0 -50
  464. package/templates/scaffold/scripts/with-fixture.mjs +0 -69
  465. package/templates/scaffold/test-results/.last-run.json +0 -4
  466. /package/templates/scaffold/src/map/(app_base)/home/{home.html → index.html} +0 -0
@@ -6,6 +6,7 @@ import { chromium } from "@playwright/test";
6
6
  import { join, dirname } from "node:path";
7
7
  import { fileURLToPath, pathToFileURL } from "node:url";
8
8
  import { createRequire } from "node:module";
9
+ import { chromiumExecutablePath } from "waygraph";
9
10
 
10
11
  const require = createRequire(import.meta.url);
11
12
  await import(require.resolve("tsx/esm"));
@@ -18,7 +19,7 @@ const { buildExploreContext, buildExploreMenu } = await import(
18
19
  );
19
20
  const { MemPage, Engine, start, end } = await import(pathToFileURL(join(waygraphDist, "index.js")).href);
20
21
 
21
- const exe = process.env.CHROME_PATH || process.env.CHROMIUM_PATH;
22
+ const exe = chromiumExecutablePath();
22
23
 
23
24
  async function runBlock(engine, entry, context, page, mem) {
24
25
  const flow = engine.defineFlow([start, entry.block, end]);
@@ -2,6 +2,7 @@ import { chromium } from "@playwright/test";
2
2
  import { join, dirname } from "node:path";
3
3
  import { fileURLToPath, pathToFileURL } from "node:url";
4
4
  import { createRequire } from "node:module";
5
+ import { chromiumExecutablePath } from "waygraph";
5
6
 
6
7
  const require = createRequire(import.meta.url);
7
8
  await import(require.resolve("tsx/esm"));
@@ -15,7 +16,7 @@ const { buildExploreContext, buildExploreMenu } = await import(
15
16
  );
16
17
  const { locate, MemPage, Engine, start, end } = await import(pathToFileURL(join(waygraphDist, "index.js")).href);
17
18
 
18
- const exe = process.env.CHROME_PATH || process.env.CHROMIUM_PATH;
19
+ const exe = chromiumExecutablePath();
19
20
 
20
21
  async function snap(page, name) {
21
22
  const path = join(outDir, `graph-proof-${name}.png`);
@@ -6,6 +6,7 @@ import { chromium } from "@playwright/test";
6
6
  import { join, dirname } from "node:path";
7
7
  import { fileURLToPath, pathToFileURL } from "node:url";
8
8
  import { createRequire } from "node:module";
9
+ import { chromiumExecutablePath } from "waygraph";
9
10
 
10
11
  const require = createRequire(import.meta.url);
11
12
  await import(require.resolve("tsx/esm"));
@@ -25,7 +26,7 @@ const { SubmitLoginBlock } = await import(
25
26
  );
26
27
  const { LoginCreds } = await import(pathToFileURL(join(root, "src/states/checkout.mem-keys.js")).href);
27
28
 
28
- const exe = process.env.CHROME_PATH || process.env.CHROMIUM_PATH;
29
+ const exe = chromiumExecutablePath();
29
30
  const baseURL = "https://www.saucedemo.com";
30
31
 
31
32
  console.log("RUNTIME: headless browser (wrong password test)...");
@@ -1,7 +1,6 @@
1
1
  import { test, expect } from "@playwright/test";
2
2
  import { MemPage, checkpoint, Trait } from "waygraph";
3
3
  import { checkoutFlow } from "../src/flows/checkout.flow.js";
4
- import { FfOwnerAuthBlock } from "../src/blocks/saucedemo-web/ff-owner-auth.block.js";
5
4
  import { LoginCreds, SelectedItem } from "../src/states/checkout.mem-keys.js";
6
5
 
7
6
  // checkoutFlow.withBlockVerify/modBlockVerify - a spec that only imports the
@@ -31,12 +30,8 @@ test("withBlockVerify: replacing login's verify with an extra real check still p
31
30
  mem.set(LoginCreds({ username: "standard_user", password: "secret_sauce" }));
32
31
  mem.set(SelectedItem({ id: "sauce-labs-backpack", name: "Sauce Labs Backpack" }));
33
32
 
34
- // Addressed by the actual FfOwnerAuthBlock reference - the preferred
35
- // form: no typo risk, refactor-safe, jump-to-definition works. checkoutFlow
36
- // drives login through the ff-owner-auth FFCompose step (collapsed
37
- // nav-login + fill-username + fill-password + submit-login), not a bare
38
- // SubmitLoginBlock reference, so that's the Block whose verify this patches.
39
- const patched = checkoutFlow.withBlockVerify(FfOwnerAuthBlock, [
33
+ // checkoutFlow's login steps are one inline `{ ff: true }` group, auto-named "ff-1".
34
+ const patched = checkoutFlow.withBlockVerify("ff-1", [
40
35
  Trait.url({ pathname: "/inventory.html" }),
41
36
  Trait.visible(".inventory_list"),
42
37
  ]);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "waygraph",
3
- "version": "0.15.49",
3
+ "version": "0.15.51",
4
4
  "type": "module",
5
5
  "description": "A typed graph of reusable Blocks for driving a browser through E2E flows.",
6
6
  "license": "MIT",
@@ -30,7 +30,15 @@
30
30
  "!examples/**/.waygraph-traverse/**",
31
31
  "!examples/**/.waygraph-videos",
32
32
  "!examples/**/.waygraph-videos/**",
33
- "!**/*.webm"
33
+ "!**/*.webm",
34
+ "!**/.waygraph-auto",
35
+ "!**/.waygraph-auto/**",
36
+ "!**/test-results",
37
+ "!**/test-results/**",
38
+ "!**/playwright-report",
39
+ "!**/playwright-report/**",
40
+ "!**/.waygraph-chain-*.mjs",
41
+ "!**/*.log"
34
42
  ],
35
43
  "repository": {
36
44
  "type": "git",
@@ -10,11 +10,5 @@ export default defineConfig({
10
10
  headless: true,
11
11
  baseURL: "https://www.saucedemo.com",
12
12
  trace: "retain-on-failure",
13
- launchOptions: {
14
- // Canonical Chromium on this machine is the Flatpak install - never let
15
- // Playwright download its own bundled binary. See .agent/manager-agent.md.
16
- executablePath: process.env.CHROME_PATH || process.env.CHROMIUM_PATH,
17
- args: ["--no-sandbox", "--disable-dev-shm-usage"],
18
- },
19
13
  },
20
14
  });
@@ -1,7 +1,7 @@
1
1
  # __PROJECT_NAME__
2
2
 
3
3
  A waygraph project on the **Waygraph Map** layout: `src/map/` folders mirror your app's URLs.
4
- Runs fully offline - `npm test` is green on a local fixture page.
4
+ Runs fully offline - the demo pages open directly via `file://`, no server or network needed.
5
5
 
6
6
  ## Run it
7
7
 
@@ -24,7 +24,9 @@ one Block per action, flows in `src/flows/`.
24
24
 
25
25
  ## Point it at your real app
26
26
 
27
- Set `waygraph.baseUrl` in `package.json`, drop the `scripts/with-fixture.mjs` wrappers, and
28
- keep each `src/map/` folder matching the URL it represents (`waygraph map` enforces this).
27
+ Change each `_nav.block.ts`'s `url` from the local `file://` path to a real one, and set a real
28
+ `baseUrl` if your Nav Blocks use relative paths (`waygraph.config.ts`, a `.env`, or
29
+ `package.json`'s `"waygraph"` field - see the main docs' "Project config" section). Keep each
30
+ `src/map/` folder matching the URL it represents (`waygraph map` enforces this).
29
31
 
30
32
  Docs: https://deviate-dv8.github.io/waygraph/
@@ -9,12 +9,12 @@ Next.js route groups) and never appear in a URL or Checkpoint name.
9
9
  ├── package.json
10
10
  ├── src/
11
11
  │ ├── map/
12
- │ │ ├── (app_base)/ # your app (served on :4177 here)
13
- │ │ │ ├── home/ # URL /home.html
12
+ │ │ ├── (app_base)/ # your app (opened via file:// here)
13
+ │ │ │ ├── home/ # URL /home
14
14
  │ │ │ │ ├── _nav.block.ts # how to get here
15
15
  │ │ │ │ ├── _page.block.ts # "you have arrived" hub
16
16
  │ │ │ │ ├── _sel.ts # every selector for this page
17
- │ │ │ │ ├── home.html # offline fixture page
17
+ │ │ │ │ ├── index.html # offline fixture page
18
18
  │ │ │ │ └── _methods/ # one action per Block
19
19
  │ │ │ │ ├── add-item.effect.block.ts # + instanceOptions (auto menu)
20
20
  │ │ │ │ ├── remove-item.effect.block.ts
@@ -25,7 +25,6 @@ Next.js route groups) and never appear in a URL or Checkpoint name.
25
25
  │ │ └── (external)/mailpit/ # a different origin (mail catcher)
26
26
  │ ├── states/ # Checkpoint types + mem keys
27
27
  │ └── flows/ # example / shop / mail-verify
28
- ├── scripts/ # local fixture server
29
28
  └── tests/example.spec.ts
30
29
  ```
31
30
 
@@ -7,22 +7,18 @@
7
7
  "typecheck": "waygraph typecheck .",
8
8
  "test": "waygraph test",
9
9
  "test:ui": "waygraph test ui",
10
- "fixture": "node scripts/fixture-server.mjs",
11
10
  "list": "waygraph list",
12
11
  "check": "waygraph check",
13
12
  "graph": "waygraph graph",
14
13
  "graph:mermaid": "waygraph graph --mermaid",
15
- "auto": "node scripts/with-fixture.mjs waygraph auto",
16
- "auto:cli": "node scripts/with-fixture.mjs waygraph auto --cli",
17
- "demo": "node scripts/with-fixture.mjs waygraph demo --blocks exampleFlow",
18
- "demo:auto-next": "node scripts/with-fixture.mjs waygraph demo --blocks exampleFlow --auto-next --title \"Scaffold hello\"",
19
- "demo:shop": "node scripts/with-fixture.mjs waygraph demo --blocks shopFlow --data \"{\\\"demo.selectedItem\\\":{\\\"id\\\":\\\"alpha\\\",\\\"name\\\":\\\"Alpha\\\"}}\" --title \"Scaffold shop\"",
20
- "demo:shop:auto-next": "node scripts/with-fixture.mjs waygraph demo --blocks shopFlow --auto-next --data \"{\\\"demo.selectedItem\\\":{\\\"id\\\":\\\"alpha\\\",\\\"name\\\":\\\"Alpha\\\"}}\"",
21
- "run": "node scripts/with-fixture.mjs waygraph run --blocks exampleFlow",
22
- "run:shop": "node scripts/with-fixture.mjs waygraph run --blocks shopFlow --data \"{\\\"demo.selectedItem\\\":{\\\"id\\\":\\\"alpha\\\",\\\"name\\\":\\\"Alpha\\\"}}\""
23
- },
24
- "waygraph": {
25
- "baseUrl": "http://127.0.0.1:4177"
14
+ "auto": "waygraph auto",
15
+ "auto:cli": "waygraph auto --cli",
16
+ "demo": "waygraph demo --blocks exampleFlow",
17
+ "demo:auto-next": "waygraph demo --blocks exampleFlow --auto-next",
18
+ "demo:shop": "waygraph demo --blocks shopFlow",
19
+ "demo:shop:auto-next": "waygraph demo --blocks shopFlow --auto-next",
20
+ "run": "waygraph run --blocks exampleFlow",
21
+ "run:shop": "waygraph run --blocks shopFlow"
26
22
  },
27
23
  "dependencies": {
28
24
  "waygraph": "^0.12.20"
@@ -1,28 +1,12 @@
1
1
  import { defineConfig } from "@playwright/test";
2
2
 
3
- const FIXTURE_PORT = process.env.WAYGRAPH_FIXTURE_PORT || "4177";
4
- const FIXTURE_HOST = process.env.WAYGRAPH_FIXTURE_HOST || "127.0.0.1";
5
- const FIXTURE_ORIGIN = `http://${FIXTURE_HOST}:${FIXTURE_PORT}`;
6
-
7
3
  export default defineConfig({
8
4
  testDir: "./tests",
9
5
  fullyParallel: true,
10
6
  reporter: [["list"], ["html", { open: "never" }]],
11
7
  use: {
12
- baseURL: FIXTURE_ORIGIN,
8
+ // Demo pages open via file:// - no server. Filled in by `waygraph init`.
9
+ baseURL: "__APP_BASE_URL__",
13
10
  trace: "retain-on-failure",
14
- launchOptions: {
15
- executablePath: process.env.CHROME_PATH || process.env.CHROMIUM_PATH,
16
- },
17
- },
18
- webServer: {
19
- command: "node scripts/fixture-server.mjs",
20
- url: `${FIXTURE_ORIGIN}/home.html`,
21
- reuseExistingServer: !process.env.CI,
22
- env: {
23
- WAYGRAPH_FIXTURE_PORT: FIXTURE_PORT,
24
- WAYGRAPH_FIXTURE_HOST: FIXTURE_HOST,
25
- WAYGRAPH_FIXTURE_QUIET: "1",
26
- },
27
11
  },
28
12
  });
@@ -5,21 +5,34 @@ import {
5
5
  withTitle,
6
6
  withHighlightFixtures,
7
7
  withSessionReset,
8
+ withMemStub,
9
+ registerMemStub,
8
10
  } from "waygraph";
9
11
  import { NavHomeBlock } from "../map/(app_base)/home/_nav.block.js";
10
12
  import { AddItemBlock } from "../map/(app_base)/home/_methods/add-item.effect.block.js";
11
13
  import { AssertItemAddedBlock } from "../map/(app_base)/home/_methods/assert-item-added.method.block.js";
12
14
  import { RemoveItemBlock } from "../map/(app_base)/home/_methods/remove-item.effect.block.js";
13
15
  import { ClearCartBlock } from "../map/(app_base)/home/_methods/clear-cart.method.block.js";
16
+ import { SelectedItem } from "../states/demo.mem-keys.js";
14
17
  import "../map/(app_base)/home/_page.block.js";
15
18
 
16
19
  const engine = new Engine();
17
20
 
18
21
  /**
19
- * Effect + Method demo (set mem for add-item, or use `waygraph auto` which
20
- * fills SelectedItem via instanceOptions).
22
+ * memStub: a real fixture row (`alpha`/`Alpha`), registered once so this Flow never needs
23
+ * --data at all. Still override-able - `--data '{"demo.selectedItem":{"id":"beta",...}}'`
24
+ * wins over this registration, same as any other memStub (see docs/REFERENCE.md's own
25
+ * "memStub - fake values for requires" section).
26
+ */
27
+ registerMemStub(SelectedItem.key, () => ({ id: "alpha", name: "Alpha" }));
28
+
29
+ /**
30
+ * Effect + Method demo. `requires: [SelectedItem.key]` (on `add-item`) is filled automatically
31
+ * by the memStub registration above - no --data needed. Override it with real data, or use
32
+ * `waygraph auto` which fills SelectedItem via instanceOptions instead:
21
33
  *
22
- * waygraph demo --blocks shopFlow --data '{"demo.selectedItem":{"id":"alpha","name":"Alpha"}}'
34
+ * waygraph demo --blocks shopFlow # memStub fills it
35
+ * waygraph demo --blocks shopFlow --data '{"demo.selectedItem":{"id":"beta","name":"Beta"}}'
23
36
  * waygraph auto # after landing on home, pick Add Alpha / Add Beta / Remove ...
24
37
  *
25
38
  * Add -> assert it actually landed (mem-matched Remove button + cart count,
@@ -28,32 +41,34 @@ const engine = new Engine();
28
41
  * Clear cart (bulk Method, `clear-cart`) - keeps both the per-item and bulk
29
42
  * clear paths atomic and each wired into a real flow, not orphaned.
30
43
  */
31
- export const shopFlow = withHighlightFixtures(
32
- withTitle(
33
- withSessionReset(
34
- engine.defineFlow([
35
- start,
36
- NavHomeBlock,
37
- AddItemBlock,
38
- AssertItemAddedBlock,
39
- RemoveItemBlock,
40
- AddItemBlock,
41
- ClearCartBlock,
42
- end,
43
- ]),
44
+ export const shopFlow = withMemStub(
45
+ withHighlightFixtures(
46
+ withTitle(
47
+ withSessionReset(
48
+ engine.defineFlow([
49
+ start,
50
+ NavHomeBlock,
51
+ AddItemBlock,
52
+ AssertItemAddedBlock,
53
+ RemoveItemBlock,
54
+ AddItemBlock,
55
+ ClearCartBlock,
56
+ end,
57
+ ]),
58
+ ),
59
+ "Scaffold: Shop (Effect + clear)",
44
60
  ),
45
- "Scaffold: Shop (Effect + clear)",
46
- ),
47
- {
48
- "add-item": {
49
- stubAfter: {
50
- cart: {
51
- label: "AC · item in cart",
52
- detail: "Cart count bumped after Add.",
53
- tag: "AC",
54
- duration: true,
61
+ {
62
+ "add-item": {
63
+ stubAfter: {
64
+ cart: {
65
+ label: "AC · item in cart",
66
+ detail: "Cart count bumped after Add.",
67
+ tag: "AC",
68
+ duration: true,
69
+ },
55
70
  },
56
71
  },
57
72
  },
58
- },
73
+ ),
59
74
  );
@@ -6,7 +6,7 @@ import { DocsSel, DOCS_URL } from "./_sel.js";
6
6
  * Kind: Nav
7
7
  * Route: (app_base)/docs/
8
8
  *
9
- * Same origin as home/ (same fixture server, different HTML file) - lives
9
+ * Same shape as home/ (its own file:// page, no server) - lives
10
10
  * under (app_base), not (external). See docs/REFERENCE.md "Waygraph Map" and
11
11
  * openspec/changes/waygraph-map. `(app_base)` is purely organizational
12
12
  * (Next.js route-group style) - never part of the Checkpoint tag.
@@ -1,6 +1,5 @@
1
- export const DOCS_URL =
2
- process.env.WAYGRAPH_DOCS_URL ??
3
- `http://${process.env.WAYGRAPH_FIXTURE_HOST || "127.0.0.1"}:${process.env.WAYGRAPH_FIXTURE_PORT || "4177"}/docs.html`;
1
+ // Relative to playwright.config.ts's baseURL (the (app_base) folder, set by `waygraph init`).
2
+ export const DOCS_URL = "docs/index.html";
4
3
 
5
4
  export const DocsSel = {
6
5
  heading: "#docs-heading",
@@ -3,6 +3,6 @@
3
3
  <head><title>Scaffold - docs (Waygraph Map convention demo)</title></head>
4
4
  <body>
5
5
  <h1 id="docs-heading">Docs</h1>
6
- <a id="go-home" href="/home.html">Back home</a>
6
+ <a id="go-home" href="../home/index.html">Back home</a>
7
7
  </body>
8
8
  </html>
@@ -1,10 +1,9 @@
1
1
  import {
2
2
  defineEffectBlock,
3
3
  checkpoint,
4
- type Checkpoint,
5
4
  type WaygraphInstanceOption,
6
5
  } from "waygraph";
7
- import type { ItemInCart } from "../../../../states/demo.states.js";
6
+ import type { CanAddItem, ItemInCart } from "../../../../states/demo.states.js";
8
7
  import { SelectedItem } from "../../../../states/demo.mem-keys.js";
9
8
  import { DemoSel } from "../_sel.js";
10
9
 
@@ -16,7 +15,7 @@ import { DemoSel } from "../_sel.js";
16
15
  * Mutates one catalog row from mem. `waygraph auto` lists one "Add …" row per
17
16
  * live Add button via instanceOptions.
18
17
  */
19
- export const AddItemBlock = defineEffectBlock<Checkpoint<string>, ItemInCart>({
18
+ export const AddItemBlock = defineEffectBlock<CanAddItem, ItemInCart>({
20
19
  name: "add-item",
21
20
  description: "Adds the mem-selected catalog item to the cart.",
22
21
  requires: [SelectedItem.key],
@@ -35,15 +34,6 @@ export const AddItemBlock = defineEffectBlock<Checkpoint<string>, ItemInCart>({
35
34
  },
36
35
  },
37
36
  ],
38
- stubBefore: {
39
- add: { selector: DemoSel.catalog, label: "Catalog" },
40
- },
41
- stubAfter: {
42
- cart: { selector: DemoSel.cartCount, label: "Cart count", duration: true },
43
- },
44
- stubOnError: {
45
- cart: { selector: DemoSel.cartCount, label: "Cart at failure", tag: "FAIL" },
46
- },
47
37
  },
48
38
  async instanceOptions(page): Promise<readonly WaygraphInstanceOption[]> {
49
39
  const buttons = page.locator("button.add:not([hidden])");
@@ -65,4 +55,13 @@ export const AddItemBlock = defineEffectBlock<Checkpoint<string>, ItemInCart>({
65
55
  }
66
56
  return out;
67
57
  },
68
- });
58
+ })
59
+ .stubBefore((ctx) => {
60
+ ctx.ring("add", { selector: DemoSel.catalog, label: "Catalog" });
61
+ })
62
+ .stubAfter((ctx) => {
63
+ ctx.ring("cart", { selector: DemoSel.cartCount, label: "Cart count", duration: true });
64
+ })
65
+ .stubOnError((ctx) => {
66
+ ctx.ring("cart", { selector: DemoSel.cartCount, label: "Cart at failure", tag: "FAIL" });
67
+ });
@@ -1,4 +1,5 @@
1
1
  import { defineAssertBlock, Trait } from "waygraph";
2
+ import type { Home } from "../../../../states/demo.states.js";
2
3
  import { DemoSel } from "../_sel.js";
3
4
 
4
5
  /**
@@ -10,31 +11,12 @@ import { DemoSel } from "../_sel.js";
10
11
  * act/resolve to accidentally do a second thing. Same-URL assert after nav,
11
12
  * with stubs + fixtures + a YAP slide.
12
13
  */
13
- export const AssertHelloBlock = defineAssertBlock({
14
+ export const AssertHelloBlock = defineAssertBlock<Home>({
14
15
  name: "assert-hello",
15
16
  description: "Confirms the hello heading is still visible after arrival.",
16
- checkpoint: "HomeVerified",
17
+ checkpoint: "Home",
17
18
  waitForHeading: "Hello Waygraph",
18
19
  verify: [Trait.text(DemoSel.title, "Hello Waygraph"), Trait.visible(DemoSel.sub)],
19
- stubBefore: {
20
- title: { selector: DemoSel.title, label: "Heading about to check" },
21
- },
22
- stubAfter: {
23
- title: {
24
- selector: DemoSel.title,
25
- label: "Hello confirmed",
26
- detail: "Offline scaffold proof point.",
27
- duration: true,
28
- },
29
- sub: { selector: DemoSel.sub, label: "Subcopy", duration: 1500 },
30
- },
31
- stubOnError: {
32
- title: {
33
- selector: DemoSel.title,
34
- label: "Heading at failure",
35
- tag: "FAIL",
36
- },
37
- },
38
20
  slides: [
39
21
  {
40
22
  caption: "Scaffold covers auto + narration",
@@ -43,4 +25,19 @@ export const AssertHelloBlock = defineAssertBlock({
43
25
  duration: true,
44
26
  },
45
27
  ],
46
- });
28
+ })
29
+ .stubBefore((ctx) => {
30
+ ctx.ring("title", { selector: DemoSel.title, label: "Heading about to check" });
31
+ })
32
+ .stubAfter((ctx) => {
33
+ ctx.ring("title", {
34
+ selector: DemoSel.title,
35
+ label: "Hello confirmed",
36
+ detail: "Offline scaffold proof point.",
37
+ duration: true,
38
+ });
39
+ ctx.ring("sub", { selector: DemoSel.sub, label: "Subcopy", duration: 1500 });
40
+ })
41
+ .stubOnError((ctx) => {
42
+ ctx.ring("title", { selector: DemoSel.title, label: "Heading at failure", tag: "FAIL" });
43
+ });
@@ -21,12 +21,11 @@ export const ClearCartBlock = defineMethodBlock<ItemInCart, CartEmpty>({
21
21
  },
22
22
  resolve: () => checkpoint("CartEmpty"),
23
23
  verify: [Trait.text(DemoSel.cartCount, "0")],
24
- stubBefore: {
25
- clear: { selector: DemoSel.clear, label: "Clear cart" },
26
- },
27
- stubAfter: {
28
- cart: { selector: DemoSel.cartCount, label: "Empty cart", duration: true },
29
- },
30
- stubOnError: {},
31
24
  },
32
- });
25
+ })
26
+ .stubBefore((ctx) => {
27
+ ctx.ring("clear", { selector: DemoSel.clear, label: "Clear cart" });
28
+ })
29
+ .stubAfter((ctx) => {
30
+ ctx.ring("cart", { selector: DemoSel.cartCount, label: "Empty cart", duration: true });
31
+ });
@@ -1,10 +1,9 @@
1
1
  import {
2
2
  defineEffectBlock,
3
3
  checkpoint,
4
- type Checkpoint,
5
4
  type WaygraphInstanceOption,
6
5
  } from "waygraph";
7
- import type { CartEmpty } from "../../../../states/demo.states.js";
6
+ import type { CartEmpty, ItemInCart } from "../../../../states/demo.states.js";
8
7
  import { SelectedItem } from "../../../../states/demo.mem-keys.js";
9
8
  import { DemoSel } from "../_sel.js";
10
9
 
@@ -15,7 +14,7 @@ import { DemoSel } from "../_sel.js";
15
14
  *
16
15
  * Removes one in-cart row. Auto menus one row per visible Remove button.
17
16
  */
18
- export const RemoveItemBlock = defineEffectBlock<Checkpoint<string>, CartEmpty>({
17
+ export const RemoveItemBlock = defineEffectBlock<ItemInCart, CartEmpty>({
19
18
  name: "remove-item",
20
19
  description: "Removes the mem-selected catalog item from the cart.",
21
20
  requires: [SelectedItem.key],
@@ -34,11 +33,6 @@ export const RemoveItemBlock = defineEffectBlock<Checkpoint<string>, CartEmpty>(
34
33
  },
35
34
  },
36
35
  ],
37
- stubBefore: {},
38
- stubAfter: {
39
- cart: { selector: DemoSel.cartCount, label: "Cart count", duration: true },
40
- },
41
- stubOnError: {},
42
36
  },
43
37
  async instanceOptions(page): Promise<readonly WaygraphInstanceOption[]> {
44
38
  const buttons = page.locator("button.remove:not([hidden])");
@@ -60,4 +54,6 @@ export const RemoveItemBlock = defineEffectBlock<Checkpoint<string>, CartEmpty>(
60
54
  }
61
55
  return out;
62
56
  },
57
+ }).stubAfter((ctx) => {
58
+ ctx.ring("cart", { selector: DemoSel.cartCount, label: "Cart count", duration: true });
63
59
  });
@@ -1,4 +1,5 @@
1
1
  import { defineNavBlock, Trait } from "waygraph";
2
+ import type { Home } from "../../../states/demo.states.js";
2
3
  import { DemoSel, HOME_URL } from "./_sel.js";
3
4
 
4
5
  /**
@@ -6,17 +7,16 @@ import { DemoSel, HOME_URL } from "./_sel.js";
6
7
  * Helper: defineNavBlock
7
8
  * Route: (app_base)/home/ (synthetic "/")
8
9
  */
9
- export const NavHomeBlock = defineNavBlock({
10
+ export const NavHomeBlock = defineNavBlock<Home>({
10
11
  name: "nav-home",
11
- description: "Opens the offline catalog page (HTTP fixture :4177).",
12
+ description: "Opens the offline catalog page (file://, no server).",
12
13
  checkpoint: "Home",
13
14
  url: HOME_URL,
14
15
  verify: [Trait.text(DemoSel.title, "Hello Waygraph"), Trait.visible(DemoSel.catalog)],
15
- stubBefore: {},
16
- stubAfter: {
17
- title: { selector: DemoSel.title, label: "Home heading", duration: true },
18
- },
19
- stubOnError: {
20
- title: { selector: DemoSel.title, label: "Home heading at failure" },
21
- },
22
- });
16
+ })
17
+ .stubAfter((ctx) => {
18
+ ctx.ring("title", { selector: DemoSel.title, label: "Home heading", duration: true });
19
+ })
20
+ .stubOnError((ctx) => {
21
+ ctx.ring("title", { selector: DemoSel.title, label: "Home heading at failure" });
22
+ });
@@ -1,7 +1,5 @@
1
- /** Offline catalog URL — HTTP fixture server (not file://; Flatpak Chromium blocks /tmp file URLs). */
2
- export const HOME_URL =
3
- process.env.WAYGRAPH_HOME_URL ??
4
- `http://${process.env.WAYGRAPH_FIXTURE_HOST || "127.0.0.1"}:${process.env.WAYGRAPH_FIXTURE_PORT || "4177"}/home.html`;
1
+ // Relative to playwright.config.ts's baseURL (the (app_base) folder, set by `waygraph init`).
2
+ export const HOME_URL = "home/index.html";
5
3
 
6
4
  export const DemoSel = {
7
5
  title: "h1",
@@ -0,0 +1,17 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <title>Waygraph scaffold demo</title>
6
+ <style>
7
+ body { font-family: system-ui, sans-serif; margin: 6rem 2rem 2rem; }
8
+ </style>
9
+ </head>
10
+ <body>
11
+ <h1>Waygraph scaffold demo</h1>
12
+ <ul>
13
+ <li><a href="home/index.html">Home</a></li>
14
+ <li><a href="docs/index.html">Docs</a></li>
15
+ </ul>
16
+ </body>
17
+ </html>
@@ -4,6 +4,8 @@ export type Home = Checkpoint<"Home">;
4
4
  export type HomeVerified = Checkpoint<"HomeVerified">;
5
5
  export type ItemInCart = Checkpoint<"ItemInCart">;
6
6
  export type CartEmpty = Checkpoint<"CartEmpty">;
7
+ /** Anywhere an item can be added from: fresh on Home, or after the cart was emptied. */
8
+ export type CanAddItem = Home | CartEmpty;
7
9
 
8
10
  // --- Mailpit (external tool surface, src/map/(external)/mailpit/) ---
9
11
 
@@ -2,8 +2,9 @@
2
2
 
3
3
  Real `@playwright/test` specs, run through `waygraph test` (an alias for `playwright test`,
4
4
  plus `waygraph test ui`/`report`/`show-trace` for Playwright's own UI Mode/HTML report/trace
5
- viewer). These run against the offline fixture server (see `scripts/README.md`), not a live
6
- network - that's what makes `npm test` green immediately after `waygraph init`.
5
+ viewer). These run against the offline fixture pages under `src/map/` (opened directly via `file://`,
6
+ no server), not a live network - that's what makes `npm test` green immediately after
7
+ `waygraph init`.
7
8
 
8
9
  A spec here typically runs a `*.flow.ts` from `src/flows/` and asserts on its result, rather
9
10
  than driving the page directly - the flow already encodes the real path and its own `verify`
@@ -10,5 +10,5 @@
10
10
  "skipLibCheck": true,
11
11
  "forceConsistentCasingInFileNames": true
12
12
  },
13
- "include": ["src/**/*.ts", "tests/**/*.ts"]
13
+ "include": ["src/**/*.ts", "tests/**/*.ts", "scripts/**/*.ts"]
14
14
  }
@@ -42,9 +42,11 @@ against a live site, use `--skill-pilot-blind`.
42
42
  hand-supplied every time, `registerMemStub(key, fake)` + `withMemStub(flow)` (or
43
43
  `--mem-stub`) fills it from a registry instead - a key with no registration still fails
44
44
  preflight exactly as before, so this narrows what needs real input, never removes the guard.
45
- 6. **Keep Checkpoints typed — never `Checkpoint<string>`.** Block helpers take concrete
46
- Checkpoint types from `src/states/` (e.g. `defineMethodBlock<LoginPage, LoginPage>`).
47
- Wildcard `Checkpoint<string>` compiles but kills graph honesty; `waygraph check` / `waygraph typecheck` warn.
45
+ 6. **Keep Checkpoints typed.** Block helpers take concrete Checkpoint types from `src/states/`
46
+ (e.g. `defineMethodBlock<LoginPage, LoggedIn>`). A Block's **output** must never be
47
+ `Checkpoint<string>` — `waygraph check` / `waygraph typecheck` warn. When a Block runs from a
48
+ few known states, name them as a union in `src/states/` (`type CanAddItem = Home | CartEmpty`);
49
+ a `Checkpoint<string>` **input** is only for a Block that's genuinely reachable from anywhere.
48
50
  Same for `defineAssertBlock({…})` without an explicit type arg — use
49
51
  `defineAssertBlock<YourCheckpoint>({…})`.
50
52
  7. **One input/action per Method Block.** No block that `.fill()`s two fields or `.fill()` + `.click()` in one