@crvouga/atlas 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (379) hide show
  1. package/CHANGELOG.md +7 -1
  2. package/README.md +178 -617
  3. package/dist/bun/src/driver.d.ts +41 -7
  4. package/dist/bun/src/driver.js +47 -6
  5. package/dist/bun/src/index.d.ts +8 -0
  6. package/dist/bun/src/index.js +8 -0
  7. package/dist/core/src/cli.d.ts +14 -1
  8. package/dist/core/src/cli.js +30 -1
  9. package/dist/core/src/config.d.ts +70 -4
  10. package/dist/core/src/config.js +62 -3
  11. package/dist/core/src/events/cloudevents.d.ts +54 -9
  12. package/dist/core/src/events/cloudevents.js +60 -9
  13. package/dist/core/src/graph.d.ts +21 -0
  14. package/dist/core/src/graph.js +26 -0
  15. package/dist/core/src/index.d.ts +11 -0
  16. package/dist/core/src/index.js +11 -0
  17. package/dist/core/src/lint.d.ts +30 -0
  18. package/dist/core/src/lint.js +13 -0
  19. package/dist/core/src/plan.d.ts +39 -1
  20. package/dist/core/src/plan.js +28 -1
  21. package/dist/core/src/privacy.d.ts +29 -2
  22. package/dist/core/src/privacy.js +19 -2
  23. package/dist/core/src/report/formats.d.ts +34 -4
  24. package/dist/core/src/report/formats.js +24 -4
  25. package/dist/core/src/report/markdown.d.ts +15 -0
  26. package/dist/core/src/report/markdown.js +8 -0
  27. package/dist/core/src/run/clients.d.ts +44 -5
  28. package/dist/core/src/run/clients.js +46 -2
  29. package/dist/core/src/run/execute.d.ts +69 -16
  30. package/dist/core/src/run/execute.js +67 -16
  31. package/dist/core/src/run/frames.d.ts +13 -4
  32. package/dist/core/src/run/frames.js +19 -4
  33. package/dist/core/src/run/http.d.ts +34 -1
  34. package/dist/core/src/run/http.js +14 -1
  35. package/dist/core/src/run/types.d.ts +76 -3
  36. package/dist/core/src/run/types.js +19 -3
  37. package/dist/core/src/signals.d.ts +49 -5
  38. package/dist/core/src/signals.js +22 -5
  39. package/dist/core/src/spec/compose.d.ts +23 -1
  40. package/dist/core/src/spec/compose.js +10 -1
  41. package/dist/core/src/spec/index.d.ts +9 -1
  42. package/dist/core/src/spec/index.js +9 -1
  43. package/dist/core/src/spec/load.d.ts +22 -1
  44. package/dist/core/src/spec/load.js +31 -1
  45. package/dist/core/src/spec/parse.d.ts +16 -2
  46. package/dist/core/src/spec/parse.js +25 -2
  47. package/dist/core/src/spec/scxml.d.ts +25 -4
  48. package/dist/core/src/spec/scxml.js +36 -4
  49. package/dist/core/src/spec/types.d.ts +52 -1
  50. package/dist/core/src/spec/types.js +24 -0
  51. package/dist/detox/src/index.d.ts +54 -11
  52. package/dist/detox/src/index.js +45 -7
  53. package/dist/playwright/src/driver.d.ts +39 -3
  54. package/dist/playwright/src/driver.js +27 -3
  55. package/dist/playwright/src/index.d.ts +10 -0
  56. package/dist/playwright/src/index.js +10 -0
  57. package/dist/playwright/src/media.d.ts +50 -4
  58. package/dist/playwright/src/media.js +55 -4
  59. package/dist/playwright/src/signals.d.ts +44 -5
  60. package/dist/playwright/src/signals.js +29 -5
  61. package/dist/reports/src/attachment-files.d.ts +44 -0
  62. package/dist/reports/src/attachment-files.js +121 -0
  63. package/dist/reports/src/attachment-response.d.ts +31 -0
  64. package/dist/reports/src/attachment-response.js +55 -0
  65. package/dist/reports/src/aws-credentials.d.ts +48 -0
  66. package/dist/reports/src/aws-credentials.js +221 -0
  67. package/dist/reports/src/browser-navigation.d.ts +14 -0
  68. package/dist/reports/src/browser-navigation.js +7 -0
  69. package/dist/reports/src/bundle.d.ts +34 -2
  70. package/dist/reports/src/bundle.js +38 -2
  71. package/dist/reports/src/catalog.d.ts +34 -3
  72. package/dist/reports/src/catalog.js +17 -3
  73. package/dist/reports/src/cli-stores.d.ts +36 -0
  74. package/dist/reports/src/cli-stores.js +73 -0
  75. package/dist/reports/src/clock.d.ts +7 -2
  76. package/dist/reports/src/clock.js +5 -2
  77. package/dist/reports/src/completion-order.d.ts +18 -5
  78. package/dist/reports/src/completion-order.js +18 -5
  79. package/dist/reports/src/compose.d.ts +80 -0
  80. package/dist/reports/src/compose.js +117 -0
  81. package/dist/reports/src/copy-store.d.ts +29 -0
  82. package/dist/reports/src/copy-store.js +52 -0
  83. package/dist/reports/src/directory-outline.d.ts +38 -0
  84. package/dist/reports/src/directory-outline.js +103 -0
  85. package/dist/reports/src/directory-store.d.ts +20 -0
  86. package/dist/reports/src/directory-store.js +166 -0
  87. package/dist/reports/src/doctor.d.ts +29 -0
  88. package/dist/reports/src/doctor.js +83 -0
  89. package/dist/reports/src/effective-delta.d.ts +34 -0
  90. package/dist/reports/src/effective-delta.js +25 -0
  91. package/dist/reports/src/evidence-detail.d.ts +64 -0
  92. package/dist/reports/src/evidence-detail.js +92 -0
  93. package/dist/reports/src/evidence-live.d.ts +35 -5
  94. package/dist/reports/src/evidence-live.js +18 -2
  95. package/dist/reports/src/evidence-types.d.ts +68 -1
  96. package/dist/reports/src/evidence-types.js +5 -1
  97. package/dist/reports/src/evidence-view.d.ts +43 -4
  98. package/dist/reports/src/evidence-view.js +13 -2
  99. package/dist/reports/src/explorer-types.d.ts +40 -3
  100. package/dist/reports/src/explorer-types.js +8 -0
  101. package/dist/reports/src/explorer-versions.d.ts +9 -1
  102. package/dist/reports/src/explorer-versions.js +18 -1
  103. package/dist/reports/src/export-evidence.d.ts +16 -1
  104. package/dist/reports/src/export-evidence.js +52 -1
  105. package/dist/reports/src/fetcher.d.ts +27 -3
  106. package/dist/reports/src/fetcher.js +11 -3
  107. package/dist/reports/src/format-date.d.ts +6 -0
  108. package/dist/reports/src/format-date.js +6 -0
  109. package/dist/reports/src/format.d.ts +16 -0
  110. package/dist/reports/src/format.js +10 -0
  111. package/dist/reports/src/frames.d.ts +36 -3
  112. package/dist/reports/src/frames.js +22 -3
  113. package/dist/reports/src/hash.d.ts +18 -0
  114. package/dist/reports/src/hash.js +13 -0
  115. package/dist/reports/src/host.d.ts +29 -0
  116. package/dist/reports/src/host.js +64 -0
  117. package/dist/reports/src/html-frame.d.ts +5 -6
  118. package/dist/reports/src/html-frame.js +12 -1
  119. package/dist/reports/src/http-store.d.ts +52 -0
  120. package/dist/reports/src/http-store.js +145 -0
  121. package/dist/reports/src/http.d.ts +7 -0
  122. package/dist/reports/src/http.js +6 -0
  123. package/dist/reports/src/ingest.d.ts +54 -0
  124. package/dist/reports/src/ingest.js +210 -0
  125. package/dist/reports/src/init.d.ts +40 -0
  126. package/dist/reports/src/init.js +364 -0
  127. package/dist/reports/src/junit.d.ts +33 -6
  128. package/dist/reports/src/junit.js +87 -21
  129. package/dist/reports/src/keyboard.d.ts +20 -0
  130. package/dist/reports/src/keyboard.js +11 -0
  131. package/dist/reports/src/keys.d.ts +21 -3
  132. package/dist/reports/src/keys.js +21 -3
  133. package/dist/reports/src/layer-axes.d.ts +35 -5
  134. package/dist/reports/src/layer-axes.js +25 -5
  135. package/dist/reports/src/layer-catalog.d.ts +28 -1
  136. package/dist/reports/src/layer-catalog.js +18 -1
  137. package/dist/reports/src/layer-merge.d.ts +98 -9
  138. package/dist/reports/src/layer-merge.js +147 -31
  139. package/dist/reports/src/layer-source.d.ts +18 -0
  140. package/dist/reports/src/layer-source.js +11 -0
  141. package/dist/reports/src/layer-store.d.ts +42 -0
  142. package/dist/reports/src/layer-store.js +63 -5
  143. package/dist/reports/src/layer-types.d.ts +32 -1
  144. package/dist/reports/src/layers-route.d.ts +47 -4
  145. package/dist/reports/src/layers-route.js +86 -7
  146. package/dist/reports/src/media-types.d.ts +11 -0
  147. package/dist/reports/src/media-types.js +22 -0
  148. package/dist/reports/src/namespace-guard.d.ts +10 -1
  149. package/dist/reports/src/namespace-guard.js +10 -1
  150. package/dist/reports/src/navigation.d.ts +12 -0
  151. package/dist/reports/src/navigation.js +7 -0
  152. package/dist/reports/src/object-io.d.ts +11 -4
  153. package/dist/reports/src/object-io.js +4 -4
  154. package/dist/reports/src/object-store-conformance.d.ts +27 -0
  155. package/dist/reports/src/object-store-conformance.js +87 -0
  156. package/dist/reports/src/object-store.d.ts +33 -24
  157. package/dist/reports/src/object-store.js +17 -24
  158. package/dist/reports/src/parse-with.d.ts +16 -0
  159. package/dist/reports/src/parse-with.js +14 -0
  160. package/dist/reports/src/performance-part.d.ts +25 -1
  161. package/dist/reports/src/performance-part.js +15 -1
  162. package/dist/reports/src/performance.d.ts +22 -2
  163. package/dist/reports/src/performance.js +12 -2
  164. package/dist/reports/src/persist.d.ts +12 -3
  165. package/dist/reports/src/persist.js +12 -3
  166. package/dist/reports/src/phone.d.ts +18 -1
  167. package/dist/reports/src/phone.js +18 -1
  168. package/dist/reports/src/protocol.d.ts +26 -4
  169. package/dist/reports/src/protocol.js +15 -4
  170. package/dist/reports/src/publication.d.ts +21 -1
  171. package/dist/reports/src/publication.js +21 -1
  172. package/dist/reports/src/publish-checks.d.ts +35 -0
  173. package/dist/reports/src/publish-checks.js +122 -0
  174. package/dist/reports/src/publish.d.ts +42 -9
  175. package/dist/reports/src/publish.js +36 -7
  176. package/dist/reports/src/read.d.ts +46 -16
  177. package/dist/reports/src/read.js +38 -14
  178. package/dist/reports/src/recording-bundle.d.ts +13 -2
  179. package/dist/reports/src/recording-bundle.js +4 -2
  180. package/dist/reports/src/recording-keys.d.ts +15 -1
  181. package/dist/reports/src/recording-keys.js +15 -1
  182. package/dist/reports/src/remote-report.d.ts +28 -7
  183. package/dist/reports/src/remote-report.js +15 -7
  184. package/dist/reports/src/report-cli.d.ts +51 -0
  185. package/dist/reports/src/report-cli.js +485 -0
  186. package/dist/reports/src/report-index.d.ts +99 -0
  187. package/dist/reports/src/report-index.js +337 -0
  188. package/dist/reports/src/report-loader.d.ts +10 -0
  189. package/dist/reports/src/report-loader.js +6 -0
  190. package/dist/reports/src/report-parts.d.ts +29 -3
  191. package/dist/reports/src/report-parts.js +37 -3
  192. package/dist/reports/src/report-status.d.ts +48 -0
  193. package/dist/reports/src/report-status.js +156 -0
  194. package/dist/reports/src/report-types.d.ts +73 -0
  195. package/dist/reports/src/report-types.js +3 -0
  196. package/dist/reports/src/reporter.d.ts +67 -0
  197. package/dist/reports/src/reporter.js +128 -0
  198. package/dist/reports/src/reports-explorer-route.d.ts +541 -0
  199. package/dist/reports/src/reports-explorer-route.js +11 -0
  200. package/dist/reports/src/reports-list-route.d.ts +9 -0
  201. package/dist/reports/src/reports-list-route.js +9 -0
  202. package/dist/reports/src/reports-route.d.ts +561 -22
  203. package/dist/reports/src/reports-route.js +11 -3
  204. package/dist/reports/src/reports-store.d.ts +19 -2
  205. package/dist/reports/src/reports-store.js +10 -2
  206. package/dist/reports/src/resilient-cache.d.ts +14 -1
  207. package/dist/reports/src/resilient-cache.js +8 -1
  208. package/dist/reports/src/retention.d.ts +17 -1
  209. package/dist/reports/src/retention.js +5 -1
  210. package/dist/reports/src/run-bundle.d.ts +63 -0
  211. package/dist/reports/src/run-bundle.js +159 -0
  212. package/dist/reports/src/s3-store.d.ts +79 -0
  213. package/dist/reports/src/s3-store.js +295 -0
  214. package/dist/reports/src/scenario.d.ts +14 -4
  215. package/dist/reports/src/scenario.js +5 -4
  216. package/dist/reports/src/sigv4.d.ts +72 -0
  217. package/dist/reports/src/sigv4.js +96 -0
  218. package/dist/reports/src/snapshot-bundle.d.ts +24 -1
  219. package/dist/reports/src/snapshot-bundle.js +27 -2
  220. package/dist/reports/src/snapshot-surface.d.ts +20 -9
  221. package/dist/reports/src/snapshot-surface.js +32 -19
  222. package/dist/reports/src/source-content.d.ts +23 -0
  223. package/dist/reports/src/source-content.js +30 -1
  224. package/dist/reports/src/source-entries.d.ts +13 -0
  225. package/dist/reports/src/source-entries.js +6 -0
  226. package/dist/reports/src/source-part.d.ts +15 -0
  227. package/dist/reports/src/source-part.js +8 -0
  228. package/dist/reports/src/source-reader.d.ts +11 -0
  229. package/dist/reports/src/source-reader.js +5 -0
  230. package/dist/reports/src/spec-evidence.d.ts +12 -2
  231. package/dist/reports/src/spec-evidence.js +6 -2
  232. package/dist/reports/src/spec-inventory.d.ts +15 -1
  233. package/dist/reports/src/spec-inventory.js +22 -1
  234. package/dist/reports/src/spec-link.d.ts +28 -0
  235. package/dist/reports/src/spec-link.js +70 -0
  236. package/dist/reports/src/spec-set.d.ts +63 -0
  237. package/dist/reports/src/spec-set.js +177 -0
  238. package/dist/reports/src/status.d.ts +10 -0
  239. package/dist/reports/src/status.js +5 -0
  240. package/dist/reports/src/store-prefix.d.ts +28 -0
  241. package/dist/reports/src/store-prefix.js +22 -0
  242. package/dist/reports/src/store-url.d.ts +89 -0
  243. package/dist/reports/src/store-url.js +160 -0
  244. package/dist/reports/src/test-catalog-entity.d.ts +11 -0
  245. package/dist/reports/src/test-catalog-entity.js +6 -0
  246. package/dist/reports/src/types.d.ts +6 -1
  247. package/dist/reports/src/use-report-nav.d.ts +35 -0
  248. package/dist/reports/src/use-report-nav.js +12 -0
  249. package/dist/schema/src/api.d.ts +799 -0
  250. package/dist/schema/src/api.js +201 -0
  251. package/dist/schema/src/cli-results.d.ts +210 -0
  252. package/dist/schema/src/cli-results.js +124 -0
  253. package/dist/schema/src/common.d.ts +53 -0
  254. package/dist/schema/src/common.js +42 -0
  255. package/dist/schema/src/index.d.ts +14 -0
  256. package/dist/schema/src/index.js +14 -0
  257. package/dist/schema/src/layer.d.ts +2273 -0
  258. package/dist/schema/src/layer.js +462 -0
  259. package/dist/schema/src/manifest.d.ts +95 -0
  260. package/dist/schema/src/manifest.js +84 -0
  261. package/dist/schema/src/report-sources.d.ts +28 -0
  262. package/dist/schema/src/report-sources.js +25 -0
  263. package/dist/schema/src/runs-index.d.ts +16 -0
  264. package/dist/schema/src/runs-index.js +15 -0
  265. package/dist/schema/src/server-config.d.ts +93 -0
  266. package/dist/schema/src/server-config.js +73 -0
  267. package/dist/schema/src/spec.d.ts +69 -0
  268. package/dist/schema/src/spec.js +58 -0
  269. package/dist/server/src/app.d.ts +62 -0
  270. package/dist/server/src/app.js +419 -0
  271. package/dist/server/src/auth.d.ts +41 -0
  272. package/dist/server/src/auth.js +59 -0
  273. package/dist/server/src/config.d.ts +83 -0
  274. package/dist/server/src/config.js +187 -0
  275. package/dist/server/src/dev.d.ts +12 -0
  276. package/dist/server/src/dev.js +80 -0
  277. package/dist/server/src/events.d.ts +29 -0
  278. package/dist/server/src/events.js +101 -0
  279. package/dist/server/src/host.d.ts +30 -0
  280. package/dist/server/src/host.js +115 -0
  281. package/dist/server/src/index.d.ts +16 -0
  282. package/dist/server/src/index.js +16 -0
  283. package/dist/server/src/llms.d.ts +19 -0
  284. package/dist/server/src/llms.js +63 -0
  285. package/dist/server/src/main.d.ts +30 -0
  286. package/dist/server/src/main.js +112 -0
  287. package/dist/server/src/openapi.d.ts +59 -0
  288. package/dist/server/src/openapi.js +374 -0
  289. package/dist/server/src/problem.d.ts +8 -0
  290. package/dist/server/src/problem.js +39 -0
  291. package/dist/server/src/site.d.ts +13 -0
  292. package/dist/server/src/site.js +43 -0
  293. package/dist/server/src/store-api.d.ts +28 -0
  294. package/dist/server/src/store-api.js +159 -0
  295. package/dist/server/src/validate.d.ts +71 -0
  296. package/dist/server/src/validate.js +197 -0
  297. package/dist/vitest/src/index.d.ts +27 -5
  298. package/dist/vitest/src/index.js +18 -5
  299. package/dist/webdriver/src/driver.d.ts +63 -11
  300. package/dist/webdriver/src/driver.js +57 -6
  301. package/dist/webdriver/src/index.d.ts +8 -0
  302. package/dist/webdriver/src/index.js +1 -0
  303. package/dist/webdriver/src/protocol.d.ts +75 -6
  304. package/dist/webdriver/src/protocol.js +79 -6
  305. package/docs/agents.md +137 -0
  306. package/docs/deploying.md +345 -0
  307. package/docs/dogfooding.md +175 -0
  308. package/docs/extending.md +242 -0
  309. package/docs/integrating.md +485 -0
  310. package/docs/reference/bun.md +141 -0
  311. package/docs/reference/cli.md +146 -0
  312. package/docs/reference/core.md +2426 -0
  313. package/docs/reference/detox.md +150 -0
  314. package/docs/reference/http-api.md +303 -0
  315. package/docs/reference/playwright.md +303 -0
  316. package/docs/reference/reports.md +7098 -0
  317. package/docs/reference/schema.md +1651 -0
  318. package/docs/reference/server.md +685 -0
  319. package/docs/reference/vitest.md +45 -0
  320. package/docs/reference/webdriver.md +330 -0
  321. package/docs/report-backends.md +144 -0
  322. package/docs/report-contract.md +400 -0
  323. package/docs/reporting-issues.md +160 -0
  324. package/docs/server.md +285 -0
  325. package/docs/statecharts.md +641 -0
  326. package/llms-full.txt +3506 -0
  327. package/llms.txt +47 -0
  328. package/package.json +32 -4
  329. package/packages/core/README.md +2 -1
  330. package/packages/reports/README.md +65 -0
  331. package/packages/reports/STORAGE.md +4 -0
  332. package/packages/schema/README.md +14 -0
  333. package/packages/schema/schemas/check-detail.schema.json +1032 -0
  334. package/packages/schema/schemas/checks-result.schema.json +26 -0
  335. package/packages/schema/schemas/command-error.schema.json +35 -0
  336. package/packages/schema/schemas/doctor-result.schema.json +60 -0
  337. package/packages/schema/schemas/effective-delta.schema.json +490 -0
  338. package/packages/schema/schemas/effective-evidence.schema.json +471 -0
  339. package/packages/schema/schemas/evidence-page.schema.json +271 -0
  340. package/packages/schema/schemas/hello-event.schema.json +22 -0
  341. package/packages/schema/schemas/init-plan.schema.json +347 -0
  342. package/packages/schema/schemas/layer-rows.schema.json +199 -0
  343. package/packages/schema/schemas/layer.schema.json +2888 -0
  344. package/packages/schema/schemas/merge-result.schema.json +40 -0
  345. package/packages/schema/schemas/outline.schema.json +62 -0
  346. package/packages/schema/schemas/problem.schema.json +37 -0
  347. package/packages/schema/schemas/publish-checks.schema.json +1413 -0
  348. package/packages/schema/schemas/publish-result.schema.json +168 -0
  349. package/packages/schema/schemas/ready.schema.json +68 -0
  350. package/packages/schema/schemas/report-event.schema.json +100 -0
  351. package/packages/schema/schemas/report-status.schema.json +370 -0
  352. package/packages/schema/schemas/server-config.schema.json +194 -0
  353. package/packages/schema/schemas/server-info.schema.json +114 -0
  354. package/packages/schema/schemas/spec-set.schema.json +103 -0
  355. package/packages/schema/schemas/store-listing.schema.json +29 -0
  356. package/packages/schema/schemas/store-write-result.schema.json +28 -0
  357. package/packages/schema/schemas/stream-result.schema.json +59 -0
  358. package/packages/server/README.md +43 -0
  359. package/packages/server/openapi.json +6699 -0
  360. package/packages/visualizer/README.md +21 -0
  361. package/packages/visualizer/src/app/AppShell.tsx +9 -2
  362. package/packages/visualizer/src/app/report-sources.tsx +6 -4
  363. package/packages/visualizer/src/app/router.tsx +3 -3
  364. package/packages/visualizer/src/components/Header.module.css +35 -0
  365. package/packages/visualizer/src/components/Header.tsx +40 -3
  366. package/packages/visualizer/src/data/adapters/adapter.ts +5 -17
  367. package/packages/visualizer/src/data/adapters/index.ts +10 -1
  368. package/packages/visualizer/src/evidence/api.ts +14 -2
  369. package/packages/visualizer/src/evidence/artifacts.module.css +213 -0
  370. package/packages/visualizer/src/evidence/artifacts.tsx +272 -0
  371. package/packages/visualizer/src/evidence/check-detail.tsx +3 -1
  372. package/packages/visualizer/src/evidence/evidence-context.tsx +74 -12
  373. package/packages/visualizer/src/evidence/spec-page.tsx +23 -16
  374. package/packages/visualizer/src/find/Finder.tsx +1 -7
  375. package/packages/visualizer/src/find/open.ts +4 -0
  376. package/packages/visualizer/src/live/live-stream.ts +204 -0
  377. package/packages/visualizer/src/runtime.ts +19 -0
  378. package/packages/visualizer/vite/atlas-server-proxy.ts +36 -0
  379. package/packages/visualizer/vite.config.ts +11 -3
