GitHub ActionDirect link to GitHub Action
OverviewDirect link to Overview
DevAssure O2 is an AI-powered end-to-end (E2E) testing agent that integrates directly into GitHub workflows. It reads pull request diffs, automatically generates targeted UI tests, executes them on real browsers, and reports results back to the PR — with no test scripts to write or maintain.
Core workflow: reads code diff → maps blast radius → generates tests → executes → reports
How It WorksDirect link to How It Works
When a pull request is opened or updated:
- The DevAssure O2 agent reads the code diff from the PR.
- It identifies the impacted areas (blast radius) of the changes.
- It generates comprehensive end-to-end UI tests in natural language to validate those changes.
- It executes the generated tests on real browsers.
- It reports bugs and test results back to the PR, along with downloadable reports.
PrerequisitesDirect link to Prerequisites
- Runner OS: Unix-based runners only (Linux or macOS). Windows runners are not supported.
- Checkout step: The
actions/checkoutstep must includewith.refso the agent can resolve the code diff correctly. - Node.js: Required for installing
@devassure/cli. Node.js 24 is recommended. - DevAssure API Token: Required for authentication. See Authentication below.
AuthenticationDirect link to Authentication
Creating a DevAssure API TokenDirect link to Creating a DevAssure API Token
- Log in at https://app.devassure.io or sign up for free at https://app.devassure.io/sign_up.
- Navigate to Account → Settings → Token.
- Generate a new API token.
- Save it as a GitHub repository secret named
DEVASSURE_TOKEN.
Configuring the Token in WorkflowsDirect link to Configuring the Token in Workflows
The action resolves the token in order of precedence:
with.tokeninput (explicit pass-through)env.DEVASSURE_TOKENenvironment variable
Recommended approach — use the environment variable via GitHub Secrets:
env:
DEVASSURE_TOKEN: ${{ secrets.DEVASSURE_TOKEN }}
Installation & Basic SetupDirect link to Installation & Basic Setup
The action installs @devassure/cli globally, configures the token, and runs the specified command automatically. No manual CLI installation is required in the workflow.
Minimal Workflow (Default: test on every push)Direct link to Minimal Workflow (Default: test on every push)
name: devassure
on: [push]
jobs:
e2e:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{ github.head_ref || github.ref_name }}
- uses: actions/setup-node@v4
with:
node-version: "24"
- name: Run DevAssure
uses: devassure-ai/devassure-action@v1
env:
DEVASSURE_TOKEN: ${{ secrets.DEVASSURE_TOKEN }}
CommandsDirect link to Commands
The action supports the following commands via the command input. The default command is test.
| Command | Description |
|---|---|
setup | Installs and configures the DevAssure CLI |
test | Generates and runs E2E tests from a PR or branch diff |
run | Executes existing tests with optional filters |
summary | Retrieves a test session summary |
archive / archive-report | Archives the test report for a session |
test — Generate and Run Tests from a DiffDirect link to test--generate-and-run-tests-from-a-diff
- name: Run DevAssure test
uses: devassure-ai/devassure-action@v1
with:
command: test
minimum_score: 80
workers: 2
path: e2e/tests
source: staging
target: production
commit_id: ${{ github.sha }}
url: https://example.com
environment: staging
headless: "true"
env:
DEVASSURE_TOKEN: ${{ secrets.DEVASSURE_TOKEN }}
run — Execute Existing Tests with FiltersDirect link to run--execute-existing-tests-with-filters
- name: Run DevAssure run
uses: devassure-ai/devassure-action@v1
with:
command: run
workers: 2
path: e2e
filter: smoke
query: "login flow"
tag: nightly
priority: high
folder: reports
url: https://example.com
environment: staging
headless: "false"
env:
DEVASSURE_TOKEN: ${{ secrets.DEVASSURE_TOKEN }}
summary — Retrieve Session SummaryDirect link to summary--retrieve-session-summary
- name: Run DevAssure summary
uses: devassure-ai/devassure-action@v1
with:
command: summary
session_id: sess_123
env:
DEVASSURE_TOKEN: ${{ secrets.DEVASSURE_TOKEN }}
If
session_idis not provided, the action runsdevassure summary --last.
archive — Archive a Test ReportDirect link to archive--archive-a-test-report
- name: Run DevAssure archive-report
uses: devassure-ai/devassure-action@v1
with:
command: archive
session_id: sess_123
env:
DEVASSURE_TOKEN: ${{ secrets.DEVASSURE_TOKEN }}
If
session_idis not provided, the action runsdevassure archive-report --last.
setup — Explicit Token Pass-ThroughDirect link to setup--explicit-token-pass-through
- name: Run DevAssure with explicit token
uses: devassure-ai/devassure-action@v1
with:
token: ${{ secrets.DEVASSURE_TOKEN }}
command: setup
Inputs ReferenceDirect link to Inputs Reference
All inputs are optional. The default command is test.
| Input | Default | Description |
|---|---|---|
command | test | DevAssure command: setup, test, run, summary, archive, archive-report |
token | (empty) | DevAssure API token. Falls back to DEVASSURE_TOKEN env var if unset |
path | (empty) | Relative path to run from (useful when tests are in a subdirectory) |
source | (empty) | Source branch for test command scope and branch checkout |
target | (empty) | Target branch for test command baseline comparison |
commit_id | (empty) | Commit SHA for test command scope |
filter | (empty) | Filter expression for run command |
query | (empty) | Query string for selecting tests in run command |
tag | (empty) | Tag-based selector for run command |
priority | (empty) | Priority-based selector for run command |
folder | (empty) | Folder selector for run command |
url | (empty) | Application URL under test (used by test and run) |
headless | true | Headless browser mode ("true" or "false") |
session_id | (empty) | Specific session ID for summary or archive (defaults to latest session) |
archive | true | Set to false to skip archive-report --last and artifact upload for test/run |
minimum_score | 75 | Minimum passing score threshold for test/run. Set to 0 to disable |
workers | (empty) | Number of parallel workers (integer > 0) |
environment | (empty) | Environment name passed to test/run (e.g., staging, qa, production) |
Outputs ReferenceDirect link to Outputs Reference
| Output | Description |
|---|---|
archive_path | Path to the archived report, parsed from devassure archive-report output |
Command Parameter MappingDirect link to Command Parameter Mapping
The action forwards supported inputs to the CLI using --<arg-name>="<arg-value>" format.
| Command | Forwarded Parameters |
|---|---|
setup | (none) |
test | path, source, target, commit_id, url, workers, environment, headless |
run | path, filter, query, tag, priority, folder, url, workers, environment, headless |
summary | session_id (when set), otherwise --last |
archive / archive-report | session_id (when set), otherwise --last |
Note:
headlessalways defaults totrueand is always passed fortestandruncommands.
Score ValidationDirect link to Score Validation
For test and run commands, the action automatically runs devassure summary --last after execution and validates the score against minimum_score.
Score validation behavior:
- If
minimum_scoreis non-numeric or<= 0→ validation is skipped. - If the score is missing or
N/A→ the job fails. - If the score is below
minimum_score→ the job fails with:
Test score '<score>' is less than the minimum expected score (<minimum_score>) - If the score meets or exceeds
minimum_score→ the job passes.
To disable score validation, set minimum_score: 0.
Report Archiving & ArtifactsDirect link to Report Archiving & Artifacts
For test and run commands, report archiving is enabled by default (archive: true). The action:
- Runs
devassure archive-report --lastto archive the report. - Uploads the archive as a GitHub Actions artifact.
- Adds test result details to the GitHub Actions run summary using
dorny/test-reporter.
To skip archiving, set archive: false.
The archived .zip report can be downloaded from the GitHub Actions run summary and opened using:
- DevAssure CLI (
@devassure/cli) - DevAssure VSCode Extension
Runner Sizing RecommendationsDirect link to Runner Sizing Recommendations
| Workers / Concurrency | Recommended Spec |
|---|---|
| Baseline (default) | 4 vCPU / 16 GB RAM |
| Higher concurrency | Scale vCPU and RAM proportionally to avoid CPU and memory contention |
Increasing
workerswithout scaling the runner will cause performance degradation and potential test failures due to resource contention.
Local ExecutionDirect link to Local Execution
The DevAssure O2 agent can also be invoked locally using the DevAssure CLI npm package:
npm install -g @devassure/cli
devassure test --url https://your-app.com
See the DevAssure CLI documentation for full local usage details.
FAQDirect link to FAQ
How does minimum_score work?Direct link to how-does-minimum_score-work
minimum_score is the threshold a test run must meet or exceed to pass. The default is 75. If the score falls below this value, the GitHub Actions job fails. Set minimum_score: 0 to disable score validation entirely.
Does DevAssure charge per test run?Direct link to Does DevAssure charge per test run?
No. The O2 agent is $25 per agent per month with unlimited executions — no token-based metering and no per-run or per-call charges. Add agents if you need more parallelism. Current plans are on the pricing page.
How do I view the complete test report?Direct link to How do I view the complete test report?
The full report is archived as a .zip file and available for download from the GitHub Actions run summary. Open it using the DevAssure CLI or the DevAssure VSCode extension.
Can I run the agent locally?Direct link to Can I run the agent locally?
Yes. Install @devassure/cli via npm and run devassure commands directly from your local machine. Full CLI documentation is available at https://app.devassure.io.
Can I use session_id with the summary command?Direct link to can-i-use-session_id-with-the-summary-command
Yes. Pass a specific session_id to retrieve the summary for that session. If omitted, the action defaults to devassure summary --last (most recent session). The --last flag and session_id are mutually exclusive — the action ensures only one is passed.