Aegis — The AI Quality Control Plane
Project description
Aegis
The AI Quality Control Plane
Aegis is a lightweight orchestration layer that unifies AI-powered QA tools into a single control plane. It coordinates route discovery, test generation, bug triage, and fix proposals across your development workflow.
Architecture
graph TB
subgraph Aegis["Aegis — Control Plane"]
API[FastAPI API<br/>Typed OpenAPI Spec]
WF[Workflow Engine]
REG[Service Registry]
EV[Event System<br/>Emitter · Log · Webhooks]
HIST[History<br/>SQLite / In-Memory]
HP[Health Endpoint<br/>Version · Uptime · Config]
LP[Landing Page]
end
SDK[Python SDK<br/>AegisClient · AsyncAegisClient] --> API
subgraph Tools["QA Tool Suite"]
QA[QA Agent<br/>Route Discovery · Risk Analysis<br/>Test Generation · Orchestration]
BUG[Bugalizer<br/>Bug Triage · Code Localization<br/>Duplicate Detection]
end
subgraph LLM["LLM Backend"]
OLL[Ollama<br/>qwen2.5-coder:7b]
end
API --> WF
WF --> REG
WF --> HIST
WF --> EV
REG --> QA
REG --> BUG
QA --> OLL
BUG --> OLL
LP --> API
EV -->|webhooks| EXT[External Systems]
Quick Start
# Install from PyPI
pip install aegis-qa
# Or install from source (for development)
pip install -e ".[dev]"
# Configure
cp .aegis.yaml.example .aegis.yaml
# Edit .aegis.yaml with your service URLs
# Check service status
aegis status
# Run the full QA pipeline
aegis run full_pipeline
# Start the API server + landing page
aegis serve
Python SDK
The SDK is included when you pip install aegis-qa — no extra dependency needed.
from aegis_qa.client import AegisClient
# Sync client
with AegisClient(base_url="http://localhost:8000") as client:
health = client.health()
print(f"Status: {health.status}, uptime: {health.uptime_seconds}s")
services = client.list_services()
for svc in services:
print(f" {svc.name}: {svc.status}")
result = client.run_workflow("full_pipeline")
print(f"Pipeline {'passed' if result.success else 'failed'}")
from aegis_qa.client import AsyncAegisClient
# Async client
async with AsyncAegisClient(api_key="your-key") as client:
workflows = await client.list_workflows()
history = await client.recent_history(limit=5)
Deployment
Docker
# Pull the latest image
docker pull ghcr.io/jblacketter/aegis:latest
# Or build locally
docker build -t aegis .
# Run the server
docker run -p 8000:8000 aegis
# Verify it's running
curl http://localhost:8000/health
Docker Compose
# Start with SQLite persistence and config mounting
docker compose up
# Run in background
docker compose up -d
The compose file mounts .aegis.yaml (read-only) and persists the SQLite database on a named volume.
Environment Variables
| Variable | Description | Default |
|---|---|---|
AEGIS_DB_PATH |
Override SQLite database path | Value from .aegis.yaml |
Tools
| Tool | Description | Features |
|---|---|---|
| QA Agent | Route discovery, risk analysis, test generation & orchestration | Route Discovery, Risk Assessment, Test Generation, Test Orchestration, Branch Board |
| Bugalizer | AI-powered bug triage, code localization & fix proposals | Bug Triage, Code Localization, Duplicate Detection |
CLI Commands
| Command | Description |
|---|---|
aegis status |
Show all services and their health status |
aegis serve |
Start API server and serve landing page |
aegis run <workflow> |
Execute a named workflow pipeline |
aegis openapi |
Export OpenAPI spec as JSON |
aegis config show |
Print resolved configuration |
API Endpoints
| Endpoint | Method | Description |
|---|---|---|
/health |
GET | Health check with version, uptime, and config summary |
/api/services |
GET | List services with health status |
/api/services/{name}/health |
GET | Live health check for one service |
/api/workflows |
GET | List all configured workflows |
/api/workflows/{name} |
GET | Get a specific workflow definition |
/api/workflows/{name}/run |
POST | Trigger a named workflow |
/api/workflows/{name}/history |
GET | Execution history for a workflow |
/api/history |
GET | Recent execution history across all workflows |
/api/events |
GET | Recent events (filterable by type) |
/api/portfolio |
GET | Tool metadata for landing page |
Configuration
Aegis uses .aegis.yaml for configuration. See .aegis.yaml.example for the full schema.
Environment variables can be interpolated using ${VAR_NAME} syntax:
services:
qaagent:
url: ${QAAGENT_URL:-http://localhost:8080}
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file aegis_qa-0.2.0.tar.gz.
File metadata
- Download URL: aegis_qa-0.2.0.tar.gz
- Upload date:
- Size: 66.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a96eaa1f4f25a992f86a6c2d7c44ef1c30c16ecd2dcbbe3129cdf5b5f986e3b1
|
|
| MD5 |
2d9d2651737ca4db946bac81503738fd
|
|
| BLAKE2b-256 |
df4c2816e8b9601bb5a2011809721008e6ca84bf971e24c1756cd4ef7cac157c
|
Provenance
The following attestation bundles were made for aegis_qa-0.2.0.tar.gz:
Publisher:
release.yml on jblacketter/aegis
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
aegis_qa-0.2.0.tar.gz -
Subject digest:
a96eaa1f4f25a992f86a6c2d7c44ef1c30c16ecd2dcbbe3129cdf5b5f986e3b1 - Sigstore transparency entry: 1236564732
- Sigstore integration time:
-
Permalink:
jblacketter/aegis@e9d70e57cd619b2faafc55e5ab04d816195bac02 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/jblacketter
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@e9d70e57cd619b2faafc55e5ab04d816195bac02 -
Trigger Event:
push
-
Statement type:
File details
Details for the file aegis_qa-0.2.0-py3-none-any.whl.
File metadata
- Download URL: aegis_qa-0.2.0-py3-none-any.whl
- Upload date:
- Size: 50.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
98dbc3e3eaea984d884f7aed344c3c03f46fb389ccb2f7a118bdea69940bf704
|
|
| MD5 |
3bce6e824662879584c2e182d9428f73
|
|
| BLAKE2b-256 |
066a363c20b459117cf1a0fee5502bcdcdda6f63c4bea7bf7414499d57273e75
|
Provenance
The following attestation bundles were made for aegis_qa-0.2.0-py3-none-any.whl:
Publisher:
release.yml on jblacketter/aegis
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
aegis_qa-0.2.0-py3-none-any.whl -
Subject digest:
98dbc3e3eaea984d884f7aed344c3c03f46fb389ccb2f7a118bdea69940bf704 - Sigstore transparency entry: 1236564761
- Sigstore integration time:
-
Permalink:
jblacketter/aegis@e9d70e57cd619b2faafc55e5ab04d816195bac02 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/jblacketter
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@e9d70e57cd619b2faafc55e5ab04d816195bac02 -
Trigger Event:
push
-
Statement type: