Contributing to QA Agent
Read the guide below.
Turn this cable into a shipping system.
We help teams deploy reliable AI workflows with architecture, implementation, and hardening support.
Contributing to QA Agent
QA Agent is open source. Contributions that add integrations, improve the report format, or extend the agent's tool set are all welcome.
What you'll learn
- How to set up a local dev environment for contribution
- Project conventions and where to put new code
- What a good PR looks like
- Where contributors can have the most impact
Step 1: Fork and clone
# Fork on GitHub first, then:
git clone https://github.com/<your-handle>/qa-agent.git
cd qa-agent
git remote add upstream https://github.com/frenxt/qa-agent.git
Step 2: Set up the dev environment
python3.11 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
browser-use install
cp .env.example .env
# Set QA_LLM_API_KEY in .env
The [dev] extra installs linting tools (ruff, mypy).
Step 3: Run the existing tests
# Unit tests (fast, no browser required)
pytest unit_tests/ -v
# Smoke tests (requires a running target, uses the configured base_url)
python cli.py run --suite smoke
All unit tests should pass before you start making changes.
Code conventions
- Python 3.11+, typed with
mypy --strict(checkpyproject.tomlfor config) - Modules are single-responsibility — one module per integration, one module per pipeline stage
- No global state — pass config and dependencies explicitly through function arguments
- Ruff for formatting and linting:
ruff check . && ruff format .
Adding a new integration
The most common contribution type. Example: adding GitHub Issues support.
- Create
qa_agent/github_reporter.py:
from dataclasses import dataclass
from typing import Any
from .runner import RunResult
@dataclass
class GitHubConfig:
token: str
repo: str # format: "owner/repo"
def report(run_result: RunResult, config: GitHubConfig) -> list[str]:
"""Create GitHub issues for each failed test. Returns list of issue URLs."""
...
- Add config to
config.yaml:
github:
token: ""
repo: ""
create_issues: false
-
Load and call from
runner.pyaftergenerate_report(), following the pattern used forlinear_reporter.py. -
Add a unit test in
unit_tests/test_github_reporter.pythat mocks the GitHub API and verifies issue creation for a failedRunResult.
What to include in your PR
A good PR has three things:
- The implementation — focused, minimal, one feature or fix per PR
- A unit test — in
unit_tests/, testing the new behaviour directly. For integrations, mock the external API. For parser changes, use a fixture markdown file. - An updated
CONTRIBUTING.mdorREADME.mdsection if you added a new config key or CLI flag
PR checklist
Before opening:
ruff check . && ruff format --check .
mypy qa_agent/
pytest unit_tests/ -v
All three should pass with no errors.
Areas where contributors can have the most impact
- New reporter integrations (GitHub Issues, Jira, PagerDuty, Slack)
- Report format improvements — the HTML report is functional; a redesign with better mobile support or dark mode would be valuable
- Custom tool extensions —
custom_tools.pyis thin; drag-and-drop, file upload, and canvas interaction helpers are all missing - Release pipeline — the CSV-driven release runner works but has no UI; a simple web dashboard for release sign-off is on the roadmap
Open an issue before starting large changes to confirm the approach aligns with the project direction.
Quick answers
What do I get from this cable?
You get a step-by-step guide for this aspect of QA Agent.
How much time should I budget?
Typical effort is 25 min. The cable is marked intermediate.
Do I need to know Python?
Basic familiarity with running Python CLI commands is enough for the user guide cables (1–5). The contributor guide (cables 6–7) assumes you can read and write Python.
How fresh is the guidance?
The cable was last verified on 2026-04-17.
More from @frenxt
How QA Agent Works (Architecture)
Before contributing, understand what runs when you type `python cli.py run --suite smoke`.
Writing Your First Test Case
A good test case reads like a conversation between a QA engineer and a developer — not like code.
Running Tests & Reading Reports
A green result is only useful if you trust it. A red result is only useful if you can debug it fast.