@crvouga/atlas 0.3.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 (429) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +178 -604
  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 +40 -4
  94. package/dist/reports/src/evidence-live.js +52 -4
  95. package/dist/reports/src/evidence-types.d.ts +70 -1
  96. package/dist/reports/src/evidence-types.js +5 -1
  97. package/dist/reports/src/evidence-view.d.ts +58 -6
  98. package/dist/reports/src/evidence-view.js +44 -5
  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 +48 -0
  134. package/dist/reports/src/layer-axes.js +71 -0
  135. package/dist/reports/src/layer-catalog.d.ts +28 -1
  136. package/dist/reports/src/layer-catalog.js +19 -2
  137. package/dist/reports/src/layer-merge.d.ts +98 -9
  138. package/dist/reports/src/layer-merge.js +154 -33
  139. package/dist/reports/src/layer-source.d.ts +18 -0
  140. package/dist/reports/src/layer-source.js +14 -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 +34 -1
  144. package/dist/reports/src/layers-route.d.ts +47 -4
  145. package/dist/reports/src/layers-route.js +88 -12
  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 +30 -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 +44 -9
  175. package/dist/reports/src/publish.js +40 -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 +40 -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 +33 -5
  329. package/packages/core/README.md +2 -1
  330. package/packages/reports/README.md +69 -2
  331. package/packages/reports/STORAGE.md +5 -1
  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 +27 -5
  361. package/packages/visualizer/example/specs/coffee/ordering/cart.qnt +7 -0
  362. package/packages/visualizer/example/specs/coffee/ordering/checkout.openslo.yaml +10 -0
  363. package/packages/visualizer/example/specs/coffee/ordering/drink-price.dmn +24 -0
  364. package/packages/visualizer/example/specs/coffee/ordering/loyalty.feature +7 -0
  365. package/packages/visualizer/example/specs/coffee/ordering/ordering.feature +36 -0
  366. package/packages/visualizer/example/specs/coffee/ordering/payment.als +4 -0
  367. package/packages/visualizer/fixtures/failures/specs/coffee/ordering/cart.qnt +7 -0
  368. package/packages/visualizer/fixtures/failures/specs/coffee/ordering/checkout.openslo.yaml +10 -0
  369. package/packages/visualizer/fixtures/failures/specs/coffee/ordering/drink-price.dmn +24 -0
  370. package/packages/visualizer/fixtures/failures/specs/coffee/ordering/loyalty.feature +7 -0
  371. package/packages/visualizer/fixtures/failures/specs/coffee/ordering/ordering.feature +36 -0
  372. package/packages/visualizer/fixtures/failures/specs/coffee/ordering/payment.als +4 -0
  373. package/packages/visualizer/fixtures/full/specs/coffee/ordering/cart.qnt +7 -0
  374. package/packages/visualizer/fixtures/full/specs/coffee/ordering/checkout.openslo.yaml +10 -0
  375. package/packages/visualizer/fixtures/full/specs/coffee/ordering/drink-price.dmn +24 -0
  376. package/packages/visualizer/fixtures/full/specs/coffee/ordering/loyalty.feature +7 -0
  377. package/packages/visualizer/fixtures/full/specs/coffee/ordering/ordering.feature +36 -0
  378. package/packages/visualizer/fixtures/full/specs/coffee/ordering/payment.als +4 -0
  379. package/packages/visualizer/fixtures/malformed/specs/coffee/ordering/cart.qnt +7 -0
  380. package/packages/visualizer/fixtures/malformed/specs/coffee/ordering/checkout.openslo.yaml +10 -0
  381. package/packages/visualizer/fixtures/malformed/specs/coffee/ordering/drink-price.dmn +24 -0
  382. package/packages/visualizer/fixtures/malformed/specs/coffee/ordering/loyalty.feature +7 -0
  383. package/packages/visualizer/fixtures/malformed/specs/coffee/ordering/ordering.feature +36 -0
  384. package/packages/visualizer/fixtures/malformed/specs/coffee/ordering/payment.als +4 -0
  385. package/packages/visualizer/fixtures/partial/specs/coffee/ordering/cart.qnt +7 -0
  386. package/packages/visualizer/fixtures/partial/specs/coffee/ordering/checkout.openslo.yaml +10 -0
  387. package/packages/visualizer/fixtures/partial/specs/coffee/ordering/drink-price.dmn +24 -0
  388. package/packages/visualizer/fixtures/partial/specs/coffee/ordering/loyalty.feature +7 -0
  389. package/packages/visualizer/fixtures/partial/specs/coffee/ordering/ordering.feature +36 -0
  390. package/packages/visualizer/fixtures/partial/specs/coffee/ordering/payment.als +4 -0
  391. package/packages/visualizer/fixtures/removed/specs/coffee/ordering/cart.qnt +7 -0
  392. package/packages/visualizer/fixtures/removed/specs/coffee/ordering/checkout.openslo.yaml +10 -0
  393. package/packages/visualizer/fixtures/removed/specs/coffee/ordering/drink-price.dmn +24 -0
  394. package/packages/visualizer/fixtures/removed/specs/coffee/ordering/loyalty.feature +7 -0
  395. package/packages/visualizer/fixtures/removed/specs/coffee/ordering/ordering.feature +36 -0
  396. package/packages/visualizer/fixtures/removed/specs/coffee/ordering/payment.als +4 -0
  397. package/packages/visualizer/fixtures/spec-only/specs/coffee/ordering/cart.qnt +7 -0
  398. package/packages/visualizer/fixtures/spec-only/specs/coffee/ordering/checkout.openslo.yaml +10 -0
  399. package/packages/visualizer/fixtures/spec-only/specs/coffee/ordering/drink-price.dmn +24 -0
  400. package/packages/visualizer/fixtures/spec-only/specs/coffee/ordering/loyalty.feature +7 -0
  401. package/packages/visualizer/fixtures/spec-only/specs/coffee/ordering/ordering.feature +36 -0
  402. package/packages/visualizer/fixtures/spec-only/specs/coffee/ordering/payment.als +4 -0
  403. package/packages/visualizer/scripts/make-fixtures.ts +2 -0
  404. package/packages/visualizer/scripts/publish-data.ts +1 -2
  405. package/packages/visualizer/src/app/AppShell.tsx +9 -2
  406. package/packages/visualizer/src/app/report-sources.tsx +6 -4
  407. package/packages/visualizer/src/app/router.tsx +3 -3
  408. package/packages/visualizer/src/components/Header.module.css +35 -0
  409. package/packages/visualizer/src/components/Header.tsx +41 -4
  410. package/packages/visualizer/src/data/adapters/adapter.ts +5 -17
  411. package/packages/visualizer/src/data/adapters/index.ts +10 -1
  412. package/packages/visualizer/src/evidence/api.ts +14 -2
  413. package/packages/visualizer/src/evidence/artifacts.module.css +213 -0
  414. package/packages/visualizer/src/evidence/artifacts.tsx +272 -0
  415. package/packages/visualizer/src/evidence/check-detail.tsx +38 -4
  416. package/packages/visualizer/src/evidence/evidence-context.tsx +74 -12
  417. package/packages/visualizer/src/evidence/evidence.module.css +20 -0
  418. package/packages/visualizer/src/evidence/marks.tsx +2 -0
  419. package/packages/visualizer/src/evidence/overview.tsx +3 -3
  420. package/packages/visualizer/src/evidence/sources-panel.tsx +88 -34
  421. package/packages/visualizer/src/evidence/spec-page.tsx +23 -16
  422. package/packages/visualizer/src/find/Finder.tsx +1 -7
  423. package/packages/visualizer/src/find/open.ts +4 -0
  424. package/packages/visualizer/src/live/live-stream.ts +204 -0
  425. package/packages/visualizer/src/runtime.ts +19 -0
  426. package/packages/visualizer/src/state/ui-store.ts +6 -2
  427. package/packages/visualizer/vite/atlas-server-proxy.ts +36 -0
  428. package/packages/visualizer/vite/example-reports.ts +475 -0
  429. package/packages/visualizer/vite.config.ts +18 -2