@@ -37,6 +37,7 @@ export type WebViewContext = SignalContext & {
37
37
  press(key: string, label?: string): Promise<void>;
38
38
  };
39
39
  };
40
+ /** Options of `bunWebViewDriver`; every field is optional. */
40
41
  export type BunWebViewDriverOptions = {
41
42
  /** Where `goto` paths resolve; the implementation's setup decides where to open. */
42
43
  baseUrl?: string | (() => string | Promise<string>);
@@ -47,7 +48,10 @@ export type BunWebViewDriverOptions = {
47
48
  backend?: 'webkit' | 'chrome';
48
49
  /** How long a tap waits for its target to show, in milliseconds (default 10 000). */
49
50
  actionTimeoutMs?: number;
50
- /** Showcase pacing, in milliseconds. */
51
+ /**
52
+ * Showcase pacing, in milliseconds: the hold before each event runs and after its state shows (default 400 and
53
+ * 900).
54
+ */
51
55
  pacing?: {
52
56
  before: number;
53
57
  after: number;
@@ -56,12 +60,42 @@ export type BunWebViewDriverOptions = {
56
60
  concurrency?: number;
57
61
  };
58
62
  /**
59
- * Drive a web app in Bun's built-in headless browser: the system WebKit on macOS (nothing to
60
- * install), Chrome over CDP elsewhere. A view starts in milliseconds and screenshots take about
61
- * ten, so it is the quickest way to run a chart against a real page. Clips are encoded from
62
- * screenshots with FFmpeg. Needs the Bun runtime; there is no fake clock, so time events use the
63
- * app's own controls.
63
+ * Drives a web app in Bun's built-in headless browser for `atlas run`: the system WebKit on macOS (nothing to
64
+ * install), Chrome over CDP elsewhere. A view starts in milliseconds and screenshots take about ten, so it is the
65
+ * quickest way to run a chart against a real page. Each path attempt gets its own view, closed afterwards. Screenshots
66
+ * are PNG files without a thumbnail. Clips are encoded from screenshots with FFmpeg (no clip is recorded without it).
67
+ * `user.tap` and `user.type` wait up to `actionTimeoutMs` for the target signal to show, then click its centre; a
68
+ * target that never shows fails the step with "<signal> is not on screen". Needs the Bun runtime (run
69
+ * `bun --bun atlas run`), and throws on open without it. There is no fake clock, so time events use the app's own
70
+ * controls.
71
+ *
72
+ * @see docs/statecharts.md
73
+ *
74
+ * @example
75
+ * ```ts
76
+ * import { defineConfig } from '@crvouga/atlas';
77
+ * import { bunWebViewDriver, screen, text } from '@crvouga/atlas/bun';
78
+ *
79
+ * export default defineConfig({
80
+ * specs: './specs',
81
+ * driver: () => bunWebViewDriver({ baseUrl: 'http://127.0.0.1:4317' }),
82
+ * implementation: {
83
+ * async setup(ctx) { await ctx.goto('/'); },
84
+ * events: {
85
+ * // one entry per event of the spec
86
+ * },
87
+ * states: { 'No todos': screen({ all: [text('Nothing to do yet')] }) }
88
+ * }
89
+ * });
90
+ * ```
64
91
  */
65
92
  export declare function bunWebViewDriver(options?: BunWebViewDriverOptions): Driver<WebViewContext>;
66
- /** A state recognised from its signals in the page: every `all` visible and no `none` visible. */
93
+ /**
94
+ * Builds a state implementation for a `WebViewContext` from its signals in the page: every `all` signal visible, one
95
+ * `any` signal visible (when given), no `none` signal visible. It is core's `signatureScreen` over `ctx.isVisible`, so
96
+ * it takes the same spec as `screen` from `@crvouga/atlas/signals` (`checks`, `transient`, `sameAs`, `lookIn`,
97
+ * `settle` included).
98
+ *
99
+ * @see docs/statecharts.md
100
+ */
67
101
  export declare const screen: (spec: import('../../core/src/signals.js').ScreenSpec<WebViewContext, Signal>) => import('../../core/src/index.js').StateImplementation<WebViewContext>;
@@ -1,3 +1,14 @@
1
+ /**
2
+ * @module Bun WebView driver
3
+ *
4
+ * `bunWebViewDriver()` is the core `Driver` that runs a statechart's paths in Bun's built-in headless browser
5
+ * (`Bun.WebView`), the quickest way to run a chart against a real page. It provides a `WebViewContext` whose
6
+ * `user.tap` and `user.type` act on `Signal`s, found by the shared in-page DOM probe from core, so an implementation
7
+ * written against `SignalContext` runs here and on the other web drivers unchanged. `Bun.WebView` is typed
8
+ * structurally (`BunWebView`), so this package builds without Bun's types; at run time the Bun runtime is required.
9
+ *
10
+ * @see docs/statecharts.md
11
+ */
1
12
  import { mkdirSync, writeFileSync } from 'node:fs';
2
13
  import path from 'node:path';
3
14
  import { recordFrames } from '../../core/src/index.js';
@@ -51,11 +62,34 @@ function contextFor(view, baseUrl, timeline, options) {
51
62
  return ctx;
52
63
  }
53
64
  /**
54
- * Drive a web app in Bun's built-in headless browser: the system WebKit on macOS (nothing to
55
- * install), Chrome over CDP elsewhere. A view starts in milliseconds and screenshots take about
56
- * ten, so it is the quickest way to run a chart against a real page. Clips are encoded from
57
- * screenshots with FFmpeg. Needs the Bun runtime; there is no fake clock, so time events use the
58
- * app's own controls.
65
+ * Drives a web app in Bun's built-in headless browser for `atlas run`: the system WebKit on macOS (nothing to
66
+ * install), Chrome over CDP elsewhere. A view starts in milliseconds and screenshots take about ten, so it is the
67
+ * quickest way to run a chart against a real page. Each path attempt gets its own view, closed afterwards. Screenshots
68
+ * are PNG files without a thumbnail. Clips are encoded from screenshots with FFmpeg (no clip is recorded without it).
69
+ * `user.tap` and `user.type` wait up to `actionTimeoutMs` for the target signal to show, then click its centre; a
70
+ * target that never shows fails the step with "<signal> is not on screen". Needs the Bun runtime (run
71
+ * `bun --bun atlas run`), and throws on open without it. There is no fake clock, so time events use the app's own
72
+ * controls.
73
+ *
74
+ * @see docs/statecharts.md
75
+ *
76
+ * @example
77
+ * ```ts
78
+ * import { defineConfig } from '@crvouga/atlas';
79
+ * import { bunWebViewDriver, screen, text } from '@crvouga/atlas/bun';
80
+ *
81
+ * export default defineConfig({
82
+ * specs: './specs',
83
+ * driver: () => bunWebViewDriver({ baseUrl: 'http://127.0.0.1:4317' }),
84
+ * implementation: {
85
+ * async setup(ctx) { await ctx.goto('/'); },
86
+ * events: {
87
+ * // one entry per event of the spec
88
+ * },
89
+ * states: { 'No todos': screen({ all: [text('Nothing to do yet')] }) }
90
+ * }
91
+ * });
92
+ * ```
59
93
  */
60
94
  export function bunWebViewDriver(options = {}) {
61
95
  const width = options.width ?? 390;
@@ -86,5 +120,12 @@ export function bunWebViewDriver(options = {}) {
86
120
  hold: (_ctx, ms) => new Promise((r) => setTimeout(r, ms))
87
121
  };
88
122
  }
89
- /** A state recognised from its signals in the page: every `all` visible and no `none` visible. */
123
+ /**
124
+ * Builds a state implementation for a `WebViewContext` from its signals in the page: every `all` signal visible, one
125
+ * `any` signal visible (when given), no `none` signal visible. It is core's `signatureScreen` over `ctx.isVisible`, so
126
+ * it takes the same spec as `screen` from `@crvouga/atlas/signals` (`checks`, `transient`, `sameAs`, `lookIn`,
127
+ * `settle` included).
128
+ *
129
+ * @see docs/statecharts.md
130
+ */
90
131
  export const screen = signatureScreen((ctx, signal) => ctx.isVisible(signal), describeSignal);
@@ -1,2 +1,10 @@
1
+ /**
2
+ * @module Bun WebView driver entry point (`@crvouga/atlas/bun`)
3
+ *
4
+ * Re-exports the Bun WebView driver for statechart runs (`bunWebViewDriver`), its context and option types, `screen`
5
+ * for recognising states from signals, and the signal constructors. Needs the Bun runtime.
6
+ *
7
+ * @see docs/statecharts.md
8
+ */
1
9
  export { bunWebViewDriver, screen, type BunWebView, type BunWebViewDriverOptions, type WebViewContext } from './driver.js';
2
10
  export { css, label, role, testId, text, describeSignal, type Signal } from '../../core/src/signals.js';
@@ -1,2 +1,10 @@
1
+ /**
2
+ * @module Bun WebView driver entry point (`@crvouga/atlas/bun`)
3
+ *
4
+ * Re-exports the Bun WebView driver for statechart runs (`bunWebViewDriver`), its context and option types, `screen`
5
+ * for recognising states from signals, and the signal constructors. Needs the Bun runtime.
6
+ *
7
+ * @see docs/statecharts.md
8
+ */
1
9
  export { bunWebViewDriver, screen } from './driver.js';
2
10
  export { css, label, role, testId, text, describeSignal } from '../../core/src/signals.js';
@@ -1 +1,14 @@
1
- export declare function main(argv?: string[]): Promise<0 | 1 | 2>;
1
+ /**
2
+ * @module The `atlas` command
3
+ *
4
+ * Dispatches `atlas <command>`: the statechart commands (`lint`, `plan`, `run`, `merge`, `export`) and, loaded on demand so
5
+ * they cost nothing otherwise, `serve`, `dev`, `init` and `report`. Statechart configuration is `atlas.config.ts` (see
6
+ * `defineConfig`). A command that is wrong prints a message and exits 2; a plan, lint or run that finds problems exits 1.
7
+ *
8
+ * @see docs/statecharts.md
9
+ * @see docs/reference/cli.md
10
+ */
11
+ /** The text `atlas --help` prints: every command, and the flags of the statechart commands. */
12
+ export declare const USAGE = "atlas \u2014 executable statecharts\n\n atlas lint [--config atlas.config.ts | --specs <dir>] [--require-implementations]\n atlas plan [--config atlas.config.ts] [--state <name>]\n atlas run [--config atlas.config.ts] [--mode fast|showcase] [--workers n] [--state <name>]\n [--seed <name>]... [--paths id,id] [--shard i/n] [--rerun-failed | --reuse <run-dir>]\n [--no-retry] [--output <dir>]\n atlas merge [--config atlas.config.ts] [--output <dir>] <run-dir> <run-dir>...\n atlas export --specs <dir> --format scxml|mermaid|markdown|json [--out <file>]\n atlas serve [--data <dir>] [--port 8080] [--store <url>]... the Atlas server: results in, the live report out\n atlas dev [--port 5180] the server and the viewer's dev server, on one host\n atlas init [--server <url>] [--write] integrate this project: detect its suites, print the plan (atlas init --help)\n atlas report publish|stream|status|merge|doctor|policy \u2026 layered evidence for any kind of spec (atlas report --help)\n\n --workers path attempts that run at once (default: one per CPU, capped by the driver)\n --seed only paths that start from this seed (\"start\" for paths setup starts); repeatable\n --shard 2/4 run the second quarter of the plan; merge the shards' runs afterwards\n --rerun-failed keep the newest run's passed paths and run only the rest\n";
13
+ /** Runs `atlas` with `argv` (default: the process arguments) and returns the exit code. Throws for a command that is wrong, which the `atlas` binary reports as a message and exit code 2. */
14
+ export declare function main(argv?: string[]): Promise<number>;
@@ -1,3 +1,13 @@
1
+ /**
2
+ * @module The `atlas` command
3
+ *
4
+ * Dispatches `atlas <command>`: the statechart commands (`lint`, `plan`, `run`, `merge`, `export`) and, loaded on demand so
5
+ * they cost nothing otherwise, `serve`, `dev`, `init` and `report`. Statechart configuration is `atlas.config.ts` (see
6
+ * `defineConfig`). A command that is wrong prints a message and exits 2; a plan, lint or run that finds problems exits 1.
7
+ *
8
+ * @see docs/statecharts.md
9
+ * @see docs/reference/cli.md
10
+ */
1
11
  import { writeFileSync } from 'node:fs';
2
12
  import path from 'node:path';
3
13
  import { pathToFileURL } from 'node:url';
@@ -8,7 +18,8 @@ import { toMarkdown } from './report/markdown.js';
8
18
  import { composeCharts } from './spec/compose.js';
9
19
  import { loadSpecDirectory } from './spec/load.js';
10
20
  import { machineToScxml } from './spec/scxml.js';
11
- const USAGE = `atlas — executable statecharts
21
+ /** The text `atlas --help` prints: every command, and the flags of the statechart commands. */
22
+ export const USAGE = `atlas — executable statecharts
12
23
 
13
24
  atlas lint [--config atlas.config.ts | --specs <dir>] [--require-implementations]
14
25
  atlas plan [--config atlas.config.ts] [--state <name>]
@@ -17,6 +28,10 @@ const USAGE = `atlas — executable statecharts
17
28
  [--no-retry] [--output <dir>]
18
29
  atlas merge [--config atlas.config.ts] [--output <dir>] <run-dir> <run-dir>...
19
30
  atlas export --specs <dir> --format scxml|mermaid|markdown|json [--out <file>]
31
+ atlas serve [--data <dir>] [--port 8080] [--store <url>]... the Atlas server: results in, the live report out
32
+ atlas dev [--port 5180] the server and the viewer's dev server, on one host
33
+ atlas init [--server <url>] [--write] integrate this project: detect its suites, print the plan (atlas init --help)
34
+ atlas report publish|stream|status|merge|doctor|policy … layered evidence for any kind of spec (atlas report --help)
20
35
 
21
36
  --workers path attempts that run at once (default: one per CPU, capped by the driver)
22
37
  --seed only paths that start from this seed ("start" for paths setup starts); repeatable
@@ -69,8 +84,22 @@ async function loadConfig(file) {
69
84
  throw new Error(`${file} has no default export (use defineConfig)`);
70
85
  return { config: mod.default, base: path.dirname(absolute) };
71
86
  }
87
+ /** Runs `atlas` with `argv` (default: the process arguments) and returns the exit code. Throws for a command that is wrong, which the `atlas` binary reports as a message and exit code 2. */
72
88
  export async function main(argv = process.argv.slice(2)) {
73
89
  const [command] = argv;
90
+ // Loaded on demand: lint, plan and run do not pay for the reports.
91
+ if (command === 'serve') {
92
+ const { serveMain } = await import('../../server/src/main.js');
93
+ return serveMain(argv.slice(1), { out: text => process.stdout.write(text) });
94
+ }
95
+ if (command === 'dev') {
96
+ const { devMain } = await import('../../server/src/dev.js');
97
+ return devMain(argv.slice(1), { out: text => process.stdout.write(text) });
98
+ }
99
+ if (command === 'init')
100
+ return (await import('../../reports/src/init.js')).initMain(argv.slice(1), { out: text => process.stdout.write(text) });
101
+ if (command === 'report')
102
+ return (await import('../../reports/src/report-cli.js')).runReportCommand(argv.slice(1));
74
103
  const configFile = flag(argv, 'config') ?? 'atlas.config.ts';
75
104
  const specs = flag(argv, 'specs');
76
105
  const output = flag(argv, 'output');
@@ -1,6 +1,10 @@
1
1
  import type { StateValue } from './graph.js';
2
2
  import type { Shard } from './run/execute.js';
3
3
  import type { Driver, EventMatcher, EventSource, Implementation, PrivacyRules, RunMode } from './run/types.js';
4
+ /**
5
+ * Everything a project says about running its specs. `C` is the type of the driver's context
6
+ * (a Playwright `Page`, a model, ...), which events and states receive.
7
+ */
4
8
  export type AtlasConfig<C = unknown> = {
5
9
  /** The directory holding the charts (`*.scxml`, `*.machine.{json,yaml}`) and `journeys.yaml`. */
6
10
  specs: string;
@@ -8,6 +12,7 @@ export type AtlasConfig<C = unknown> = {
8
12
  chart?: string;
9
13
  /** Where generated paths start (an XState state value); the initial state when omitted. */
10
14
  start?: StateValue;
15
+ /** A phrase describing `start` in reports; `The start of the chart` when omitted. */
11
16
  startLabel?: string;
12
17
  /** Only these events enter the chart from outside it. */
13
18
  entryEvents?: string[];
@@ -17,27 +22,61 @@ export type AtlasConfig<C = unknown> = {
17
22
  workers?: number;
18
23
  /** Runs once before any path: prepare what every seed relies on (reference data, config). */
19
24
  beforeRun?: () => Promise<void> | void;
25
+ /** The driver, or a function that creates it (called once per run, after `beforeRun`). */
20
26
  driver: Driver<C> | (() => Driver<C> | Promise<Driver<C>>);
27
+ /** How to make each event happen and recognise each state. */
21
28
  implementation: Implementation<C>;
22
29
  /** Where runs are written; `atlas-runs` beside the config when omitted. */
23
30
  output?: string;
31
+ /** Creates the business event sources for a run (called once per run; the run closes them). */
24
32
  eventSources?: () => EventSource[] | Promise<EventSource[]>;
33
+ /** How each business event name from `meta.events` is recognised; by default a CloudEvent whose `type` equals the name. */
25
34
  eventMatchers?: Record<string, EventMatcher>;
35
+ /** Extra privacy rules on top of the defaults. */
26
36
  privacy?: PrivacyRules;
27
37
  /** URLs the run will reach; checked against `privacy.allowHosts` (loopback by default). */
28
38
  targets?: string[];
39
+ /** Recorded in the manifest as the run's environment (`run.environment`), beside the driver name. */
29
40
  environment?: Record<string, unknown>;
41
+ /** How long to wait for a state to be recognised after an event, in milliseconds; 45 000 when omitted. */
30
42
  stepTimeoutMs?: number;
31
43
  /** Meta fields every state must carry (default: description). */
32
44
  requiredMeta?: string[];
33
45
  };
46
+ /**
47
+ * Declares an Atlas config with types, returning it unchanged. Put it as the default export of
48
+ * `atlas.config.ts`; the CLI loads the file with `tsx` and defaults to `atlas.config.ts` in the
49
+ * current directory.
50
+ *
51
+ * @see docs/statecharts.md
52
+ *
53
+ * @example
54
+ * export default defineConfig({
55
+ * specs: './specs',
56
+ * driver: () => functionDriver(() => new TodoModel()),
57
+ * implementation: {
58
+ * events: { 'Adds a todo': { kind: 'user', how: 'Calls add().', run: async (model) => model.add('x') } },
59
+ * states: { 'No todos': { recognize: async (model) => ({ matched: model.count === 0, signals: [] }) } }
60
+ * }
61
+ * });
62
+ */
34
63
  export declare function defineConfig<C>(config: AtlasConfig<C>): AtlasConfig<C>;
35
- /** Narrow what a config runs from the command line. */
64
+ /** Overrides of a config that the command line can give. */
36
65
  export type PrepareOptions = {
37
66
  /** Scope the run to this state instead of the config's. */
38
67
  state?: string;
39
68
  };
40
- /** Load, lint and plan a config without running anything. */
69
+ /**
70
+ * Loads, lints and plans a config without running anything (what `atlas lint` and `atlas plan` do).
71
+ *
72
+ * @param baseDirectory what a relative `config.specs` resolves against.
73
+ * @returns the loaded `bundle`; `lint` (findings, composition and graph, including `implemented`
74
+ * findings for what the implementation lacks); the run's `scope`; the `plan` (paths, journeys, seeds,
75
+ * `unreachable`); and the resolved `specs` directory.
76
+ * @throws Error when the specs cannot be loaded or composed, when a seed's `shows` is not active where
77
+ * it starts, or when a seed's `for` names an event no state handles. Lint findings are returned,
78
+ * not thrown.
79
+ */
41
80
  export declare function prepare<C>(config: AtlasConfig<C>, baseDirectory?: string, options?: PrepareOptions): {
42
81
  bundle: import('./index.js').SpecBundle;
43
82
  lint: {
@@ -82,22 +121,41 @@ export declare function prepare<C>(config: AtlasConfig<C>, baseDirectory?: strin
82
121
  };
83
122
  specs: string;
84
123
  };
124
+ /** The options of `atlas run` that `runConfig` accepts; each overrides the config's own setting. */
85
125
  export type RunCommandOptions = PrepareOptions & {
126
+ /** `fast` when omitted. */
86
127
  mode?: RunMode;
87
128
  /** Only these paths, by id. */
88
129
  paths?: string[];
89
130
  /** Only paths that start from these seeds ("start" for paths that `setup` starts). */
90
131
  seeds?: string[];
132
+ /** Whether a failed path runs again to tell flaky from broken; true unless `false`. */
91
133
  retry?: boolean;
134
+ /** Where the run is written; the config's `output`, else `atlas-runs`. */
92
135
  output?: string;
136
+ /** Path attempts at once; the config's `workers`, else one per CPU, always capped by the driver. */
93
137
  workers?: number;
94
138
  /** Run one shard of the plan; `atlas merge` composes the shards. */
95
139
  shard?: Shard;
96
140
  /** Keep the passed paths of this run (or the newest run, with "latest") and run the rest. */
97
141
  reuse?: string;
142
+ /** Receives progress lines; stdout when omitted. */
98
143
  log?: (line: string) => void;
99
144
  };
100
- /** Run a config end to end and write its manifest and reports. */
145
+ /**
146
+ * Runs a config end to end and writes the run (manifest, reports, media) under its output
147
+ * directory, like `atlas run`.
148
+ *
149
+ * Refuses to start (throws) when the spec has any structural lint finding (everything but missing
150
+ * implementations, which just block paths) or when a `targets` URL is not on the privacy allow-list.
151
+ * Then it calls `beforeRun`, creates the driver and runs the planned paths (filtered by
152
+ * `options.paths`/`seeds`/`shard`, reusing earlier passes when `options.reuse` is set).
153
+ *
154
+ * @returns what `runPaths` returns: the run directory, the manifest and `ok` (false if any path
155
+ * failed or the privacy scan found something).
156
+ * @throws Error also when `reuse` names a run with no outcomes or there is no earlier run for `latest`.
157
+ * @see docs/statecharts.md
158
+ */
101
159
  export declare function runConfig<C>(config: AtlasConfig<C>, options?: RunCommandOptions, baseDirectory?: string): Promise<{
102
160
  runDir: string;
103
161
  manifest: {
@@ -285,7 +343,15 @@ export declare function runConfig<C>(config: AtlasConfig<C>, options?: RunComman
285
343
  };
286
344
  ok: boolean;
287
345
  }>;
288
- /** Compose runs of a config (its shards, or a rerun and the run before it) into one run. */
346
+ /**
347
+ * Composes runs of a config (its shards, or a rerun and the run before it) into one new run
348
+ * under the output directory, like `atlas merge`. The plan is recomputed from the config, so the runs
349
+ * must come from the same specs, implementation and seeds.
350
+ *
351
+ * @param runDirs the run directories to compose; later ones win when two ran the same path.
352
+ * @returns what `mergeRuns` returns: the new run directory, its manifest and `ok`.
353
+ * @throws Error when a run directory has no `outcomes.json`.
354
+ */
289
355
  export declare function mergeConfigRuns<C>(config: AtlasConfig<C>, runDirs: string[], options?: PrepareOptions & {
290
356
  output?: string;
291
357
  }, baseDirectory?: string): {
@@ -1,3 +1,14 @@
1
+ /**
2
+ * @module Config and programmatic API
3
+ *
4
+ * The user-facing entry point: `defineConfig` types a project's `atlas.config.ts`, and `prepare`,
5
+ * `runConfig` and `mergeConfigRuns` are the programmatic equivalents of `atlas lint`/`plan`, `atlas
6
+ * run` and `atlas merge`. They wire the pieces together (load specs, lint, scope, plan, run) and add
7
+ * no behaviour of their own beyond validating the config against the spec. Relative paths in a config
8
+ * resolve against the `baseDirectory` argument (the config file's directory when called by the CLI).
9
+ *
10
+ * @see docs/statecharts.md
11
+ */
1
12
  import { availableParallelism } from 'node:os';
2
13
  import path from 'node:path';
3
14
  import { lintBundle } from './lint.js';
@@ -5,10 +16,37 @@ import { chartScope, planChart } from './plan.js';
5
16
  import { assertAllowedTarget, mergePrivacy } from './privacy.js';
6
17
  import { latestRun, mergeRuns, readOutcomes, runPaths, shardPaths } from './run/execute.js';
7
18
  import { loadSpecDirectory } from './spec/load.js';
19
+ /**
20
+ * Declares an Atlas config with types, returning it unchanged. Put it as the default export of
21
+ * `atlas.config.ts`; the CLI loads the file with `tsx` and defaults to `atlas.config.ts` in the
22
+ * current directory.
23
+ *
24
+ * @see docs/statecharts.md
25
+ *
26
+ * @example
27
+ * export default defineConfig({
28
+ * specs: './specs',
29
+ * driver: () => functionDriver(() => new TodoModel()),
30
+ * implementation: {
31
+ * events: { 'Adds a todo': { kind: 'user', how: 'Calls add().', run: async (model) => model.add('x') } },
32
+ * states: { 'No todos': { recognize: async (model) => ({ matched: model.count === 0, signals: [] }) } }
33
+ * }
34
+ * });
35
+ */
8
36
  export function defineConfig(config) {
9
37
  return config;
10
38
  }
11
- /** Load, lint and plan a config without running anything. */
39
+ /**
40
+ * Loads, lints and plans a config without running anything (what `atlas lint` and `atlas plan` do).
41
+ *
42
+ * @param baseDirectory what a relative `config.specs` resolves against.
43
+ * @returns the loaded `bundle`; `lint` (findings, composition and graph, including `implemented`
44
+ * findings for what the implementation lacks); the run's `scope`; the `plan` (paths, journeys, seeds,
45
+ * `unreachable`); and the resolved `specs` directory.
46
+ * @throws Error when the specs cannot be loaded or composed, when a seed's `shows` is not active where
47
+ * it starts, or when a seed's `for` names an event no state handles. Lint findings are returned,
48
+ * not thrown.
49
+ */
12
50
  export function prepare(config, baseDirectory = process.cwd(), options = {}) {
13
51
  const specs = path.resolve(baseDirectory, config.specs);
14
52
  const bundle = loadSpecDirectory(specs);
@@ -60,7 +98,20 @@ const contextOf = (config, prepared) => ({
60
98
  ...(config.privacy ? { privacy: config.privacy } : {}),
61
99
  ...(config.environment ? { environment: config.environment } : {})
62
100
  });
63
- /** Run a config end to end and write its manifest and reports. */
101
+ /**
102
+ * Runs a config end to end and writes the run (manifest, reports, media) under its output
103
+ * directory, like `atlas run`.
104
+ *
105
+ * Refuses to start (throws) when the spec has any structural lint finding (everything but missing
106
+ * implementations, which just block paths) or when a `targets` URL is not on the privacy allow-list.
107
+ * Then it calls `beforeRun`, creates the driver and runs the planned paths (filtered by
108
+ * `options.paths`/`seeds`/`shard`, reusing earlier passes when `options.reuse` is set).
109
+ *
110
+ * @returns what `runPaths` returns: the run directory, the manifest and `ok` (false if any path
111
+ * failed or the privacy scan found something).
112
+ * @throws Error also when `reuse` names a run with no outcomes or there is no earlier run for `latest`.
113
+ * @see docs/statecharts.md
114
+ */
64
115
  export async function runConfig(config, options = {}, baseDirectory = process.cwd()) {
65
116
  const prepared = prepare(config, baseDirectory, options);
66
117
  const structural = prepared.lint.findings.filter((f) => f.rule !== 'implemented');
@@ -93,7 +144,15 @@ export async function runConfig(config, options = {}, baseDirectory = process.cw
93
144
  ...(options.log ? { log: options.log } : {})
94
145
  });
95
146
  }
96
- /** Compose runs of a config (its shards, or a rerun and the run before it) into one run. */
147
+ /**
148
+ * Composes runs of a config (its shards, or a rerun and the run before it) into one new run
149
+ * under the output directory, like `atlas merge`. The plan is recomputed from the config, so the runs
150
+ * must come from the same specs, implementation and seeds.
151
+ *
152
+ * @param runDirs the run directories to compose; later ones win when two ran the same path.
153
+ * @returns what `mergeRuns` returns: the new run directory, its manifest and `ok`.
154
+ * @throws Error when a run directory has no `outcomes.json`.
155
+ */
97
156
  export function mergeConfigRuns(config, runDirs, options = {}, baseDirectory = process.cwd()) {
98
157
  const prepared = prepare(config, baseDirectory, options);
99
158
  return mergeRuns(contextOf(config, prepared), prepared.plan.paths, runDirs.map((d) => path.resolve(d)), { outputRoot: path.resolve(baseDirectory, options.output ?? config.output ?? 'atlas-runs') });
@@ -11,11 +11,32 @@ export type CloudEvent = {
11
11
  data?: unknown;
12
12
  [extension: string]: unknown;
13
13
  };
14
- /** Parse an HTTP delivery in either CloudEvents content mode (structured, binary or batch). */
14
+ /**
15
+ * Parses an HTTP delivery in any CloudEvents content mode: structured (`application/cloudevents+json`),
16
+ * batch (`application/cloudevents-batch+json`) or binary (`ce-*` headers, with the body as `data`).
17
+ * A request with none of those (no `ce-type` header and a different content type) yields no events.
18
+ * In binary mode a missing `ce-id` becomes a random UUID and a missing `ce-source` becomes `unknown`;
19
+ * other `ce-*` headers become extension attributes; the body is parsed as JSON when the content type
20
+ * says JSON and it parses, else kept as text.
21
+ *
22
+ * @param headers lower-cased header names, as Node's `IncomingMessage.headers`.
23
+ * @throws SyntaxError when a structured or batch body is not valid JSON.
24
+ */
15
25
  export declare function cloudEventsFromHttp(headers: Record<string, string | string[] | undefined>, body: string): CloudEvent[];
16
26
  /**
17
- * An HTTP endpoint the system under test sends CloudEvents to (any content mode). Point the
18
- * product's event bus, webhook relay or OpenTelemetry collector's CloudEvents exporter at it.
27
+ * Starts an HTTP endpoint the system under test sends CloudEvents to (any content mode). Point the
28
+ * product's event bus, webhook relay or OpenTelemetry collector's CloudEvents exporter at its `url`.
29
+ *
30
+ * It answers every valid POST with 202 and an unparseable delivery with 400, and keeps events in
31
+ * memory. It does no authentication and listens on `127.0.0.1` unless `host` says otherwise, so
32
+ * only the local machine can reach it by default. `mark()` is the number of events received so far.
33
+ * Call `close()` to stop the server; `runPaths` does that for the sources it is given.
34
+ *
35
+ * @param options.port the port to listen on; an unused port when omitted (read the real one from `url`).
36
+ * @param options.host the interface to listen on; `127.0.0.1` when omitted.
37
+ *
38
+ * @example
39
+ * eventSources: async () => [await cloudEventsHttpSource({ port: 4318 })]
19
40
  */
20
41
  export declare function cloudEventsHttpSource(options?: {
21
42
  port?: number;
@@ -23,20 +44,38 @@ export declare function cloudEventsHttpSource(options?: {
23
44
  }): Promise<EventSource & {
24
45
  url: string;
25
46
  }>;
26
- /** Lines appended to a log file during a step, for products whose only event stream is a log. */
47
+ /**
48
+ * An event source for products whose only event stream is a log file: `collect` returns the text
49
+ * appended to the file since `mark` (match it with an `{ pattern }` matcher), and no CloudEvents.
50
+ *
51
+ * `mark()` is the file's size in bytes (0 when it does not exist). `collect` first waits `settleMs`
52
+ * for the product to write, then reads from the mark to the end of the file; a missing or
53
+ * unreadable file gives empty text, and a file that was truncated or rotated since the mark is not
54
+ * detected. The source's name starts with `log:`, which is how the runner tells it from a CloudEvents source.
55
+ *
56
+ * @param file the log file path.
57
+ * @param options.settleMs how long `collect` waits before reading, in milliseconds; 1000 when omitted.
58
+ */
27
59
  export declare function logFileSource(file: string, options?: {
28
60
  settleMs?: number;
29
61
  }): EventSource;
62
+ /** The outcome of comparing a state's expected business events with what the sources collected. */
30
63
  export type BusinessEventResult = {
64
+ /** The names listed in the state's `meta.events`. */
31
65
  expected: string[];
66
+ /** Expected names that a matcher (or a CloudEvent of that type) confirmed. */
32
67
  observed: string[];
68
+ /** Expected names that could be observed but were not. */
33
69
  missing: string[];
70
+ /** Expected names with no way to be observed (no matcher and no CloudEvents source). Not a failure. */
34
71
  noSignal: string[];
72
+ /** The CloudEvents collected for this step. */
35
73
  events: CloudEvent[];
36
74
  };
37
75
  /**
38
- * Keep what belongs to one attempt when attempts run side by side: events and log lines that
39
- * mention one of its correlation ids. With no ids, everything is kept.
76
+ * Keeps what belongs to one attempt when attempts run side by side: events (whose JSON mentions an
77
+ * id) and log lines that contain one of its correlation ids. Empty ids are ignored; with no ids,
78
+ * everything is kept.
40
79
  */
41
80
  export declare function correlated(collected: {
42
81
  events: CloudEvent[];
@@ -46,9 +85,15 @@ export declare function correlated(collected: {
46
85
  text: string;
47
86
  };
48
87
  /**
49
- * Compare the business events a state expects with what the sources saw. A business event is
50
- * observed when its matcher matches; with no matcher, a CloudEvent whose `type` equals the name.
51
- * Events with neither a matcher nor any CloudEvents source are "no signal", never "missing".
88
+ * Compares the business events a state expects with what the sources saw, sorting each expected
89
+ * name into `observed`, `missing` or `noSignal`. A business event is observed when its matcher
90
+ * matches (a function gets the events and log text; `{ type }` compares CloudEvent types;
91
+ * `{ pattern }` tests the log text); with no matcher, when a CloudEvent's `type` equals the name.
92
+ * With neither a matcher nor any CloudEvents source (`hasCloudEvents` false) it is "no signal",
93
+ * never "missing". Pure.
94
+ *
95
+ * @param matchers matchers by business event name.
96
+ * @param hasCloudEvents whether any non-log source was configured.
52
97
  */
53
98
  export declare function compareBusinessEvents(expected: string[], collected: {
54
99
  events: CloudEvent[];