@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.
- package/CHANGELOG.md +12 -0
- package/README.md +178 -604
- package/dist/bun/src/driver.d.ts +41 -7
- package/dist/bun/src/driver.js +47 -6
- package/dist/bun/src/index.d.ts +8 -0
- package/dist/bun/src/index.js +8 -0
- package/dist/core/src/cli.d.ts +14 -1
- package/dist/core/src/cli.js +30 -1
- package/dist/core/src/config.d.ts +70 -4
- package/dist/core/src/config.js +62 -3
- package/dist/core/src/events/cloudevents.d.ts +54 -9
- package/dist/core/src/events/cloudevents.js +60 -9
- package/dist/core/src/graph.d.ts +21 -0
- package/dist/core/src/graph.js +26 -0
- package/dist/core/src/index.d.ts +11 -0
- package/dist/core/src/index.js +11 -0
- package/dist/core/src/lint.d.ts +30 -0
- package/dist/core/src/lint.js +13 -0
- package/dist/core/src/plan.d.ts +39 -1
- package/dist/core/src/plan.js +28 -1
- package/dist/core/src/privacy.d.ts +29 -2
- package/dist/core/src/privacy.js +19 -2
- package/dist/core/src/report/formats.d.ts +34 -4
- package/dist/core/src/report/formats.js +24 -4
- package/dist/core/src/report/markdown.d.ts +15 -0
- package/dist/core/src/report/markdown.js +8 -0
- package/dist/core/src/run/clients.d.ts +44 -5
- package/dist/core/src/run/clients.js +46 -2
- package/dist/core/src/run/execute.d.ts +69 -16
- package/dist/core/src/run/execute.js +67 -16
- package/dist/core/src/run/frames.d.ts +13 -4
- package/dist/core/src/run/frames.js +19 -4
- package/dist/core/src/run/http.d.ts +34 -1
- package/dist/core/src/run/http.js +14 -1
- package/dist/core/src/run/types.d.ts +76 -3
- package/dist/core/src/run/types.js +19 -3
- package/dist/core/src/signals.d.ts +49 -5
- package/dist/core/src/signals.js +22 -5
- package/dist/core/src/spec/compose.d.ts +23 -1
- package/dist/core/src/spec/compose.js +10 -1
- package/dist/core/src/spec/index.d.ts +9 -1
- package/dist/core/src/spec/index.js +9 -1
- package/dist/core/src/spec/load.d.ts +22 -1
- package/dist/core/src/spec/load.js +31 -1
- package/dist/core/src/spec/parse.d.ts +16 -2
- package/dist/core/src/spec/parse.js +25 -2
- package/dist/core/src/spec/scxml.d.ts +25 -4
- package/dist/core/src/spec/scxml.js +36 -4
- package/dist/core/src/spec/types.d.ts +52 -1
- package/dist/core/src/spec/types.js +24 -0
- package/dist/detox/src/index.d.ts +54 -11
- package/dist/detox/src/index.js +45 -7
- package/dist/playwright/src/driver.d.ts +39 -3
- package/dist/playwright/src/driver.js +27 -3
- package/dist/playwright/src/index.d.ts +10 -0
- package/dist/playwright/src/index.js +10 -0
- package/dist/playwright/src/media.d.ts +50 -4
- package/dist/playwright/src/media.js +55 -4
- package/dist/playwright/src/signals.d.ts +44 -5
- package/dist/playwright/src/signals.js +29 -5
- package/dist/reports/src/attachment-files.d.ts +44 -0
- package/dist/reports/src/attachment-files.js +121 -0
- package/dist/reports/src/attachment-response.d.ts +31 -0
- package/dist/reports/src/attachment-response.js +55 -0
- package/dist/reports/src/aws-credentials.d.ts +48 -0
- package/dist/reports/src/aws-credentials.js +221 -0
- package/dist/reports/src/browser-navigation.d.ts +14 -0
- package/dist/reports/src/browser-navigation.js +7 -0
- package/dist/reports/src/bundle.d.ts +34 -2
- package/dist/reports/src/bundle.js +38 -2
- package/dist/reports/src/catalog.d.ts +34 -3
- package/dist/reports/src/catalog.js +17 -3
- package/dist/reports/src/cli-stores.d.ts +36 -0
- package/dist/reports/src/cli-stores.js +73 -0
- package/dist/reports/src/clock.d.ts +7 -2
- package/dist/reports/src/clock.js +5 -2
- package/dist/reports/src/completion-order.d.ts +18 -5
- package/dist/reports/src/completion-order.js +18 -5
- package/dist/reports/src/compose.d.ts +80 -0
- package/dist/reports/src/compose.js +117 -0
- package/dist/reports/src/copy-store.d.ts +29 -0
- package/dist/reports/src/copy-store.js +52 -0
- package/dist/reports/src/directory-outline.d.ts +38 -0
- package/dist/reports/src/directory-outline.js +103 -0
- package/dist/reports/src/directory-store.d.ts +20 -0
- package/dist/reports/src/directory-store.js +166 -0
- package/dist/reports/src/doctor.d.ts +29 -0
- package/dist/reports/src/doctor.js +83 -0
- package/dist/reports/src/effective-delta.d.ts +34 -0
- package/dist/reports/src/effective-delta.js +25 -0
- package/dist/reports/src/evidence-detail.d.ts +64 -0
- package/dist/reports/src/evidence-detail.js +92 -0
- package/dist/reports/src/evidence-live.d.ts +40 -4
- package/dist/reports/src/evidence-live.js +52 -4
- package/dist/reports/src/evidence-types.d.ts +70 -1
- package/dist/reports/src/evidence-types.js +5 -1
- package/dist/reports/src/evidence-view.d.ts +58 -6
- package/dist/reports/src/evidence-view.js +44 -5
- package/dist/reports/src/explorer-types.d.ts +40 -3
- package/dist/reports/src/explorer-types.js +8 -0
- package/dist/reports/src/explorer-versions.d.ts +9 -1
- package/dist/reports/src/explorer-versions.js +18 -1
- package/dist/reports/src/export-evidence.d.ts +16 -1
- package/dist/reports/src/export-evidence.js +52 -1
- package/dist/reports/src/fetcher.d.ts +27 -3
- package/dist/reports/src/fetcher.js +11 -3
- package/dist/reports/src/format-date.d.ts +6 -0
- package/dist/reports/src/format-date.js +6 -0
- package/dist/reports/src/format.d.ts +16 -0
- package/dist/reports/src/format.js +10 -0
- package/dist/reports/src/frames.d.ts +36 -3
- package/dist/reports/src/frames.js +22 -3
- package/dist/reports/src/hash.d.ts +18 -0
- package/dist/reports/src/hash.js +13 -0
- package/dist/reports/src/host.d.ts +29 -0
- package/dist/reports/src/host.js +64 -0
- package/dist/reports/src/html-frame.d.ts +5 -6
- package/dist/reports/src/html-frame.js +12 -1
- package/dist/reports/src/http-store.d.ts +52 -0
- package/dist/reports/src/http-store.js +145 -0
- package/dist/reports/src/http.d.ts +7 -0
- package/dist/reports/src/http.js +6 -0
- package/dist/reports/src/ingest.d.ts +54 -0
- package/dist/reports/src/ingest.js +210 -0
- package/dist/reports/src/init.d.ts +40 -0
- package/dist/reports/src/init.js +364 -0
- package/dist/reports/src/junit.d.ts +33 -6
- package/dist/reports/src/junit.js +87 -21
- package/dist/reports/src/keyboard.d.ts +20 -0
- package/dist/reports/src/keyboard.js +11 -0
- package/dist/reports/src/keys.d.ts +21 -3
- package/dist/reports/src/keys.js +21 -3
- package/dist/reports/src/layer-axes.d.ts +48 -0
- package/dist/reports/src/layer-axes.js +71 -0
- package/dist/reports/src/layer-catalog.d.ts +28 -1
- package/dist/reports/src/layer-catalog.js +19 -2
- package/dist/reports/src/layer-merge.d.ts +98 -9
- package/dist/reports/src/layer-merge.js +154 -33
- package/dist/reports/src/layer-source.d.ts +18 -0
- package/dist/reports/src/layer-source.js +14 -0
- package/dist/reports/src/layer-store.d.ts +42 -0
- package/dist/reports/src/layer-store.js +63 -5
- package/dist/reports/src/layer-types.d.ts +34 -1
- package/dist/reports/src/layers-route.d.ts +47 -4
- package/dist/reports/src/layers-route.js +88 -12
- package/dist/reports/src/media-types.d.ts +11 -0
- package/dist/reports/src/media-types.js +22 -0
- package/dist/reports/src/namespace-guard.d.ts +10 -1
- package/dist/reports/src/namespace-guard.js +10 -1
- package/dist/reports/src/navigation.d.ts +12 -0
- package/dist/reports/src/navigation.js +7 -0
- package/dist/reports/src/object-io.d.ts +11 -4
- package/dist/reports/src/object-io.js +4 -4
- package/dist/reports/src/object-store-conformance.d.ts +27 -0
- package/dist/reports/src/object-store-conformance.js +87 -0
- package/dist/reports/src/object-store.d.ts +33 -24
- package/dist/reports/src/object-store.js +17 -24
- package/dist/reports/src/parse-with.d.ts +16 -0
- package/dist/reports/src/parse-with.js +14 -0
- package/dist/reports/src/performance-part.d.ts +25 -1
- package/dist/reports/src/performance-part.js +15 -1
- package/dist/reports/src/performance.d.ts +22 -2
- package/dist/reports/src/performance.js +12 -2
- package/dist/reports/src/persist.d.ts +12 -3
- package/dist/reports/src/persist.js +12 -3
- package/dist/reports/src/phone.d.ts +18 -1
- package/dist/reports/src/phone.js +18 -1
- package/dist/reports/src/protocol.d.ts +30 -4
- package/dist/reports/src/protocol.js +15 -4
- package/dist/reports/src/publication.d.ts +21 -1
- package/dist/reports/src/publication.js +21 -1
- package/dist/reports/src/publish-checks.d.ts +35 -0
- package/dist/reports/src/publish-checks.js +122 -0
- package/dist/reports/src/publish.d.ts +44 -9
- package/dist/reports/src/publish.js +40 -7
- package/dist/reports/src/read.d.ts +46 -16
- package/dist/reports/src/read.js +38 -14
- package/dist/reports/src/recording-bundle.d.ts +13 -2
- package/dist/reports/src/recording-bundle.js +4 -2
- package/dist/reports/src/recording-keys.d.ts +15 -1
- package/dist/reports/src/recording-keys.js +15 -1
- package/dist/reports/src/remote-report.d.ts +28 -7
- package/dist/reports/src/remote-report.js +15 -7
- package/dist/reports/src/report-cli.d.ts +51 -0
- package/dist/reports/src/report-cli.js +485 -0
- package/dist/reports/src/report-index.d.ts +99 -0
- package/dist/reports/src/report-index.js +337 -0
- package/dist/reports/src/report-loader.d.ts +10 -0
- package/dist/reports/src/report-loader.js +6 -0
- package/dist/reports/src/report-parts.d.ts +29 -3
- package/dist/reports/src/report-parts.js +40 -3
- package/dist/reports/src/report-status.d.ts +48 -0
- package/dist/reports/src/report-status.js +156 -0
- package/dist/reports/src/report-types.d.ts +73 -0
- package/dist/reports/src/report-types.js +3 -0
- package/dist/reports/src/reporter.d.ts +67 -0
- package/dist/reports/src/reporter.js +128 -0
- package/dist/reports/src/reports-explorer-route.d.ts +541 -0
- package/dist/reports/src/reports-explorer-route.js +11 -0
- package/dist/reports/src/reports-list-route.d.ts +9 -0
- package/dist/reports/src/reports-list-route.js +9 -0
- package/dist/reports/src/reports-route.d.ts +561 -22
- package/dist/reports/src/reports-route.js +11 -3
- package/dist/reports/src/reports-store.d.ts +19 -2
- package/dist/reports/src/reports-store.js +10 -2
- package/dist/reports/src/resilient-cache.d.ts +14 -1
- package/dist/reports/src/resilient-cache.js +8 -1
- package/dist/reports/src/retention.d.ts +17 -1
- package/dist/reports/src/retention.js +5 -1
- package/dist/reports/src/run-bundle.d.ts +63 -0
- package/dist/reports/src/run-bundle.js +159 -0
- package/dist/reports/src/s3-store.d.ts +79 -0
- package/dist/reports/src/s3-store.js +295 -0
- package/dist/reports/src/scenario.d.ts +14 -4
- package/dist/reports/src/scenario.js +5 -4
- package/dist/reports/src/sigv4.d.ts +72 -0
- package/dist/reports/src/sigv4.js +96 -0
- package/dist/reports/src/snapshot-bundle.d.ts +24 -1
- package/dist/reports/src/snapshot-bundle.js +27 -2
- package/dist/reports/src/snapshot-surface.d.ts +20 -9
- package/dist/reports/src/snapshot-surface.js +32 -19
- package/dist/reports/src/source-content.d.ts +23 -0
- package/dist/reports/src/source-content.js +30 -1
- package/dist/reports/src/source-entries.d.ts +13 -0
- package/dist/reports/src/source-entries.js +6 -0
- package/dist/reports/src/source-part.d.ts +15 -0
- package/dist/reports/src/source-part.js +8 -0
- package/dist/reports/src/source-reader.d.ts +11 -0
- package/dist/reports/src/source-reader.js +5 -0
- package/dist/reports/src/spec-evidence.d.ts +12 -2
- package/dist/reports/src/spec-evidence.js +6 -2
- package/dist/reports/src/spec-inventory.d.ts +15 -1
- package/dist/reports/src/spec-inventory.js +22 -1
- package/dist/reports/src/spec-link.d.ts +28 -0
- package/dist/reports/src/spec-link.js +70 -0
- package/dist/reports/src/spec-set.d.ts +63 -0
- package/dist/reports/src/spec-set.js +177 -0
- package/dist/reports/src/status.d.ts +10 -0
- package/dist/reports/src/status.js +5 -0
- package/dist/reports/src/store-prefix.d.ts +28 -0
- package/dist/reports/src/store-prefix.js +22 -0
- package/dist/reports/src/store-url.d.ts +89 -0
- package/dist/reports/src/store-url.js +160 -0
- package/dist/reports/src/test-catalog-entity.d.ts +11 -0
- package/dist/reports/src/test-catalog-entity.js +6 -0
- package/dist/reports/src/types.d.ts +6 -1
- package/dist/reports/src/use-report-nav.d.ts +35 -0
- package/dist/reports/src/use-report-nav.js +12 -0
- package/dist/schema/src/api.d.ts +799 -0
- package/dist/schema/src/api.js +201 -0
- package/dist/schema/src/cli-results.d.ts +210 -0
- package/dist/schema/src/cli-results.js +124 -0
- package/dist/schema/src/common.d.ts +53 -0
- package/dist/schema/src/common.js +42 -0
- package/dist/schema/src/index.d.ts +14 -0
- package/dist/schema/src/index.js +14 -0
- package/dist/schema/src/layer.d.ts +2273 -0
- package/dist/schema/src/layer.js +462 -0
- package/dist/schema/src/manifest.d.ts +95 -0
- package/dist/schema/src/manifest.js +84 -0
- package/dist/schema/src/report-sources.d.ts +28 -0
- package/dist/schema/src/report-sources.js +25 -0
- package/dist/schema/src/runs-index.d.ts +16 -0
- package/dist/schema/src/runs-index.js +15 -0
- package/dist/schema/src/server-config.d.ts +93 -0
- package/dist/schema/src/server-config.js +73 -0
- package/dist/schema/src/spec.d.ts +69 -0
- package/dist/schema/src/spec.js +58 -0
- package/dist/server/src/app.d.ts +62 -0
- package/dist/server/src/app.js +419 -0
- package/dist/server/src/auth.d.ts +41 -0
- package/dist/server/src/auth.js +59 -0
- package/dist/server/src/config.d.ts +83 -0
- package/dist/server/src/config.js +187 -0
- package/dist/server/src/dev.d.ts +12 -0
- package/dist/server/src/dev.js +80 -0
- package/dist/server/src/events.d.ts +29 -0
- package/dist/server/src/events.js +101 -0
- package/dist/server/src/host.d.ts +30 -0
- package/dist/server/src/host.js +115 -0
- package/dist/server/src/index.d.ts +16 -0
- package/dist/server/src/index.js +16 -0
- package/dist/server/src/llms.d.ts +19 -0
- package/dist/server/src/llms.js +63 -0
- package/dist/server/src/main.d.ts +30 -0
- package/dist/server/src/main.js +112 -0
- package/dist/server/src/openapi.d.ts +59 -0
- package/dist/server/src/openapi.js +374 -0
- package/dist/server/src/problem.d.ts +8 -0
- package/dist/server/src/problem.js +39 -0
- package/dist/server/src/site.d.ts +13 -0
- package/dist/server/src/site.js +43 -0
- package/dist/server/src/store-api.d.ts +28 -0
- package/dist/server/src/store-api.js +159 -0
- package/dist/server/src/validate.d.ts +71 -0
- package/dist/server/src/validate.js +197 -0
- package/dist/vitest/src/index.d.ts +27 -5
- package/dist/vitest/src/index.js +18 -5
- package/dist/webdriver/src/driver.d.ts +63 -11
- package/dist/webdriver/src/driver.js +57 -6
- package/dist/webdriver/src/index.d.ts +8 -0
- package/dist/webdriver/src/index.js +1 -0
- package/dist/webdriver/src/protocol.d.ts +75 -6
- package/dist/webdriver/src/protocol.js +79 -6
- package/docs/agents.md +137 -0
- package/docs/deploying.md +345 -0
- package/docs/dogfooding.md +175 -0
- package/docs/extending.md +242 -0
- package/docs/integrating.md +485 -0
- package/docs/reference/bun.md +141 -0
- package/docs/reference/cli.md +146 -0
- package/docs/reference/core.md +2426 -0
- package/docs/reference/detox.md +150 -0
- package/docs/reference/http-api.md +303 -0
- package/docs/reference/playwright.md +303 -0
- package/docs/reference/reports.md +7098 -0
- package/docs/reference/schema.md +1651 -0
- package/docs/reference/server.md +685 -0
- package/docs/reference/vitest.md +45 -0
- package/docs/reference/webdriver.md +330 -0
- package/docs/report-backends.md +144 -0
- package/docs/report-contract.md +400 -0
- package/docs/reporting-issues.md +160 -0
- package/docs/server.md +285 -0
- package/docs/statecharts.md +641 -0
- package/llms-full.txt +3506 -0
- package/llms.txt +47 -0
- package/package.json +33 -5
- package/packages/core/README.md +2 -1
- package/packages/reports/README.md +69 -2
- package/packages/reports/STORAGE.md +5 -1
- package/packages/schema/README.md +14 -0
- package/packages/schema/schemas/check-detail.schema.json +1032 -0
- package/packages/schema/schemas/checks-result.schema.json +26 -0
- package/packages/schema/schemas/command-error.schema.json +35 -0
- package/packages/schema/schemas/doctor-result.schema.json +60 -0
- package/packages/schema/schemas/effective-delta.schema.json +490 -0
- package/packages/schema/schemas/effective-evidence.schema.json +471 -0
- package/packages/schema/schemas/evidence-page.schema.json +271 -0
- package/packages/schema/schemas/hello-event.schema.json +22 -0
- package/packages/schema/schemas/init-plan.schema.json +347 -0
- package/packages/schema/schemas/layer-rows.schema.json +199 -0
- package/packages/schema/schemas/layer.schema.json +2888 -0
- package/packages/schema/schemas/merge-result.schema.json +40 -0
- package/packages/schema/schemas/outline.schema.json +62 -0
- package/packages/schema/schemas/problem.schema.json +37 -0
- package/packages/schema/schemas/publish-checks.schema.json +1413 -0
- package/packages/schema/schemas/publish-result.schema.json +168 -0
- package/packages/schema/schemas/ready.schema.json +68 -0
- package/packages/schema/schemas/report-event.schema.json +100 -0
- package/packages/schema/schemas/report-status.schema.json +370 -0
- package/packages/schema/schemas/server-config.schema.json +194 -0
- package/packages/schema/schemas/server-info.schema.json +114 -0
- package/packages/schema/schemas/spec-set.schema.json +103 -0
- package/packages/schema/schemas/store-listing.schema.json +29 -0
- package/packages/schema/schemas/store-write-result.schema.json +28 -0
- package/packages/schema/schemas/stream-result.schema.json +59 -0
- package/packages/server/README.md +43 -0
- package/packages/server/openapi.json +6699 -0
- package/packages/visualizer/README.md +27 -5
- package/packages/visualizer/example/specs/coffee/ordering/cart.qnt +7 -0
- package/packages/visualizer/example/specs/coffee/ordering/checkout.openslo.yaml +10 -0
- package/packages/visualizer/example/specs/coffee/ordering/drink-price.dmn +24 -0
- package/packages/visualizer/example/specs/coffee/ordering/loyalty.feature +7 -0
- package/packages/visualizer/example/specs/coffee/ordering/ordering.feature +36 -0
- package/packages/visualizer/example/specs/coffee/ordering/payment.als +4 -0
- package/packages/visualizer/fixtures/failures/specs/coffee/ordering/cart.qnt +7 -0
- package/packages/visualizer/fixtures/failures/specs/coffee/ordering/checkout.openslo.yaml +10 -0
- package/packages/visualizer/fixtures/failures/specs/coffee/ordering/drink-price.dmn +24 -0
- package/packages/visualizer/fixtures/failures/specs/coffee/ordering/loyalty.feature +7 -0
- package/packages/visualizer/fixtures/failures/specs/coffee/ordering/ordering.feature +36 -0
- package/packages/visualizer/fixtures/failures/specs/coffee/ordering/payment.als +4 -0
- package/packages/visualizer/fixtures/full/specs/coffee/ordering/cart.qnt +7 -0
- package/packages/visualizer/fixtures/full/specs/coffee/ordering/checkout.openslo.yaml +10 -0
- package/packages/visualizer/fixtures/full/specs/coffee/ordering/drink-price.dmn +24 -0
- package/packages/visualizer/fixtures/full/specs/coffee/ordering/loyalty.feature +7 -0
- package/packages/visualizer/fixtures/full/specs/coffee/ordering/ordering.feature +36 -0
- package/packages/visualizer/fixtures/full/specs/coffee/ordering/payment.als +4 -0
- package/packages/visualizer/fixtures/malformed/specs/coffee/ordering/cart.qnt +7 -0
- package/packages/visualizer/fixtures/malformed/specs/coffee/ordering/checkout.openslo.yaml +10 -0
- package/packages/visualizer/fixtures/malformed/specs/coffee/ordering/drink-price.dmn +24 -0
- package/packages/visualizer/fixtures/malformed/specs/coffee/ordering/loyalty.feature +7 -0
- package/packages/visualizer/fixtures/malformed/specs/coffee/ordering/ordering.feature +36 -0
- package/packages/visualizer/fixtures/malformed/specs/coffee/ordering/payment.als +4 -0
- package/packages/visualizer/fixtures/partial/specs/coffee/ordering/cart.qnt +7 -0
- package/packages/visualizer/fixtures/partial/specs/coffee/ordering/checkout.openslo.yaml +10 -0
- package/packages/visualizer/fixtures/partial/specs/coffee/ordering/drink-price.dmn +24 -0
- package/packages/visualizer/fixtures/partial/specs/coffee/ordering/loyalty.feature +7 -0
- package/packages/visualizer/fixtures/partial/specs/coffee/ordering/ordering.feature +36 -0
- package/packages/visualizer/fixtures/partial/specs/coffee/ordering/payment.als +4 -0
- package/packages/visualizer/fixtures/removed/specs/coffee/ordering/cart.qnt +7 -0
- package/packages/visualizer/fixtures/removed/specs/coffee/ordering/checkout.openslo.yaml +10 -0
- package/packages/visualizer/fixtures/removed/specs/coffee/ordering/drink-price.dmn +24 -0
- package/packages/visualizer/fixtures/removed/specs/coffee/ordering/loyalty.feature +7 -0
- package/packages/visualizer/fixtures/removed/specs/coffee/ordering/ordering.feature +36 -0
- package/packages/visualizer/fixtures/removed/specs/coffee/ordering/payment.als +4 -0
- package/packages/visualizer/fixtures/spec-only/specs/coffee/ordering/cart.qnt +7 -0
- package/packages/visualizer/fixtures/spec-only/specs/coffee/ordering/checkout.openslo.yaml +10 -0
- package/packages/visualizer/fixtures/spec-only/specs/coffee/ordering/drink-price.dmn +24 -0
- package/packages/visualizer/fixtures/spec-only/specs/coffee/ordering/loyalty.feature +7 -0
- package/packages/visualizer/fixtures/spec-only/specs/coffee/ordering/ordering.feature +36 -0
- package/packages/visualizer/fixtures/spec-only/specs/coffee/ordering/payment.als +4 -0
- package/packages/visualizer/scripts/make-fixtures.ts +2 -0
- package/packages/visualizer/scripts/publish-data.ts +1 -2
- package/packages/visualizer/src/app/AppShell.tsx +9 -2
- package/packages/visualizer/src/app/report-sources.tsx +6 -4
- package/packages/visualizer/src/app/router.tsx +3 -3
- package/packages/visualizer/src/components/Header.module.css +35 -0
- package/packages/visualizer/src/components/Header.tsx +41 -4
- package/packages/visualizer/src/data/adapters/adapter.ts +5 -17
- package/packages/visualizer/src/data/adapters/index.ts +10 -1
- package/packages/visualizer/src/evidence/api.ts +14 -2
- package/packages/visualizer/src/evidence/artifacts.module.css +213 -0
- package/packages/visualizer/src/evidence/artifacts.tsx +272 -0
- package/packages/visualizer/src/evidence/check-detail.tsx +38 -4
- package/packages/visualizer/src/evidence/evidence-context.tsx +74 -12
- package/packages/visualizer/src/evidence/evidence.module.css +20 -0
- package/packages/visualizer/src/evidence/marks.tsx +2 -0
- package/packages/visualizer/src/evidence/overview.tsx +3 -3
- package/packages/visualizer/src/evidence/sources-panel.tsx +88 -34
- package/packages/visualizer/src/evidence/spec-page.tsx +23 -16
- package/packages/visualizer/src/find/Finder.tsx +1 -7
- package/packages/visualizer/src/find/open.ts +4 -0
- package/packages/visualizer/src/live/live-stream.ts +204 -0
- package/packages/visualizer/src/runtime.ts +19 -0
- package/packages/visualizer/src/state/ui-store.ts +6 -2
- package/packages/visualizer/vite/atlas-server-proxy.ts +36 -0
- package/packages/visualizer/vite/example-reports.ts +475 -0
- 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.
|