agentic-qa-maestro 0.1.0__tar.gz
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.
- agentic_qa_maestro-0.1.0/.github/workflows/ci.yml +32 -0
- agentic_qa_maestro-0.1.0/.github/workflows/release.yml +47 -0
- agentic_qa_maestro-0.1.0/.gitignore +38 -0
- agentic_qa_maestro-0.1.0/ARCHITECTURE.md +254 -0
- agentic_qa_maestro-0.1.0/CODE_OF_CONDUCT.md +28 -0
- agentic_qa_maestro-0.1.0/CONTRIBUTING.md +31 -0
- agentic_qa_maestro-0.1.0/GETTINGSTARTED.md +135 -0
- agentic_qa_maestro-0.1.0/LICENSE +182 -0
- agentic_qa_maestro-0.1.0/PKG-INFO +128 -0
- agentic_qa_maestro-0.1.0/README.md +86 -0
- agentic_qa_maestro-0.1.0/SECURITY.md +25 -0
- agentic_qa_maestro-0.1.0/agentic_qa_maestro/__init__.py +3 -0
- agentic_qa_maestro-0.1.0/agentic_qa_maestro/agents/__init__.py +1 -0
- agentic_qa_maestro-0.1.0/agentic_qa_maestro/agents/factory.py +213 -0
- agentic_qa_maestro-0.1.0/agentic_qa_maestro/config.py +115 -0
- agentic_qa_maestro-0.1.0/agentic_qa_maestro/main.py +469 -0
- agentic_qa_maestro-0.1.0/agentic_qa_maestro/models/__init__.py +1 -0
- agentic_qa_maestro-0.1.0/agentic_qa_maestro/models/azure_openai.py +79 -0
- agentic_qa_maestro-0.1.0/agentic_qa_maestro/observability/__init__.py +1 -0
- agentic_qa_maestro-0.1.0/agentic_qa_maestro/observability/tracing.py +80 -0
- agentic_qa_maestro-0.1.0/agentic_qa_maestro/resources/app_flows/example-app.yaml +28 -0
- agentic_qa_maestro-0.1.0/agentic_qa_maestro/resources/application.yaml +118 -0
- agentic_qa_maestro-0.1.0/agentic_qa_maestro/resources/example.env +27 -0
- agentic_qa_maestro-0.1.0/agentic_qa_maestro/runtime_assets.py +57 -0
- agentic_qa_maestro-0.1.0/agentic_qa_maestro/teams/__init__.py +1 -0
- agentic_qa_maestro-0.1.0/agentic_qa_maestro/teams/group_chat_team.py +39 -0
- agentic_qa_maestro-0.1.0/agentic_qa_maestro/teams/sequential_team.py +41 -0
- agentic_qa_maestro-0.1.0/agentic_qa_maestro/tools/__init__.py +1 -0
- agentic_qa_maestro-0.1.0/agentic_qa_maestro/tools/app_knowledge_tools.py +118 -0
- agentic_qa_maestro-0.1.0/agentic_qa_maestro/tools/browser_tools.py +419 -0
- agentic_qa_maestro-0.1.0/agentic_qa_maestro/tools/jira_tools.py +360 -0
- agentic_qa_maestro-0.1.0/agentic_qa_maestro/tools/local_tools.py +77 -0
- agentic_qa_maestro-0.1.0/agentic_qa_maestro/web_ui/__init__.py +1 -0
- agentic_qa_maestro-0.1.0/agentic_qa_maestro/web_ui/app.py +558 -0
- agentic_qa_maestro-0.1.0/agentic_qa_maestro/web_ui/templates/index.html +631 -0
- agentic_qa_maestro-0.1.0/agentic_qa_maestro.egg-info/PKG-INFO +128 -0
- agentic_qa_maestro-0.1.0/agentic_qa_maestro.egg-info/SOURCES.txt +54 -0
- agentic_qa_maestro-0.1.0/agentic_qa_maestro.egg-info/dependency_links.txt +1 -0
- agentic_qa_maestro-0.1.0/agentic_qa_maestro.egg-info/entry_points.txt +2 -0
- agentic_qa_maestro-0.1.0/agentic_qa_maestro.egg-info/requires.txt +21 -0
- agentic_qa_maestro-0.1.0/agentic_qa_maestro.egg-info/top_level.txt +1 -0
- agentic_qa_maestro-0.1.0/app_flows/example-app.yaml +82 -0
- agentic_qa_maestro-0.1.0/application.yaml +134 -0
- agentic_qa_maestro-0.1.0/configs/scenarios/jira_e2e_pipeline.yaml +27 -0
- agentic_qa_maestro-0.1.0/example.env +27 -0
- agentic_qa_maestro-0.1.0/pyproject.toml +80 -0
- agentic_qa_maestro-0.1.0/scripts/run_e2e_pipeline.py +303 -0
- agentic_qa_maestro-0.1.0/scripts/run_jira_pipeline.py +162 -0
- agentic_qa_maestro-0.1.0/setup.cfg +10 -0
- agentic_qa_maestro-0.1.0/test_evidence/.gitkeep +0 -0
- agentic_qa_maestro-0.1.0/tests/unit/test_agents.py +84 -0
- agentic_qa_maestro-0.1.0/tests/unit/test_config.py +123 -0
- agentic_qa_maestro-0.1.0/tests/unit/test_teams.py +46 -0
- agentic_qa_maestro-0.1.0/tests/unit/test_tools.py +69 -0
- agentic_qa_maestro-0.1.0/uv.lock +4438 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main, develop]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main, develop]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
lint:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- uses: actions/checkout@v4
|
|
14
|
+
- uses: actions/setup-python@v5
|
|
15
|
+
with:
|
|
16
|
+
python-version: "3.12"
|
|
17
|
+
- run: pip install ruff
|
|
18
|
+
- run: ruff check .
|
|
19
|
+
- run: ruff format --check .
|
|
20
|
+
|
|
21
|
+
test:
|
|
22
|
+
runs-on: ubuntu-latest
|
|
23
|
+
strategy:
|
|
24
|
+
matrix:
|
|
25
|
+
python-version: ["3.10", "3.11", "3.12"]
|
|
26
|
+
steps:
|
|
27
|
+
- uses: actions/checkout@v4
|
|
28
|
+
- uses: actions/setup-python@v5
|
|
29
|
+
with:
|
|
30
|
+
python-version: ${{ matrix.python-version }}
|
|
31
|
+
- run: pip install -e ".[dev]"
|
|
32
|
+
- run: pytest --cov=agentic_qa_maestro --cov-report=term-missing
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
name: Release to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
id-token: write
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
build:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v4
|
|
16
|
+
|
|
17
|
+
- uses: actions/setup-python@v5
|
|
18
|
+
with:
|
|
19
|
+
python-version: "3.12"
|
|
20
|
+
|
|
21
|
+
- name: Install build tools
|
|
22
|
+
run: pip install build
|
|
23
|
+
|
|
24
|
+
- name: Build package
|
|
25
|
+
run: python -m build
|
|
26
|
+
|
|
27
|
+
- name: Upload artifacts
|
|
28
|
+
uses: actions/upload-artifact@v4
|
|
29
|
+
with:
|
|
30
|
+
name: dist
|
|
31
|
+
path: dist/
|
|
32
|
+
|
|
33
|
+
publish-pypi:
|
|
34
|
+
needs: build
|
|
35
|
+
runs-on: ubuntu-latest
|
|
36
|
+
environment: pypi
|
|
37
|
+
permissions:
|
|
38
|
+
id-token: write
|
|
39
|
+
steps:
|
|
40
|
+
- name: Download artifacts
|
|
41
|
+
uses: actions/download-artifact@v4
|
|
42
|
+
with:
|
|
43
|
+
name: dist
|
|
44
|
+
path: dist/
|
|
45
|
+
|
|
46
|
+
- name: Publish to PyPI
|
|
47
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
*.egg-info/
|
|
6
|
+
|
|
7
|
+
# App settings (may contain config)
|
|
8
|
+
.settings.json
|
|
9
|
+
dist/
|
|
10
|
+
build/
|
|
11
|
+
*.egg
|
|
12
|
+
|
|
13
|
+
# Environment
|
|
14
|
+
.env
|
|
15
|
+
.venv/
|
|
16
|
+
venv/
|
|
17
|
+
env/
|
|
18
|
+
|
|
19
|
+
# IDE
|
|
20
|
+
.idea/
|
|
21
|
+
.vscode/
|
|
22
|
+
*.swp
|
|
23
|
+
*.swo
|
|
24
|
+
|
|
25
|
+
# Testing
|
|
26
|
+
.pytest_cache/
|
|
27
|
+
htmlcov/
|
|
28
|
+
.coverage
|
|
29
|
+
.coverage.*
|
|
30
|
+
|
|
31
|
+
# OS
|
|
32
|
+
.DS_Store
|
|
33
|
+
Thumbs.db
|
|
34
|
+
|
|
35
|
+
# Test evidence screenshots (keep folder, ignore contents)
|
|
36
|
+
test_evidence/*
|
|
37
|
+
!test_evidence/.gitkeep
|
|
38
|
+
*.png
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
# Architecture — Agentic QA Maestro
|
|
2
|
+
|
|
3
|
+
> Multi-agent QA automation powered by [Microsoft Agent Framework](https://github.com/microsoft/agent-framework).
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## High-Level Overview
|
|
8
|
+
|
|
9
|
+
```mermaid
|
|
10
|
+
graph TD
|
|
11
|
+
subgraph UI["User Interface"]
|
|
12
|
+
CLI["CLI (main)"]
|
|
13
|
+
WebUI["Web UI (FastAPI)"]
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
subgraph Core["QAMaestro (main.py)"]
|
|
17
|
+
Entry["Entry point — loads config, creates model clients & agents,<br/>dispatches to chosen execution mode<br/><br/>Modes: chat | run | pipeline"]
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
subgraph Teams["Team Orchestration"]
|
|
21
|
+
GC["GroupChat Team<br/>(group_chat_team.py)<br/>Dynamic orchestrator selects<br/>the next agent at each turn"]
|
|
22
|
+
SEQ["Sequential Team<br/>(sequential_team.py)<br/>Deterministic pipeline runs<br/>agents in fixed order"]
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
subgraph Agents["Agent Layer"]
|
|
26
|
+
direction LR
|
|
27
|
+
Orch["Orchestrator"]
|
|
28
|
+
JIRA["JIRA Agent"]
|
|
29
|
+
Browser["Browser Agent"]
|
|
30
|
+
API["API Agent"]
|
|
31
|
+
Research["Research Agent"]
|
|
32
|
+
TestRunner["Test Runner"]
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
subgraph Tools["Tool Layer"]
|
|
36
|
+
direction LR
|
|
37
|
+
BT["Browser Tools<br/>(Playwright)"]
|
|
38
|
+
JT["JIRA Tools<br/>(REST/httpx)"]
|
|
39
|
+
LT["Local Tools<br/>(pytest, …)"]
|
|
40
|
+
MCP["MCP Servers<br/>(external tools)"]
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
CLI --> Entry
|
|
44
|
+
WebUI --> Entry
|
|
45
|
+
Entry --> GC
|
|
46
|
+
Entry --> SEQ
|
|
47
|
+
GC --> Orch
|
|
48
|
+
SEQ --> Orch
|
|
49
|
+
Orch --> BT
|
|
50
|
+
Orch --> JT
|
|
51
|
+
Orch --> LT
|
|
52
|
+
Orch --> MCP
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Execution Modes
|
|
58
|
+
|
|
59
|
+
```mermaid
|
|
60
|
+
graph TD
|
|
61
|
+
UR["User Request"] --> Chat["Chat<br/>(interactive loop)"]
|
|
62
|
+
UR --> Run["Run<br/>(one-shot task)"]
|
|
63
|
+
UR --> Pipeline["Pipeline<br/>(sequential steps)"]
|
|
64
|
+
|
|
65
|
+
Chat --> GC["GroupChat Orchestrator<br/>(dynamic agent select)"]
|
|
66
|
+
Run --> GC
|
|
67
|
+
Pipeline --> ST["Sequential Team<br/>(fixed order)"]
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
| Mode | Orchestration | Use Case |
|
|
71
|
+
|------|---------------|----------|
|
|
72
|
+
| **Chat** | GroupChat (dynamic) | Exploratory QA — user types tasks interactively |
|
|
73
|
+
| **Run** | GroupChat (dynamic) | One-shot task execution |
|
|
74
|
+
| **Pipeline** | Sequential (fixed) | Reproducible E2E pipelines in defined order |
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Data Flow
|
|
79
|
+
|
|
80
|
+
```mermaid
|
|
81
|
+
graph TD
|
|
82
|
+
YAML["application.yaml"] --> Config["AppConfig (config.py)<br/>• env var substitution<br/>• self-referencing templates"]
|
|
83
|
+
|
|
84
|
+
Config --> Models["Model Clients<br/>(azure_openai.py)"]
|
|
85
|
+
Config --> AgentDefs["Agent Defs<br/>(factory.py)"]
|
|
86
|
+
Config --> TeamCfg["Team Config<br/>(teams/*.py)"]
|
|
87
|
+
|
|
88
|
+
Models --> Agents["Agent Framework Agent instances"]
|
|
89
|
+
AgentDefs --> Agents
|
|
90
|
+
TeamCfg --> Agents
|
|
91
|
+
|
|
92
|
+
Agents --> ToolFns["@tool functions<br/>(browser, jira, local, mcp)"]
|
|
93
|
+
|
|
94
|
+
ToolFns --> PW["Playwright<br/>(browser)"]
|
|
95
|
+
ToolFns --> JIRAAPI["JIRA API<br/>(httpx)"]
|
|
96
|
+
ToolFns --> Pytest["pytest<br/>(subprocess)"]
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Agent Roles
|
|
102
|
+
|
|
103
|
+
```mermaid
|
|
104
|
+
graph TD
|
|
105
|
+
Orch["Orchestrator<br/>Coordinates the full<br/>E2E pipeline phases"] --> JIRA["JIRA Agent<br/>• Fetch issues<br/>• Extract criteria<br/>• Create bugs<br/>• Comment<br/>• Transition"]
|
|
106
|
+
Orch --> Browser["Browser Agent<br/>• Start browser<br/>• Nav, click, fill<br/>• Screenshots<br/>• AAD auth"]
|
|
107
|
+
Orch --> API["API Agent<br/>• REST calls<br/>• Contract test"]
|
|
108
|
+
Orch --> Research["Research Agent<br/>• Web search<br/>• Doc lookup"]
|
|
109
|
+
Orch --> TestRunner["Test Runner<br/>• pytest execute<br/>• Collect results<br/>• Analyze output"]
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## E2E Pipeline Phases
|
|
115
|
+
|
|
116
|
+
```mermaid
|
|
117
|
+
graph LR
|
|
118
|
+
P1["Phase 1<br/>Requirement Analysis<br/><br/>JIRA Agent<br/>fetches story + criteria"] --> P2["Phase 2<br/>App Discovery<br/><br/>Browser Agent<br/>explores UI via Playwright"]
|
|
119
|
+
P2 --> P3["Phase 3<br/>Test Case Generation<br/><br/>Orchestrator<br/>creates tests from criteria"]
|
|
120
|
+
P3 --> P4["Phase 4<br/>Test Execution<br/><br/>Browser Agent + Test Runner<br/>run tests"]
|
|
121
|
+
P4 --> P5["Phase 5<br/>Bug Reporting<br/><br/>JIRA Agent<br/>files bugs, posts summary"]
|
|
122
|
+
P5 --> P6["Phase 6<br/>Cleanup<br/><br/>Browser Agent<br/>closes browser"]
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Component Details
|
|
128
|
+
|
|
129
|
+
### Configuration (`config.py`)
|
|
130
|
+
|
|
131
|
+
Loads `application.yaml` with two substitution passes:
|
|
132
|
+
|
|
133
|
+
1. **Environment variables**: `${env:AZURE_OPENAI_API_KEY}` → value from env
|
|
134
|
+
2. **Self-references**: `${this:models.default.endpoint}` → value from config
|
|
135
|
+
|
|
136
|
+
Exposes typed sections: `.models`, `.agents`, `.teams`, `.mcp_servers`, `.observability`, `.web_ui`
|
|
137
|
+
|
|
138
|
+
### Model Client Factory (`models/azure_openai.py`)
|
|
139
|
+
|
|
140
|
+
- Creates `OpenAIChatCompletionClient` instances for Azure OpenAI
|
|
141
|
+
- Supports API key or `DefaultAzureCredential` (Azure AD)
|
|
142
|
+
- Auto-detects SSL certificate bundles for corporate proxy environments
|
|
143
|
+
|
|
144
|
+
### Agent Factory (`agents/factory.py`)
|
|
145
|
+
|
|
146
|
+
- Maps YAML agent definitions → Agent Framework `Agent` objects
|
|
147
|
+
- Assigns tools and model clients per agent
|
|
148
|
+
- Provides default system prompts for each role
|
|
149
|
+
|
|
150
|
+
### Tool Layer
|
|
151
|
+
|
|
152
|
+
| Module | Tools | External Dependency |
|
|
153
|
+
|--------|-------|---------------------|
|
|
154
|
+
| `browser_tools.py` | `start_browser`, `open_url`, `click`, `fill`, `select_option`, `wait_for_selector`, `get_text`, `get_page_content`, `screenshot`, `check_browser`, `close_browser`, `authenticate_aad` | Playwright (Chromium) |
|
|
155
|
+
| `jira_tools.py` | `jira_get_issue`, `jira_add_comment`, `jira_get_comments`, `jira_search_issues`, `jira_create_issue`, `jira_create_bug`, `jira_transition_issue` | JIRA REST API (httpx) |
|
|
156
|
+
| `local_tools.py` | `get_current_time`, `run_pytest`, `collect_pytest_tests` | pytest (subprocess) |
|
|
157
|
+
|
|
158
|
+
### Observability (`observability/tracing.py`)
|
|
159
|
+
|
|
160
|
+
```mermaid
|
|
161
|
+
graph TD
|
|
162
|
+
ST["setup_tracing()"] --> Console["Console Exporter"]
|
|
163
|
+
ST --> OTLP["OTLP (gRPC)"]
|
|
164
|
+
ST --> AzMon["Azure Monitor Exporter"]
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
- OpenTelemetry tracing with configurable exporters
|
|
168
|
+
- Structured Python logging with suppression of noisy libraries
|
|
169
|
+
|
|
170
|
+
### Web UI (`web_ui/app.py`)
|
|
171
|
+
|
|
172
|
+
```mermaid
|
|
173
|
+
graph LR
|
|
174
|
+
Browser["Browser"] --> FastAPI["FastAPI + Jinja2"]
|
|
175
|
+
FastAPI --> GET_root["GET / → Dashboard (HTML)"]
|
|
176
|
+
FastAPI --> POST_chat["POST /api/chat → Run group chat"]
|
|
177
|
+
FastAPI --> GET_status["GET /api/status → Agent status"]
|
|
178
|
+
FastAPI --> GET_history["GET /api/history → Run history"]
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## Design Patterns
|
|
184
|
+
|
|
185
|
+
| Pattern | Where | Purpose |
|
|
186
|
+
|---------|-------|---------|
|
|
187
|
+
| **Factory** | `create_model_clients_from_config()`, `create_agents_from_config()`, `create_*_team()` | Decouple creation from config |
|
|
188
|
+
| **Singleton** | Browser state in `browser_tools.py` (module-level globals + single-thread executor) | One browser instance, thread-safe |
|
|
189
|
+
| **Strategy** | AAD auth methods (`header`, `token_url`, `easyauth`, `msal_cache`); orchestration modes | Swap behavior at runtime |
|
|
190
|
+
| **Decorator** | `@tool(approval_mode=...)` on all tool functions | Register functions as Agent Framework tools |
|
|
191
|
+
| **Template Method** | `AppConfig._apply_substitutions()` | Recursive config resolution |
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## Directory Structure
|
|
196
|
+
|
|
197
|
+
```
|
|
198
|
+
agentic-qa-maestro/
|
|
199
|
+
├── ARCHITECTURE.md ← You are here
|
|
200
|
+
├── application.yaml # All config: models, agents, teams, observability
|
|
201
|
+
├── pyproject.toml # Package metadata & dependencies
|
|
202
|
+
├── example.env # Template for environment variables
|
|
203
|
+
│
|
|
204
|
+
├── agentic_qa_maestro/
|
|
205
|
+
│ ├── main.py # QAMaestro class & CLI entry point
|
|
206
|
+
│ ├── config.py # YAML loader with env/self-ref substitution
|
|
207
|
+
│ │
|
|
208
|
+
│ ├── agents/
|
|
209
|
+
│ │ └── factory.py # Agent creation from config
|
|
210
|
+
│ │
|
|
211
|
+
│ ├── models/
|
|
212
|
+
│ │ └── azure_openai.py # Azure OpenAI client factory
|
|
213
|
+
│ │
|
|
214
|
+
│ ├── teams/
|
|
215
|
+
│ │ ├── group_chat_team.py # GroupChatBuilder orchestration
|
|
216
|
+
│ │ └── sequential_team.py # SequentialBuilder pipelines
|
|
217
|
+
│ │
|
|
218
|
+
│ ├── tools/
|
|
219
|
+
│ │ ├── browser_tools.py # Playwright browser automation
|
|
220
|
+
│ │ ├── jira_tools.py # JIRA REST API client
|
|
221
|
+
│ │ └── local_tools.py # pytest runner, time utilities
|
|
222
|
+
│ │
|
|
223
|
+
│ ├── observability/
|
|
224
|
+
│ │ └── tracing.py # OpenTelemetry + logging setup
|
|
225
|
+
│ │
|
|
226
|
+
│ └── web_ui/
|
|
227
|
+
│ ├── app.py # FastAPI dashboard
|
|
228
|
+
│ └── templates/
|
|
229
|
+
│ └── index.html # Dark-theme chat UI
|
|
230
|
+
│
|
|
231
|
+
├── scripts/
|
|
232
|
+
│ ├── run_e2e_pipeline.py # Full 6-phase E2E runner
|
|
233
|
+
│ └── run_jira_pipeline.py # Lightweight JIRA-only runner
|
|
234
|
+
│
|
|
235
|
+
└── tests/
|
|
236
|
+
└── unit/ # Unit tests
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## Technology Stack
|
|
242
|
+
|
|
243
|
+
| Layer | Technology |
|
|
244
|
+
|-------|-----------|
|
|
245
|
+
| Agent Framework | Microsoft Agent Framework |
|
|
246
|
+
| LLM Provider | Azure OpenAI (model configurable via application.yaml) |
|
|
247
|
+
| Browser Automation | Playwright (Chromium) |
|
|
248
|
+
| Issue Tracking | JIRA (REST API via httpx) |
|
|
249
|
+
| Test Execution | pytest (subprocess) |
|
|
250
|
+
| Web Framework | FastAPI + Uvicorn + Jinja2 |
|
|
251
|
+
| Observability | OpenTelemetry (console / OTLP / Azure Monitor) |
|
|
252
|
+
| Auth | Azure Identity (DefaultAzureCredential / API keys) |
|
|
253
|
+
| Config | YAML + python-dotenv |
|
|
254
|
+
| Language | Python 3.10+ |
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Contributor Covenant Code of Conduct
|
|
2
|
+
|
|
3
|
+
## Our Pledge
|
|
4
|
+
We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation.
|
|
5
|
+
|
|
6
|
+
We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.
|
|
7
|
+
|
|
8
|
+
## Our Standards
|
|
9
|
+
Examples of behavior that contributes to a positive environment:
|
|
10
|
+
- Demonstrating empathy and kindness
|
|
11
|
+
- Being respectful of differing opinions
|
|
12
|
+
- Accepting constructive criticism
|
|
13
|
+
- Focusing on what is best for the community
|
|
14
|
+
- Showing gratitude
|
|
15
|
+
|
|
16
|
+
Examples of unacceptable behavior:
|
|
17
|
+
- The use of sexualized language or imagery
|
|
18
|
+
- Trolling, insulting or derogatory comments
|
|
19
|
+
- Personal or political attacks
|
|
20
|
+
- Public or private harassment
|
|
21
|
+
- Publishing others’ private information
|
|
22
|
+
- Other conduct which could reasonably be considered inappropriate
|
|
23
|
+
|
|
24
|
+
## Enforcement
|
|
25
|
+
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the maintainers at creation-platform@amadeus.com. All complaints will be reviewed and investigated and will result in a response deemed necessary and appropriate to the circumstances.
|
|
26
|
+
|
|
27
|
+
## Attribution
|
|
28
|
+
This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org/), version 2.1.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Contributing to Agentic QA Maestro
|
|
2
|
+
|
|
3
|
+
Thank you for your interest in contributing! Please follow these guidelines to help us maintain a collaborative and high-quality project.
|
|
4
|
+
|
|
5
|
+
## How to Contribute
|
|
6
|
+
- Fork the repository and create your branch from `main` or `develop`.
|
|
7
|
+
- Use descriptive branch names (e.g., `feature/your-feature`, `bugfix/issue-123`).
|
|
8
|
+
- Write clear, concise commit messages.
|
|
9
|
+
- Ensure your code passes all tests and lints (see below).
|
|
10
|
+
- Submit a pull request (PR) with a clear description of your changes.
|
|
11
|
+
|
|
12
|
+
## Code of Conduct
|
|
13
|
+
By participating, you agree to abide by the [Code of Conduct](CODE_OF_CONDUCT.md).
|
|
14
|
+
|
|
15
|
+
## Development Setup
|
|
16
|
+
- Install dependencies: `pip install -e .[dev]`
|
|
17
|
+
- Run tests: `pytest`
|
|
18
|
+
- Lint code: `ruff .`
|
|
19
|
+
|
|
20
|
+
## Reporting Issues
|
|
21
|
+
- Use GitHub Issues for bugs, feature requests, and questions.
|
|
22
|
+
- Provide as much detail as possible (steps to reproduce, logs, screenshots).
|
|
23
|
+
|
|
24
|
+
## Review Process
|
|
25
|
+
- All PRs require at least one approval.
|
|
26
|
+
- Maintain backward compatibility when possible.
|
|
27
|
+
- Add or update documentation as needed.
|
|
28
|
+
|
|
29
|
+
## Community
|
|
30
|
+
- Be respectful and constructive in all interactions.
|
|
31
|
+
- For major changes, open an issue to discuss your proposal first.
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# Quick Start
|
|
2
|
+
|
|
3
|
+
## Prerequisites
|
|
4
|
+
|
|
5
|
+
- Python 3.10, 3.11, or 3.12
|
|
6
|
+
- Access to Azure OpenAI (endpoint + API key or Azure AD credentials)
|
|
7
|
+
- JIRA instance with API token (for JIRA workflows)
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
# Install the released CLI
|
|
13
|
+
pip install agentic-qa-maestro
|
|
14
|
+
|
|
15
|
+
# Or install it with uv
|
|
16
|
+
uv tool install agentic-qa-maestro
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Use `pip` if you want the package in your current Python environment. Use `uv tool`
|
|
20
|
+
if you want an isolated CLI installation.
|
|
21
|
+
|
|
22
|
+
## Configuration
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
# Scaffold local runtime files
|
|
26
|
+
qa-maestro init
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
This creates:
|
|
30
|
+
|
|
31
|
+
- `application.yaml`
|
|
32
|
+
- `.env`
|
|
33
|
+
- `app_flows/example-app.yaml`
|
|
34
|
+
|
|
35
|
+
Edit `.env` with your credentials:
|
|
36
|
+
|
|
37
|
+
```dotenv
|
|
38
|
+
# Azure OpenAI (mandatory)
|
|
39
|
+
DEFAULT_OPENAI_ENDPOINT=https://your-resource.openai.azure.com/
|
|
40
|
+
DEFAULT_OPENAI_DEPLOYMENT=your-deployment-name
|
|
41
|
+
AZURE_OPENAI_API_KEY=your-api-key-here
|
|
42
|
+
DEFAULT_OPENAI_API_VERSION=2024-12-01-preview
|
|
43
|
+
|
|
44
|
+
# JIRA (mandatory)
|
|
45
|
+
JIRA_BASE_URL=https://your-jira-instance.atlassian.net
|
|
46
|
+
JIRA_API_TOKEN=your-jira-api-token
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
All secrets are loaded via environment variables — never hardcode them in config files.
|
|
50
|
+
|
|
51
|
+
## Browser Setup
|
|
52
|
+
|
|
53
|
+
Install Playwright's Chromium binary once before running the full E2E pipeline:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
playwright install chromium
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Run Tests
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
qa-maestro --help
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Run a JIRA Pipeline (Analysis Only)
|
|
66
|
+
|
|
67
|
+
Fetches the JIRA ticket, generates test cases, and posts them as a comment:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
qa-maestro --ticket SACP-282967
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Run the Full E2E Pipeline
|
|
74
|
+
|
|
75
|
+
The E2E pipeline executes all 6 phases against a live application. The `--url`, `--username`, and `--password` flags are **mandatory**.
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
qa-maestro \
|
|
79
|
+
--ticket YOUR-TICKET-ID \
|
|
80
|
+
--url "https://your-app.example.com/login" \
|
|
81
|
+
--username "your-username" \
|
|
82
|
+
--password "your-password"
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### E2E Pipeline Phases
|
|
86
|
+
|
|
87
|
+
| Phase | Name | Description |
|
|
88
|
+
|-------|------|-------------|
|
|
89
|
+
| 1 | **Requirement Analysis** | Fetch JIRA ticket, extract acceptance criteria |
|
|
90
|
+
| 2 | **App Discovery** | Launch browser, navigate to URL, discover UI elements and selectors |
|
|
91
|
+
| 3 | **Test Case Generation** | Generate test cases from requirements + discovered UI |
|
|
92
|
+
| 4 | **Test Execution** | Execute tests against the live app, take screenshots as evidence |
|
|
93
|
+
| 5 | **Bug Reporting** | Create JIRA bug tickets for failures, post summary comment |
|
|
94
|
+
| 6 | **Cleanup** | Close browser, output final status |
|
|
95
|
+
|
|
96
|
+
### Optional: Azure AD Authentication
|
|
97
|
+
|
|
98
|
+
For apps behind Azure AD, pass additional auth flags:
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
qa-maestro \
|
|
102
|
+
--ticket YOUR-TICKET-ID \
|
|
103
|
+
--url "https://your-app.example.com" \
|
|
104
|
+
--username "your-username" \
|
|
105
|
+
--password "your-password" \
|
|
106
|
+
--tenant-id "your-tenant-id" \
|
|
107
|
+
--client-id "your-client-id" \
|
|
108
|
+
--client-secret "your-client-secret" \
|
|
109
|
+
--scope "api://your-scope/.default"
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Start the Web UI
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
uvicorn agentic_qa_maestro.web_ui.app:app --port 8000
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Open http://localhost:8000 in your browser.
|
|
119
|
+
|
|
120
|
+
## CLI Usage
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
qa-maestro --help
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Development Setup
|
|
127
|
+
|
|
128
|
+
If you want to work from a local source checkout instead of the released package,
|
|
129
|
+
use the contributor workflow from [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
130
|
+
|
|
131
|
+
## Next Steps
|
|
132
|
+
|
|
133
|
+
- Review `application.yaml` for agent/team/model configuration
|
|
134
|
+
- See [ARCHITECTURE.md](ARCHITECTURE.md) for system design details
|
|
135
|
+
- See [CONTRIBUTING.md](CONTRIBUTING.md) to contribute
|