@@ -0,0 +1,242 @@
1
+ # Evidence: attachments, timelines, snapshots and everything else
2
+
3
+ Atlas is opinionated about **specs** and open about **evidence**.
4
+
5
+ - A *spec* says what the product should do, in a notation Atlas knows how to read and show: statecharts,
6
+ Gherkin, Quint, DMN, Alloy, OpenSLO. That list is short on purpose, and each notation gets a real view.
7
+ - *Evidence* is what a test run left behind. It is open-ended, because every framework leaves something
8
+ different: a screenshot, a video, a Playwright trace, a HAR, a DOM or accessibility snapshot, a console
9
+ log, a flame graph, a coverage map, a diff, a timeline of requests. Atlas stores any of it, shows what it
10
+ can, and keeps and offers the rest.
11
+
12
+ The format is built so that a new kind of evidence **never** needs a new version of Atlas to be recorded, and
13
+ never breaks anyone who has not upgraded. This page is the model and the rules that guarantee it.
14
+
15
+ - [What a result can carry](#what-a-result-can-carry)
16
+ - [The rules that keep it compatible, forever](#the-rules-that-keep-it-compatible-forever)
17
+ - [Attach evidence](#attach-evidence)
18
+ - [What each part looks like](#what-each-part-looks-like)
19
+ - [Adding something new](#adding-something-new)
20
+
21
+ ## What a result can carry
22
+
23
+ A check is a result: an `id`, a `status`, a `title`, and a `detail`. Beyond that, a check (and a layer, and a part) may
24
+ carry any of these. Every one is optional.
25
+
26
+ | Field | What it is |
27
+ | --- | --- |
28
+ | `attachments[]` | Files and values: a screenshot, a video, a trace, a log, a snapshot, a HAR, a report. Any media type. |
29
+ | `steps[]` | A timeline: what happened, in order, with timing, nested with `parentId`. |
30
+ | `annotations[]` | Notes about the result: a warning, a deprecation, an accessibility finding, a coverage figure. |
31
+ | `attempts[]` | Every try, when the check was retried. |
32
+ | `tags[]` | Free labels to filter by: `smoke`, `payments`. |
33
+ | `labels{}` | Facts about the result that are not its identity: `owner`, `severity`, `browser`, `build`. |
34
+ | `links[]` | Where to read more: the CI run, the issue, the trace viewer. |
35
+ | `extensions{}` | Structured data of your own or a tool's, under a name you own. |
36
+ | `measurements[]` | Numbers, with units and an allowance (already part of the contract). |
37
+
38
+ On a **layer** the same fields describe the whole run: its CI log, a coverage report, an archive of traces, the
39
+ build number, a link to the pipeline.
40
+
41
+ ```json
42
+ {
43
+ "id": "specs/checkout.feature > Pays by card",
44
+ "title": "Pays by card",
45
+ "status": "failed",
46
+ "detail": "expected a receipt",
47
+ "tags": ["smoke"],
48
+ "labels": { "owner": "payments-team", "browser": "chromium" },
49
+ "steps": [
50
+ { "id": "open", "name": "Open the cart", "kind": "action", "status": "passed", "offsetMs": 0, "durationMs": 800 },
51
+ { "id": "req", "parentId": "open", "name": "GET /cart", "kind": "request", "status": "passed", "offsetMs": 20, "durationMs": 120 },
52
+ { "name": "Pay", "kind": "action", "status": "failed", "offsetMs": 900, "durationMs": 3000, "detail": "timeout",
53
+ "attachments": [{ "name": "failure.png", "role": "screenshot", "contentType": "image/png", "bundleKey": "attachments/<sha256>" }] }
54
+ ],
55
+ "attachments": [
56
+ { "name": "run.webm", "role": "video", "contentType": "video/webm", "bundleKey": "attachments/<sha256>", "durationMs": 4200 },
57
+ { "name": "trace.zip", "role": "trace", "contentType": "application/zip", "uri": "https://artifacts.example.com/trace.zip" }
58
+ ],
59
+ "annotations": [{ "type": "accessibility", "level": "warning", "message": "Low contrast on Pay", "source": { "file": "src/pay.tsx", "line": 12 } }],
60
+ "attempts": [{ "index": 0, "status": "failed" }, { "index": 1, "status": "failed" }],
61
+ "extensions": { "com.example.coverage": { "lines": 0.82 } }
62
+ }
63
+ ```
64
+
65
+ The complete reference, with every field, is the JSON Schema
66
+ [`layer.schema.json`](../packages/schema/schemas/layer.schema.json) (what a stored layer is) and
67
+ [`publish-checks.schema.json`](../packages/schema/schemas/publish-checks.schema.json) (what you hand to
68
+ `publishChecks` or `atlas report publish --checks`, where an attachment may name a `path` or carry `data`).
69
+
70
+ ## The rules that keep it compatible, forever
71
+
72
+ These are part of [the report contract](report-contract.md#versioning-and-stability). They are why a layer
73
+ written today is readable by every Atlas to come, and a layer written by a future Atlas is readable today.
74
+
75
+ 1. **Everything new is optional.** A layer with none of the fields above is as valid as it has ever been. No
76
+ field is ever made required, renamed, removed, or given a different meaning.
77
+ 2. **Every object is open.** A reader keeps and ignores fields it does not know, at every level: layer, part,
78
+ check, step, attachment, annotation, measurement. A field added next year survives a read by an Atlas that
79
+ does not know it, and a copy carries it along.
80
+ 3. **Vocabularies are open strings.** `role`, `kind`, `type`, `level`, a step's `status` and the `kind` of a
81
+ part have conventional values (below), not a list. A value nobody has heard of is shown generically, and
82
+ never rejected.
83
+ 4. **Only three things are closed**, and they will stay so: a check's `status` (`passed`, `failed`, `running`,
84
+ `not-run`), `freshness`, and `schemaVersion`. Everything that decides a result is in those. Anything richer
85
+ goes in evidence.
86
+ 5. **`extensions` is yours.** Put structured data of your own under a key you own: a reverse domain
87
+ (`com.example.coverage`) or your tool's name (`io.playwright`). Readers preserve it, show it as raw data, and
88
+ never fail on it. Two tools cannot collide, because each uses its own name.
89
+ 6. **Evidence never decides a result.** A status, a slot and a winner never depend on an attachment, a step or an
90
+ annotation. A reader that cannot read a piece of evidence drops *that piece* and keeps the check, its status
91
+ and the rest of its evidence. A broken screenshot reference never turns a pass into an unknown.
92
+ 7. **Bytes are by reference.** A layer holds files as `bundleKey` (stored in the layer, by content, once), `uri`
93
+ (somewhere else), or a short inline `text`. Producers never need to know how files are stored.
94
+ 8. **New kinds of evidence are data.** Recording a new role, media type, annotation type or extension namespace needs no
95
+ change to Atlas. Showing it nicely needs one renderer, and until then it is listed with its name and a
96
+ download.
97
+
98
+ Two checks guard this in the repository: `packages/reports/tests/fixtures/layer-v1-extended.json` (a layer carrying
99
+ every kind of evidence and values from the future) and `layer-extensibility.test.ts`, which proves unknown
100
+ fields survive at every level, malformed evidence is dropped without losing the result, and a reader of the
101
+ first version of the format still reads it all.
102
+
103
+ ## Attach evidence
104
+
105
+ ### From the command line
106
+
107
+ ```sh
108
+ # Files a CTRF report names (attachments, a base64 screenshot, stdout and stderr, steps, retries, tags) are
109
+ # read from the report's own folder and stored in the layer.
110
+ atlas report publish --producer e2e --ctrf ctrf-report.json --environment desktop-web
111
+
112
+ # Files and facts about the whole run.
113
+ atlas report publish --producer e2e --junit out.xml \
114
+ --attach ci.log --attach trace=playwright-traces.zip \
115
+ --label build=4821 --label browser=chromium --link 'CI=https://ci.example.com/runs/42'
116
+ ```
117
+
118
+ - `--attach <file>` attaches a file to the whole layer. `--attach <role>=<file>` also gives it a role.
119
+ - `--label key=value` and `--link [name=]<url>` add facts and links about the run.
120
+ - A file the report names that cannot be found, is not allowed, or is over `--max-attachment-mb` (512) is skipped
121
+ with a warning; the results are still published. All the files of one publish together are limited by
122
+ `--max-total-attachment-mb` (2048), because they are held in memory while stored.
123
+ - **A report is data from a test run, not instructions.** The files it names are read only from its own folder
124
+ and from each `--attach-root <dir>` you give; never a hidden file (`.env`, `.aws`, `.git`), never a link that
125
+ leads out, never an absolute path elsewhere. Otherwise a test could print
126
+ `[[ATTACHMENT|/home/runner/.aws/credentials]]` and have it uploaded. What you type with `--attach` is yours to
127
+ choose, and is read as written.
128
+ - CTRF is mapped completely: `steps`, `attachments`, `screenshot`, `stdout`, `stderr`, `retryAttempts`, `tags`,
129
+ `browser`, `device`, `flaky`, `snippet` and `extra`. JUnit gives each test its `<system-out>`, `<system-err>`,
130
+ `<properties>` and Jenkins `[[ATTACHMENT|path]]` lines. An Atlas run gives each path its steps.
131
+
132
+ ### From a checks file
133
+
134
+ For anything else, write what you have. `path` is read relative to the file; the same screenshot used twice is
135
+ stored once.
136
+
137
+ ```json
138
+ {
139
+ "producer": "playwright",
140
+ "environment": "desktop-web",
141
+ "recordedAtMs": 1760000000000,
142
+ "labels": { "build": "4821" },
143
+ "checks": [
144
+ {
145
+ "id": "specs/checkout.feature > Pays by card",
146
+ "title": "Pays by card",
147
+ "status": "failed",
148
+ "detail": "expected a receipt",
149
+ "specPath": "specs/checkout.feature",
150
+ "tags": ["smoke"],
151
+ "steps": [
152
+ { "id": "open", "name": "Open the cart", "kind": "action", "status": "passed", "offsetMs": 0, "durationMs": 800 },
153
+ { "name": "Pay", "kind": "action", "status": "failed", "offsetMs": 900, "durationMs": 3000, "attachments": [{ "name": "failure.png", "role": "screenshot", "path": "evidence/failure.png" }] }
154
+ ],
155
+ "attachments": [
156
+ { "name": "run.webm", "role": "video", "path": "evidence/run.webm" },
157
+ { "name": "console.log", "role": "log", "text": "warn: slow response" }
158
+ ],
159
+ "annotations": [{ "type": "accessibility", "level": "warning", "message": "Low contrast on Pay" }],
160
+ "extensions": { "io.playwright": { "retries": 1 } }
161
+ }
162
+ ]
163
+ }
164
+ ```
165
+
166
+ ### From code
167
+
168
+ ```ts
169
+ import { publishChecks } from '@crvouga/atlas/reports/publish-checks';
170
+
171
+ await publishChecks(store, {
172
+ producer: 'e2e',
173
+ recordedAtMs: Date.now(),
174
+ checks: [{
175
+ id: 'pay', title: 'Pays by card', status: 'failed',
176
+ attachments: [
177
+ { name: 'failure.png', role: 'screenshot', data: await Bun.file('failure.png').bytes() }, // bytes: stored in the layer
178
+ { name: 'trace.zip', role: 'trace', uri: 'https://artifacts.example.com/trace.zip' } // elsewhere: a reference
179
+ ],
180
+ steps: [{ name: 'Pay', kind: 'action', status: 'failed', offsetMs: 900, durationMs: 3000 }],
181
+ extensions: { 'com.example.cost': { cents: 3 } }
182
+ }]
183
+ });
184
+ ```
185
+
186
+ Give bytes as `data` (or `base64`, or a long `text`); the publisher stores them in the layer by content,
187
+ fills in `bundleKey`, `bytes` and `sha256`, and removes what you handed over. Identical files are stored once.
188
+ Publishing the same input twice writes the same layer.
189
+
190
+ ## What each part looks like
191
+
192
+ **Attachments** are shown by what they are, from their media type:
193
+
194
+ | Media type | Shown as |
195
+ | --- | --- |
196
+ | `image/*` | A picture, opening full size |
197
+ | `video/*` | A video with controls, seekable (range requests) |
198
+ | `audio/*` | An audio player |
199
+ | `text/html` | A page snapshot in a frame with no permissions: nothing in it can run |
200
+ | `application/pdf` | A frame |
201
+ | `text/*`, JSON, XML, YAML | The text, pretty-printed for JSON, up to 200 000 characters |
202
+ | anything else | Its name, its role, its type and size, and a download |
203
+
204
+ Attachment bytes are served as untrusted: never sniffed, with a sandboxing policy, never embeddable by another site.
205
+ An attachment's `uri` is followed only if it is an `http` or `https` address.
206
+
207
+ **Steps** are a flat list: order them by `offsetMs`, nest them by `parentId`. Whatever your framework calls them
208
+ (actions, hooks, requests, spans, Given/When/Then) they fit. **Annotations** show their `level` (`info`,
209
+ `warning`, `error`; any other level is shown as written) and where in the source they point.
210
+ **Extensions** you add appear as raw data under the result, so nothing a tool recorded is out of reach.
211
+
212
+ Conventional values, in case you want to be understood by others: attachment `role`: `screenshot`, `video`,
213
+ `trace`, `log`, `snapshot`, `har`, `coverage`, `diff`, `report`, `captions`. Step `kind`: `action`,
214
+ `assertion`, `hook`, `request`, `span`, `given`, `when`, `then`. Step `status`: `passed`, `failed`, `skipped`.
215
+ Annotation `type`: `note`, `warning`, `deprecation`, `issue`, `accessibility`, `coverage`.
216
+
217
+ ## Adding something new
218
+
219
+ | You want to record | Do |
220
+ | --- | --- |
221
+ | A kind of file Atlas has never seen | Attach it with its media type and a `role`. It is stored and offered for download today. |
222
+ | Structured data of your own | Put it in `extensions` under a name you own. It is kept, and shown as raw data. |
223
+ | A new annotation type, role or step kind | Use it. Open vocabularies need no registration. |
224
+ | Something that should be shown well | Ask for a renderer (below). |
225
+ | A field every tool should have | Open an issue. It is added as an optional field, and the rules above guarantee nothing breaks. |
226
+
227
+ **A renderer** is one entry in the viewer's list (`artifactRenderers` in
228
+ `packages/visualizer/src/evidence/artifacts.tsx`): how to show an attachment of a media type. The first one that
229
+ matches wins:
230
+
231
+ ```tsx
232
+ registerArtifactRenderer({
233
+ id: 'flamegraph',
234
+ matches: (attachment, mediaType) => mediaType === 'application/x-flamegraph',
235
+ render: (attachment, { url }) => <FlameGraph src={url} />
236
+ });
237
+ ```
238
+
239
+ The viewer is part of Atlas, so a renderer for a new media type is a contribution to Atlas: file an issue
240
+ ([reporting issues](reporting-issues.md)) with a sample file. Until it lands, the attachment is still stored,
241
+ listed with its name, role, type and size, and offered for download, and everything else about the result is
242
+ unaffected.