@e2epilot/cli
v1.2.1
Published
E2Epilot — AI-powered E2E test automation orchestrator
Readme
E2Epilot — Fix broken E2E tests. Diagnoses every failing test with real DOM, network, and console evidence — then writes the fix. Autonomous.
Website · Privacy Policy · Terms of Service
Quick Start
npx -y @e2epilot/cliRun it from your terminal — a local UI opens in your browser.
To run the non-interactive Fix All flow:
npx -y @e2epilot/cli fix --project ./path/to/testsUseful options include --framework, --base-url, --headed, --max-concurrent-investigators, and --fixer-file-batch-size. Run npx -y @e2epilot/cli --help for the complete list. If you install the package globally, the shorter e2epilot command is also available.
Features
- Diagnoses every failure — captures DOM, network, console, and action timeline to explain why a test broke
- Suggests reviewable fixes — proposes targeted code changes you review and merge, never silent rewrites
- Learns from every fix — each diagnosis becomes a reusable pattern stored locally, applied instantly next time
Supported Frameworks
| Framework | Language | Version | |---|---|---| | Playwright | TypeScript | 1.45+ | | Cypress | TypeScript | 13+ | | WebDriverIO | TypeScript | 8+ | | Selenium JavaScript | TypeScript | 4+ | | Selenium Java | Java | Maven / Gradle | | SeleniumBase | Python | pytest |
How It Works
E2Epilot runs a multi-agent system where specialized AI agents collaborate:
- Run your test suite and capture results
- Diagnose failures with full evidence (DOM snapshots, network logs, console output)
- Fix broken tests with validated, reviewable code changes
- Learn — save the fix as a reusable pattern for future runs
Requirements
- Node.js 20.1.x, 22.x, or 24+
- A supported test framework configured in your project
Learned patterns and other application state are stored under ~/.e2epilot by default. Set E2EPILOT_DATA_DIR to use a different location. Pattern records in that user-level store carry an opaque project scope, so project-specific fixes are never reused in an unrelated repository. The package’s curated seed patterns are read-only and remain separate from learned data.
Links
- e2epilot.com — product website
- Privacy Policy
- Terms of Service
- [email protected] — questions and feedback
License
Proprietary. See Terms of Service for usage terms.
Copyright © 2026 Kaizen Yutani Ltd.
Jira tickets
Paste a Jira Cloud ticket link into the composer and press Plan. AmbientQA imports the description and requirement fields automatically, then uses the normal test-plan approval flow. There is no Jira import dialog. Initial Atlassian authorization uses the same tab and restores the ticket request on return.
After the full approved ticket plan is written and its generated-test folders pass verification, AmbientQA moves the issue to Done through an available Jira transition. Failed, cancelled, partially approved, already-covered, or unverified work leaves Jira unchanged. Changed ticket requirements, required transition fields, and uncertain update responses are reported inline instead of claiming success or repeating a write.
The Jira composer button opens inline connection settings. OAuth credentials and imported-source/update records stay under the private local data directory (~/.e2epilot/connections/jira by default), outside project configuration; credentials are never sent to the model. Disconnect removes the local grant. Atlassian account settings control server-side revocation.
The connector uses the official Atlassian MCP v2 endpoint and requests Jira read/update permissions. Its only write operation is the verified-workflow transition to Done; it does not add comments, edit descriptions, or create issues.
Verified locally with CPG-7: automatic import, generated Appium test, iOS/Safari scoped and folder passes, then a confirmed Done transition. The Appium capture adapter preserves declared mobile capabilities and resolves folder scopes without substituting desktop Chrome.
Jira-generated test names use a stable issue-key prefix, for example [CPG-7] User signs in with a valid PIN. The prefix appears in proposed plans and is carried into the individual it()/test() name.
Generated UI test quality
JavaScript/TypeScript UI writers (Playwright, WDIO/Appium, Cypress and Selenium JS) validate source before saving tests and revalidate on-disk output against the current page objects before execution.
- Put selector construction in page objects and call semantic actions such as
login()oropenCards()from tests. Clicking a page-object getter from a test is rejected. - Assert requested amounts, currency, names, error feedback and counts against the relevant UI field. Container visibility, non-empty text, self-comparisons and unrelated API status checks do not satisfy those value requirements.
- Await asynchronous UI assertions. Comments, uncalled helpers and swallowed assertion failures do not count as proof.
- Genuine visibility smoke tests, API/domain tests and unmodified legacy cases remain valid. New or changed UI cases receive the new checks. Shared POM changes are checked again before runtime verification.
- WDIO script-timeout configuration is allowed; fixed sleeps and swallowed UI-action failures remain blocked.
These are bounded static checks for common JS/TS assertion patterns, not a proof of every natural-language business requirement. Runtime verification and plan review still apply. Other test languages retain their existing checks and writer guidance.
Tool discovery pilot
Optional Playwright tool discovery, bounded MCP evidence, and gateway preparation are documented in MCP tool discovery.
Workspace UI and Jev browsing
npm run dev builds and serves the AmbientQA-Jev-Browser workspace design with
the existing AmbientQA core. Connect a local project in the sidebar, set its
target in Project setup, and use the bottom composer to explore. The composer
can switch to a project task; Run, Inspect, Fix, Write test, Reports, coverage,
saved cases, questions, plan approval, account settings, and Jira use the existing
core APIs. The agents timeline is hidden. /legacy retains the previous workspace.
Browsing requires TYPESAFE_API_KEY in the ignored root .env; it does not
require the coding gateway. Jev selects observed actions and Playwright executes
them. Cart completion requires matching product, variant, and quantity evidence.
Partial exploration remains incomplete, and approval stays separate from observed
success. Writing a scenario uses a durable case and the original writer and
verification pipeline; discovery alone never marks repository tests as passed.
Browser, viewport, and timeout controls apply to exploration and step capture.
The other displayed execution preferences are saved; existing tests continue to
use their repository Playwright configuration. Browser data, reports, catalogs,
and settings are isolated per project under E2EPILOT_DATA_DIR/browser (default
~/.e2epilot/browser). Browsing and core mutations cannot overlap for a project.
Restarting the server marks interrupted browsing honestly instead of resuming
unverified actions.
Build with npm run build:workspace, check with npm run typecheck, and run the
imported browser and UI contracts with npm run test:workspace. Keep the root
Playwright runtime pinned to the supported stable version: the official MCP
backend has its own nested version, which must not replace the writer's runtime.
Jev decisions in the existing core
Add TYPESAFE_API_KEY=<your key> to your ignored
.env, then restart with npm run dev. Open your test project, set its app URL,
and use a specific Plan request that explores a scenario, or record a flow.
Normal AmbientQA sign-in and the existing model gateway are still required.
Jev click help is opt-in (E2EPILOT_JEV_BROWSER=1): in 388 traces it handed control
back to the Explorer in 755 of 756 decisions, and each call is awaited between
Explorer rounds. When on, Jev selects up to three clicks between completed Explorer
tool batches, with a 12-click session limit. Native
Playwright tools execute them in the same browser and retain flow/evidence
recording. The Explorer handles typing, dropdowns, scrolling, missing context,
recovery, and final verification. Inventory-only exploration stays with the
Explorer. Look for Jev browser decision in the run trace.
The local server sends a bounded, redacted goal and control context directly to
TypeSafe. The key stays server-side; input values are omitted from observations
and remembered entered values are redacted from Jev requests and telemetry.
Leave E2EPILOT_JEV_BROWSER unset (or 0) to use the existing Explorer path. Missing keys, provider errors,
confidence below 0.9, stale controls, dialogs, and unsupported pages return to
the Explorer. Bounded free-text requests targeting known tests also try Jev
before the existing model fallback. E2EPILOT_JEV_ROUTING=0 disables that layer.
Explicit Run, Inspect, Fix, Write, case dispatch, and plan authority bypass it;
Jev cannot grant write permission or certify repairs or coverage.
Optional settings: TYPESAFE_MODEL (default jev-latest) and
E2EPILOT_JEV_TIMEOUT_MS (default 5000). TypeSafe usage is recorded separately
in the trace; it is not part of the gateway's account-usage percentage.
Other Jev decisions in the write flow, each with an opt-out: the writer's prompt keeps the recorded flows relevant to the scenario and names the rest
(E2EPILOT_JEV_FLOW_SELECTION=0 keeps every flow); when no test title resembles the scenario, Jev reads the test files for one that asserts it under
another name, and only the source precheck's requirement-by-requirement proof can end the spec as covered (E2EPILOT_JEV_WRITE_RECALL=0); and the library
marks a suggested test that describes the same behavior as an earlier suggestion with Overlaps (E2EPILOT_JEV_LIBRARY=0 turns off the comparison).
When Jev stops answering, two failures in a row (a timeout, a network error, HTTP 5xx or 429)
pause it for 30 seconds, then one request tests whether it is back; a failed test doubles
the pause up to 5 minutes. Decisions use the rule-based fallbacks meanwhile, no request is
sent and no usage row is written for a skipped ask, and the run trace shows Jev paused and
Jev resumed. Set E2EPILOT_JEV_BREAKER=0 to keep asking regardless.
Browser guard checks can be run explicitly with
E2EPILOT_JEV_BROWSER_TESTS=1 npx vitest run tests/integration/jev-browser-bridge.test.ts.
The full native-tool/recording test is tests/integration/jev-browser-control.test.ts.
It uses mocked decisions by default; set E2EPILOT_JEV_LIVE_TESTS=1 (with E2EPILOT_JEV_BROWSER=1) and load .env
to exercise the real TypeSafe client with a simulated Explorer fallback step.
