@crvouga/atlas 0.4.0 → 0.6.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 +13 -1
- package/README.md +191 -611
- 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 +35 -1
- package/dist/core/src/config.d.ts +77 -4
- package/dist/core/src/config.js +110 -17
- 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 +75 -16
- package/dist/core/src/run/execute.js +71 -18
- 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 +85 -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 +35 -5
- package/dist/reports/src/evidence-live.js +18 -2
- package/dist/reports/src/evidence-types.d.ts +68 -1
- package/dist/reports/src/evidence-types.js +5 -1
- package/dist/reports/src/evidence-view.d.ts +43 -4
- package/dist/reports/src/evidence-view.js +13 -2
- 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 +56 -0
- package/dist/reports/src/http-store.js +148 -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 +369 -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 +35 -5
- package/dist/reports/src/layer-axes.js +25 -5
- package/dist/reports/src/layer-catalog.d.ts +28 -1
- package/dist/reports/src/layer-catalog.js +18 -1
- package/dist/reports/src/layer-merge.d.ts +98 -9
- package/dist/reports/src/layer-merge.js +147 -31
- package/dist/reports/src/layer-source.d.ts +18 -0
- package/dist/reports/src/layer-source.js +11 -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 +32 -1
- package/dist/reports/src/layers-route.d.ts +47 -4
- package/dist/reports/src/layers-route.js +86 -7
- package/dist/reports/src/live-reporter.d.ts +34 -0
- package/dist/reports/src/live-reporter.js +122 -0
- 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 +26 -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 +42 -9
- package/dist/reports/src/publish.js +36 -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 +486 -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 +37 -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/runners/src/codecept.d.ts +14 -0
- package/dist/runners/src/codecept.js +16 -0
- package/dist/runners/src/jest.d.ts +50 -0
- package/dist/runners/src/jest.js +52 -0
- package/dist/runners/src/mocha.d.ts +40 -0
- package/dist/runners/src/mocha.js +39 -0
- package/dist/runners/src/node-test.d.ts +28 -0
- package/dist/runners/src/node-test.js +44 -0
- package/dist/runners/src/publish.d.ts +30 -0
- package/dist/runners/src/publish.js +68 -0
- package/dist/schema/src/api.d.ts +800 -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 +16 -0
- package/dist/schema/src/index.js +16 -0
- package/dist/schema/src/layer.d.ts +2273 -0
- package/dist/schema/src/layer.js +462 -0
- package/dist/schema/src/live-run.d.ts +123 -0
- package/dist/schema/src/live-run.js +30 -0
- package/dist/schema/src/manifest.d.ts +97 -2
- package/dist/schema/src/manifest.js +84 -0
- package/dist/schema/src/project.d.ts +20 -0
- package/dist/schema/src/project.js +10 -0
- package/dist/schema/src/report-sources.d.ts +29 -0
- package/dist/schema/src/report-sources.js +27 -1
- package/dist/schema/src/runs-index.d.ts +17 -1
- package/dist/schema/src/runs-index.js +15 -0
- package/dist/schema/src/server-config.d.ts +177 -0
- package/dist/schema/src/server-config.js +85 -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 +72 -0
- package/dist/server/src/app.js +557 -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 +204 -0
- package/dist/server/src/dev.d.ts +12 -0
- package/dist/server/src/dev.js +89 -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 +18 -0
- package/dist/server/src/index.js +18 -0
- package/dist/server/src/live-runs.d.ts +52 -0
- package/dist/server/src/live-runs.js +229 -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 +114 -0
- package/dist/server/src/openapi.d.ts +56 -0
- package/dist/server/src/openapi.js +438 -0
- package/dist/server/src/problem.d.ts +8 -0
- package/dist/server/src/problem.js +39 -0
- package/dist/server/src/projects.d.ts +3 -0
- package/dist/server/src/projects.js +154 -0
- package/dist/server/src/settings-page.d.ts +9 -0
- package/dist/server/src/settings-page.js +93 -0
- package/dist/server/src/settings.d.ts +23 -0
- package/dist/server/src/settings.js +72 -0
- package/dist/server/src/site.d.ts +15 -0
- package/dist/server/src/site.js +78 -0
- package/dist/server/src/store-api.d.ts +28 -0
- package/dist/server/src/store-api.js +180 -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 +148 -0
- package/docs/reference/core.md +2432 -0
- package/docs/reference/detox.md +150 -0
- package/docs/reference/http-api.md +799 -0
- package/docs/reference/playwright.md +303 -0
- package/docs/reference/reports.md +7152 -0
- package/docs/reference/runners.md +169 -0
- package/docs/reference/schema.md +1762 -0
- package/docs/reference/server.md +825 -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/runners.md +69 -0
- package/docs/server.md +321 -0
- package/docs/statecharts.md +643 -0
- package/llms-full.txt +4114 -0
- package/llms.txt +49 -0
- package/package.json +61 -11
- package/packages/core/README.md +2 -1
- package/packages/reports/README.md +65 -0
- package/packages/reports/STORAGE.md +4 -0
- package/packages/runners/README.md +6 -0
- package/packages/runners/compat/codecept.cjs +2 -0
- package/packages/runners/compat/jest.cjs +2 -0
- package/packages/runners/compat/mocha.cjs +2 -0
- package/packages/schema/README.md +14 -0
- package/packages/schema/schemas/atlas-change.schema.json +4 -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 +26 -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/live-run-start.schema.json +42 -0
- package/packages/schema/schemas/live-run-update.schema.json +93 -0
- package/packages/schema/schemas/live-run.schema.json +225 -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/project-slug.schema.json +8 -0
- package/packages/schema/schemas/project.schema.json +22 -0
- package/packages/schema/schemas/projects.schema.json +33 -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 +208 -0
- package/packages/schema/schemas/server-editable-settings.schema.json +132 -0
- package/packages/schema/schemas/server-info.schema.json +114 -0
- package/packages/schema/schemas/server-settings-snapshot.schema.json +285 -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 +11021 -0
- package/packages/visualizer/README.md +32 -11
- package/packages/visualizer/bin/atlas-client.mjs +176 -0
- package/packages/visualizer/bin/atlas-visualizer.mjs +2 -175
- package/packages/visualizer/src/app/AppShell.tsx +32 -16
- package/packages/visualizer/src/app/report-sources.tsx +7 -4
- package/packages/visualizer/src/app/router.tsx +3 -3
- package/packages/visualizer/src/components/ActivityIndicator.module.css +4 -0
- package/packages/visualizer/src/components/ActivityIndicator.tsx +6 -0
- package/packages/visualizer/src/components/Header.module.css +101 -192
- package/packages/visualizer/src/components/Header.tsx +88 -13
- package/packages/visualizer/src/components/ProjectPicker.tsx +64 -0
- package/packages/visualizer/src/data/adapters/adapter.ts +5 -17
- package/packages/visualizer/src/data/adapters/index.ts +10 -1
- package/packages/visualizer/src/data/adapters/report-backend.test.ts +3 -2
- package/packages/visualizer/src/data/adapters/report-backend.ts +1 -1
- package/packages/visualizer/src/data/queries.ts +14 -7
- package/packages/visualizer/src/evidence/api.ts +16 -3
- 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 +21 -4
- package/packages/visualizer/src/evidence/document-page.tsx +6 -2
- package/packages/visualizer/src/evidence/evidence-context.tsx +79 -12
- package/packages/visualizer/src/evidence/evidence.module.css +11 -1
- package/packages/visualizer/src/evidence/feature-page.tsx +7 -3
- package/packages/visualizer/src/evidence/model-page.tsx +6 -2
- package/packages/visualizer/src/evidence/project-home.tsx +45 -0
- package/packages/visualizer/src/evidence/recording-page.tsx +4 -1
- package/packages/visualizer/src/evidence/spec-index.tsx +2 -1
- package/packages/visualizer/src/evidence/spec-page.tsx +23 -16
- package/packages/visualizer/src/evidence/test-filter.tsx +21 -0
- package/packages/visualizer/src/find/Finder.tsx +1 -7
- package/packages/visualizer/src/find/open.ts +4 -0
- package/packages/visualizer/src/live/live-query.ts +21 -0
- package/packages/visualizer/src/live/live-runs.tsx +69 -0
- package/packages/visualizer/src/live/live-stream.ts +225 -0
- package/packages/visualizer/src/live/report-progress.ts +62 -0
- package/packages/visualizer/src/live/test-progress.tsx +34 -0
- package/packages/visualizer/src/runtime.ts +35 -0
- package/packages/visualizer/src/state/ui-store.ts +3 -2
- package/packages/visualizer/src/views/ChartPage.tsx +2 -0
- package/packages/visualizer/src/views/ChartTests.tsx +43 -0
- package/packages/visualizer/src/views/SidePanel.tsx +2 -0
- package/packages/visualizer/vite/atlas-files.test.ts +4 -4
- package/packages/visualizer/vite/atlas-files.ts +1 -5
- package/packages/visualizer/vite/atlas-server-proxy.ts +37 -0
- package/packages/visualizer/vite.config.ts +11 -3
|
@@ -0,0 +1,799 @@
|
|
|
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
|
+
### List projects on this Atlas node
|
|
6
|
+
|
|
7
|
+
`GET /api/projects` · role: read
|
|
8
|
+
|
|
9
|
+
Projects are created on their first authenticated upload. All report, spec, recording and live-run data is isolated by project. Unqualified API calls address the legacy default project. Tokens retain their node-wide role; project partitioning is not a tenant authorization boundary.
|
|
10
|
+
|
|
11
|
+
Responses: `200` Available project identities.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `503` The project catalog is unavailable.
|
|
12
|
+
|
|
13
|
+
### Live test progress and recent invocations
|
|
14
|
+
|
|
15
|
+
`GET /api/live` · role: read
|
|
16
|
+
|
|
17
|
+
Returns up to 50 recent producer leases, including running, completed and interrupted runs. Counters and recent check/step updates are bounded; authentication credentials are never returned. Consume run events for immediate bounded snapshots; re-fetch after reconnect or atlas:change with scope runs on older servers.
|
|
18
|
+
|
|
19
|
+
- `project` (query): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
20
|
+
|
|
21
|
+
Responses: `200` Recent live run summaries.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.
|
|
22
|
+
|
|
23
|
+
### Live test progress and recent invocations
|
|
24
|
+
|
|
25
|
+
`GET /api/projects/{project}/live` · role: read
|
|
26
|
+
|
|
27
|
+
Returns up to 50 recent producer leases, including running, completed and interrupted runs. Counters and recent check/step updates are bounded; authentication credentials are never returned. Consume run events for immediate bounded snapshots; re-fetch after reconnect or atlas:change with scope runs on older servers.
|
|
28
|
+
|
|
29
|
+
Scoped to one project. The same project may be selected on the unprefixed API using ?project= or X-Atlas-Project. Unknown projects return 404 on reads and are created by an authenticated upload.
|
|
30
|
+
|
|
31
|
+
- `project` (path, required): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
32
|
+
|
|
33
|
+
Responses: `200` Recent live run summaries.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.
|
|
34
|
+
|
|
35
|
+
### Start a live producer lease
|
|
36
|
+
|
|
37
|
+
`POST /api/live/{id}` · role: publish
|
|
38
|
+
|
|
39
|
+
Register a UUID run id and fixed producer identity before tests begin. Retrying the same identity and token is idempotent. The server timestamps receipt. Send heartbeats every 5 seconds and progress as tests execute. The default heartbeat timeout is 30 seconds; a 15-minute progress stall is configurable separately.
|
|
40
|
+
|
|
41
|
+
- `id` (path, required): Producer-generated UUID, also given in the body.
|
|
42
|
+
- `project` (query): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
43
|
+
|
|
44
|
+
Responses: `201` The registered lease.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `403` The token is known but its role may not do this.; `409` The id already belongs to another invocation.; `413` Request too large.; `422` Invalid identity.; `429` Live run capacity reached.
|
|
45
|
+
|
|
46
|
+
### Start a live producer lease
|
|
47
|
+
|
|
48
|
+
`POST /api/projects/{project}/live/{id}` · role: publish
|
|
49
|
+
|
|
50
|
+
Register a UUID run id and fixed producer identity before tests begin. Retrying the same identity and token is idempotent. The server timestamps receipt. Send heartbeats every 5 seconds and progress as tests execute. The default heartbeat timeout is 30 seconds; a 15-minute progress stall is configurable separately.
|
|
51
|
+
|
|
52
|
+
Scoped to one project. The same project may be selected on the unprefixed API using ?project= or X-Atlas-Project. Unknown projects return 404 on reads and are created by an authenticated upload.
|
|
53
|
+
|
|
54
|
+
- `project` (path, required): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
55
|
+
- `id` (path, required): Producer-generated UUID, also given in the body.
|
|
56
|
+
|
|
57
|
+
Responses: `201` The registered lease.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `403` The token is known but its role may not do this.; `409` The id already belongs to another invocation.; `413` Request too large.; `422` Invalid identity.; `429` Live run capacity reached.
|
|
58
|
+
|
|
59
|
+
### Publish progress or finish an invocation
|
|
60
|
+
|
|
61
|
+
`PATCH /api/live/{id}` · role: publish
|
|
62
|
+
|
|
63
|
+
Apply ordered check deltas, starting at sequence 1. Retry a sequence with identical content only. Completed results become immutable report layers immediately; running checks remain operational progress and do not replace historical winners. Finish as completed or interrupted. Stale updates cannot revive an expired lease; pending checks never become passes.
|
|
64
|
+
|
|
65
|
+
- `id` (path, required): The UUID of a run started with this publisher token.
|
|
66
|
+
- `project` (query): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
67
|
+
|
|
68
|
+
Responses: `200` Updated progress.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `403` The token is known but its role may not do this.; `404` Unknown run.; `409` Run ended or sequence is stale.; `413` Request too large.; `422` Invalid progress.; `429` Run check capacity reached.
|
|
69
|
+
|
|
70
|
+
### Publish progress or finish an invocation
|
|
71
|
+
|
|
72
|
+
`PATCH /api/projects/{project}/live/{id}` · role: publish
|
|
73
|
+
|
|
74
|
+
Apply ordered check deltas, starting at sequence 1. Retry a sequence with identical content only. Completed results become immutable report layers immediately; running checks remain operational progress and do not replace historical winners. Finish as completed or interrupted. Stale updates cannot revive an expired lease; pending checks never become passes.
|
|
75
|
+
|
|
76
|
+
Scoped to one project. The same project may be selected on the unprefixed API using ?project= or X-Atlas-Project. Unknown projects return 404 on reads and are created by an authenticated upload.
|
|
77
|
+
|
|
78
|
+
- `project` (path, required): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
79
|
+
- `id` (path, required): The UUID of a run started with this publisher token.
|
|
80
|
+
|
|
81
|
+
Responses: `200` Updated progress.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `403` The token is known but its role may not do this.; `404` Unknown run.; `409` Run ended or sequence is stale.; `413` Request too large.; `422` Invalid progress.; `429` Run check capacity reached.
|
|
82
|
+
|
|
83
|
+
### Renew a producer heartbeat
|
|
84
|
+
|
|
85
|
+
`POST /api/live/{id}/heartbeat` · role: publish
|
|
86
|
+
|
|
87
|
+
Renew a running lease using server receipt time, independently of test progress. No result layers are created. Heartbeats cannot revive terminal runs or bypass the configured progress-stall timeout. The producer token must be the one that started this invocation.
|
|
88
|
+
|
|
89
|
+
- `id` (path, required): The UUID of this producer invocation.
|
|
90
|
+
- `project` (query): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
91
|
+
|
|
92
|
+
Responses: `200` Heartbeat received.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `403` The token is known but its role may not do this.; `404` Unknown run.; `409` Run ended or its lease expired.; `422` Invalid run id.
|
|
93
|
+
|
|
94
|
+
### Renew a producer heartbeat
|
|
95
|
+
|
|
96
|
+
`POST /api/projects/{project}/live/{id}/heartbeat` · role: publish
|
|
97
|
+
|
|
98
|
+
Renew a running lease using server receipt time, independently of test progress. No result layers are created. Heartbeats cannot revive terminal runs or bypass the configured progress-stall timeout. The producer token must be the one that started this invocation.
|
|
99
|
+
|
|
100
|
+
Scoped to one project. The same project may be selected on the unprefixed API using ?project= or X-Atlas-Project. Unknown projects return 404 on reads and are created by an authenticated upload.
|
|
101
|
+
|
|
102
|
+
- `project` (path, required): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
103
|
+
- `id` (path, required): The UUID of this producer invocation.
|
|
104
|
+
|
|
105
|
+
Responses: `200` Heartbeat received.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `403` The token is known but its role may not do this.; `404` Unknown run.; `409` Run ended or its lease expired.; `422` Invalid run id.
|
|
106
|
+
|
|
107
|
+
### Server settings page
|
|
108
|
+
|
|
109
|
+
`GET /admin` · role: read
|
|
110
|
+
|
|
111
|
+
A standalone settings editor. Supply an admin Bearer token in the page to read or save configuration. The token is held only in memory.
|
|
112
|
+
|
|
113
|
+
Responses: `200` Settings editor.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.
|
|
114
|
+
|
|
115
|
+
### Read server settings
|
|
116
|
+
|
|
117
|
+
`GET /api/settings` · role: admin
|
|
118
|
+
|
|
119
|
+
Returns editable persisted storage/report settings, active settings, a revision, and configuration precedence. Authentication settings are excluded. Requires an admin Bearer token. Embedded applications may manage settings outside this API.
|
|
120
|
+
|
|
121
|
+
Responses: `200` Settings and revision.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `403` The token is known but its role may not do this.; `503` Configuration is managed by the embedding application.
|
|
122
|
+
|
|
123
|
+
### Save settings for the next restart
|
|
124
|
+
|
|
125
|
+
`PUT /api/settings` · role: admin
|
|
126
|
+
|
|
127
|
+
Replaces editable storage/report settings, preserving authentication and other file fields. Atomically persists a validated configuration; no report data is moved. Environment variables and flags override these values after restart. Requires an admin Bearer token, same-origin requests in browsers, and a current revision.
|
|
128
|
+
|
|
129
|
+
- `If-Match` (header, required): The quoted revision returned by GET /api/settings.
|
|
130
|
+
|
|
131
|
+
Responses: `200` Saved settings and new revision. Restart required.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `403` The token is known but its role may not do this.; `409` Settings changed; reload before saving.; `413` Settings exceed the body limit.; `422` Invalid configuration.; `428` A quoted settings revision is required.; `503` Configuration is managed by the embedding application.
|
|
132
|
+
|
|
133
|
+
### Is the process up
|
|
134
|
+
|
|
135
|
+
`GET /healthz` · role: none
|
|
136
|
+
|
|
137
|
+
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.
|
|
138
|
+
|
|
139
|
+
Responses: `200` The process is up.
|
|
140
|
+
|
|
141
|
+
### Has the server read its backends
|
|
142
|
+
|
|
143
|
+
`GET /readyz` · role: none
|
|
144
|
+
|
|
145
|
+
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.
|
|
146
|
+
|
|
147
|
+
Responses: `200` Ready.; `503` Not ready yet; the body is the same shape with `ready: false`.
|
|
148
|
+
|
|
149
|
+
### This document
|
|
150
|
+
|
|
151
|
+
`GET /api/openapi.json` · role: none
|
|
152
|
+
|
|
153
|
+
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.
|
|
154
|
+
|
|
155
|
+
Responses: `200` The OpenAPI document.
|
|
156
|
+
|
|
157
|
+
### How to use this server, for an agent
|
|
158
|
+
|
|
159
|
+
`GET /llms.txt` · role: none
|
|
160
|
+
|
|
161
|
+
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.
|
|
162
|
+
|
|
163
|
+
Responses: `200` The guide, Markdown.
|
|
164
|
+
|
|
165
|
+
### What this server is and who is asking
|
|
166
|
+
|
|
167
|
+
`GET /api/server` · role: read
|
|
168
|
+
|
|
169
|
+
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.
|
|
170
|
+
|
|
171
|
+
Responses: `200` The server.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.
|
|
172
|
+
|
|
173
|
+
### Server-sent events: results arrived, specs or runs changed
|
|
174
|
+
|
|
175
|
+
`GET /api/events` · role: read
|
|
176
|
+
|
|
177
|
+
A `text/event-stream` that stays open. Report events announce changes, and run events carry bounded live progress snapshots; authoritative state can always be fetched, so a client that missed events (a dropped connection) loses nothing: read again on reconnect.
|
|
178
|
+
|
|
179
|
+
| event | data |
|
|
180
|
+
| --- | --- |
|
|
181
|
+
| `hello` | `{ version, ready, time, heartbeatMs? }`, sent first |
|
|
182
|
+
| `report` | `{ version, totalLayers, added: [{ id, producer, environment, branch, sha, recordedAtMs, counts }], addedTotal }`: layers arrived |
|
|
183
|
+
| `atlas:change` | `{ scope: "specs" \| "runs", files, runIds }`: new specs or runs |
|
|
184
|
+
| `run` | A LiveRun snapshot after start, progress, heartbeat, completion, or interruption; contains no producer credentials |
|
|
185
|
+
| `projects` | `{}` when the node discovers another project; refresh `/api/projects` |
|
|
186
|
+
| `ping` | `{}` every `heartbeatSeconds`, so a quiet server is told apart from a dead connection |
|
|
187
|
+
|
|
188
|
+
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`.
|
|
189
|
+
|
|
190
|
+
- `project` (query): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
191
|
+
|
|
192
|
+
Responses: `200` The stream.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `503` Too many viewers are connected; poll instead.
|
|
193
|
+
|
|
194
|
+
### Server-sent events: results arrived, specs or runs changed
|
|
195
|
+
|
|
196
|
+
`GET /api/projects/{project}/events` · role: read
|
|
197
|
+
|
|
198
|
+
A `text/event-stream` that stays open. Report events announce changes, and run events carry bounded live progress snapshots; authoritative state can always be fetched, so a client that missed events (a dropped connection) loses nothing: read again on reconnect.
|
|
199
|
+
|
|
200
|
+
| event | data |
|
|
201
|
+
| --- | --- |
|
|
202
|
+
| `hello` | `{ version, ready, time, heartbeatMs? }`, sent first |
|
|
203
|
+
| `report` | `{ version, totalLayers, added: [{ id, producer, environment, branch, sha, recordedAtMs, counts }], addedTotal }`: layers arrived |
|
|
204
|
+
| `atlas:change` | `{ scope: "specs" \| "runs", files, runIds }`: new specs or runs |
|
|
205
|
+
| `run` | A LiveRun snapshot after start, progress, heartbeat, completion, or interruption; contains no producer credentials |
|
|
206
|
+
| `projects` | `{}` when the node discovers another project; refresh `/api/projects` |
|
|
207
|
+
| `ping` | `{}` every `heartbeatSeconds`, so a quiet server is told apart from a dead connection |
|
|
208
|
+
|
|
209
|
+
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`.
|
|
210
|
+
|
|
211
|
+
Scoped to one project. The same project may be selected on the unprefixed API using ?project= or X-Atlas-Project. Unknown projects return 404 on reads and are created by an authenticated upload.
|
|
212
|
+
|
|
213
|
+
- `project` (path, required): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
214
|
+
|
|
215
|
+
Responses: `200` The stream.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `503` Too many viewers are connected; poll instead.
|
|
216
|
+
|
|
217
|
+
### The whole report, or only what changed since a version
|
|
218
|
+
|
|
219
|
+
`GET /api/reports/evidence/effective` · role: read
|
|
220
|
+
|
|
221
|
+
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.
|
|
222
|
+
|
|
223
|
+
`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.
|
|
224
|
+
|
|
225
|
+
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`.
|
|
226
|
+
|
|
227
|
+
- `since` (query): The `version` of the report you hold.
|
|
228
|
+
- `if-none-match` (header): The ETag (the quoted version) of the report you hold.
|
|
229
|
+
- `project` (query): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
230
|
+
|
|
231
|
+
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`.
|
|
232
|
+
|
|
233
|
+
### The whole report, or only what changed since a version
|
|
234
|
+
|
|
235
|
+
`GET /api/projects/{project}/reports/evidence/effective` · role: read
|
|
236
|
+
|
|
237
|
+
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.
|
|
238
|
+
|
|
239
|
+
`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.
|
|
240
|
+
|
|
241
|
+
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`.
|
|
242
|
+
|
|
243
|
+
Scoped to one project. The same project may be selected on the unprefixed API using ?project= or X-Atlas-Project. Unknown projects return 404 on reads and are created by an authenticated upload.
|
|
244
|
+
|
|
245
|
+
- `project` (path, required): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
246
|
+
- `since` (query): The `version` of the report you hold.
|
|
247
|
+
- `if-none-match` (header): The ETag (the quoted version) of the report you hold.
|
|
248
|
+
|
|
249
|
+
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`.
|
|
250
|
+
|
|
251
|
+
### The gate: does the report pass
|
|
252
|
+
|
|
253
|
+
`GET /api/status` · role: read
|
|
254
|
+
|
|
255
|
+
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.**
|
|
256
|
+
|
|
257
|
+
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.
|
|
258
|
+
|
|
259
|
+
- `branch` (query): Only layers recorded on this branch. Repeatable.
|
|
260
|
+
- `ignoreModified` (query): `1`: leave out layers from modified checkouts and unknown origins.
|
|
261
|
+
- `requireEnvironments` (query): Comma-separated environments that must have results.
|
|
262
|
+
- `requireAllSpecs` (query): `1`: fail while any spec of the outline has no results.
|
|
263
|
+
- `project` (query): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
264
|
+
|
|
265
|
+
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`.
|
|
266
|
+
|
|
267
|
+
### The gate: does the report pass
|
|
268
|
+
|
|
269
|
+
`GET /api/projects/{project}/status` · role: read
|
|
270
|
+
|
|
271
|
+
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.**
|
|
272
|
+
|
|
273
|
+
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.
|
|
274
|
+
|
|
275
|
+
Scoped to one project. The same project may be selected on the unprefixed API using ?project= or X-Atlas-Project. Unknown projects return 404 on reads and are created by an authenticated upload.
|
|
276
|
+
|
|
277
|
+
- `project` (path, required): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
278
|
+
- `branch` (query): Only layers recorded on this branch. Repeatable.
|
|
279
|
+
- `ignoreModified` (query): `1`: leave out layers from modified checkouts and unknown origins.
|
|
280
|
+
- `requireEnvironments` (query): Comma-separated environments that must have results.
|
|
281
|
+
- `requireAllSpecs` (query): `1`: fail while any spec of the outline has no results.
|
|
282
|
+
|
|
283
|
+
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`.
|
|
284
|
+
|
|
285
|
+
### Upload one layer of checks as JSON
|
|
286
|
+
|
|
287
|
+
`POST /api/checks` · role: publish
|
|
288
|
+
|
|
289
|
+
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.
|
|
290
|
+
|
|
291
|
+
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`.
|
|
292
|
+
|
|
293
|
+
- `project` (query): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
294
|
+
|
|
295
|
+
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.
|
|
296
|
+
|
|
297
|
+
### Upload one layer of checks as JSON
|
|
298
|
+
|
|
299
|
+
`POST /api/projects/{project}/checks` · role: publish
|
|
300
|
+
|
|
301
|
+
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.
|
|
302
|
+
|
|
303
|
+
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`.
|
|
304
|
+
|
|
305
|
+
Scoped to one project. The same project may be selected on the unprefixed API using ?project= or X-Atlas-Project. Unknown projects return 404 on reads and are created by an authenticated upload.
|
|
306
|
+
|
|
307
|
+
- `project` (path, required): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
308
|
+
|
|
309
|
+
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.
|
|
310
|
+
|
|
311
|
+
### List keys under layers/
|
|
312
|
+
|
|
313
|
+
`GET /api/store` · role: read
|
|
314
|
+
|
|
315
|
+
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.
|
|
316
|
+
|
|
317
|
+
- `prefix` (query): Only keys starting with this. Default `layers/`.
|
|
318
|
+
- `after` (query): Only keys after this one (exclusive).
|
|
319
|
+
- `limit` (query): Page size, 1 to 1000. Default 1000.
|
|
320
|
+
- `project` (query): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
321
|
+
|
|
322
|
+
Responses: `200` A page.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `422` The prefix is not one Atlas holds.
|
|
323
|
+
|
|
324
|
+
### List keys under layers/
|
|
325
|
+
|
|
326
|
+
`GET /api/projects/{project}/store` · role: read
|
|
327
|
+
|
|
328
|
+
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.
|
|
329
|
+
|
|
330
|
+
Scoped to one project. The same project may be selected on the unprefixed API using ?project= or X-Atlas-Project. Unknown projects return 404 on reads and are created by an authenticated upload.
|
|
331
|
+
|
|
332
|
+
- `project` (path, required): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
333
|
+
- `prefix` (query): Only keys starting with this. Default `layers/`.
|
|
334
|
+
- `after` (query): Only keys after this one (exclusive).
|
|
335
|
+
- `limit` (query): Page size, 1 to 1000. Default 1000.
|
|
336
|
+
|
|
337
|
+
Responses: `200` A page.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `422` The prefix is not one Atlas holds.
|
|
338
|
+
|
|
339
|
+
### Read an object
|
|
340
|
+
|
|
341
|
+
`GET /api/store/{key}` · role: read
|
|
342
|
+
|
|
343
|
+
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.
|
|
344
|
+
|
|
345
|
+
- `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.
|
|
346
|
+
- `project` (query): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
347
|
+
|
|
348
|
+
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.
|
|
349
|
+
|
|
350
|
+
### Read an object
|
|
351
|
+
|
|
352
|
+
`GET /api/projects/{project}/store/{key}` · role: read
|
|
353
|
+
|
|
354
|
+
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.
|
|
355
|
+
|
|
356
|
+
Scoped to one project. The same project may be selected on the unprefixed API using ?project= or X-Atlas-Project. Unknown projects return 404 on reads and are created by an authenticated upload.
|
|
357
|
+
|
|
358
|
+
- `project` (path, required): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
359
|
+
- `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.
|
|
360
|
+
|
|
361
|
+
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.
|
|
362
|
+
|
|
363
|
+
### Does an object exist
|
|
364
|
+
|
|
365
|
+
`HEAD /api/store/{key}` · role: read
|
|
366
|
+
|
|
367
|
+
`200` when the object exists, `404` when not. No body.
|
|
368
|
+
|
|
369
|
+
- `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.
|
|
370
|
+
- `project` (query): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
371
|
+
|
|
372
|
+
Responses: `200` It exists.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `404` No such object.
|
|
373
|
+
|
|
374
|
+
### Does an object exist
|
|
375
|
+
|
|
376
|
+
`HEAD /api/projects/{project}/store/{key}` · role: read
|
|
377
|
+
|
|
378
|
+
`200` when the object exists, `404` when not. No body.
|
|
379
|
+
|
|
380
|
+
Scoped to one project. The same project may be selected on the unprefixed API using ?project= or X-Atlas-Project. Unknown projects return 404 on reads and are created by an authenticated upload.
|
|
381
|
+
|
|
382
|
+
- `project` (path, required): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
383
|
+
- `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.
|
|
384
|
+
|
|
385
|
+
Responses: `200` It exists.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `404` No such object.
|
|
386
|
+
|
|
387
|
+
### Upload an object
|
|
388
|
+
|
|
389
|
+
`PUT /api/store/{key}` · role: publish
|
|
390
|
+
|
|
391
|
+
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:
|
|
392
|
+
|
|
393
|
+
- 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);
|
|
394
|
+
- a **blob** (`layers/blobs/<sha256>.gz`) must be gzip of content whose SHA-256 is its name; a **spec file** likewise;
|
|
395
|
+
- a **catalog entry** (`…/index/…`) must name something already uploaded (`409` otherwise): it is what makes a layer visible, so it is written last;
|
|
396
|
+
- a **run manifest** must have passed its privacy scan;
|
|
397
|
+
- keys are immutable: the same bytes again are `200` (a retry), other bytes under the same key are `409`.
|
|
398
|
+
|
|
399
|
+
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.
|
|
400
|
+
|
|
401
|
+
- `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.
|
|
402
|
+
- `content-type` (header): Stored with the object and returned when it is read.
|
|
403
|
+
- `project` (query): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
404
|
+
|
|
405
|
+
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.
|
|
406
|
+
|
|
407
|
+
### Upload an object
|
|
408
|
+
|
|
409
|
+
`PUT /api/projects/{project}/store/{key}` · role: publish
|
|
410
|
+
|
|
411
|
+
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:
|
|
412
|
+
|
|
413
|
+
- 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);
|
|
414
|
+
- a **blob** (`layers/blobs/<sha256>.gz`) must be gzip of content whose SHA-256 is its name; a **spec file** likewise;
|
|
415
|
+
- a **catalog entry** (`…/index/…`) must name something already uploaded (`409` otherwise): it is what makes a layer visible, so it is written last;
|
|
416
|
+
- a **run manifest** must have passed its privacy scan;
|
|
417
|
+
- keys are immutable: the same bytes again are `200` (a retry), other bytes under the same key are `409`.
|
|
418
|
+
|
|
419
|
+
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.
|
|
420
|
+
|
|
421
|
+
Scoped to one project. The same project may be selected on the unprefixed API using ?project= or X-Atlas-Project. Unknown projects return 404 on reads and are created by an authenticated upload.
|
|
422
|
+
|
|
423
|
+
- `project` (path, required): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
424
|
+
- `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.
|
|
425
|
+
- `content-type` (header): Stored with the object and returned when it is read.
|
|
426
|
+
|
|
427
|
+
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.
|
|
428
|
+
|
|
429
|
+
### Remove a scratch object
|
|
430
|
+
|
|
431
|
+
`DELETE /api/store/{key}` · role: publish
|
|
432
|
+
|
|
433
|
+
Only the scratch objects `atlas report doctor` writes (`layers/doctor-…`) can be removed. Layers, specs and runs are never removed through the API.
|
|
434
|
+
|
|
435
|
+
- `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.
|
|
436
|
+
- `project` (query): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
437
|
+
|
|
438
|
+
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.
|
|
439
|
+
|
|
440
|
+
### Remove a scratch object
|
|
441
|
+
|
|
442
|
+
`DELETE /api/projects/{project}/store/{key}` · role: publish
|
|
443
|
+
|
|
444
|
+
Only the scratch objects `atlas report doctor` writes (`layers/doctor-…`) can be removed. Layers, specs and runs are never removed through the API.
|
|
445
|
+
|
|
446
|
+
Scoped to one project. The same project may be selected on the unprefixed API using ?project= or X-Atlas-Project. Unknown projects return 404 on reads and are created by an authenticated upload.
|
|
447
|
+
|
|
448
|
+
- `project` (path, required): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
449
|
+
- `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.
|
|
450
|
+
|
|
451
|
+
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.
|
|
452
|
+
|
|
453
|
+
### The specs a report is laid over
|
|
454
|
+
|
|
455
|
+
`GET /api/reports/outline` · role: read
|
|
456
|
+
|
|
457
|
+
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.
|
|
458
|
+
|
|
459
|
+
- `project` (query): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
460
|
+
|
|
461
|
+
Responses: `200` The outline.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.
|
|
462
|
+
|
|
463
|
+
### The specs a report is laid over
|
|
464
|
+
|
|
465
|
+
`GET /api/projects/{project}/reports/outline` · role: read
|
|
466
|
+
|
|
467
|
+
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.
|
|
468
|
+
|
|
469
|
+
Scoped to one project. The same project may be selected on the unprefixed API using ?project= or X-Atlas-Project. Unknown projects return 404 on reads and are created by an authenticated upload.
|
|
470
|
+
|
|
471
|
+
- `project` (path, required): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
472
|
+
|
|
473
|
+
Responses: `200` The outline.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.
|
|
474
|
+
|
|
475
|
+
### The text of one spec
|
|
476
|
+
|
|
477
|
+
`GET /api/reports/outline/spec` · role: read
|
|
478
|
+
|
|
479
|
+
The text of a spec file of the outline, by its path.
|
|
480
|
+
|
|
481
|
+
- `path` (query, required): The spec's path, `specs/<path>`.
|
|
482
|
+
- `project` (query): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
483
|
+
|
|
484
|
+
Responses: `200` The spec text.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `404` No such spec in the outline.
|
|
485
|
+
|
|
486
|
+
### The text of one spec
|
|
487
|
+
|
|
488
|
+
`GET /api/projects/{project}/reports/outline/spec` · role: read
|
|
489
|
+
|
|
490
|
+
The text of a spec file of the outline, by its path.
|
|
491
|
+
|
|
492
|
+
Scoped to one project. The same project may be selected on the unprefixed API using ?project= or X-Atlas-Project. Unknown projects return 404 on reads and are created by an authenticated upload.
|
|
493
|
+
|
|
494
|
+
- `project` (path, required): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
495
|
+
- `path` (query, required): The spec's path, `specs/<path>`.
|
|
496
|
+
|
|
497
|
+
Responses: `200` The spec text.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `404` No such spec in the outline.
|
|
498
|
+
|
|
499
|
+
### Page through every layer header
|
|
500
|
+
|
|
501
|
+
`GET /api/reports/evidence` · role: read
|
|
502
|
+
|
|
503
|
+
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.
|
|
504
|
+
|
|
505
|
+
- `cursor` (query): The `cursor` of the previous page.
|
|
506
|
+
- `project` (query): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
507
|
+
|
|
508
|
+
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`.
|
|
509
|
+
|
|
510
|
+
### Page through every layer header
|
|
511
|
+
|
|
512
|
+
`GET /api/projects/{project}/reports/evidence` · role: read
|
|
513
|
+
|
|
514
|
+
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.
|
|
515
|
+
|
|
516
|
+
Scoped to one project. The same project may be selected on the unprefixed API using ?project= or X-Atlas-Project. Unknown projects return 404 on reads and are created by an authenticated upload.
|
|
517
|
+
|
|
518
|
+
- `project` (path, required): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
519
|
+
- `cursor` (query): The `cursor` of the previous page.
|
|
520
|
+
|
|
521
|
+
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`.
|
|
522
|
+
|
|
523
|
+
### The checks of one layer
|
|
524
|
+
|
|
525
|
+
`GET /api/reports/evidence/rows/{backend}/{id}` · role: read
|
|
526
|
+
|
|
527
|
+
Every check of one layer (not only those that win), with the spec fingerprints it recorded.
|
|
528
|
+
|
|
529
|
+
- `backend` (path, required): A backend id from `/api/server`.
|
|
530
|
+
- `id` (path, required): A layer id: 64 lowercase hex digits.
|
|
531
|
+
- `project` (query): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
532
|
+
|
|
533
|
+
Responses: `200` The rows.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `404` No such layer in that backend.
|
|
534
|
+
|
|
535
|
+
### The checks of one layer
|
|
536
|
+
|
|
537
|
+
`GET /api/projects/{project}/reports/evidence/rows/{backend}/{id}` · role: read
|
|
538
|
+
|
|
539
|
+
Every check of one layer (not only those that win), with the spec fingerprints it recorded.
|
|
540
|
+
|
|
541
|
+
Scoped to one project. The same project may be selected on the unprefixed API using ?project= or X-Atlas-Project. Unknown projects return 404 on reads and are created by an authenticated upload.
|
|
542
|
+
|
|
543
|
+
- `project` (path, required): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
544
|
+
- `backend` (path, required): A backend id from `/api/server`.
|
|
545
|
+
- `id` (path, required): A layer id: 64 lowercase hex digits.
|
|
546
|
+
|
|
547
|
+
Responses: `200` The rows.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `404` No such layer in that backend.
|
|
548
|
+
|
|
549
|
+
### Everything one result carries
|
|
550
|
+
|
|
551
|
+
`GET /api/reports/evidence/detail/{backend}/{id}` · role: read
|
|
552
|
+
|
|
553
|
+
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}`.
|
|
554
|
+
|
|
555
|
+
- `backend` (path, required): A backend id from `/api/server`.
|
|
556
|
+
- `id` (path, required): A layer id: 64 lowercase hex digits.
|
|
557
|
+
- `check` (query): The check id.
|
|
558
|
+
- `kind` (query): The kind of the part, when the same id is in several.
|
|
559
|
+
- `project` (query): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
560
|
+
|
|
561
|
+
Responses: `200` The detail.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `404` No such layer or check.
|
|
562
|
+
|
|
563
|
+
### Everything one result carries
|
|
564
|
+
|
|
565
|
+
`GET /api/projects/{project}/reports/evidence/detail/{backend}/{id}` · role: read
|
|
566
|
+
|
|
567
|
+
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}`.
|
|
568
|
+
|
|
569
|
+
Scoped to one project. The same project may be selected on the unprefixed API using ?project= or X-Atlas-Project. Unknown projects return 404 on reads and are created by an authenticated upload.
|
|
570
|
+
|
|
571
|
+
- `project` (path, required): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
572
|
+
- `backend` (path, required): A backend id from `/api/server`.
|
|
573
|
+
- `id` (path, required): A layer id: 64 lowercase hex digits.
|
|
574
|
+
- `check` (query): The check id.
|
|
575
|
+
- `kind` (query): The kind of the part, when the same id is in several.
|
|
576
|
+
|
|
577
|
+
Responses: `200` The detail.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `404` No such layer or check.
|
|
578
|
+
|
|
579
|
+
### A file a layer carries
|
|
580
|
+
|
|
581
|
+
`GET /api/reports/layers/{id}/blobs/{bundleKey}` · role: read
|
|
582
|
+
|
|
583
|
+
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`.
|
|
584
|
+
|
|
585
|
+
- `id` (path, required): A layer id: 64 lowercase hex digits.
|
|
586
|
+
- `bundleKey` (path, required): The attachment's `bundleKey`, which contains a slash.
|
|
587
|
+
- `range` (header): A byte range, `bytes=0-1023`.
|
|
588
|
+
- `project` (query): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
589
|
+
|
|
590
|
+
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.
|
|
591
|
+
|
|
592
|
+
### A file a layer carries
|
|
593
|
+
|
|
594
|
+
`GET /api/projects/{project}/reports/layers/{id}/blobs/{bundleKey}` · role: read
|
|
595
|
+
|
|
596
|
+
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`.
|
|
597
|
+
|
|
598
|
+
Scoped to one project. The same project may be selected on the unprefixed API using ?project= or X-Atlas-Project. Unknown projects return 404 on reads and are created by an authenticated upload.
|
|
599
|
+
|
|
600
|
+
- `project` (path, required): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
601
|
+
- `id` (path, required): A layer id: 64 lowercase hex digits.
|
|
602
|
+
- `bundleKey` (path, required): The attachment's `bundleKey`, which contains a slash.
|
|
603
|
+
- `range` (header): A byte range, `bytes=0-1023`.
|
|
604
|
+
|
|
605
|
+
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.
|
|
606
|
+
|
|
607
|
+
### A recorded test of a statechart run
|
|
608
|
+
|
|
609
|
+
`GET /api/reports/layers/{id}/{path}` · role: read
|
|
610
|
+
|
|
611
|
+
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.
|
|
612
|
+
|
|
613
|
+
- `id` (path, required): A layer id: 64 lowercase hex digits.
|
|
614
|
+
- `path` (path, required): The path under the layer.
|
|
615
|
+
- `project` (query): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
616
|
+
|
|
617
|
+
Responses: `200` The file.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `404` No such file.
|
|
618
|
+
|
|
619
|
+
### A recorded test of a statechart run
|
|
620
|
+
|
|
621
|
+
`GET /api/projects/{project}/reports/layers/{id}/{path}` · role: read
|
|
622
|
+
|
|
623
|
+
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.
|
|
624
|
+
|
|
625
|
+
Scoped to one project. The same project may be selected on the unprefixed API using ?project= or X-Atlas-Project. Unknown projects return 404 on reads and are created by an authenticated upload.
|
|
626
|
+
|
|
627
|
+
- `project` (path, required): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
628
|
+
- `id` (path, required): A layer id: 64 lowercase hex digits.
|
|
629
|
+
- `path` (path, required): The path under the layer.
|
|
630
|
+
|
|
631
|
+
Responses: `200` The file.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `404` No such file.
|
|
632
|
+
|
|
633
|
+
### Frame stylesheet of a live spec run (development only)
|
|
634
|
+
|
|
635
|
+
`GET /api/reports/live/{source}/frame.css` · role: read
|
|
636
|
+
|
|
637
|
+
For spec runs writing on the same machine as a development host (`atlas-visualizer dev`). A server has none: it answers `404`.
|
|
638
|
+
|
|
639
|
+
- `source` (path, required): The live source id.
|
|
640
|
+
- `project` (query): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
641
|
+
|
|
642
|
+
Responses: `200` The stylesheet.; `404` Not a live source.
|
|
643
|
+
|
|
644
|
+
### Frame stylesheet of a live spec run (development only)
|
|
645
|
+
|
|
646
|
+
`GET /api/projects/{project}/reports/live/{source}/frame.css` · role: read
|
|
647
|
+
|
|
648
|
+
For spec runs writing on the same machine as a development host (`atlas-visualizer dev`). A server has none: it answers `404`.
|
|
649
|
+
|
|
650
|
+
Scoped to one project. The same project may be selected on the unprefixed API using ?project= or X-Atlas-Project. Unknown projects return 404 on reads and are created by an authenticated upload.
|
|
651
|
+
|
|
652
|
+
- `project` (path, required): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
653
|
+
- `source` (path, required): The live source id.
|
|
654
|
+
|
|
655
|
+
Responses: `200` The stylesheet.; `404` Not a live source.
|
|
656
|
+
|
|
657
|
+
### A file of a test in a live spec run (development only)
|
|
658
|
+
|
|
659
|
+
`GET /api/reports/live/{source}/tests/{testId}/{path}` · role: read
|
|
660
|
+
|
|
661
|
+
For spec runs writing on the same machine as a development host. A server has none: it answers `404`.
|
|
662
|
+
|
|
663
|
+
- `source` (path, required): The live source id.
|
|
664
|
+
- `testId` (path, required): The test id.
|
|
665
|
+
- `path` (path, required): The path under the test.
|
|
666
|
+
- `project` (query): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
667
|
+
|
|
668
|
+
Responses: `200` The file.; `404` Not a live source.
|
|
669
|
+
|
|
670
|
+
### A file of a test in a live spec run (development only)
|
|
671
|
+
|
|
672
|
+
`GET /api/projects/{project}/reports/live/{source}/tests/{testId}/{path}` · role: read
|
|
673
|
+
|
|
674
|
+
For spec runs writing on the same machine as a development host. A server has none: it answers `404`.
|
|
675
|
+
|
|
676
|
+
Scoped to one project. The same project may be selected on the unprefixed API using ?project= or X-Atlas-Project. Unknown projects return 404 on reads and are created by an authenticated upload.
|
|
677
|
+
|
|
678
|
+
- `project` (path, required): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
679
|
+
- `source` (path, required): The live source id.
|
|
680
|
+
- `testId` (path, required): The test id.
|
|
681
|
+
- `path` (path, required): The path under the test.
|
|
682
|
+
|
|
683
|
+
Responses: `200` The file.; `404` Not a live source.
|
|
684
|
+
|
|
685
|
+
### The sources the viewer reads
|
|
686
|
+
|
|
687
|
+
`GET /api/data/sources.json` · role: read
|
|
688
|
+
|
|
689
|
+
The viewer's address book of data sources, in the shape a static host serves. A server has one source, itself.
|
|
690
|
+
|
|
691
|
+
- `project` (query): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
692
|
+
|
|
693
|
+
Responses: `200` The sources file.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.
|
|
694
|
+
|
|
695
|
+
### The sources the viewer reads
|
|
696
|
+
|
|
697
|
+
`GET /api/projects/{project}/data/sources.json` · role: read
|
|
698
|
+
|
|
699
|
+
The viewer's address book of data sources, in the shape a static host serves. A server has one source, itself.
|
|
700
|
+
|
|
701
|
+
Scoped to one project. The same project may be selected on the unprefixed API using ?project= or X-Atlas-Project. Unknown projects return 404 on reads and are created by an authenticated upload.
|
|
702
|
+
|
|
703
|
+
- `project` (path, required): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
704
|
+
|
|
705
|
+
Responses: `200` The sources file.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.
|
|
706
|
+
|
|
707
|
+
### The spec files
|
|
708
|
+
|
|
709
|
+
`GET /api/data/specs/index.json` · role: read
|
|
710
|
+
|
|
711
|
+
The files of the newest committed spec set, relative to `specs/`.
|
|
712
|
+
|
|
713
|
+
- `project` (query): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
714
|
+
|
|
715
|
+
Responses: `200` The index.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.
|
|
716
|
+
|
|
717
|
+
### The spec files
|
|
718
|
+
|
|
719
|
+
`GET /api/projects/{project}/data/specs/index.json` · role: read
|
|
720
|
+
|
|
721
|
+
The files of the newest committed spec set, relative to `specs/`.
|
|
722
|
+
|
|
723
|
+
Scoped to one project. The same project may be selected on the unprefixed API using ?project= or X-Atlas-Project. Unknown projects return 404 on reads and are created by an authenticated upload.
|
|
724
|
+
|
|
725
|
+
- `project` (path, required): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
726
|
+
|
|
727
|
+
Responses: `200` The index.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.
|
|
728
|
+
|
|
729
|
+
### One spec file
|
|
730
|
+
|
|
731
|
+
`GET /api/data/specs/{file}` · role: read
|
|
732
|
+
|
|
733
|
+
The text of a spec file, with the digest of its content as `ETag`.
|
|
734
|
+
|
|
735
|
+
- `file` (path, required): The file's path relative to `specs/`.
|
|
736
|
+
- `project` (query): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
737
|
+
|
|
738
|
+
Responses: `200` The text.; `304` Not modified.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `404` No such spec.
|
|
739
|
+
|
|
740
|
+
### One spec file
|
|
741
|
+
|
|
742
|
+
`GET /api/projects/{project}/data/specs/{file}` · role: read
|
|
743
|
+
|
|
744
|
+
The text of a spec file, with the digest of its content as `ETag`.
|
|
745
|
+
|
|
746
|
+
Scoped to one project. The same project may be selected on the unprefixed API using ?project= or X-Atlas-Project. Unknown projects return 404 on reads and are created by an authenticated upload.
|
|
747
|
+
|
|
748
|
+
- `project` (path, required): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
749
|
+
- `file` (path, required): The file's path relative to `specs/`.
|
|
750
|
+
|
|
751
|
+
Responses: `200` The text.; `304` Not modified.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `404` No such spec.
|
|
752
|
+
|
|
753
|
+
### The statechart runs
|
|
754
|
+
|
|
755
|
+
`GET /api/data/runs/index.json` · role: read
|
|
756
|
+
|
|
757
|
+
The newest uploaded statechart runs (`atlas report publish --manifest … --upload-run`), newest first.
|
|
758
|
+
|
|
759
|
+
- `project` (query): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
760
|
+
|
|
761
|
+
Responses: `200` The index.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.
|
|
762
|
+
|
|
763
|
+
### The statechart runs
|
|
764
|
+
|
|
765
|
+
`GET /api/projects/{project}/data/runs/index.json` · role: read
|
|
766
|
+
|
|
767
|
+
The newest uploaded statechart runs (`atlas report publish --manifest … --upload-run`), newest first.
|
|
768
|
+
|
|
769
|
+
Scoped to one project. The same project may be selected on the unprefixed API using ?project= or X-Atlas-Project. Unknown projects return 404 on reads and are created by an authenticated upload.
|
|
770
|
+
|
|
771
|
+
- `project` (path, required): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
772
|
+
|
|
773
|
+
Responses: `200` The index.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.
|
|
774
|
+
|
|
775
|
+
### A file of an uploaded run
|
|
776
|
+
|
|
777
|
+
`GET /api/data/runs/{id}/{path}` · role: read
|
|
778
|
+
|
|
779
|
+
A file of an uploaded run: its manifest, timelines, screenshots, clips. Untrusted bytes, served sandboxed; immutable.
|
|
780
|
+
|
|
781
|
+
- `id` (path, required): The run id.
|
|
782
|
+
- `path` (path, required): The path inside the run.
|
|
783
|
+
- `project` (query): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
784
|
+
|
|
785
|
+
Responses: `200` The file.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `404` No such run or file.
|
|
786
|
+
|
|
787
|
+
### A file of an uploaded run
|
|
788
|
+
|
|
789
|
+
`GET /api/projects/{project}/data/runs/{id}/{path}` · role: read
|
|
790
|
+
|
|
791
|
+
A file of an uploaded run: its manifest, timelines, screenshots, clips. Untrusted bytes, served sandboxed; immutable.
|
|
792
|
+
|
|
793
|
+
Scoped to one project. The same project may be selected on the unprefixed API using ?project= or X-Atlas-Project. Unknown projects return 404 on reads and are created by an authenticated upload.
|
|
794
|
+
|
|
795
|
+
- `project` (path, required): Project slug. Alternatively send X-Atlas-Project or use the project-prefixed route. Omit for the default project. Conflicting selectors are refused.
|
|
796
|
+
- `id` (path, required): The run id.
|
|
797
|
+
- `path` (path, required): The path inside the run.
|
|
798
|
+
|
|
799
|
+
Responses: `200` The file.; `401` No token, or an unknown one. Send `Authorization: Bearer <token>`.; `404` No such run or file.
|