e2e 0.15.1 → 0.16.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/README.md +51 -24
- package/dist/.build.json +1 -1
- package/dist/agent/act-validation.d.ts +10 -1
- package/dist/agent/act-validation.js +48 -1
- package/dist/agent/act.d.ts +1 -2
- package/dist/agent/act.js +25 -8
- package/dist/agent/action-dispatcher.d.ts +0 -1
- package/dist/agent/action-dispatcher.js +0 -1
- package/dist/agent/action-names.d.ts +0 -1
- package/dist/agent/action-names.js +0 -1
- package/dist/agent/actions.d.ts +0 -1
- package/dist/agent/actions.js +0 -1
- package/dist/agent/agent-brand.d.ts +0 -1
- package/dist/agent/agent-brand.js +0 -1
- package/dist/agent/ai-sdk.d.ts +7 -1
- package/dist/agent/ai-sdk.js +11 -1
- package/dist/agent/call-options.d.ts +0 -1
- package/dist/agent/call-options.js +0 -1
- package/dist/agent/default-agent.d.ts +0 -1
- package/dist/agent/default-agent.js +0 -1
- package/dist/agent/derived.d.ts +0 -1
- package/dist/agent/derived.js +0 -1
- package/dist/agent/error.d.ts +16 -4
- package/dist/agent/error.js +25 -7
- package/dist/agent/executor.d.ts +0 -1
- package/dist/agent/executor.js +0 -1
- package/dist/agent/index.d.ts +0 -1
- package/dist/agent/index.js +0 -1
- package/dist/agent/interactive-step.d.ts +0 -1
- package/dist/agent/interactive-step.js +0 -1
- package/dist/agent/invocation.d.ts +0 -1
- package/dist/agent/invocation.js +10 -5
- package/dist/agent/ledger.d.ts +0 -1
- package/dist/agent/ledger.js +0 -1
- package/dist/agent/loop-guards.d.ts +0 -1
- package/dist/agent/loop-guards.js +0 -1
- package/dist/agent/model/adapter.d.ts +0 -1
- package/dist/agent/model/adapter.js +0 -1
- package/dist/agent/model/overflow.d.ts +0 -1
- package/dist/agent/model/overflow.js +0 -1
- package/dist/agent/model/provider-hints.d.ts +0 -1
- package/dist/agent/model/provider-hints.js +0 -1
- package/dist/agent/model/schema.d.ts +0 -1
- package/dist/agent/model/schema.js +0 -1
- package/dist/agent/model/sdk.d.ts +0 -1
- package/dist/agent/model/sdk.js +0 -1
- package/dist/agent/model/stall.d.ts +0 -1
- package/dist/agent/model/stall.js +0 -1
- package/dist/agent/model/tool-choice.d.ts +24 -2
- package/dist/agent/model/tool-choice.js +27 -2
- package/dist/agent/observation-budget.d.ts +0 -1
- package/dist/agent/observation-budget.js +0 -1
- package/dist/agent/observation-feed.d.ts +0 -1
- package/dist/agent/observation-feed.js +0 -1
- package/dist/agent/observation.d.ts +0 -1
- package/dist/agent/observation.js +0 -1
- package/dist/agent/operation-queue.d.ts +0 -1
- package/dist/agent/operation-queue.js +0 -1
- package/dist/agent/phases.d.ts +0 -1
- package/dist/agent/phases.js +0 -1
- package/dist/agent/pixels.d.ts +0 -1
- package/dist/agent/pixels.js +0 -1
- package/dist/agent/point-tap.d.ts +0 -1
- package/dist/agent/point-tap.js +0 -1
- package/dist/agent/primitives.d.ts +6 -1
- package/dist/agent/primitives.js +4 -2
- package/dist/agent/prompts.d.ts +0 -1
- package/dist/agent/prompts.js +0 -1
- package/dist/agent/protocol.d.ts +0 -1
- package/dist/agent/protocol.js +0 -1
- package/dist/agent/public.d.ts +0 -1
- package/dist/agent/public.js +0 -1
- package/dist/agent/reading.d.ts +0 -1
- package/dist/agent/reading.js +0 -1
- package/dist/agent/replay.d.ts +0 -1
- package/dist/agent/replay.js +0 -1
- package/dist/agent/screen-update.d.ts +0 -1
- package/dist/agent/screen-update.js +0 -1
- package/dist/agent/scroll-target.d.ts +0 -1
- package/dist/agent/scroll-target.js +0 -1
- package/dist/agent/secrets.d.ts +0 -1
- package/dist/agent/secrets.js +0 -1
- package/dist/agent/settle-policy.d.ts +0 -1
- package/dist/agent/settle-policy.js +0 -1
- package/dist/agent/step-accounting.d.ts +0 -1
- package/dist/agent/step-accounting.js +0 -1
- package/dist/agent/step-cache.d.ts +14 -4
- package/dist/agent/step-cache.js +13 -4
- package/dist/agent/tool-loop.d.ts +0 -1
- package/dist/agent/tool-loop.js +62 -10
- package/dist/agent/tool-output.d.ts +0 -1
- package/dist/agent/tool-output.js +0 -1
- package/dist/agent/tool.d.ts +0 -1
- package/dist/agent/tool.js +0 -1
- package/dist/agent/transcript-compaction.d.ts +0 -1
- package/dist/agent/transcript-compaction.js +0 -1
- package/dist/agent/upload-paths.d.ts +0 -1
- package/dist/agent/upload-paths.js +0 -1
- package/dist/agent/usage.d.ts +0 -1
- package/dist/agent/usage.js +0 -1
- package/dist/cache/anchors.d.ts +0 -1
- package/dist/cache/anchors.js +0 -1
- package/dist/cache/context.d.ts +19 -7
- package/dist/cache/context.js +15 -22
- package/dist/cache/decide.d.ts +0 -1
- package/dist/cache/decide.js +0 -1
- package/dist/cache/identity.d.ts +0 -1
- package/dist/cache/identity.js +0 -1
- package/dist/cache/recorder.d.ts +0 -1
- package/dist/cache/recorder.js +0 -1
- package/dist/cache/relocate.d.ts +0 -1
- package/dist/cache/relocate.js +0 -1
- package/dist/cache/route.d.ts +0 -1
- package/dist/cache/route.js +0 -1
- package/dist/cache/store.d.ts +0 -1
- package/dist/cache/store.js +0 -1
- package/dist/cache/template.d.ts +0 -1
- package/dist/cache/template.js +0 -1
- package/dist/cache/trace.d.ts +0 -1
- package/dist/cache/trace.js +0 -1
- package/dist/cli/bin.d.ts +0 -1
- package/dist/cli/bin.js +0 -1
- package/dist/cli/cache.d.ts +0 -1
- package/dist/cli/cache.js +0 -1
- package/dist/cli/docs-url.d.ts +0 -1
- package/dist/cli/docs-url.js +0 -1
- package/dist/cli/feedback.d.ts +0 -1
- package/dist/cli/feedback.js +0 -1
- package/dist/cli/guide.d.ts +0 -1
- package/dist/cli/guide.js +0 -1
- package/dist/cli/index.d.ts +0 -1
- package/dist/cli/index.js +2 -3
- package/dist/cli/init/agent-skill.d.ts +0 -1
- package/dist/cli/init/agent-skill.js +0 -1
- package/dist/cli/init/engines.d.ts +0 -1
- package/dist/cli/init/engines.js +0 -1
- package/dist/cli/init/gateways.d.ts +0 -1
- package/dist/cli/init/gateways.js +0 -1
- package/dist/cli/init/mcp-config.d.ts +0 -1
- package/dist/cli/init/mcp-config.js +0 -1
- package/dist/cli/init/package.d.ts +0 -1
- package/dist/cli/init/package.js +0 -1
- package/dist/cli/init/scaffold.d.ts +1 -1
- package/dist/cli/init/scaffold.js +2 -2
- package/dist/cli/init/sibling-versions.json +1 -1
- package/dist/cli/init/versions.d.ts +0 -1
- package/dist/cli/init/versions.js +0 -1
- package/dist/cli/init.d.ts +0 -1
- package/dist/cli/init.js +0 -1
- package/dist/cli/mcp.d.ts +9 -2
- package/dist/cli/mcp.js +14 -2
- package/dist/cli/signals.d.ts +0 -1
- package/dist/cli/signals.js +0 -1
- package/dist/cli/skill.d.ts +0 -1
- package/dist/cli/skill.js +0 -1
- package/dist/cli/telemetry.d.ts +0 -1
- package/dist/cli/telemetry.js +1 -2
- package/dist/cli/wordmark.d.ts +0 -1
- package/dist/cli/wordmark.js +0 -1
- package/dist/collect/collect.d.ts +0 -1
- package/dist/collect/collect.js +3 -2
- package/dist/collect/registry.d.ts +6 -3
- package/dist/collect/registry.js +31 -14
- package/dist/collect/select.d.ts +0 -1
- package/dist/collect/select.js +0 -1
- package/dist/config/agent.d.ts +0 -1
- package/dist/config/agent.js +0 -1
- package/dist/config/app.d.ts +0 -1
- package/dist/config/app.js +0 -1
- package/dist/config/command.d.ts +0 -1
- package/dist/config/command.js +0 -1
- package/dist/config/diagnose.d.ts +0 -1
- package/dist/config/diagnose.js +0 -1
- package/dist/config/esm-hooks.d.ts +0 -1
- package/dist/config/esm-hooks.js +0 -1
- package/dist/config/load.d.ts +0 -1
- package/dist/config/load.js +0 -1
- package/dist/config/resolve.d.ts +0 -1
- package/dist/config/resolve.js +0 -1
- package/dist/config/secrets.d.ts +0 -1
- package/dist/config/secrets.js +0 -1
- package/dist/config/targets.d.ts +0 -1
- package/dist/config/targets.js +0 -1
- package/dist/config/validate.d.ts +0 -1
- package/dist/config/validate.js +0 -1
- package/dist/engine/contract.d.ts +0 -1
- package/dist/engine/contract.js +0 -1
- package/dist/engine/index.d.ts +1 -2
- package/dist/engine/index.js +4 -4
- package/dist/engine/manifest.d.ts +0 -1
- package/dist/engine/manifest.js +0 -1
- package/dist/engine/recording.d.ts +0 -1
- package/dist/engine/recording.js +0 -1
- package/dist/engine/resolve.d.ts +0 -1
- package/dist/engine/resolve.js +0 -1
- package/dist/engine/session.d.ts +0 -1
- package/dist/engine/session.js +0 -1
- package/dist/engine/surface.d.ts +0 -1
- package/dist/engine/surface.js +0 -1
- package/dist/engine/timing.d.ts +0 -1
- package/dist/engine/timing.js +0 -1
- package/dist/expect/async.d.ts +0 -1
- package/dist/expect/async.js +99 -58
- package/dist/expect/attempt.d.ts +0 -1
- package/dist/expect/attempt.js +0 -1
- package/dist/expect/index.d.ts +0 -1
- package/dist/expect/index.js +0 -1
- package/dist/expect/poll.d.ts +0 -1
- package/dist/expect/poll.js +0 -1
- package/dist/expect/soft.d.ts +0 -1
- package/dist/expect/soft.js +0 -1
- package/dist/expect/values.d.ts +0 -1
- package/dist/expect/values.js +1 -2
- package/dist/explore/body.d.ts +0 -1
- package/dist/explore/body.js +0 -1
- package/dist/explore/executor.d.ts +0 -1
- package/dist/explore/executor.js +0 -1
- package/dist/explore/index.d.ts +0 -1
- package/dist/explore/index.js +16 -2
- package/dist/explore/plan.d.ts +0 -1
- package/dist/explore/plan.js +0 -1
- package/dist/explore/progress.d.ts +0 -1
- package/dist/explore/progress.js +0 -1
- package/dist/explore/state.d.ts +0 -1
- package/dist/explore/state.js +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -1
- package/dist/internal/ai-trace.d.ts +0 -1
- package/dist/internal/ai-trace.js +0 -1
- package/dist/internal/atomic-write.d.ts +0 -1
- package/dist/internal/atomic-write.js +0 -1
- package/dist/internal/brands.d.ts +0 -1
- package/dist/internal/brands.js +0 -1
- package/dist/internal/debug.d.ts +0 -1
- package/dist/internal/debug.js +0 -1
- package/dist/internal/env.d.ts +0 -1
- package/dist/internal/env.js +0 -1
- package/dist/internal/errors.d.ts +0 -1
- package/dist/internal/errors.js +0 -1
- package/dist/internal/geometry.d.ts +0 -1
- package/dist/internal/geometry.js +0 -1
- package/dist/internal/git.d.ts +0 -1
- package/dist/internal/git.js +0 -1
- package/dist/internal/globs.d.ts +0 -1
- package/dist/internal/globs.js +0 -1
- package/dist/internal/ids.d.ts +0 -1
- package/dist/internal/ids.js +0 -1
- package/dist/internal/json-value.d.ts +0 -1
- package/dist/internal/json-value.js +0 -1
- package/dist/internal/keys.d.ts +0 -1
- package/dist/internal/keys.js +0 -1
- package/dist/internal/node-version.d.ts +0 -1
- package/dist/internal/node-version.js +0 -1
- package/dist/internal/objects.d.ts +0 -1
- package/dist/internal/objects.js +0 -1
- package/dist/internal/options.d.ts +0 -1
- package/dist/internal/options.js +0 -1
- package/dist/internal/package-manager.d.ts +0 -1
- package/dist/internal/package-manager.js +0 -1
- package/dist/internal/package-version.d.ts +0 -1
- package/dist/internal/package-version.js +0 -1
- package/dist/internal/paths.d.ts +0 -1
- package/dist/internal/paths.js +0 -1
- package/dist/internal/realm-slot.d.ts +0 -1
- package/dist/internal/realm-slot.js +0 -1
- package/dist/internal/recording-modes.d.ts +0 -1
- package/dist/internal/recording-modes.js +0 -1
- package/dist/internal/redact.d.ts +0 -1
- package/dist/internal/redact.js +0 -1
- package/dist/internal/regexp.d.ts +0 -1
- package/dist/internal/regexp.js +0 -1
- package/dist/internal/roles.d.ts +0 -1
- package/dist/internal/roles.js +0 -1
- package/dist/internal/skip.d.ts +0 -1
- package/dist/internal/skip.js +0 -1
- package/dist/internal/source.d.ts +0 -1
- package/dist/internal/source.js +0 -1
- package/dist/internal/standard-schema.d.ts +0 -1
- package/dist/internal/standard-schema.js +0 -1
- package/dist/internal/suggest.d.ts +0 -1
- package/dist/internal/suggest.js +0 -1
- package/dist/internal/text.d.ts +8 -1
- package/dist/internal/text.js +13 -2
- package/dist/internal/time.d.ts +0 -1
- package/dist/internal/time.js +0 -1
- package/dist/internal/urls.d.ts +0 -1
- package/dist/internal/urls.js +0 -1
- package/dist/internal/vcs.d.ts +0 -1
- package/dist/internal/vcs.js +0 -1
- package/dist/internal/zip.d.ts +0 -1
- package/dist/internal/zip.js +0 -1
- package/dist/locator/engine.d.ts +0 -1
- package/dist/locator/engine.js +0 -1
- package/dist/locator/expression.d.ts +0 -1
- package/dist/locator/expression.js +0 -1
- package/dist/locator/screen.d.ts +0 -1
- package/dist/locator/screen.js +0 -1
- package/dist/mcp/catalog.d.ts +4 -1
- package/dist/mcp/catalog.js +2 -3
- package/dist/mcp/config.d.ts +0 -1
- package/dist/mcp/config.js +0 -1
- package/dist/mcp/recording.d.ts +0 -1
- package/dist/mcp/recording.js +0 -1
- package/dist/mcp/server.d.ts +8 -1
- package/dist/mcp/server.js +8 -5
- package/dist/mcp/session.d.ts +4 -2
- package/dist/mcp/session.js +43 -21
- package/dist/mcp/sessions.d.ts +2 -1
- package/dist/mcp/sessions.js +5 -2
- package/dist/mcp/tools.d.ts +7 -6
- package/dist/mcp/tools.js +36 -11
- package/dist/mcp/usage.d.ts +61 -0
- package/dist/mcp/usage.js +73 -0
- package/dist/oauth/callback-server.d.ts +0 -1
- package/dist/oauth/callback-server.js +0 -1
- package/dist/oauth/chatgpt.d.ts +0 -1
- package/dist/oauth/chatgpt.js +0 -1
- package/dist/oauth/cli.d.ts +0 -1
- package/dist/oauth/cli.js +0 -1
- package/dist/oauth/copilot.d.ts +0 -1
- package/dist/oauth/copilot.js +0 -1
- package/dist/oauth/device-code.d.ts +0 -1
- package/dist/oauth/device-code.js +0 -1
- package/dist/oauth/errors.d.ts +0 -1
- package/dist/oauth/errors.js +0 -1
- package/dist/oauth/fetch.d.ts +0 -1
- package/dist/oauth/fetch.js +0 -1
- package/dist/oauth/grok.d.ts +0 -1
- package/dist/oauth/grok.js +0 -1
- package/dist/oauth/jwt.d.ts +0 -1
- package/dist/oauth/jwt.js +0 -1
- package/dist/oauth/login.d.ts +0 -1
- package/dist/oauth/login.js +0 -1
- package/dist/oauth/models.d.ts +0 -1
- package/dist/oauth/models.js +0 -1
- package/dist/oauth/pkce.d.ts +0 -1
- package/dist/oauth/pkce.js +0 -1
- package/dist/oauth/providers/github-copilot.d.ts +0 -1
- package/dist/oauth/providers/github-copilot.js +10 -3
- package/dist/oauth/providers/openai.d.ts +0 -1
- package/dist/oauth/providers/openai.js +1 -2
- package/dist/oauth/providers/xai.d.ts +0 -1
- package/dist/oauth/providers/xai.js +0 -1
- package/dist/oauth/providers.d.ts +0 -1
- package/dist/oauth/providers.js +0 -1
- package/dist/oauth/sse.d.ts +0 -1
- package/dist/oauth/sse.js +0 -1
- package/dist/oauth/store.d.ts +0 -1
- package/dist/oauth/store.js +0 -1
- package/dist/oauth/token-endpoint.d.ts +0 -1
- package/dist/oauth/token-endpoint.js +0 -1
- package/dist/oauth/types.d.ts +0 -1
- package/dist/oauth/types.js +0 -1
- package/dist/params.d.ts +0 -1
- package/dist/params.js +0 -1
- package/dist/report/build.d.ts +0 -1
- package/dist/report/build.js +0 -1
- package/dist/report/builtin.d.ts +0 -1
- package/dist/report/builtin.js +0 -1
- package/dist/report/code-frame.d.ts +0 -1
- package/dist/report/code-frame.js +0 -1
- package/dist/report/debug-steps.d.ts +0 -1
- package/dist/report/debug-steps.js +0 -1
- package/dist/report/explore-text.d.ts +0 -1
- package/dist/report/explore-text.js +0 -1
- package/dist/report/failure-text.d.ts +0 -1
- package/dist/report/failure-text.js +0 -1
- package/dist/report/format.d.ts +0 -1
- package/dist/report/format.js +0 -1
- package/dist/report/json.d.ts +0 -1
- package/dist/report/json.js +0 -1
- package/dist/report/junit.d.ts +0 -1
- package/dist/report/junit.js +0 -1
- package/dist/report/list-explore.d.ts +0 -1
- package/dist/report/list-explore.js +0 -1
- package/dist/report/list-model.d.ts +0 -1
- package/dist/report/list-model.js +0 -1
- package/dist/report/list-steps.d.ts +0 -1
- package/dist/report/list-steps.js +0 -1
- package/dist/report/list.d.ts +0 -1
- package/dist/report/list.js +0 -1
- package/dist/report/live-window.d.ts +0 -1
- package/dist/report/live-window.js +0 -1
- package/dist/report/markdown-text.d.ts +0 -1
- package/dist/report/markdown-text.js +0 -1
- package/dist/report/markdown.d.ts +0 -1
- package/dist/report/markdown.js +0 -1
- package/dist/report/outcome.d.ts +0 -1
- package/dist/report/outcome.js +0 -1
- package/dist/report/repeats.d.ts +0 -1
- package/dist/report/repeats.js +0 -1
- package/dist/report/running-tree.d.ts +0 -1
- package/dist/report/running-tree.js +0 -1
- package/dist/report/write.d.ts +0 -1
- package/dist/report/write.js +0 -1
- package/dist/run/app-ports.d.ts +0 -1
- package/dist/run/app-ports.js +0 -1
- package/dist/run/artifacts.d.ts +0 -1
- package/dist/run/artifacts.js +0 -1
- package/dist/run/budget.d.ts +0 -1
- package/dist/run/budget.js +0 -1
- package/dist/run/declared-processes.d.ts +0 -1
- package/dist/run/declared-processes.js +0 -1
- package/dist/run/events.d.ts +0 -1
- package/dist/run/events.js +0 -1
- package/dist/run/execute.d.ts +0 -1
- package/dist/run/execute.js +27 -13
- package/dist/run/extended-fixtures.d.ts +0 -1
- package/dist/run/extended-fixtures.js +0 -1
- package/dist/run/failure-evidence.d.ts +0 -1
- package/dist/run/failure-evidence.js +0 -1
- package/dist/run/fixture-recording.d.ts +0 -1
- package/dist/run/fixture-recording.js +0 -1
- package/dist/run/fixtures.d.ts +0 -1
- package/dist/run/fixtures.js +0 -1
- package/dist/run/in-process.d.ts +0 -1
- package/dist/run/in-process.js +0 -1
- package/dist/run/last-run.d.ts +0 -1
- package/dist/run/last-run.js +0 -1
- package/dist/run/managed-process.d.ts +0 -1
- package/dist/run/managed-process.js +0 -1
- package/dist/run/output.d.ts +0 -1
- package/dist/run/output.js +0 -1
- package/dist/run/process-pool.d.ts +0 -1
- package/dist/run/process-pool.js +0 -1
- package/dist/run/provision.d.ts +0 -1
- package/dist/run/provision.js +0 -1
- package/dist/run/realm.d.ts +2 -1
- package/dist/run/realm.js +1 -2
- package/dist/run/records.d.ts +0 -1
- package/dist/run/records.js +0 -1
- package/dist/run/retry.d.ts +0 -1
- package/dist/run/retry.js +0 -1
- package/dist/run/runner.d.ts +2 -1
- package/dist/run/runner.js +1 -2
- package/dist/run/scheduler.d.ts +0 -1
- package/dist/run/scheduler.js +0 -1
- package/dist/run/secrecy.d.ts +15 -1
- package/dist/run/secrecy.js +27 -2
- package/dist/run/serial.d.ts +0 -1
- package/dist/run/serial.js +0 -1
- package/dist/run/sessions.d.ts +0 -1
- package/dist/run/sessions.js +0 -1
- package/dist/run/standalone.d.ts +0 -1
- package/dist/run/standalone.js +3 -3
- package/dist/run/steps.d.ts +2 -3
- package/dist/run/steps.js +4 -2
- package/dist/run/trace-redaction.d.ts +0 -1
- package/dist/run/trace-redaction.js +0 -1
- package/dist/run/unit-runner.d.ts +0 -1
- package/dist/run/unit-runner.js +0 -1
- package/dist/run/units.d.ts +0 -1
- package/dist/run/units.js +0 -1
- package/dist/run/worker/entry.d.ts +0 -1
- package/dist/run/worker/entry.js +2 -3
- package/dist/run/worker/handle.d.ts +0 -1
- package/dist/run/worker/handle.js +0 -1
- package/dist/run/worker/protocol.d.ts +0 -1
- package/dist/run/worker/protocol.js +0 -1
- package/dist/run/worker/session.d.ts +0 -1
- package/dist/run/worker/session.js +0 -1
- package/dist/run/worker-models.d.ts +0 -1
- package/dist/run/worker-models.js +0 -1
- package/dist/secrets.d.ts +0 -1
- package/dist/secrets.js +0 -1
- package/dist/telemetry/checkout.d.ts +0 -1
- package/dist/telemetry/checkout.js +0 -1
- package/dist/telemetry/environment.d.ts +0 -1
- package/dist/telemetry/environment.js +0 -1
- package/dist/telemetry/events.d.ts +26 -10
- package/dist/telemetry/events.js +107 -13
- package/dist/telemetry/failure-kind.d.ts +0 -1
- package/dist/telemetry/failure-kind.js +0 -1
- package/dist/telemetry/posthog.d.ts +0 -1
- package/dist/telemetry/posthog.js +0 -1
- package/dist/telemetry/project.d.ts +0 -1
- package/dist/telemetry/project.js +0 -1
- package/dist/telemetry/store.d.ts +0 -1
- package/dist/telemetry/store.js +0 -1
- package/dist/telemetry/telemetry.d.ts +19 -8
- package/dist/telemetry/telemetry.js +26 -9
- package/dist/telemetry/token.d.ts +0 -1
- package/dist/telemetry/token.js +0 -1
- package/dist/types.d.ts +26 -24
- package/dist/types.js +0 -1
- package/docs/agent-steps.mdx +126 -0
- package/docs/agents.mdx +217 -0
- package/docs/api-testing.mdx +65 -0
- package/docs/authentication.mdx +345 -0
- package/docs/browser.mdx +440 -0
- package/docs/bug-bash.mdx +90 -0
- package/docs/cache.mdx +306 -0
- package/docs/ci.mdx +210 -0
- package/docs/coding-agents.mdx +183 -0
- package/docs/debugging.mdx +291 -0
- package/docs/executors.mdx +243 -0
- package/docs/explore.mdx +174 -0
- package/docs/github.mdx +184 -0
- package/docs/index.mdx +82 -0
- package/docs/integrations/eas.mdx +216 -0
- package/docs/integrations/index.mdx +24 -0
- package/docs/integrations/kernel.mdx +163 -0
- package/docs/migrate/cypress.mdx +124 -0
- package/docs/migrate/detox.mdx +140 -0
- package/docs/migrate/maestro.mdx +229 -0
- package/docs/migrate/playwright.mdx +430 -0
- package/docs/migrate/selenium.mdx +110 -0
- package/docs/mobile-ci.mdx +567 -0
- package/docs/mobile.mdx +595 -0
- package/docs/models.mdx +241 -0
- package/docs/quickstart.mdx +260 -0
- package/docs/reference/agent.mdx +524 -0
- package/docs/reference/app.mdx +72 -0
- package/docs/reference/cli.mdx +819 -0
- package/docs/reference/config.mdx +986 -0
- package/docs/reference/engine.mdx +1363 -0
- package/docs/reference/environment.mdx +113 -0
- package/docs/reference/errors.mdx +143 -0
- package/docs/reference/expect.mdx +546 -0
- package/docs/reference/mcp.mdx +205 -0
- package/docs/reference/mobile.mdx +522 -0
- package/docs/reference/reporters.mdx +216 -0
- package/docs/reference/screen.mdx +688 -0
- package/docs/reference/test.mdx +449 -0
- package/docs/reference/web.mdx +615 -0
- package/docs/security.mdx +308 -0
- package/docs/starting-your-app.mdx +231 -0
- package/docs/subscriptions.mdx +166 -0
- package/docs/telemetry.mdx +227 -0
- package/docs/tools.mdx +150 -0
- package/docs/viewports.mdx +146 -0
- package/docs/writing-an-engine.mdx +316 -0
- package/docs/writing-tests.mdx +256 -0
- package/package.json +5 -3
- package/skills/e2e/SKILL.md +4 -1
- package/skills/e2e/references/agent.md +3 -1
- package/skills/e2e/references/mcp.md +3 -0
- package/skills/e2e/references/setup.md +19 -4
- package/skills/e2e/references/writing-tests.md +11 -0
- package/dist/agent/act-validation.d.ts.map +0 -1
- package/dist/agent/act-validation.js.map +0 -1
- package/dist/agent/act.d.ts.map +0 -1
- package/dist/agent/act.js.map +0 -1
- package/dist/agent/action-dispatcher.d.ts.map +0 -1
- package/dist/agent/action-dispatcher.js.map +0 -1
- package/dist/agent/action-names.d.ts.map +0 -1
- package/dist/agent/action-names.js.map +0 -1
- package/dist/agent/actions.d.ts.map +0 -1
- package/dist/agent/actions.js.map +0 -1
- package/dist/agent/agent-brand.d.ts.map +0 -1
- package/dist/agent/agent-brand.js.map +0 -1
- package/dist/agent/ai-sdk.d.ts.map +0 -1
- package/dist/agent/ai-sdk.js.map +0 -1
- package/dist/agent/call-options.d.ts.map +0 -1
- package/dist/agent/call-options.js.map +0 -1
- package/dist/agent/default-agent.d.ts.map +0 -1
- package/dist/agent/default-agent.js.map +0 -1
- package/dist/agent/derived.d.ts.map +0 -1
- package/dist/agent/derived.js.map +0 -1
- package/dist/agent/error.d.ts.map +0 -1
- package/dist/agent/error.js.map +0 -1
- package/dist/agent/executor.d.ts.map +0 -1
- package/dist/agent/executor.js.map +0 -1
- package/dist/agent/index.d.ts.map +0 -1
- package/dist/agent/index.js.map +0 -1
- package/dist/agent/interactive-step.d.ts.map +0 -1
- package/dist/agent/interactive-step.js.map +0 -1
- package/dist/agent/invocation.d.ts.map +0 -1
- package/dist/agent/invocation.js.map +0 -1
- package/dist/agent/ledger.d.ts.map +0 -1
- package/dist/agent/ledger.js.map +0 -1
- package/dist/agent/loop-guards.d.ts.map +0 -1
- package/dist/agent/loop-guards.js.map +0 -1
- package/dist/agent/model/adapter.d.ts.map +0 -1
- package/dist/agent/model/adapter.js.map +0 -1
- package/dist/agent/model/overflow.d.ts.map +0 -1
- package/dist/agent/model/overflow.js.map +0 -1
- package/dist/agent/model/provider-hints.d.ts.map +0 -1
- package/dist/agent/model/provider-hints.js.map +0 -1
- package/dist/agent/model/schema.d.ts.map +0 -1
- package/dist/agent/model/schema.js.map +0 -1
- package/dist/agent/model/sdk.d.ts.map +0 -1
- package/dist/agent/model/sdk.js.map +0 -1
- package/dist/agent/model/stall.d.ts.map +0 -1
- package/dist/agent/model/stall.js.map +0 -1
- package/dist/agent/model/tool-choice.d.ts.map +0 -1
- package/dist/agent/model/tool-choice.js.map +0 -1
- package/dist/agent/observation-budget.d.ts.map +0 -1
- package/dist/agent/observation-budget.js.map +0 -1
- package/dist/agent/observation-feed.d.ts.map +0 -1
- package/dist/agent/observation-feed.js.map +0 -1
- package/dist/agent/observation.d.ts.map +0 -1
- package/dist/agent/observation.js.map +0 -1
- package/dist/agent/operation-queue.d.ts.map +0 -1
- package/dist/agent/operation-queue.js.map +0 -1
- package/dist/agent/phases.d.ts.map +0 -1
- package/dist/agent/phases.js.map +0 -1
- package/dist/agent/pixels.d.ts.map +0 -1
- package/dist/agent/pixels.js.map +0 -1
- package/dist/agent/point-tap.d.ts.map +0 -1
- package/dist/agent/point-tap.js.map +0 -1
- package/dist/agent/primitives.d.ts.map +0 -1
- package/dist/agent/primitives.js.map +0 -1
- package/dist/agent/prompts.d.ts.map +0 -1
- package/dist/agent/prompts.js.map +0 -1
- package/dist/agent/protocol.d.ts.map +0 -1
- package/dist/agent/protocol.js.map +0 -1
- package/dist/agent/public.d.ts.map +0 -1
- package/dist/agent/public.js.map +0 -1
- package/dist/agent/reading.d.ts.map +0 -1
- package/dist/agent/reading.js.map +0 -1
- package/dist/agent/replay.d.ts.map +0 -1
- package/dist/agent/replay.js.map +0 -1
- package/dist/agent/screen-update.d.ts.map +0 -1
- package/dist/agent/screen-update.js.map +0 -1
- package/dist/agent/scroll-target.d.ts.map +0 -1
- package/dist/agent/scroll-target.js.map +0 -1
- package/dist/agent/secrets.d.ts.map +0 -1
- package/dist/agent/secrets.js.map +0 -1
- package/dist/agent/settle-policy.d.ts.map +0 -1
- package/dist/agent/settle-policy.js.map +0 -1
- package/dist/agent/step-accounting.d.ts.map +0 -1
- package/dist/agent/step-accounting.js.map +0 -1
- package/dist/agent/step-cache.d.ts.map +0 -1
- package/dist/agent/step-cache.js.map +0 -1
- package/dist/agent/tool-loop.d.ts.map +0 -1
- package/dist/agent/tool-loop.js.map +0 -1
- package/dist/agent/tool-output.d.ts.map +0 -1
- package/dist/agent/tool-output.js.map +0 -1
- package/dist/agent/tool.d.ts.map +0 -1
- package/dist/agent/tool.js.map +0 -1
- package/dist/agent/transcript-compaction.d.ts.map +0 -1
- package/dist/agent/transcript-compaction.js.map +0 -1
- package/dist/agent/upload-paths.d.ts.map +0 -1
- package/dist/agent/upload-paths.js.map +0 -1
- package/dist/agent/usage.d.ts.map +0 -1
- package/dist/agent/usage.js.map +0 -1
- package/dist/cache/anchors.d.ts.map +0 -1
- package/dist/cache/anchors.js.map +0 -1
- package/dist/cache/context.d.ts.map +0 -1
- package/dist/cache/context.js.map +0 -1
- package/dist/cache/decide.d.ts.map +0 -1
- package/dist/cache/decide.js.map +0 -1
- package/dist/cache/identity.d.ts.map +0 -1
- package/dist/cache/identity.js.map +0 -1
- package/dist/cache/recorder.d.ts.map +0 -1
- package/dist/cache/recorder.js.map +0 -1
- package/dist/cache/relocate.d.ts.map +0 -1
- package/dist/cache/relocate.js.map +0 -1
- package/dist/cache/route.d.ts.map +0 -1
- package/dist/cache/route.js.map +0 -1
- package/dist/cache/store.d.ts.map +0 -1
- package/dist/cache/store.js.map +0 -1
- package/dist/cache/template.d.ts.map +0 -1
- package/dist/cache/template.js.map +0 -1
- package/dist/cache/trace.d.ts.map +0 -1
- package/dist/cache/trace.js.map +0 -1
- package/dist/cli/bin.d.ts.map +0 -1
- package/dist/cli/bin.js.map +0 -1
- package/dist/cli/cache.d.ts.map +0 -1
- package/dist/cli/cache.js.map +0 -1
- package/dist/cli/docs-url.d.ts.map +0 -1
- package/dist/cli/docs-url.js.map +0 -1
- package/dist/cli/feedback.d.ts.map +0 -1
- package/dist/cli/feedback.js.map +0 -1
- package/dist/cli/guide.d.ts.map +0 -1
- package/dist/cli/guide.js.map +0 -1
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js.map +0 -1
- package/dist/cli/init/agent-skill.d.ts.map +0 -1
- package/dist/cli/init/agent-skill.js.map +0 -1
- package/dist/cli/init/engines.d.ts.map +0 -1
- package/dist/cli/init/engines.js.map +0 -1
- package/dist/cli/init/gateways.d.ts.map +0 -1
- package/dist/cli/init/gateways.js.map +0 -1
- package/dist/cli/init/mcp-config.d.ts.map +0 -1
- package/dist/cli/init/mcp-config.js.map +0 -1
- package/dist/cli/init/package.d.ts.map +0 -1
- package/dist/cli/init/package.js.map +0 -1
- package/dist/cli/init/scaffold.d.ts.map +0 -1
- package/dist/cli/init/scaffold.js.map +0 -1
- package/dist/cli/init/versions.d.ts.map +0 -1
- package/dist/cli/init/versions.js.map +0 -1
- package/dist/cli/init.d.ts.map +0 -1
- package/dist/cli/init.js.map +0 -1
- package/dist/cli/mcp.d.ts.map +0 -1
- package/dist/cli/mcp.js.map +0 -1
- package/dist/cli/signals.d.ts.map +0 -1
- package/dist/cli/signals.js.map +0 -1
- package/dist/cli/skill.d.ts.map +0 -1
- package/dist/cli/skill.js.map +0 -1
- package/dist/cli/telemetry.d.ts.map +0 -1
- package/dist/cli/telemetry.js.map +0 -1
- package/dist/cli/wordmark.d.ts.map +0 -1
- package/dist/cli/wordmark.js.map +0 -1
- package/dist/collect/collect.d.ts.map +0 -1
- package/dist/collect/collect.js.map +0 -1
- package/dist/collect/registry.d.ts.map +0 -1
- package/dist/collect/registry.js.map +0 -1
- package/dist/collect/select.d.ts.map +0 -1
- package/dist/collect/select.js.map +0 -1
- package/dist/config/agent.d.ts.map +0 -1
- package/dist/config/agent.js.map +0 -1
- package/dist/config/app.d.ts.map +0 -1
- package/dist/config/app.js.map +0 -1
- package/dist/config/command.d.ts.map +0 -1
- package/dist/config/command.js.map +0 -1
- package/dist/config/diagnose.d.ts.map +0 -1
- package/dist/config/diagnose.js.map +0 -1
- package/dist/config/esm-hooks.d.ts.map +0 -1
- package/dist/config/esm-hooks.js.map +0 -1
- package/dist/config/load.d.ts.map +0 -1
- package/dist/config/load.js.map +0 -1
- package/dist/config/resolve.d.ts.map +0 -1
- package/dist/config/resolve.js.map +0 -1
- package/dist/config/secrets.d.ts.map +0 -1
- package/dist/config/secrets.js.map +0 -1
- package/dist/config/targets.d.ts.map +0 -1
- package/dist/config/targets.js.map +0 -1
- package/dist/config/validate.d.ts.map +0 -1
- package/dist/config/validate.js.map +0 -1
- package/dist/engine/contract.d.ts.map +0 -1
- package/dist/engine/contract.js.map +0 -1
- package/dist/engine/index.d.ts.map +0 -1
- package/dist/engine/index.js.map +0 -1
- package/dist/engine/manifest.d.ts.map +0 -1
- package/dist/engine/manifest.js.map +0 -1
- package/dist/engine/recording.d.ts.map +0 -1
- package/dist/engine/recording.js.map +0 -1
- package/dist/engine/resolve.d.ts.map +0 -1
- package/dist/engine/resolve.js.map +0 -1
- package/dist/engine/session.d.ts.map +0 -1
- package/dist/engine/session.js.map +0 -1
- package/dist/engine/surface.d.ts.map +0 -1
- package/dist/engine/surface.js.map +0 -1
- package/dist/engine/timing.d.ts.map +0 -1
- package/dist/engine/timing.js.map +0 -1
- package/dist/expect/async.d.ts.map +0 -1
- package/dist/expect/async.js.map +0 -1
- package/dist/expect/attempt.d.ts.map +0 -1
- package/dist/expect/attempt.js.map +0 -1
- package/dist/expect/index.d.ts.map +0 -1
- package/dist/expect/index.js.map +0 -1
- package/dist/expect/poll.d.ts.map +0 -1
- package/dist/expect/poll.js.map +0 -1
- package/dist/expect/soft.d.ts.map +0 -1
- package/dist/expect/soft.js.map +0 -1
- package/dist/expect/values.d.ts.map +0 -1
- package/dist/expect/values.js.map +0 -1
- package/dist/explore/body.d.ts.map +0 -1
- package/dist/explore/body.js.map +0 -1
- package/dist/explore/executor.d.ts.map +0 -1
- package/dist/explore/executor.js.map +0 -1
- package/dist/explore/index.d.ts.map +0 -1
- package/dist/explore/index.js.map +0 -1
- package/dist/explore/plan.d.ts.map +0 -1
- package/dist/explore/plan.js.map +0 -1
- package/dist/explore/progress.d.ts.map +0 -1
- package/dist/explore/progress.js.map +0 -1
- package/dist/explore/state.d.ts.map +0 -1
- package/dist/explore/state.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/internal/ai-trace.d.ts.map +0 -1
- package/dist/internal/ai-trace.js.map +0 -1
- package/dist/internal/atomic-write.d.ts.map +0 -1
- package/dist/internal/atomic-write.js.map +0 -1
- package/dist/internal/brands.d.ts.map +0 -1
- package/dist/internal/brands.js.map +0 -1
- package/dist/internal/debug.d.ts.map +0 -1
- package/dist/internal/debug.js.map +0 -1
- package/dist/internal/env.d.ts.map +0 -1
- package/dist/internal/env.js.map +0 -1
- package/dist/internal/errors.d.ts.map +0 -1
- package/dist/internal/errors.js.map +0 -1
- package/dist/internal/geometry.d.ts.map +0 -1
- package/dist/internal/geometry.js.map +0 -1
- package/dist/internal/git.d.ts.map +0 -1
- package/dist/internal/git.js.map +0 -1
- package/dist/internal/globs.d.ts.map +0 -1
- package/dist/internal/globs.js.map +0 -1
- package/dist/internal/ids.d.ts.map +0 -1
- package/dist/internal/ids.js.map +0 -1
- package/dist/internal/json-value.d.ts.map +0 -1
- package/dist/internal/json-value.js.map +0 -1
- package/dist/internal/keys.d.ts.map +0 -1
- package/dist/internal/keys.js.map +0 -1
- package/dist/internal/node-version.d.ts.map +0 -1
- package/dist/internal/node-version.js.map +0 -1
- package/dist/internal/objects.d.ts.map +0 -1
- package/dist/internal/objects.js.map +0 -1
- package/dist/internal/options.d.ts.map +0 -1
- package/dist/internal/options.js.map +0 -1
- package/dist/internal/package-manager.d.ts.map +0 -1
- package/dist/internal/package-manager.js.map +0 -1
- package/dist/internal/package-version.d.ts.map +0 -1
- package/dist/internal/package-version.js.map +0 -1
- package/dist/internal/paths.d.ts.map +0 -1
- package/dist/internal/paths.js.map +0 -1
- package/dist/internal/realm-slot.d.ts.map +0 -1
- package/dist/internal/realm-slot.js.map +0 -1
- package/dist/internal/recording-modes.d.ts.map +0 -1
- package/dist/internal/recording-modes.js.map +0 -1
- package/dist/internal/redact.d.ts.map +0 -1
- package/dist/internal/redact.js.map +0 -1
- package/dist/internal/regexp.d.ts.map +0 -1
- package/dist/internal/regexp.js.map +0 -1
- package/dist/internal/roles.d.ts.map +0 -1
- package/dist/internal/roles.js.map +0 -1
- package/dist/internal/skip.d.ts.map +0 -1
- package/dist/internal/skip.js.map +0 -1
- package/dist/internal/source.d.ts.map +0 -1
- package/dist/internal/source.js.map +0 -1
- package/dist/internal/standard-schema.d.ts.map +0 -1
- package/dist/internal/standard-schema.js.map +0 -1
- package/dist/internal/suggest.d.ts.map +0 -1
- package/dist/internal/suggest.js.map +0 -1
- package/dist/internal/text.d.ts.map +0 -1
- package/dist/internal/text.js.map +0 -1
- package/dist/internal/time.d.ts.map +0 -1
- package/dist/internal/time.js.map +0 -1
- package/dist/internal/urls.d.ts.map +0 -1
- package/dist/internal/urls.js.map +0 -1
- package/dist/internal/vcs.d.ts.map +0 -1
- package/dist/internal/vcs.js.map +0 -1
- package/dist/internal/zip.d.ts.map +0 -1
- package/dist/internal/zip.js.map +0 -1
- package/dist/locator/engine.d.ts.map +0 -1
- package/dist/locator/engine.js.map +0 -1
- package/dist/locator/expression.d.ts.map +0 -1
- package/dist/locator/expression.js.map +0 -1
- package/dist/locator/screen.d.ts.map +0 -1
- package/dist/locator/screen.js.map +0 -1
- package/dist/mcp/catalog.d.ts.map +0 -1
- package/dist/mcp/catalog.js.map +0 -1
- package/dist/mcp/config.d.ts.map +0 -1
- package/dist/mcp/config.js.map +0 -1
- package/dist/mcp/recording.d.ts.map +0 -1
- package/dist/mcp/recording.js.map +0 -1
- package/dist/mcp/server.d.ts.map +0 -1
- package/dist/mcp/server.js.map +0 -1
- package/dist/mcp/session.d.ts.map +0 -1
- package/dist/mcp/session.js.map +0 -1
- package/dist/mcp/sessions.d.ts.map +0 -1
- package/dist/mcp/sessions.js.map +0 -1
- package/dist/mcp/tools.d.ts.map +0 -1
- package/dist/mcp/tools.js.map +0 -1
- package/dist/oauth/callback-server.d.ts.map +0 -1
- package/dist/oauth/callback-server.js.map +0 -1
- package/dist/oauth/chatgpt.d.ts.map +0 -1
- package/dist/oauth/chatgpt.js.map +0 -1
- package/dist/oauth/cli.d.ts.map +0 -1
- package/dist/oauth/cli.js.map +0 -1
- package/dist/oauth/copilot.d.ts.map +0 -1
- package/dist/oauth/copilot.js.map +0 -1
- package/dist/oauth/device-code.d.ts.map +0 -1
- package/dist/oauth/device-code.js.map +0 -1
- package/dist/oauth/errors.d.ts.map +0 -1
- package/dist/oauth/errors.js.map +0 -1
- package/dist/oauth/fetch.d.ts.map +0 -1
- package/dist/oauth/fetch.js.map +0 -1
- package/dist/oauth/grok.d.ts.map +0 -1
- package/dist/oauth/grok.js.map +0 -1
- package/dist/oauth/jwt.d.ts.map +0 -1
- package/dist/oauth/jwt.js.map +0 -1
- package/dist/oauth/login.d.ts.map +0 -1
- package/dist/oauth/login.js.map +0 -1
- package/dist/oauth/models.d.ts.map +0 -1
- package/dist/oauth/models.js.map +0 -1
- package/dist/oauth/pkce.d.ts.map +0 -1
- package/dist/oauth/pkce.js.map +0 -1
- package/dist/oauth/providers/github-copilot.d.ts.map +0 -1
- package/dist/oauth/providers/github-copilot.js.map +0 -1
- package/dist/oauth/providers/openai.d.ts.map +0 -1
- package/dist/oauth/providers/openai.js.map +0 -1
- package/dist/oauth/providers/xai.d.ts.map +0 -1
- package/dist/oauth/providers/xai.js.map +0 -1
- package/dist/oauth/providers.d.ts.map +0 -1
- package/dist/oauth/providers.js.map +0 -1
- package/dist/oauth/sse.d.ts.map +0 -1
- package/dist/oauth/sse.js.map +0 -1
- package/dist/oauth/store.d.ts.map +0 -1
- package/dist/oauth/store.js.map +0 -1
- package/dist/oauth/token-endpoint.d.ts.map +0 -1
- package/dist/oauth/token-endpoint.js.map +0 -1
- package/dist/oauth/types.d.ts.map +0 -1
- package/dist/oauth/types.js.map +0 -1
- package/dist/params.d.ts.map +0 -1
- package/dist/params.js.map +0 -1
- package/dist/report/build.d.ts.map +0 -1
- package/dist/report/build.js.map +0 -1
- package/dist/report/builtin.d.ts.map +0 -1
- package/dist/report/builtin.js.map +0 -1
- package/dist/report/code-frame.d.ts.map +0 -1
- package/dist/report/code-frame.js.map +0 -1
- package/dist/report/debug-steps.d.ts.map +0 -1
- package/dist/report/debug-steps.js.map +0 -1
- package/dist/report/explore-text.d.ts.map +0 -1
- package/dist/report/explore-text.js.map +0 -1
- package/dist/report/failure-text.d.ts.map +0 -1
- package/dist/report/failure-text.js.map +0 -1
- package/dist/report/format.d.ts.map +0 -1
- package/dist/report/format.js.map +0 -1
- package/dist/report/json.d.ts.map +0 -1
- package/dist/report/json.js.map +0 -1
- package/dist/report/junit.d.ts.map +0 -1
- package/dist/report/junit.js.map +0 -1
- package/dist/report/list-explore.d.ts.map +0 -1
- package/dist/report/list-explore.js.map +0 -1
- package/dist/report/list-model.d.ts.map +0 -1
- package/dist/report/list-model.js.map +0 -1
- package/dist/report/list-steps.d.ts.map +0 -1
- package/dist/report/list-steps.js.map +0 -1
- package/dist/report/list.d.ts.map +0 -1
- package/dist/report/list.js.map +0 -1
- package/dist/report/live-window.d.ts.map +0 -1
- package/dist/report/live-window.js.map +0 -1
- package/dist/report/markdown-text.d.ts.map +0 -1
- package/dist/report/markdown-text.js.map +0 -1
- package/dist/report/markdown.d.ts.map +0 -1
- package/dist/report/markdown.js.map +0 -1
- package/dist/report/outcome.d.ts.map +0 -1
- package/dist/report/outcome.js.map +0 -1
- package/dist/report/repeats.d.ts.map +0 -1
- package/dist/report/repeats.js.map +0 -1
- package/dist/report/running-tree.d.ts.map +0 -1
- package/dist/report/running-tree.js.map +0 -1
- package/dist/report/write.d.ts.map +0 -1
- package/dist/report/write.js.map +0 -1
- package/dist/run/app-ports.d.ts.map +0 -1
- package/dist/run/app-ports.js.map +0 -1
- package/dist/run/artifacts.d.ts.map +0 -1
- package/dist/run/artifacts.js.map +0 -1
- package/dist/run/budget.d.ts.map +0 -1
- package/dist/run/budget.js.map +0 -1
- package/dist/run/declared-processes.d.ts.map +0 -1
- package/dist/run/declared-processes.js.map +0 -1
- package/dist/run/events.d.ts.map +0 -1
- package/dist/run/events.js.map +0 -1
- package/dist/run/execute.d.ts.map +0 -1
- package/dist/run/execute.js.map +0 -1
- package/dist/run/extended-fixtures.d.ts.map +0 -1
- package/dist/run/extended-fixtures.js.map +0 -1
- package/dist/run/failure-evidence.d.ts.map +0 -1
- package/dist/run/failure-evidence.js.map +0 -1
- package/dist/run/fixture-recording.d.ts.map +0 -1
- package/dist/run/fixture-recording.js.map +0 -1
- package/dist/run/fixtures.d.ts.map +0 -1
- package/dist/run/fixtures.js.map +0 -1
- package/dist/run/in-process.d.ts.map +0 -1
- package/dist/run/in-process.js.map +0 -1
- package/dist/run/last-run.d.ts.map +0 -1
- package/dist/run/last-run.js.map +0 -1
- package/dist/run/managed-process.d.ts.map +0 -1
- package/dist/run/managed-process.js.map +0 -1
- package/dist/run/output.d.ts.map +0 -1
- package/dist/run/output.js.map +0 -1
- package/dist/run/process-pool.d.ts.map +0 -1
- package/dist/run/process-pool.js.map +0 -1
- package/dist/run/provision.d.ts.map +0 -1
- package/dist/run/provision.js.map +0 -1
- package/dist/run/realm.d.ts.map +0 -1
- package/dist/run/realm.js.map +0 -1
- package/dist/run/records.d.ts.map +0 -1
- package/dist/run/records.js.map +0 -1
- package/dist/run/retry.d.ts.map +0 -1
- package/dist/run/retry.js.map +0 -1
- package/dist/run/runner.d.ts.map +0 -1
- package/dist/run/runner.js.map +0 -1
- package/dist/run/scheduler.d.ts.map +0 -1
- package/dist/run/scheduler.js.map +0 -1
- package/dist/run/secrecy.d.ts.map +0 -1
- package/dist/run/secrecy.js.map +0 -1
- package/dist/run/serial.d.ts.map +0 -1
- package/dist/run/serial.js.map +0 -1
- package/dist/run/sessions.d.ts.map +0 -1
- package/dist/run/sessions.js.map +0 -1
- package/dist/run/standalone.d.ts.map +0 -1
- package/dist/run/standalone.js.map +0 -1
- package/dist/run/steps.d.ts.map +0 -1
- package/dist/run/steps.js.map +0 -1
- package/dist/run/trace-redaction.d.ts.map +0 -1
- package/dist/run/trace-redaction.js.map +0 -1
- package/dist/run/unit-runner.d.ts.map +0 -1
- package/dist/run/unit-runner.js.map +0 -1
- package/dist/run/units.d.ts.map +0 -1
- package/dist/run/units.js.map +0 -1
- package/dist/run/worker/entry.d.ts.map +0 -1
- package/dist/run/worker/entry.js.map +0 -1
- package/dist/run/worker/handle.d.ts.map +0 -1
- package/dist/run/worker/handle.js.map +0 -1
- package/dist/run/worker/protocol.d.ts.map +0 -1
- package/dist/run/worker/protocol.js.map +0 -1
- package/dist/run/worker/session.d.ts.map +0 -1
- package/dist/run/worker/session.js.map +0 -1
- package/dist/run/worker-models.d.ts.map +0 -1
- package/dist/run/worker-models.js.map +0 -1
- package/dist/secrets.d.ts.map +0 -1
- package/dist/secrets.js.map +0 -1
- package/dist/telemetry/checkout.d.ts.map +0 -1
- package/dist/telemetry/checkout.js.map +0 -1
- package/dist/telemetry/environment.d.ts.map +0 -1
- package/dist/telemetry/environment.js.map +0 -1
- package/dist/telemetry/events.d.ts.map +0 -1
- package/dist/telemetry/events.js.map +0 -1
- package/dist/telemetry/failure-kind.d.ts.map +0 -1
- package/dist/telemetry/failure-kind.js.map +0 -1
- package/dist/telemetry/posthog.d.ts.map +0 -1
- package/dist/telemetry/posthog.js.map +0 -1
- package/dist/telemetry/project.d.ts.map +0 -1
- package/dist/telemetry/project.js.map +0 -1
- package/dist/telemetry/store.d.ts.map +0 -1
- package/dist/telemetry/store.js.map +0 -1
- package/dist/telemetry/telemetry.d.ts.map +0 -1
- package/dist/telemetry/telemetry.js.map +0 -1
- package/dist/telemetry/token.d.ts.map +0 -1
- package/dist/telemetry/token.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
|
@@ -0,0 +1,567 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Mobile CI
|
|
3
|
+
description: Run iOS and Android tests on GitHub Actions, EAS Workflows, Bitrise, and Codemagic.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
A mobile CI job does the same four things on every service: build the app
|
|
7
|
+
for a simulator or emulator, boot a device, install the build, and run
|
|
8
|
+
`npx e2e run`. Only the syntax changes. Read
|
|
9
|
+
[Continuous integration](/ci) first for what CI mode changes, model
|
|
10
|
+
credentials, sharding, and exit codes; everything there applies here.
|
|
11
|
+
|
|
12
|
+
## What the job needs
|
|
13
|
+
|
|
14
|
+
| | iOS | Android |
|
|
15
|
+
| --- | --- | --- |
|
|
16
|
+
| Machine | macOS with Xcode and a simulator runtime | Linux with KVM (nested virtualization) |
|
|
17
|
+
| Build | Release simulator `.app`, no signing | Release `.apk` |
|
|
18
|
+
| Device | A booted simulator | A booted emulator |
|
|
19
|
+
| Node | 22.12 or later | 22.12 or later |
|
|
20
|
+
|
|
21
|
+
Build Release on both platforms: a React Native or Expo debug build loads
|
|
22
|
+
its JavaScript from Metro, which no CI job here starts, so the app opens on
|
|
23
|
+
an error screen. The examples assume a React Native project with `ios/` and
|
|
24
|
+
`android/` committed; an Expo project without them runs `npx expo prebuild`
|
|
25
|
+
first.
|
|
26
|
+
|
|
27
|
+
The config pins the app by its bundle id or package name, and the job
|
|
28
|
+
installs the build before the run:
|
|
29
|
+
|
|
30
|
+
```ts title="e2e.config.ts"
|
|
31
|
+
import type { E2EConfig } from 'e2e';
|
|
32
|
+
import { mobile } from '@e2e-dev/mobile';
|
|
33
|
+
|
|
34
|
+
export default {
|
|
35
|
+
targets: [
|
|
36
|
+
{ name: 'ios', engine: mobile({ platform: 'ios' }), app: { bundleId: 'com.example.app' } },
|
|
37
|
+
{ name: 'android', engine: mobile({ platform: 'android' }), app: { bundleId: 'com.example.app' } },
|
|
38
|
+
],
|
|
39
|
+
workers: 1,
|
|
40
|
+
} satisfies E2EConfig;
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
<CodeGroup>
|
|
44
|
+
```bash npm
|
|
45
|
+
# iOS
|
|
46
|
+
xcrun simctl install booted path/to/MyApp.app
|
|
47
|
+
npx e2e run --target ios --reporter list,junit
|
|
48
|
+
|
|
49
|
+
# Android
|
|
50
|
+
adb install -r path/to/app.apk
|
|
51
|
+
npx e2e run --target android --reporter list,junit
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
```bash pnpm
|
|
55
|
+
# iOS
|
|
56
|
+
xcrun simctl install booted path/to/MyApp.app
|
|
57
|
+
pnpm exec e2e run --target ios --reporter list,junit
|
|
58
|
+
|
|
59
|
+
# Android
|
|
60
|
+
adb install -r path/to/app.apk
|
|
61
|
+
pnpm exec e2e run --target android --reporter list,junit
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
```bash bun
|
|
65
|
+
# iOS
|
|
66
|
+
xcrun simctl install booted path/to/MyApp.app
|
|
67
|
+
bunx e2e run --target ios --reporter list,junit
|
|
68
|
+
|
|
69
|
+
# Android
|
|
70
|
+
adb install -r path/to/app.apk
|
|
71
|
+
bunx e2e run --target android --reporter list,junit
|
|
72
|
+
```
|
|
73
|
+
</CodeGroup>
|
|
74
|
+
|
|
75
|
+
The engine uses the booted device and asks agent-device to boot one when
|
|
76
|
+
none is up. Boot it yourself as a step anyway: a fresh Linux runner has no
|
|
77
|
+
emulator image to boot until you install one, and a boot in its own step
|
|
78
|
+
tells a slow or failed boot apart from a failed test. To have the suite
|
|
79
|
+
install the build instead, set `app.appPath` and call `device.installApp()`; see
|
|
80
|
+
[Point at your app](/mobile#point-at-your-app).
|
|
81
|
+
|
|
82
|
+
A few things hold on every service:
|
|
83
|
+
|
|
84
|
+
- **One job per platform.** `--target ios` on a Mac, `--target android` on
|
|
85
|
+
a Linux machine with KVM. Hosted Macs run on Apple Silicon, which cannot
|
|
86
|
+
nest virtualization, so the Android emulator does not start there.
|
|
87
|
+
- **Pin the iOS runtime.** A simulator picked by name (`iPhone 17`) runs
|
|
88
|
+
whichever iOS the image defaults to, and the accessibility tree changes
|
|
89
|
+
between iOS releases: a runner image update can flip a locator assertion
|
|
90
|
+
with no change in your code. The examples create a simulator on a named
|
|
91
|
+
runtime and boot it by UDID; replace `iOS-26-5` with a runtime the image
|
|
92
|
+
ships (`xcrun simctl list runtimes`) and bump it on purpose.
|
|
93
|
+
- **The iOS runner is compiled on first use.** agent-device builds its
|
|
94
|
+
XCUITest runner into `~/.agent-device` the first time it drives a
|
|
95
|
+
simulator. Cache that directory where the service lets you.
|
|
96
|
+
- **Upload `.e2e/` whatever the outcome.** `report.json` and `junit.xml` say
|
|
97
|
+
what failed; `.e2e/artifacts/` holds the screenshots and screen dumps that
|
|
98
|
+
say why, and the video when you run with `--video`.
|
|
99
|
+
- **Replay what you recorded locally.** [Commit the replay cache](/cache#commit-the-replay-cache)
|
|
100
|
+
so `agent.act` steps replay without a model call. Agent judgments
|
|
101
|
+
(`agent.assert`, `agent.waitFor`, `agent.extract`) always call the model.
|
|
102
|
+
The cache keys on `app`, so a recording made on your simulator replays on
|
|
103
|
+
the CI one.
|
|
104
|
+
- **Keep the model key from untrusted code.** A job that runs a pull
|
|
105
|
+
request's code hands the key to that code, its tests and dependencies
|
|
106
|
+
included. Expose it only to builds of branches you trust; see
|
|
107
|
+
[Model credentials](/ci#model-credentials) and the
|
|
108
|
+
[security model](/security).
|
|
109
|
+
|
|
110
|
+
## GitHub Actions
|
|
111
|
+
|
|
112
|
+
Two jobs, one per platform. The iOS job builds with `xcodebuild` for the
|
|
113
|
+
simulator; swap in your own build command as long as it writes a simulator
|
|
114
|
+
`.app` without launching it. For Expo, `npx expo run:ios --configuration
|
|
115
|
+
Release --device generic --no-bundler --output build/ios` builds without
|
|
116
|
+
booting a simulator and writes the `.app` under `build/ios`.
|
|
117
|
+
|
|
118
|
+
```yaml title=".github/workflows/e2e-mobile.yml"
|
|
119
|
+
name: e2e mobile
|
|
120
|
+
|
|
121
|
+
on:
|
|
122
|
+
pull_request:
|
|
123
|
+
push:
|
|
124
|
+
branches: [main]
|
|
125
|
+
|
|
126
|
+
permissions:
|
|
127
|
+
contents: read
|
|
128
|
+
|
|
129
|
+
jobs:
|
|
130
|
+
ios:
|
|
131
|
+
runs-on: macos-26
|
|
132
|
+
timeout-minutes: 60
|
|
133
|
+
steps:
|
|
134
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
135
|
+
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
|
136
|
+
with:
|
|
137
|
+
node-version: 26
|
|
138
|
+
cache: npm
|
|
139
|
+
- run: npm ci
|
|
140
|
+
- run: pod install
|
|
141
|
+
working-directory: ios
|
|
142
|
+
|
|
143
|
+
- name: Build for the simulator
|
|
144
|
+
run: |
|
|
145
|
+
xcodebuild -workspace ios/MyApp.xcworkspace -scheme MyApp \
|
|
146
|
+
-configuration Release -sdk iphonesimulator \
|
|
147
|
+
-destination 'generic/platform=iOS Simulator' \
|
|
148
|
+
-derivedDataPath build
|
|
149
|
+
- uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
|
150
|
+
with:
|
|
151
|
+
path: ~/.agent-device
|
|
152
|
+
key: agent-device-${{ runner.os }}-${{ hashFiles('package-lock.json') }}
|
|
153
|
+
|
|
154
|
+
- name: Boot a simulator and install the app
|
|
155
|
+
run: |
|
|
156
|
+
UDID=$(xcrun simctl create e2e "iPhone 17" com.apple.CoreSimulator.SimRuntime.iOS-26-5)
|
|
157
|
+
xcrun simctl bootstatus "$UDID" -b
|
|
158
|
+
xcrun simctl install "$UDID" build/Build/Products/Release-iphonesimulator/MyApp.app
|
|
159
|
+
|
|
160
|
+
- run: npx e2e run --target ios --reporter list,junit
|
|
161
|
+
env:
|
|
162
|
+
AI_GATEWAY_API_KEY: ${{ secrets.AI_GATEWAY_API_KEY }}
|
|
163
|
+
|
|
164
|
+
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
165
|
+
if: ${{ !cancelled() }}
|
|
166
|
+
with:
|
|
167
|
+
name: e2e-ios
|
|
168
|
+
path: .e2e
|
|
169
|
+
if-no-files-found: warn
|
|
170
|
+
|
|
171
|
+
android:
|
|
172
|
+
runs-on: ubuntu-latest
|
|
173
|
+
timeout-minutes: 60
|
|
174
|
+
steps:
|
|
175
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
176
|
+
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
|
177
|
+
with:
|
|
178
|
+
node-version: 26
|
|
179
|
+
cache: npm
|
|
180
|
+
- uses: actions/setup-java@de7274f081f381c8f8158605e0321c36c376e2e6 # v6.0.1
|
|
181
|
+
with:
|
|
182
|
+
distribution: temurin
|
|
183
|
+
java-version: 17
|
|
184
|
+
- run: npm ci
|
|
185
|
+
|
|
186
|
+
- name: Enable KVM
|
|
187
|
+
run: |
|
|
188
|
+
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
|
|
189
|
+
sudo udevadm control --reload-rules
|
|
190
|
+
sudo udevadm trigger --name-match=kvm
|
|
191
|
+
# React Native and Expo templates sign release builds with the debug keystore.
|
|
192
|
+
- name: Build the APK
|
|
193
|
+
run: cd android && ./gradlew :app:assembleRelease
|
|
194
|
+
|
|
195
|
+
- name: Run on an emulator
|
|
196
|
+
uses: reactivecircus/android-emulator-runner@a421e43855164a8197daf9d8d40fe71c6996bb0d # v2.38.0
|
|
197
|
+
with:
|
|
198
|
+
api-level: 36
|
|
199
|
+
arch: x86_64
|
|
200
|
+
target: google_apis
|
|
201
|
+
profile: pixel_7
|
|
202
|
+
emulator-options: -no-window -gpu swiftshader_indirect -no-snapshot -noaudio -no-boot-anim
|
|
203
|
+
disable-animations: true
|
|
204
|
+
script: |
|
|
205
|
+
adb install -r android/app/build/outputs/apk/release/app-release.apk
|
|
206
|
+
npx e2e run --target android --reporter list,junit
|
|
207
|
+
env:
|
|
208
|
+
AI_GATEWAY_API_KEY: ${{ secrets.AI_GATEWAY_API_KEY }}
|
|
209
|
+
|
|
210
|
+
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
211
|
+
if: ${{ !cancelled() }}
|
|
212
|
+
with:
|
|
213
|
+
name: e2e-android
|
|
214
|
+
path: .e2e
|
|
215
|
+
if-no-files-found: warn
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
The emulator runner action boots the emulator, runs each `script` line in
|
|
219
|
+
its own shell, and shuts the emulator down when the step ends, so the install
|
|
220
|
+
and the run belong in the same step. Add the [GitHub reporter](/github) to
|
|
221
|
+
post each job's results on the pull request.
|
|
222
|
+
|
|
223
|
+
This repository runs its own mobile suites this way; see
|
|
224
|
+
[`mobile.yml`](https://github.com/tester-army/e2e/blob/main/.github/workflows/mobile.yml)
|
|
225
|
+
for a version that caches the Expo build per native fingerprint, boots two
|
|
226
|
+
simulators for two workers, and reruns failures with `--last-failed`.
|
|
227
|
+
|
|
228
|
+
## EAS Workflows
|
|
229
|
+
|
|
230
|
+
A `build` job produces the simulator `.app` or the `.apk` on EAS, and a
|
|
231
|
+
custom job downloads it, boots a device, and runs the suite. Add a build
|
|
232
|
+
profile that needs no credentials:
|
|
233
|
+
|
|
234
|
+
```json title="eas.json"
|
|
235
|
+
{
|
|
236
|
+
"build": {
|
|
237
|
+
"e2e": {
|
|
238
|
+
"withoutCredentials": true,
|
|
239
|
+
"ios": { "simulator": true },
|
|
240
|
+
"android": { "buildType": "apk" }
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
The iOS job runs on a macOS runner; the Android one needs a
|
|
247
|
+
`nested-virtualization` Linux runner, the only EAS machines that can run the
|
|
248
|
+
emulator:
|
|
249
|
+
|
|
250
|
+
```yaml title=".eas/workflows/e2e.yml"
|
|
251
|
+
name: e2e
|
|
252
|
+
|
|
253
|
+
on:
|
|
254
|
+
pull_request:
|
|
255
|
+
branches: ['*']
|
|
256
|
+
push:
|
|
257
|
+
branches: [main]
|
|
258
|
+
|
|
259
|
+
defaults:
|
|
260
|
+
tools:
|
|
261
|
+
node: '22'
|
|
262
|
+
|
|
263
|
+
jobs:
|
|
264
|
+
build_ios:
|
|
265
|
+
type: build
|
|
266
|
+
params:
|
|
267
|
+
platform: ios
|
|
268
|
+
profile: e2e
|
|
269
|
+
|
|
270
|
+
build_android:
|
|
271
|
+
type: build
|
|
272
|
+
params:
|
|
273
|
+
platform: android
|
|
274
|
+
profile: e2e
|
|
275
|
+
|
|
276
|
+
e2e_ios:
|
|
277
|
+
needs: [build_ios]
|
|
278
|
+
runs_on: macos-medium
|
|
279
|
+
environment: preview
|
|
280
|
+
env:
|
|
281
|
+
CI: '1'
|
|
282
|
+
steps:
|
|
283
|
+
- uses: eas/checkout
|
|
284
|
+
- uses: eas/install_node_modules
|
|
285
|
+
- uses: eas/download_build
|
|
286
|
+
id: download_build
|
|
287
|
+
with:
|
|
288
|
+
build_id: ${{ needs.build_ios.outputs.build_id }}
|
|
289
|
+
extensions: [app]
|
|
290
|
+
- name: Boot a simulator and install the app
|
|
291
|
+
run: |
|
|
292
|
+
UDID=$(xcrun simctl create e2e "iPhone 17" com.apple.CoreSimulator.SimRuntime.iOS-26-5)
|
|
293
|
+
xcrun simctl bootstatus "$UDID" -b
|
|
294
|
+
xcrun simctl install "$UDID" "${{ steps.download_build.outputs.artifact_path }}"
|
|
295
|
+
- name: Run e2e
|
|
296
|
+
run: npx e2e run --target ios --reporter list,junit
|
|
297
|
+
- uses: eas/upload_artifact
|
|
298
|
+
if: ${{ always() }}
|
|
299
|
+
with:
|
|
300
|
+
type: other
|
|
301
|
+
name: e2e-ios
|
|
302
|
+
path: .e2e
|
|
303
|
+
|
|
304
|
+
e2e_android:
|
|
305
|
+
needs: [build_android]
|
|
306
|
+
runs_on: linux-medium-nested-virtualization
|
|
307
|
+
environment: preview
|
|
308
|
+
env:
|
|
309
|
+
CI: '1'
|
|
310
|
+
steps:
|
|
311
|
+
- uses: eas/checkout
|
|
312
|
+
- uses: eas/install_node_modules
|
|
313
|
+
- uses: eas/download_build
|
|
314
|
+
id: download_build
|
|
315
|
+
with:
|
|
316
|
+
build_id: ${{ needs.build_android.outputs.build_id }}
|
|
317
|
+
extensions: [apk]
|
|
318
|
+
- uses: eas/start_android_emulator
|
|
319
|
+
with:
|
|
320
|
+
system_image_package: system-images;android-35;google_apis;x86_64
|
|
321
|
+
- name: Install the app
|
|
322
|
+
run: adb install -r "${{ steps.download_build.outputs.artifact_path }}"
|
|
323
|
+
- name: Run e2e
|
|
324
|
+
run: npx e2e run --target android --reporter list,junit
|
|
325
|
+
- uses: eas/upload_artifact
|
|
326
|
+
if: ${{ always() }}
|
|
327
|
+
with:
|
|
328
|
+
type: other
|
|
329
|
+
name: e2e-android
|
|
330
|
+
path: .e2e
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
- **Secrets.** Store `AI_GATEWAY_API_KEY` (or your provider's key) as an
|
|
334
|
+
[EAS environment variable](https://docs.expo.dev/eas/environment-variables/)
|
|
335
|
+
with secret visibility. `environment:` picks which EAS environment a job
|
|
336
|
+
reads; set it explicitly, since custom jobs default to `production`.
|
|
337
|
+
- **CI mode.** `CI: '1'` turns on the [CI defaults](/ci#what-ci-changes)
|
|
338
|
+
whether or not the runner sets it.
|
|
339
|
+
- **Emulator function.** `eas/start_android_emulator` is an EAS build
|
|
340
|
+
function, documented under
|
|
341
|
+
[custom builds](https://docs.expo.dev/custom-builds/schema/) rather than
|
|
342
|
+
on the Workflows syntax page. It downloads the system image you name with
|
|
343
|
+
`sdkmanager`. The iOS job creates its simulator with `xcrun simctl` to pin
|
|
344
|
+
the runtime.
|
|
345
|
+
- **Rebuilding less.** A `fingerprint` job with `get-build` and `repack`
|
|
346
|
+
reuses the last native build and only rebundles the JavaScript. The
|
|
347
|
+
[agent-device EAS template](https://github.com/callstackincubator/eas-agent-device/blob/main/.eas/workflows/agent-qa-mobile.yml)
|
|
348
|
+
wires this up for both platforms.
|
|
349
|
+
|
|
350
|
+
EAS Workflows also has a built-in `maestro` job type that boots the device
|
|
351
|
+
and runs Maestro flows. For e2e, use a custom job as above.
|
|
352
|
+
|
|
353
|
+
## Bitrise
|
|
354
|
+
|
|
355
|
+
One workflow per platform, grouped into a pipeline. Bitrise ships steps for
|
|
356
|
+
booting both devices: `xcode-start-simulator` on macOS, and `avd-manager`
|
|
357
|
+
with `wait-for-android-emulator` on Linux. Start the emulator before the
|
|
358
|
+
Gradle build so it boots while the APK compiles.
|
|
359
|
+
|
|
360
|
+
```yaml title="bitrise.yml"
|
|
361
|
+
format_version: '25'
|
|
362
|
+
default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git
|
|
363
|
+
|
|
364
|
+
tools:
|
|
365
|
+
nodejs: 22:installed
|
|
366
|
+
|
|
367
|
+
pipelines:
|
|
368
|
+
e2e:
|
|
369
|
+
triggers:
|
|
370
|
+
push:
|
|
371
|
+
- branch: main
|
|
372
|
+
pull_request:
|
|
373
|
+
- target_branch: main
|
|
374
|
+
workflows:
|
|
375
|
+
e2e-ios: {}
|
|
376
|
+
e2e-android: {}
|
|
377
|
+
|
|
378
|
+
workflows:
|
|
379
|
+
e2e-ios:
|
|
380
|
+
meta:
|
|
381
|
+
bitrise.io:
|
|
382
|
+
stack: osx-xcode-26.6.x
|
|
383
|
+
steps:
|
|
384
|
+
- git-clone@8: {}
|
|
385
|
+
- script@1:
|
|
386
|
+
title: Install dependencies
|
|
387
|
+
inputs:
|
|
388
|
+
- content: |-
|
|
389
|
+
#!/usr/bin/env bash
|
|
390
|
+
set -euo pipefail
|
|
391
|
+
npm ci
|
|
392
|
+
cd ios && pod install
|
|
393
|
+
- xcode-build-for-simulator@3:
|
|
394
|
+
inputs:
|
|
395
|
+
- project_path: ios/MyApp.xcworkspace
|
|
396
|
+
- scheme: MyApp
|
|
397
|
+
- configuration: Release
|
|
398
|
+
- xcode-start-simulator@0:
|
|
399
|
+
inputs:
|
|
400
|
+
- destination: platform=iOS Simulator,name=iPhone 17,OS=26.5
|
|
401
|
+
- script@1:
|
|
402
|
+
title: Run e2e
|
|
403
|
+
inputs:
|
|
404
|
+
- content: |-
|
|
405
|
+
#!/usr/bin/env bash
|
|
406
|
+
set -euo pipefail
|
|
407
|
+
xcrun simctl install booted "$BITRISE_APP_DIR_PATH"
|
|
408
|
+
npx e2e run --target ios --reporter list,junit
|
|
409
|
+
- script@1:
|
|
410
|
+
title: Package the e2e output
|
|
411
|
+
is_always_run: true
|
|
412
|
+
inputs:
|
|
413
|
+
- content: |-
|
|
414
|
+
#!/usr/bin/env bash
|
|
415
|
+
if [ -d .e2e ]; then (cd .e2e && zip -qr "$BITRISE_DEPLOY_DIR/e2e-ios.zip" .); fi
|
|
416
|
+
- custom-test-results-export@1:
|
|
417
|
+
inputs:
|
|
418
|
+
- test_name: e2e-ios
|
|
419
|
+
- base_path: $BITRISE_SOURCE_DIR/.e2e/junit.xml
|
|
420
|
+
- search_pattern: '*'
|
|
421
|
+
- deploy-to-bitrise-io@2: {}
|
|
422
|
+
|
|
423
|
+
e2e-android:
|
|
424
|
+
meta:
|
|
425
|
+
bitrise.io:
|
|
426
|
+
stack: ubuntu-noble-24.04-bitrise-2025-android
|
|
427
|
+
steps:
|
|
428
|
+
- git-clone@8: {}
|
|
429
|
+
- script@1:
|
|
430
|
+
title: Install dependencies
|
|
431
|
+
inputs:
|
|
432
|
+
- content: npm ci
|
|
433
|
+
- avd-manager@2:
|
|
434
|
+
inputs:
|
|
435
|
+
- api_level: 35
|
|
436
|
+
- tag: google_apis
|
|
437
|
+
- abi: x86_64
|
|
438
|
+
- android-build@1:
|
|
439
|
+
inputs:
|
|
440
|
+
- project_location: $BITRISE_SOURCE_DIR/android
|
|
441
|
+
- module: app
|
|
442
|
+
- variant: release
|
|
443
|
+
- build_type: apk
|
|
444
|
+
- wait-for-android-emulator@1: {}
|
|
445
|
+
- script@1:
|
|
446
|
+
title: Run e2e
|
|
447
|
+
inputs:
|
|
448
|
+
- content: |-
|
|
449
|
+
#!/usr/bin/env bash
|
|
450
|
+
set -euo pipefail
|
|
451
|
+
adb install -r "$BITRISE_APK_PATH"
|
|
452
|
+
npx e2e run --target android --reporter list,junit
|
|
453
|
+
- script@1:
|
|
454
|
+
title: Package the e2e output
|
|
455
|
+
is_always_run: true
|
|
456
|
+
inputs:
|
|
457
|
+
- content: |-
|
|
458
|
+
#!/usr/bin/env bash
|
|
459
|
+
if [ -d .e2e ]; then (cd .e2e && zip -qr "$BITRISE_DEPLOY_DIR/e2e-android.zip" .); fi
|
|
460
|
+
- custom-test-results-export@1:
|
|
461
|
+
inputs:
|
|
462
|
+
- test_name: e2e-android
|
|
463
|
+
- base_path: $BITRISE_SOURCE_DIR/.e2e/junit.xml
|
|
464
|
+
- search_pattern: '*'
|
|
465
|
+
- deploy-to-bitrise-io@2: {}
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
- **Artifacts.** `deploy-to-bitrise-io` uploads only the top level of
|
|
469
|
+
`$BITRISE_DEPLOY_DIR`, so the workflow zips `.e2e/` into it.
|
|
470
|
+
`custom-test-results-export` hands `junit.xml` to the Test Reports tab.
|
|
471
|
+
Both, and `deploy-to-bitrise-io`, run after a failed step.
|
|
472
|
+
- **Secrets.** Add the model key under Secrets in the app's workflow editor.
|
|
473
|
+
Pull request builds get a secret only with **Expose for Pull Requests**
|
|
474
|
+
turned on, and builds of a public app never get one: the deterministic
|
|
475
|
+
suite still runs there, but every agent judgment and every `agent.act`
|
|
476
|
+
with no recording fails.
|
|
477
|
+
- **Release signing.** A release APK needs signing; React Native and Expo
|
|
478
|
+
templates sign it with the debug keystore.
|
|
479
|
+
|
|
480
|
+
## Codemagic
|
|
481
|
+
|
|
482
|
+
Android runs on a Linux instance. The Ubuntu image comes with AVDs named `emulator` (API 34),
|
|
483
|
+
`emulator-35`, and `emulator-36`.
|
|
484
|
+
|
|
485
|
+
```yaml title="codemagic.yaml"
|
|
486
|
+
workflows:
|
|
487
|
+
e2e-ios:
|
|
488
|
+
name: e2e iOS
|
|
489
|
+
instance_type: mac_mini_m2
|
|
490
|
+
max_build_duration: 60
|
|
491
|
+
environment:
|
|
492
|
+
groups:
|
|
493
|
+
- e2e
|
|
494
|
+
node: 22
|
|
495
|
+
xcode: latest
|
|
496
|
+
triggering:
|
|
497
|
+
events:
|
|
498
|
+
- push
|
|
499
|
+
- pull_request
|
|
500
|
+
scripts:
|
|
501
|
+
- name: Install dependencies
|
|
502
|
+
script: npm ci
|
|
503
|
+
- name: Install pods
|
|
504
|
+
script: cd ios && pod install
|
|
505
|
+
- name: Build for the simulator
|
|
506
|
+
script: |
|
|
507
|
+
xcodebuild -workspace ios/MyApp.xcworkspace -scheme MyApp \
|
|
508
|
+
-configuration Release -sdk iphonesimulator \
|
|
509
|
+
-destination 'generic/platform=iOS Simulator' \
|
|
510
|
+
-derivedDataPath ios/build
|
|
511
|
+
- name: Boot a simulator and install the app
|
|
512
|
+
script: |
|
|
513
|
+
UDID=$(xcrun simctl create e2e "iPhone 17" com.apple.CoreSimulator.SimRuntime.iOS-26-5)
|
|
514
|
+
xcrun simctl bootstatus "$UDID" -b
|
|
515
|
+
xcrun simctl install "$UDID" ios/build/Build/Products/Release-iphonesimulator/MyApp.app
|
|
516
|
+
- name: Run e2e
|
|
517
|
+
script: npx e2e run --target ios --reporter list,junit
|
|
518
|
+
test_report: .e2e/junit.xml
|
|
519
|
+
artifacts:
|
|
520
|
+
- .e2e/report.json
|
|
521
|
+
- .e2e/junit.xml
|
|
522
|
+
- .e2e/artifacts/**
|
|
523
|
+
|
|
524
|
+
e2e-android:
|
|
525
|
+
name: e2e Android
|
|
526
|
+
instance_type: linux_x2
|
|
527
|
+
max_build_duration: 60
|
|
528
|
+
environment:
|
|
529
|
+
groups:
|
|
530
|
+
- e2e
|
|
531
|
+
node: 22
|
|
532
|
+
triggering:
|
|
533
|
+
events:
|
|
534
|
+
- push
|
|
535
|
+
- pull_request
|
|
536
|
+
scripts:
|
|
537
|
+
- name: Install dependencies
|
|
538
|
+
script: npm ci
|
|
539
|
+
- name: Build the APK
|
|
540
|
+
script: cd android && ./gradlew :app:assembleRelease
|
|
541
|
+
- name: Boot the emulator and install the app
|
|
542
|
+
script: |
|
|
543
|
+
emulator -avd emulator-35 -no-window -no-audio -no-boot-anim > /dev/null 2>&1 &
|
|
544
|
+
adb wait-for-device
|
|
545
|
+
until [ "$(adb shell getprop sys.boot_completed | tr -d '\r')" = "1" ]; do sleep 2; done
|
|
546
|
+
adb install -r android/app/build/outputs/apk/release/app-release.apk
|
|
547
|
+
- name: Run e2e
|
|
548
|
+
script: npx e2e run --target android --reporter list,junit
|
|
549
|
+
test_report: .e2e/junit.xml
|
|
550
|
+
artifacts:
|
|
551
|
+
- .e2e/report.json
|
|
552
|
+
- .e2e/junit.xml
|
|
553
|
+
- .e2e/artifacts/**
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
Put the model key in the `e2e` environment variable group, marked secret.
|
|
557
|
+
`test_report` feeds `junit.xml` to the build's Tests tab. Linux instances
|
|
558
|
+
need billing enabled.
|
|
559
|
+
|
|
560
|
+
<CardGroup cols={2}>
|
|
561
|
+
<Card title="Continuous integration" icon="gears" href="/ci">
|
|
562
|
+
CI defaults, sharding, reruns, and exit codes.
|
|
563
|
+
</Card>
|
|
564
|
+
<Card title="Hosted devices" icon="cloud" href="/mobile#hosted-devices">
|
|
565
|
+
Lease devices from a service instead of booting them on the runner.
|
|
566
|
+
</Card>
|
|
567
|
+
</CardGroup>
|