@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,150 @@
|
|
|
1
|
+
# Reference: detox
|
|
2
|
+
|
|
3
|
+
The Detox driver for statechart runs of React Native apps. Import path `@crvouga/atlas/detox`.
|
|
4
|
+
|
|
5
|
+
> Generated from the doc comments of `packages/detox/src` by `bun run docs`. Do not edit: change the comment next to the code.
|
|
6
|
+
|
|
7
|
+
### Detox driver
|
|
8
|
+
|
|
9
|
+
Source: `packages/detox/src/index.ts`. Import: `@crvouga/atlas/detox`
|
|
10
|
+
|
|
11
|
+
The Atlas driver for native iOS and Android apps tested with Detox (https://wix.github.io/Detox/).
|
|
12
|
+
It owns launching and terminating the app, mapping signals to Detox matchers, screenshots, and
|
|
13
|
+
logging taps and typing to the step timeline; it does not record video (Detox does that through its
|
|
14
|
+
artifacts plugin). It must run inside a Detox test, where Detox's `device`, `element`, `by` and
|
|
15
|
+
`waitFor` globals exist, or be given them as `api`. Detox is typed structurally here, so importing
|
|
16
|
+
this module needs no Detox install.
|
|
17
|
+
|
|
18
|
+
#### `DetoxMatcher`
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
export type DetoxMatcher = unknown;
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
What Detox's `by.*` builders return: an opaque matcher that is only passed back to Detox's `element(...)`.
|
|
25
|
+
|
|
26
|
+
#### `DetoxApi`
|
|
27
|
+
|
|
28
|
+
```ts
|
|
29
|
+
export type DetoxApi = {
|
|
30
|
+
/** The device under test; Detox's `device`. */
|
|
31
|
+
device: {
|
|
32
|
+
/** Launches the app; the driver passes `newInstance: true` and any `launchArgs`. */
|
|
33
|
+
launchApp(params?: Record<string, unknown>): Promise<void>;
|
|
34
|
+
/** Opens a deep link; when the device lacks it, `goto` throws. */
|
|
35
|
+
openURL?(params: { url: string }): Promise<void>;
|
|
36
|
+
/** Terminates the app; skipped when absent. */
|
|
37
|
+
terminateApp?(): Promise<void>;
|
|
38
|
+
/** Takes a screenshot and resolves to the path of the file Detox wrote. */
|
|
39
|
+
takeScreenshot(name: string): Promise<string>;
|
|
40
|
+
};
|
|
41
|
+
/** Detox's `element(matcher)`: the actions the driver performs on an element. */
|
|
42
|
+
element(matcher: DetoxMatcher): { tap(): Promise<void>; typeText(text: string): Promise<void>; replaceText?(text: string): Promise<void> };
|
|
43
|
+
/** Detox's `by`: matcher builders. `traits` exists on iOS only. */
|
|
44
|
+
by: {
|
|
45
|
+
id(id: string): DetoxMatcher;
|
|
46
|
+
text(text: string): DetoxMatcher;
|
|
47
|
+
label(label: string): DetoxMatcher;
|
|
48
|
+
traits?(traits: string[]): DetoxMatcher & { and?(other: DetoxMatcher): DetoxMatcher };
|
|
49
|
+
};
|
|
50
|
+
/** Detox's `waitFor(element)`, used to ask whether an element is visible. */
|
|
51
|
+
waitFor(element: unknown): { toBeVisible(): { withTimeout(ms: number): Promise<void> } };
|
|
52
|
+
};
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
The parts of Detox's global API the driver uses (`device`, `element`, `by`, `waitFor`), typed
|
|
56
|
+
structurally so this package needs no Detox install to build. Detox's real globals satisfy it.
|
|
57
|
+
|
|
58
|
+
#### `DetoxContext`
|
|
59
|
+
|
|
60
|
+
```ts
|
|
61
|
+
export type DetoxContext = DetoxApi & SignalContext & {
|
|
62
|
+
/** The step timeline the actions below write to. */
|
|
63
|
+
timeline: Timeline;
|
|
64
|
+
/** Tap the element a matcher finds and log it to the step timeline. Rejects with Detox's error if the element is not found. */
|
|
65
|
+
tap(matcher: DetoxMatcher, label: string): Promise<void>;
|
|
66
|
+
/** Type `text` into the element a matcher finds (Detox `typeText`, which appends) and log it to the step timeline; `label` is the caption. */
|
|
67
|
+
type(matcher: DetoxMatcher, text: string, label: string): Promise<void>;
|
|
68
|
+
};
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
What every event and recogniser receives from `detoxDriver`: Detox's API plus a `SignalContext`,
|
|
72
|
+
so implementations written against signals run here too. One context is created per path attempt.
|
|
73
|
+
|
|
74
|
+
#### `DetoxDriverOptions`
|
|
75
|
+
|
|
76
|
+
```ts
|
|
77
|
+
export type DetoxDriverOptions = {
|
|
78
|
+
/** Detox's globals; `globalThis` (where Detox puts them) by default. */
|
|
79
|
+
api?: DetoxApi;
|
|
80
|
+
/** Passed to `device.launchApp` as `launchArgs` at the start of every attempt. */
|
|
81
|
+
launchArgs?: Record<string, unknown>;
|
|
82
|
+
};
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Options of `detoxDriver`.
|
|
86
|
+
|
|
87
|
+
#### `detoxMatcher`
|
|
88
|
+
|
|
89
|
+
```ts
|
|
90
|
+
export function detoxMatcher(api: DetoxApi, signal: Signal): DetoxMatcher
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Translates a signal into a Detox matcher: test IDs are `by.id` (React Native's `testID`), labels
|
|
94
|
+
`by.label`, text `by.text`, a role with a name `by.label` (with the iOS `button` trait when Detox
|
|
95
|
+
has it). Detox matches exact strings, so regular expressions and CSS selectors are refused.
|
|
96
|
+
|
|
97
|
+
- `api`: the Detox API whose `by` builds the matcher.
|
|
98
|
+
|
|
99
|
+
**Throws** Error for a `css` signal, a regular expression, or a role without a name.
|
|
100
|
+
|
|
101
|
+
#### `detoxDriver`
|
|
102
|
+
|
|
103
|
+
```ts
|
|
104
|
+
export function detoxDriver(options: DetoxDriverOptions = {}): Driver<DetoxContext>
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Creates a driver for a native app tested with Detox. Every path attempt relaunches the app
|
|
108
|
+
(`device.launchApp({ newInstance: true })`) and terminates it afterwards. Screenshots come from
|
|
109
|
+
`device.takeScreenshot`. Detox records video per test through its artifacts plugin rather than per
|
|
110
|
+
call, so this driver does not record clips; enable Detox's `--record-videos` to keep a video of
|
|
111
|
+
each attempt.
|
|
112
|
+
|
|
113
|
+
The Detox globals are read when an attempt opens, so call `runConfig` from inside a Detox test.
|
|
114
|
+
Signals are resolved with `detoxMatcher`, so regular expressions and CSS selectors are refused.
|
|
115
|
+
|
|
116
|
+
- `options`: `api` to use instead of the globals, and `launchArgs` for the app.
|
|
117
|
+
|
|
118
|
+
**Returns** a driver whose context is a `DetoxContext`.
|
|
119
|
+
|
|
120
|
+
**Example**
|
|
121
|
+
|
|
122
|
+
```ts
|
|
123
|
+
const config = defineConfig<DetoxContext>({
|
|
124
|
+
specs: './specs',
|
|
125
|
+
driver: detoxDriver({ launchArgs: { resetData: true } }),
|
|
126
|
+
implementation
|
|
127
|
+
});
|
|
128
|
+
await runConfig(config, { mode: 'fast' });
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
#### `detoxScreen`
|
|
132
|
+
|
|
133
|
+
```ts
|
|
134
|
+
export function detoxScreen(spec: {
|
|
135
|
+
all: { matcher: DetoxMatcher; name: string }[];
|
|
136
|
+
none?: { matcher: DetoxMatcher; name: string }[];
|
|
137
|
+
checks?: { check: string; matcher: DetoxMatcher; name: string }[];
|
|
138
|
+
}): StateImplementation<DetoxContext>
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Builds a state implementation recognised by Detox matchers: matched when every `all` matcher is
|
|
142
|
+
visible and no `none` matcher is. `checks` pair a statement from the state's `meta.checks` with
|
|
143
|
+
the matcher that proves it. Each entry's `name` appears in failure reports. Unlike
|
|
144
|
+
`screen(...)` from the signals module it takes matchers, not signals, and has no `any`.
|
|
145
|
+
|
|
146
|
+
**Example**
|
|
147
|
+
|
|
148
|
+
```ts
|
|
149
|
+
states: { 'No todos': detoxScreen({ all: [{ matcher: by.text('Nothing to do yet'), name: 'empty message' }] }) }
|
|
150
|
+
```
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
# HTTP API reference
|
|
2
|
+
|
|
3
|
+
> Generated from the operation table in `packages/server/src/openapi.ts` by `bun run docs`. Do not edit. The same description, for tools, is `openapi.json` (OpenAPI 3.1) and `GET /api/openapi.json` on every server.
|
|
4
|
+
|
|
5
|
+
### Is the process up
|
|
6
|
+
|
|
7
|
+
`GET /healthz` · role: none
|
|
8
|
+
|
|
9
|
+
Answers `200` as long as the process runs, whatever its backends are doing. Use it as a liveness probe. It needs no token and is not logged.
|
|
10
|
+
|
|
11
|
+
Responses: `200` The process is up.
|
|
12
|
+
|
|
13
|
+
### Has the server read its backends
|
|
14
|
+
|
|
15
|
+
`GET /readyz` · role: none
|
|
16
|
+
|
|
17
|
+
Answers `200` once the first pass over the backends is done and at least one backend answers, `503` before that. Route traffic on it. The body counts what the report holds. No token needed.
|
|
18
|
+
|
|
19
|
+
Responses: `200` Ready.; `503` Not ready yet; the body is the same shape with `ready: false`.
|
|
20
|
+
|
|
21
|
+
### This document
|
|
22
|
+
|
|
23
|
+
`GET /api/openapi.json` · role: none
|
|
24
|
+
|
|
25
|
+
The OpenAPI 3.1 description of this API. No token needed, so a client that has only the server's address can learn how to use it.
|
|
26
|
+
|
|
27
|
+
Responses: `200` The OpenAPI document.
|
|
28
|
+
|
|
29
|
+
### How to use this server, for an agent
|
|
30
|
+
|
|
31
|
+
`GET /llms.txt` · role: none
|
|
32
|
+
|
|
33
|
+
A plain-text guide ([llms.txt](https://llmstxt.org)) written for an AI agent that was handed only this server's address: what it is, how to authenticate, the five commands that integrate a project, and where the machine-readable description is. No token needed.
|
|
34
|
+
|
|
35
|
+
Responses: `200` The guide, Markdown.
|
|
36
|
+
|
|
37
|
+
### What this server is and who is asking
|
|
38
|
+
|
|
39
|
+
`GET /api/server` · role: read
|
|
40
|
+
|
|
41
|
+
The role of the token of this request, which backend takes uploads, whether each backend is reachable, counts, and `capabilities`: check a capability by name before using the feature it names. `atlas report doctor` and the viewer use it.
|
|
42
|
+
|
|
43
|
+
Responses: `200` The server.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.
|
|
44
|
+
|
|
45
|
+
### Server-sent events: results arrived, specs or runs changed
|
|
46
|
+
|
|
47
|
+
`GET /api/events` · role: read
|
|
48
|
+
|
|
49
|
+
A `text/event-stream` that stays open. Events say *that* something changed; the state is always fetched, so a client that missed events (a dropped connection) loses nothing: read again on reconnect.
|
|
50
|
+
|
|
51
|
+
| event | data |
|
|
52
|
+
| --- | --- |
|
|
53
|
+
| `hello` | `{ version, ready, time }`, sent first |
|
|
54
|
+
| `report` | `{ version, totalLayers, added: [{ id, producer, environment, branch, sha, recordedAtMs, counts }], addedTotal }`: layers arrived |
|
|
55
|
+
| `atlas:change` | `{ scope: "specs" \| "runs", files, runIds }`: new specs or runs |
|
|
56
|
+
| `ping` | `{}` every `heartbeatSeconds`, so a quiet server is told apart from a dead connection |
|
|
57
|
+
|
|
58
|
+
Past `limits.maxStreams` viewers the answer is `503` with `Retry-After`: poll `/api/reports/evidence/effective` instead. A browser needs no code beyond `new EventSource("/api/events")`; other clients send the token as `Authorization: Bearer`.
|
|
59
|
+
|
|
60
|
+
Responses: `200` The stream.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `503` Too many viewers are connected; poll instead.
|
|
61
|
+
|
|
62
|
+
### The whole report, or only what changed since a version
|
|
63
|
+
|
|
64
|
+
`GET /api/reports/evidence/effective` · role: read
|
|
65
|
+
|
|
66
|
+
The report as it stands: only the layers that win at least one check, each with only the rows that win. Whatever the history behind it, this is one request.
|
|
67
|
+
|
|
68
|
+
`version` changes exactly when the report does, so it works as an ETag: send `If-None-Match` and get `304`. Better, send `?since=<version>` of the report you hold and get **only what changed** (`delta: true`): replace the layers of the same id, drop `removed`, keep the rest. If the server does not remember that version it answers with the whole report (no `delta` key), so a client always handles both.
|
|
69
|
+
|
|
70
|
+
To combine layers yourself, a check's *slot* is `(producer, kind, specPath, check id, environment, parameters)`; the newest completed result wins it. See `docs/report-contract.md`.
|
|
71
|
+
|
|
72
|
+
- `since` (query): The `version` of the report you hold.
|
|
73
|
+
- `if-none-match` (header): The ETag (the quoted version) of the report you hold.
|
|
74
|
+
|
|
75
|
+
Responses: `200` The whole report, or a delta when `since` was given and remembered.; `304` You already hold this version.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `503` The server is still reading its backends. Retry after the number of seconds in `Retry-After`.
|
|
76
|
+
|
|
77
|
+
### The gate: does the report pass
|
|
78
|
+
|
|
79
|
+
`GET /api/status` · role: read
|
|
80
|
+
|
|
81
|
+
The `atlas report status --format json` document, worked out by the server from the layers it holds and remembered for each version of the report. It passes (`ok: true`) only if some check completed, none failed, none is still running, every layer and backend could be read, and every required environment has results. **Unknown is never a pass.**
|
|
82
|
+
|
|
83
|
+
The header `X-Atlas-Ok: true|false` carries the verdict, so a shell can test it without parsing. Narrow it by choice, per request: `branch` (repeatable) and `ignoreModified` read only matching layers.
|
|
84
|
+
|
|
85
|
+
- `branch` (query): Only layers recorded on this branch. Repeatable.
|
|
86
|
+
- `ignoreModified` (query): `1`: leave out layers from modified checkouts and unknown origins.
|
|
87
|
+
- `requireEnvironments` (query): Comma-separated environments that must have results.
|
|
88
|
+
- `requireAllSpecs` (query): `1`: fail while any spec of the outline has no results.
|
|
89
|
+
|
|
90
|
+
Responses: `200` The verdict, whether or not it passes.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `503` The server is still reading its backends. Retry after the number of seconds in `Retry-After`.
|
|
91
|
+
|
|
92
|
+
### Upload one layer of checks as JSON
|
|
93
|
+
|
|
94
|
+
`POST /api/checks` · role: publish
|
|
95
|
+
|
|
96
|
+
The simplest way in: anything that can make an HTTP request can report. The body is the checks file (`packages/schema/schemas/publish-checks.schema.json`); `recordedAtMs` defaults to now. Binary evidence goes in as `base64`. The server writes the layer and it is in every viewer's report before this answers.
|
|
97
|
+
|
|
98
|
+
Send the token as `Authorization: Bearer <token>` (a `publish` or `admin` token). A browser's sign-in box is refused for uploads on purpose. A check id appearing twice in one body is `422`.
|
|
99
|
+
|
|
100
|
+
Responses: `201` The layer was written.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `403` The token is known but its role may not do this.; `413` The body is over `limits.maxJsonMiB`.; `422` The body is not valid: the detail says which field.
|
|
101
|
+
|
|
102
|
+
### List keys under layers/
|
|
103
|
+
|
|
104
|
+
`GET /api/store` · role: read
|
|
105
|
+
|
|
106
|
+
One page of the keys of `layers/…` (never anything else), in code-unit order. Page with `after` = the `next` of the previous page. This is the `listPage` of the `ObjectStore` interface; `atlas report merge` and `httpStore` use it.
|
|
107
|
+
|
|
108
|
+
- `prefix` (query): Only keys starting with this. Default `layers/`.
|
|
109
|
+
- `after` (query): Only keys after this one (exclusive).
|
|
110
|
+
- `limit` (query): Page size, 1 to 1000. Default 1000.
|
|
111
|
+
|
|
112
|
+
Responses: `200` A page.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `422` The prefix is not one Atlas holds.
|
|
113
|
+
|
|
114
|
+
### Read an object
|
|
115
|
+
|
|
116
|
+
`GET /api/store/{key}` · role: read
|
|
117
|
+
|
|
118
|
+
The bytes of one object, with the content type it was stored with. Everything under `layers/` is immutable, so the answer is cacheable for good. The bytes came from a test run and are untrusted: they are served with `nosniff` and a sandboxing Content-Security-Policy, whatever type their uploader gave them.
|
|
119
|
+
|
|
120
|
+
- `key` (path, required): An object key under `layers/`, such as `layers/manifests/<id>.json`. It contains slashes, which are not percent-encoded; every other character is.
|
|
121
|
+
|
|
122
|
+
Responses: `200` The object.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `404` No such object.; `422` Not a key Atlas holds.
|
|
123
|
+
|
|
124
|
+
### Does an object exist
|
|
125
|
+
|
|
126
|
+
`HEAD /api/store/{key}` · role: read
|
|
127
|
+
|
|
128
|
+
`200` when the object exists, `404` when not. No body.
|
|
129
|
+
|
|
130
|
+
- `key` (path, required): An object key under `layers/`, such as `layers/manifests/<id>.json`. It contains slashes, which are not percent-encoded; every other character is.
|
|
131
|
+
|
|
132
|
+
Responses: `200` It exists.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `404` No such object.
|
|
133
|
+
|
|
134
|
+
### Upload an object
|
|
135
|
+
|
|
136
|
+
`PUT /api/store/{key}` · role: publish
|
|
137
|
+
|
|
138
|
+
The write half of the `ObjectStore` interface. The server checks what it can from the bytes in hand and says no to what would corrupt the report for everyone:
|
|
139
|
+
|
|
140
|
+
- a **layer manifest** (`layers/manifests/<id>.json`) must be a valid layer whose content hashes to `<id>`, and its blobs must already be there (`409` otherwise);
|
|
141
|
+
- a **blob** (`layers/blobs/<sha256>.gz`) must be gzip of content whose SHA-256 is its name; a **spec file** likewise;
|
|
142
|
+
- a **catalog entry** (`…/index/…`) must name something already uploaded (`409` otherwise): it is what makes a layer visible, so it is written last;
|
|
143
|
+
- a **run manifest** must have passed its privacy scan;
|
|
144
|
+
- keys are immutable: the same bytes again are `200` (a retry), other bytes under the same key are `409`.
|
|
145
|
+
|
|
146
|
+
Upload in dependency order: blobs, then the manifest, then the catalog entry. `atlas report publish`, `atlas report stream` and `httpStore` do. Needs a `Bearer` token of role `publish` or `admin`; a browser's sign-in box is refused.
|
|
147
|
+
|
|
148
|
+
- `key` (path, required): An object key under `layers/`, such as `layers/manifests/<id>.json`. It contains slashes, which are not percent-encoded; every other character is.
|
|
149
|
+
- `content-type` (header): Stored with the object and returned when it is read.
|
|
150
|
+
|
|
151
|
+
Responses: `200` Already there with the same bytes.; `201` Stored.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `403` The token is known but its role may not do this.; `409` A dependency has not been uploaded yet, or other bytes are already stored under this key.; `413` Over `limits.maxObjectMiB`.; `422` Not a key Atlas writes, or the content is not what its name says.
|
|
152
|
+
|
|
153
|
+
### Remove a scratch object
|
|
154
|
+
|
|
155
|
+
`DELETE /api/store/{key}` · role: publish
|
|
156
|
+
|
|
157
|
+
Only the scratch objects `atlas report doctor` writes (`layers/doctor-…`) can be removed. Layers, specs and runs are never removed through the API.
|
|
158
|
+
|
|
159
|
+
- `key` (path, required): An object key under `layers/`, such as `layers/manifests/<id>.json`. It contains slashes, which are not percent-encoded; every other character is.
|
|
160
|
+
|
|
161
|
+
Responses: `204` Removed (or it was not there).; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `403` Not a scratch object, or the token may not.
|
|
162
|
+
|
|
163
|
+
### The specs a report is laid over
|
|
164
|
+
|
|
165
|
+
`GET /api/reports/outline` · role: read
|
|
166
|
+
|
|
167
|
+
The specs of the newest committed spec set (of `main`, else the newest), so the report needs no checkout. A spec here with no result shows as having none.
|
|
168
|
+
|
|
169
|
+
Responses: `200` The outline.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.
|
|
170
|
+
|
|
171
|
+
### The text of one spec
|
|
172
|
+
|
|
173
|
+
`GET /api/reports/outline/spec` · role: read
|
|
174
|
+
|
|
175
|
+
The text of a spec file of the outline, by its path.
|
|
176
|
+
|
|
177
|
+
- `path` (query, required): The spec's path, `specs/<path>`.
|
|
178
|
+
|
|
179
|
+
Responses: `200` The spec text.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `404` No such spec in the outline.
|
|
180
|
+
|
|
181
|
+
### Page through every layer header
|
|
182
|
+
|
|
183
|
+
`GET /api/reports/evidence` · role: read
|
|
184
|
+
|
|
185
|
+
The history: layer headers newest first, merged from every backend. Prefer `/api/reports/evidence/effective`, which is one request and holds only what wins. Use this to audit what was recorded.
|
|
186
|
+
|
|
187
|
+
- `cursor` (query): The `cursor` of the previous page.
|
|
188
|
+
|
|
189
|
+
Responses: `200` A page of headers.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `503` The server is still reading its backends. Retry after the number of seconds in `Retry-After`.
|
|
190
|
+
|
|
191
|
+
### The checks of one layer
|
|
192
|
+
|
|
193
|
+
`GET /api/reports/evidence/rows/{backend}/{id}` · role: read
|
|
194
|
+
|
|
195
|
+
Every check of one layer (not only those that win), with the spec fingerprints it recorded.
|
|
196
|
+
|
|
197
|
+
- `backend` (path, required): A backend id from `/api/server`.
|
|
198
|
+
- `id` (path, required): A layer id: 64 lowercase hex digits.
|
|
199
|
+
|
|
200
|
+
Responses: `200` The rows.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `404` No such layer in that backend.
|
|
201
|
+
|
|
202
|
+
### Everything one result carries
|
|
203
|
+
|
|
204
|
+
`GET /api/reports/evidence/detail/{backend}/{id}` · role: read
|
|
205
|
+
|
|
206
|
+
The timeline, annotations, retries, attachments and extensions of one check, and what its run carries as a whole. Without `check`, only the run's. Attachment bytes are fetched from `/api/reports/layers/{id}/blobs/{bundleKey}`.
|
|
207
|
+
|
|
208
|
+
- `backend` (path, required): A backend id from `/api/server`.
|
|
209
|
+
- `id` (path, required): A layer id: 64 lowercase hex digits.
|
|
210
|
+
- `check` (query): The check id.
|
|
211
|
+
- `kind` (query): The kind of the part, when the same id is in several.
|
|
212
|
+
|
|
213
|
+
Responses: `200` The detail.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `404` No such layer or check.
|
|
214
|
+
|
|
215
|
+
### A file a layer carries
|
|
216
|
+
|
|
217
|
+
`GET /api/reports/layers/{id}/blobs/{bundleKey}` · role: read
|
|
218
|
+
|
|
219
|
+
A screenshot, video, trace, log or any attachment of a layer, by the `bundleKey` its attachment names (`attachments/<sha256>`). Served as untrusted bytes: never sniffed, never run, sandboxed; immutable, cacheable for good; videos can be sought with `Range`.
|
|
220
|
+
|
|
221
|
+
- `id` (path, required): A layer id: 64 lowercase hex digits.
|
|
222
|
+
- `bundleKey` (path, required): The attachment's `bundleKey`, which contains a slash.
|
|
223
|
+
- `range` (header): A byte range, `bytes=0-1023`.
|
|
224
|
+
|
|
225
|
+
Responses: `200` The bytes, with the type the producer gave (or `application/octet-stream`).; `206` The requested range.; `304` Not modified.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `404` No such layer or file.
|
|
226
|
+
|
|
227
|
+
### A recorded test of a statechart run
|
|
228
|
+
|
|
229
|
+
`GET /api/reports/layers/{id}/{path}` · role: read
|
|
230
|
+
|
|
231
|
+
The `report.json`, captured files and frame stylesheet of a recorded statechart test of a layer (`tests/<testId>/report.json`, `tests/<testId>/files/…`, `frame.css`). Untrusted bytes, served like attachments.
|
|
232
|
+
|
|
233
|
+
- `id` (path, required): A layer id: 64 lowercase hex digits.
|
|
234
|
+
- `path` (path, required): The path under the layer.
|
|
235
|
+
|
|
236
|
+
Responses: `200` The file.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `404` No such file.
|
|
237
|
+
|
|
238
|
+
### Frame stylesheet of a live spec run (development only)
|
|
239
|
+
|
|
240
|
+
`GET /api/reports/live/{source}/frame.css` · role: read
|
|
241
|
+
|
|
242
|
+
For spec runs writing on the same machine as a development host (`atlas-visualizer dev`). A server has none: it answers `404`.
|
|
243
|
+
|
|
244
|
+
- `source` (path, required): The live source id.
|
|
245
|
+
|
|
246
|
+
Responses: `200` The stylesheet.; `404` Not a live source.
|
|
247
|
+
|
|
248
|
+
### A file of a test in a live spec run (development only)
|
|
249
|
+
|
|
250
|
+
`GET /api/reports/live/{source}/tests/{testId}/{path}` · role: read
|
|
251
|
+
|
|
252
|
+
For spec runs writing on the same machine as a development host. A server has none: it answers `404`.
|
|
253
|
+
|
|
254
|
+
- `source` (path, required): The live source id.
|
|
255
|
+
- `testId` (path, required): The test id.
|
|
256
|
+
- `path` (path, required): The path under the test.
|
|
257
|
+
|
|
258
|
+
Responses: `200` The file.; `404` Not a live source.
|
|
259
|
+
|
|
260
|
+
### The sources the viewer reads
|
|
261
|
+
|
|
262
|
+
`GET /api/data/sources.json` · role: read
|
|
263
|
+
|
|
264
|
+
The viewer's address book of data sources, in the shape a static host serves. A server has one source, itself.
|
|
265
|
+
|
|
266
|
+
Responses: `200` The sources file.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.
|
|
267
|
+
|
|
268
|
+
### The spec files
|
|
269
|
+
|
|
270
|
+
`GET /api/data/specs/index.json` · role: read
|
|
271
|
+
|
|
272
|
+
The files of the newest committed spec set, relative to `specs/`.
|
|
273
|
+
|
|
274
|
+
Responses: `200` The index.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.
|
|
275
|
+
|
|
276
|
+
### One spec file
|
|
277
|
+
|
|
278
|
+
`GET /api/data/specs/{file}` · role: read
|
|
279
|
+
|
|
280
|
+
The text of a spec file, with the digest of its content as `ETag`.
|
|
281
|
+
|
|
282
|
+
- `file` (path, required): The file's path relative to `specs/`.
|
|
283
|
+
|
|
284
|
+
Responses: `200` The text.; `304` Not modified.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `404` No such spec.
|
|
285
|
+
|
|
286
|
+
### The statechart runs
|
|
287
|
+
|
|
288
|
+
`GET /api/data/runs/index.json` · role: read
|
|
289
|
+
|
|
290
|
+
The newest uploaded statechart runs (`atlas report publish --manifest … --upload-run`), newest first.
|
|
291
|
+
|
|
292
|
+
Responses: `200` The index.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.
|
|
293
|
+
|
|
294
|
+
### A file of an uploaded run
|
|
295
|
+
|
|
296
|
+
`GET /api/data/runs/{id}/{path}` · role: read
|
|
297
|
+
|
|
298
|
+
A file of an uploaded run: its manifest, timelines, screenshots, clips. Untrusted bytes, served sandboxed; immutable.
|
|
299
|
+
|
|
300
|
+
- `id` (path, required): The run id.
|
|
301
|
+
- `path` (path, required): The path inside the run.
|
|
302
|
+
|
|
303
|
+
Responses: `200` The file.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `404` No such run or file.
|