@crvouga/atlas 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -1
- package/README.md +178 -617
- 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 +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 +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 +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/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 +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 +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/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 +32 -4
- package/packages/core/README.md +2 -1
- package/packages/reports/README.md +65 -0
- package/packages/reports/STORAGE.md +4 -0
- 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 +21 -0
- 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 +40 -3
- 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 +3 -1
- package/packages/visualizer/src/evidence/evidence-context.tsx +74 -12
- 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/vite/atlas-server-proxy.ts +36 -0
- package/packages/visualizer/vite.config.ts +11 -3
package/llms.txt
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Atlas
|
|
2
|
+
|
|
3
|
+
> Atlas shows whether a product still does what it was specified to do. Test results from any suite on any machine are published as immutable layers; a report is computed from layers, never partitioned, and one Atlas server per project keeps them and shows everyone the combined report, live. Specs of any kind (Gherkin, Quint, DMN, Alloy, OpenSLO, statecharts); evidence of any kind (screenshots, videos, traces, logs). Distributed as the npm package `@crvouga/atlas`; runs on Bun and Node.
|
|
4
|
+
|
|
5
|
+
To integrate a project: `bunx @crvouga/atlas init --server <url> --format json` prints a plan; `--write` applies it. Everything prints JSON on request, has a JSON Schema, and exits 0 (worked), 1 (the answer is no) or 2 (the command was wrong).
|
|
6
|
+
|
|
7
|
+
## Start here
|
|
8
|
+
|
|
9
|
+
- [Atlas for AI agents](https://raw.githubusercontent.com/crvouga/atlas/main/docs/agents.md): Everything an agent needs to integrate a project with Atlas, send it test results, and read them back, with nothing to click and nothing to guess.
|
|
10
|
+
- [Integrating Atlas into a project](https://raw.githubusercontent.com/crvouga/atlas/main/docs/integrating.md): This guide takes a project from nothing to a layered, gated report of its specs.
|
|
11
|
+
|
|
12
|
+
## Run and use the server
|
|
13
|
+
|
|
14
|
+
- [The Atlas server](https://raw.githubusercontent.com/crvouga/atlas/main/docs/server.md): One process per project that takes in results from every environment, keeps them, and shows everyone the combined report, live.
|
|
15
|
+
- [Running Atlas for a project: one server](https://raw.githubusercontent.com/crvouga/atlas/main/docs/deploying.md): This is the production setup. A project runs one Atlas server.
|
|
16
|
+
|
|
17
|
+
## Formats and rules
|
|
18
|
+
|
|
19
|
+
- [The report contract](https://raw.githubusercontent.com/crvouga/atlas/main/docs/report-contract.md): This is the normative description of what Atlas reads and writes when it reports on specs of any kind:
|
|
20
|
+
- [Evidence: attachments, timelines, snapshots and everything else](https://raw.githubusercontent.com/crvouga/atlas/main/docs/extending.md): Atlas is opinionated about specs and open about evidence.
|
|
21
|
+
- [Report backends and live snapshots](https://raw.githubusercontent.com/crvouga/atlas/main/docs/report-backends.md): Atlas maps the product's areas, screens, events and journeys from a spec, then overlays evidence of what the product did.
|
|
22
|
+
- [Executable statecharts](https://raw.githubusercontent.com/crvouga/atlas/main/docs/statecharts.md): Write down how a product behaves as statecharts in open formats, then let Atlas lint them, plan paths that cover every transition, run those paths against the real product through any driver (a browser, a phone, a pla…
|
|
23
|
+
|
|
24
|
+
## Working with this project
|
|
25
|
+
|
|
26
|
+
- [Dogfooding Atlas from another project](https://raw.githubusercontent.com/crvouga/atlas/main/docs/dogfooding.md): Atlas is developed by using it in real projects.
|
|
27
|
+
- [Reporting issues](https://raw.githubusercontent.com/crvouga/atlas/main/docs/reporting-issues.md): How people and coding agents in a project that uses Atlas report a bug or a missing feature.
|
|
28
|
+
|
|
29
|
+
## Reference (generated from the code)
|
|
30
|
+
|
|
31
|
+
- [HTTP API (OpenAPI 3.1)](https://raw.githubusercontent.com/crvouga/atlas/main/packages/server/openapi.json): every endpoint of the server, machine-readable. A running server serves it at /api/openapi.json and a guide for itself at /llms.txt.
|
|
32
|
+
- [HTTP API, in words](https://raw.githubusercontent.com/crvouga/atlas/main/docs/reference/http-api.md): the same operations as Markdown.
|
|
33
|
+
- [Command line](https://raw.githubusercontent.com/crvouga/atlas/main/docs/reference/cli.md): the usage of every command.
|
|
34
|
+
- [TypeScript API: core](https://raw.githubusercontent.com/crvouga/atlas/main/docs/reference/core.md): Executable statecharts: loading, composing, linting, planning and running specs against real apps, and the `atlas` command.
|
|
35
|
+
- [TypeScript API: reports](https://raw.githubusercontent.com/crvouga/atlas/main/docs/reference/reports.md): Layered evidence for any kind of spec: publishing layers, stores (folder, S3, an Atlas server), combining and gating, the incremental report, init.
|
|
36
|
+
- [TypeScript API: schema](https://raw.githubusercontent.com/crvouga/atlas/main/docs/reference/schema.md): The contract: Zod schemas, and the JSON Schemas generated from them, for layers, checks, report status, command results, server responses and configuration.
|
|
37
|
+
- [TypeScript API: server](https://raw.githubusercontent.com/crvouga/atlas/main/docs/reference/server.md): The Atlas server: the API results are uploaded to, the live report, and the viewer on one host.
|
|
38
|
+
- [TypeScript API: playwright](https://raw.githubusercontent.com/crvouga/atlas/main/docs/reference/playwright.md): The Playwright driver for statechart runs.
|
|
39
|
+
- [TypeScript API: bun](https://raw.githubusercontent.com/crvouga/atlas/main/docs/reference/bun.md): The Bun WebView driver for statechart runs.
|
|
40
|
+
- [TypeScript API: webdriver](https://raw.githubusercontent.com/crvouga/atlas/main/docs/reference/webdriver.md): The W3C WebDriver / Appium driver for statechart runs.
|
|
41
|
+
- [TypeScript API: detox](https://raw.githubusercontent.com/crvouga/atlas/main/docs/reference/detox.md): The Detox driver for statechart runs of React Native apps.
|
|
42
|
+
- [TypeScript API: vitest](https://raw.githubusercontent.com/crvouga/atlas/main/docs/reference/vitest.md): Run a statechart plan as Vitest tests.
|
|
43
|
+
- [JSON Schemas](https://unpkg.com/@crvouga/atlas/packages/schema/schemas/): the layer format, checks file, report status, command results, server responses, server configuration.
|
|
44
|
+
|
|
45
|
+
## Optional
|
|
46
|
+
|
|
47
|
+
- [Releasing](https://raw.githubusercontent.com/crvouga/atlas/main/docs/releasing.md): How @crvouga/atlas gets from main to npm.
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@crvouga/atlas",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Atlas:
|
|
3
|
+
"version": "0.5.0",
|
|
4
|
+
"description": "Atlas: specs of any kind, reported as layered evidence. Publish checks from any runner (JUnit, CTRF, a script), combine them across nodes, branches, environments and backends, gate CI on the result, and run statecharts against the real app.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"sideEffects": [
|
|
@@ -17,6 +17,11 @@
|
|
|
17
17
|
"url": "https://github.com/crvouga/atlas/issues"
|
|
18
18
|
},
|
|
19
19
|
"keywords": [
|
|
20
|
+
"test-reports",
|
|
21
|
+
"ctrf",
|
|
22
|
+
"junit",
|
|
23
|
+
"gherkin",
|
|
24
|
+
"specifications",
|
|
20
25
|
"statecharts",
|
|
21
26
|
"scxml",
|
|
22
27
|
"xstate",
|
|
@@ -76,11 +81,18 @@
|
|
|
76
81
|
"types": "./dist/schema/src/index.d.ts",
|
|
77
82
|
"default": "./dist/schema/src/index.js"
|
|
78
83
|
},
|
|
84
|
+
"./server": {
|
|
85
|
+
"types": "./dist/server/src/index.d.ts",
|
|
86
|
+
"default": "./dist/server/src/index.js"
|
|
87
|
+
},
|
|
79
88
|
"./reports/*": {
|
|
80
89
|
"types": "./dist/reports/src/*.d.ts",
|
|
81
90
|
"default": "./dist/reports/src/*.js"
|
|
82
91
|
},
|
|
83
|
-
"./schemas/*": "./packages/schema/schemas/*"
|
|
92
|
+
"./schemas/*": "./packages/schema/schemas/*",
|
|
93
|
+
"./openapi.json": "./packages/server/openapi.json",
|
|
94
|
+
"./llms.txt": "./llms.txt",
|
|
95
|
+
"./llms-full.txt": "./llms-full.txt"
|
|
84
96
|
},
|
|
85
97
|
"publishConfig": {
|
|
86
98
|
"access": "public",
|
|
@@ -90,6 +102,11 @@
|
|
|
90
102
|
"dist",
|
|
91
103
|
"packages/core/bin",
|
|
92
104
|
"packages/schema/schemas",
|
|
105
|
+
"packages/server/openapi.json",
|
|
106
|
+
"llms.txt",
|
|
107
|
+
"llms-full.txt",
|
|
108
|
+
"docs/agents.md",
|
|
109
|
+
"docs/reference",
|
|
93
110
|
"packages/visualizer/bin",
|
|
94
111
|
"packages/visualizer/example",
|
|
95
112
|
"packages/visualizer/fixtures",
|
|
@@ -100,13 +117,24 @@
|
|
|
100
117
|
"packages/visualizer/vite.config.ts",
|
|
101
118
|
"packages/*/README.md",
|
|
102
119
|
"packages/reports/STORAGE.md",
|
|
120
|
+
"docs/integrating.md",
|
|
121
|
+
"docs/deploying.md",
|
|
122
|
+
"docs/server.md",
|
|
123
|
+
"docs/extending.md",
|
|
124
|
+
"docs/statecharts.md",
|
|
125
|
+
"docs/report-contract.md",
|
|
126
|
+
"docs/report-backends.md",
|
|
127
|
+
"docs/dogfooding.md",
|
|
128
|
+
"docs/reporting-issues.md",
|
|
103
129
|
"CHANGELOG.md"
|
|
104
130
|
],
|
|
105
131
|
"scripts": {
|
|
106
132
|
"build": "bun scripts/build-package.ts",
|
|
107
133
|
"test": "bun test && bun test --cwd packages/visualizer --preload ./tests/preload.ts tests",
|
|
108
|
-
"type-check": "for dir in packages/* scripts examples/todo; do tsc --noEmit -p \"$dir\" || exit 1; done",
|
|
134
|
+
"type-check": "for dir in packages/* scripts scripts/docs examples/todo; do tsc --noEmit -p \"$dir\" || exit 1; done",
|
|
109
135
|
"schemas": "bun packages/schema/scripts/emit-json-schemas.ts",
|
|
136
|
+
"docs": "bun scripts/docs/generate.ts",
|
|
137
|
+
"dev": "bun packages/core/bin/atlas.mjs dev --data .atlas-data",
|
|
110
138
|
"viz:dev": "bun packages/visualizer/bin/atlas-visualizer.mjs dev --specs \"$(pwd)/packages/visualizer/fixtures/full/specs\" --runs \"$(pwd)/packages/visualizer/fixtures/full/runs\"",
|
|
111
139
|
"viz:build": "cd packages/visualizer && INIT_CWD=\"$OLDPWD\" bun --bun vite build --configLoader runner",
|
|
112
140
|
"viz:publish-data": "bun packages/visualizer/scripts/publish-data.ts",
|
package/packages/core/README.md
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# @crvouga/atlas
|
|
2
2
|
|
|
3
|
-
Executable statecharts
|
|
3
|
+
Executable statecharts, and the `atlas report` command for layered evidence of specs of any kind
|
|
4
|
+
([integrating Atlas](../../docs/integrating.md)). Load charts in W3C SCXML or XState v5 machine config, compose child charts,
|
|
4
5
|
lint them, plan paths that cover every transition, run those paths against a real system through
|
|
5
6
|
any driver, and write a manifest with JUnit, CTRF, Mermaid and WebVTT alongside.
|
|
6
7
|
|
|
@@ -1,5 +1,68 @@
|
|
|
1
1
|
# Atlas reports
|
|
2
2
|
|
|
3
|
+
Evidence for specs of any kind, kept as immutable **layers** and read back as one report. Start with
|
|
4
|
+
[integrating Atlas](../../docs/integrating.md); the exact rules are in
|
|
5
|
+
[the report contract](../../docs/report-contract.md).
|
|
6
|
+
|
|
7
|
+
## The short API
|
|
8
|
+
|
|
9
|
+
Every module is its own import path: `@crvouga/atlas/reports/<module>`. Nothing runs at import.
|
|
10
|
+
|
|
11
|
+
| Module | Exports | For |
|
|
12
|
+
| --- | --- | --- |
|
|
13
|
+
| `publish-checks` | `publishChecks(store, input)` | Publish the checks of one producer as one layer. Validates, is idempotent, reads no clock. |
|
|
14
|
+
| `ingest` | `checksFromCtrf`, `checksFromJunit`, `checksFromManifest` | Turn a CTRF report, JUnit XML or an Atlas run into checks, with stable ids. |
|
|
15
|
+
| `compose` | `combineBackends(backends, options?)`, `summarize` | Read every layer of every backend and lay them over the specs. A down backend or unreadable layer becomes a notice. |
|
|
16
|
+
| `report-status` | `reportStatus(report, { requireEnvironments? })`, `formatStatusText`, `formatStatusMarkdown` | The gate: `ok`, `reasons`, `failing`, counts per environment. Fails closed. |
|
|
17
|
+
| `directory-store` | `directoryStore(dir)` | A backend on a directory, with atomic writes. |
|
|
18
|
+
| `s3-store` | `s3Store({ bucket, prefix, region, endpoint })`, `S3Error` | A backend on AWS S3, R2, MinIO and anything with the S3 protocol. No SDK: SigV4 over `fetch`, retries, region redirects, a request cap. |
|
|
19
|
+
| `aws-credentials` | `credentialChain()` | Credentials the way an AWS SDK finds them: environment, IRSA, ECS, shared file, the AWS CLI (SSO), EC2. Refreshed before they expire. |
|
|
20
|
+
| `store-url` | `openStore(url)`, `parseStoreLocation`, `storeSpecs` | `s3://bucket/prefix?…`, a folder, or `ATLAS_STORE`, as a store. |
|
|
21
|
+
| `spec-set` | `publishSpecSet`, `latestSpecSet`, `collectSpecFiles` | Publish the specs of a commit, and pick the newest committed set of `main` as the outline. |
|
|
22
|
+
| `run-bundle` | `publishRunBundle`, `listRunSummaries` | Upload a finished statechart run with its media (privacy-gated). |
|
|
23
|
+
| `report-index` | `ReportIndex` | The report, maintained incrementally: each layer read once, only winners kept. |
|
|
24
|
+
| `http-store` | `httpStore({ url, token })`, `AtlasHttpError` | An `ObjectStore` on an Atlas server (`/api/store`): everything that publishes to a store publishes to a server. Retries, and says what to do about each refusal. |
|
|
25
|
+
| `reporter` | `createReporter(identity, { store })` | Stream a run as it happens: each flush is one immutable layer, a retry is byte for byte the same layer, and it never throws into the suite. |
|
|
26
|
+
| `effective-delta` | `applyEffectiveDelta`, `isEffectiveDelta` | A viewer holding a version of the report is sent only what changed since; this makes it whole again. |
|
|
27
|
+
| `doctor` | `inspectStore`, `iamPolicy` | Check a store end to end; the least-privilege IAM policy. |
|
|
28
|
+
| `object-store` | `ObjectStore` | The backend interface: seven methods, no transactions. |
|
|
29
|
+
| `object-store-conformance` | `verifyObjectStore(store)` | Prove a backend you wrote meets the interface. Runs under any test runner. |
|
|
30
|
+
| `copy-store` | `copyStore(from, to)` | Copy the layers a store is missing. Idempotent and commutative: how partial reports meet. |
|
|
31
|
+
| `host` | `reportsHost({ specs, stores })` | The reports half of the viewer for your stores and specs directory. |
|
|
32
|
+
| `layer-merge` | `combineEvidence`, `layerEvidence`, `textFingerprint` | The composition rule itself, over layers already in memory. |
|
|
33
|
+
| `directory-outline` | `loadDirectoryOutline(dir)` | A specs directory as the outline reports are laid over. |
|
|
34
|
+
|
|
35
|
+
The server itself, `createAtlasServer({ backends, write, site, tokens, include })` and `listen`, is
|
|
36
|
+
[`@crvouga/atlas/server`](../server/README.md), with its own import path.
|
|
37
|
+
|
|
38
|
+
```ts
|
|
39
|
+
import { combineBackends } from '@crvouga/atlas/reports/compose';
|
|
40
|
+
import { directoryStore } from '@crvouga/atlas/reports/directory-store';
|
|
41
|
+
import { publishChecks } from '@crvouga/atlas/reports/publish-checks';
|
|
42
|
+
import { reportStatus } from '@crvouga/atlas/reports/report-status';
|
|
43
|
+
|
|
44
|
+
const store = directoryStore('atlas-reports');
|
|
45
|
+
await publishChecks(store, {
|
|
46
|
+
producer: 'quint',
|
|
47
|
+
environment: 'desktop-web',
|
|
48
|
+
recordedAtMs: Date.now(),
|
|
49
|
+
checks: [{ id: 'specs/booking.qnt > no double booking', title: 'No double booking', status: 'passed', specPath: 'specs/booking.qnt' }]
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
const report = await combineBackends([{ id: 'local', store }]);
|
|
53
|
+
const status = reportStatus(report); // { ok, reasons, checks, byEnvironment, failing, notices, … }
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
The CLI is the same API for people without code: `atlas report publish | status | merge`.
|
|
57
|
+
|
|
58
|
+
## Recordings, commit-keyed parts and the viewer's API
|
|
59
|
+
|
|
60
|
+
Everything below is the machinery under the viewer: recorded timelines and captured files
|
|
61
|
+
(`publishSource`), commit-keyed parts (`publishPart`) that older stores hold, and the read-only API
|
|
62
|
+
(`createReportsApp`) the viewer calls. Most projects need only the API above: plain checks need none
|
|
63
|
+
of it, and `reportsHost` wraps `createReportsApp` for your stores.
|
|
64
|
+
|
|
65
|
+
|
|
3
66
|
Atlas owns reusable evidence publication, storage, retention, APIs, report navigation and snapshot interpretation. All nondeterministic work is provided through structural `ObjectStore`, `Clock`, `Timers` and `HttpClient` ports. There are no consumer-repository dependencies.
|
|
4
67
|
|
|
5
68
|
Consumers capture `RunReport` timelines and use `publishSource`, `publishPart` and `publishInventory` to publish them. Existing commit-keyed and compressed report stores remain readable, including reusable sources and independent producer evidence. `createReportsApp` mounts a read-only Hono API over injected stores; it is hosted alongside Atlas, not the product under test.
|
|
@@ -38,6 +101,8 @@ Freshness warnings preserve the recorded outcome. Changed spec fingerprints or r
|
|
|
38
101
|
|
|
39
102
|
## Standalone development
|
|
40
103
|
|
|
104
|
+
For your own stores and specs directory, use `reportsHost` ([integrating Atlas](../../docs/integrating.md#6-browse-it)). The rest of this section is for hosts that compose the API themselves.
|
|
105
|
+
|
|
41
106
|
Configure `ATLAS_REPORTS_MODULE` with a host composition module exporting `reportsDevFetch(request, repoRoot)`. Atlas's Vite middleware serves it at `/api/reports`, alongside specs and chart runs. `INIT_CWD` identifies the consuming repository. Credentials stay in that server module.
|
|
42
107
|
|
|
43
108
|
When that module is unset and the open specs are the coffee example or the todo example, the visualizer dev server serves an in-memory layered report for those documents instead. Any other spec set is left alone. The todo example's own module serves that same layered report and adds the desktop web layer `example:run` writes.
|
|
@@ -5,6 +5,10 @@ storage and time ports from its caller.
|
|
|
5
5
|
|
|
6
6
|
## Immutable layers
|
|
7
7
|
|
|
8
|
+
The layer document is a versioned contract with a JSON Schema: see
|
|
9
|
+
[the report contract](../../docs/report-contract.md). A suite with no timelines to record publishes
|
|
10
|
+
plain checks with `publishChecks`; the rest of this page covers recordings and commit-keyed parts.
|
|
11
|
+
|
|
8
12
|
`layers/index/<inverted-time>-<digest>.json` discovers immutable manifests at `layers/manifests/<digest>.json`. Each records producer, origin, parameters, checks, spec fingerprints and a recording bundle. The manifest is written after its blobs and the index last. Distinct results at the same timestamp retain separate identities. Compressed blobs under `layers/blobs/` are addressed by content and reused across runs; ordinary source publication shares its bundle directly with its layer without recompressing snapshots.
|
|
9
13
|
|
|
10
14
|
Git commits are provenance and exact historical recording addresses, never a report partition. `combineEvidence` chooses the newest completed result per check, environment and parameters, and keeps every other cell. An environment is the client that was checked (`desktop-web`, `mobile-web`, `ios`, `android`, or any other recorded name). The same check on two environments contributes twice. A layer that checks one scenario fills only that scenario. `publishSource` accepts `environment` and `parameters`, and a part may name its environment in `parameters.environment`. Inventory must be published before results for fingerprint comparison to be available.
|
|
@@ -12,6 +12,11 @@ The Atlas contract, as Zod schemas and as JSON Schema (draft 2020-12) documents
|
|
|
12
12
|
| `timeline-entry.schema.json` | One step of a clip's timeline (taps, typing, system events) |
|
|
13
13
|
| `cloud-event.schema.json` | A CloudEvents 1.0 business event a run observed |
|
|
14
14
|
| `runs-index.schema.json` | `runs/index.json`: the runs a host serves |
|
|
15
|
+
| `layer.schema.json` | A layer: the checks one producer ran on one environment, and any evidence they carry (attachments, steps, annotations, attempts, tags, labels, links, extensions). The unit of evidence for specs of any kind |
|
|
16
|
+
| `publish-checks.schema.json` | The input of `publishChecks` and `atlas report publish --checks` |
|
|
17
|
+
| `report-status.schema.json` | The output of `atlas report status --format json` |
|
|
18
|
+
| `server-config.schema.json` | The configuration of `atlas serve` and `atlas dev` |
|
|
19
|
+
| `spec-set.schema.json` | The specs of one commit as published, which the report is laid over |
|
|
15
20
|
|
|
16
21
|
Regenerate the JSON Schemas after changing a Zod schema:
|
|
17
22
|
|
|
@@ -19,5 +24,14 @@ Regenerate the JSON Schemas after changing a Zod schema:
|
|
|
19
24
|
bun run schemas
|
|
20
25
|
```
|
|
21
26
|
|
|
27
|
+
## Stability
|
|
28
|
+
|
|
29
|
+
The layer contract is versioned by `schemaVersion` (currently 1). Within a version, changes only add
|
|
30
|
+
optional fields, and readers ignore fields they do not know. The closed vocabularies (`status`,
|
|
31
|
+
`freshness`) change only with a new major version, and a reader refuses a layer of a newer major
|
|
32
|
+
version by name instead of guessing. `packages/reports/tests/fixtures/layer-v1.json` must keep
|
|
33
|
+
parsing, and a test keeps these files equal to what the Zod schemas emit. The full policy is in
|
|
34
|
+
[the report contract](../../docs/report-contract.md#versioning-and-stability).
|
|
35
|
+
|
|
22
36
|
Readers validate each record on its own and keep the ones that parse, so a newer or partly broken
|
|
23
37
|
manifest still renders what it can.
|