feat: add code quality and type checking workflows, update gitignore for .windsurf tracking
Some checks failed
Documentation Validation / validate-docs (push) Has been cancelled
Some checks failed
Documentation Validation / validate-docs (push) Has been cancelled
This commit is contained in:
6
.gitignore
vendored
6
.gitignore
vendored
@@ -162,7 +162,6 @@ temp/
|
|||||||
# ===================
|
# ===================
|
||||||
# Windsurf IDE
|
# Windsurf IDE
|
||||||
# ===================
|
# ===================
|
||||||
.windsurf/
|
|
||||||
.snapshots/
|
.snapshots/
|
||||||
|
|
||||||
# ===================
|
# ===================
|
||||||
@@ -232,11 +231,6 @@ website/aitbc-proxy.conf
|
|||||||
.aitbc.yaml
|
.aitbc.yaml
|
||||||
apps/coordinator-api/.env
|
apps/coordinator-api/.env
|
||||||
|
|
||||||
# ===================
|
|
||||||
# Windsurf IDE (personal dev tooling)
|
|
||||||
# ===================
|
|
||||||
.windsurf/
|
|
||||||
|
|
||||||
# ===================
|
# ===================
|
||||||
# Deploy Scripts (hardcoded local paths & IPs)
|
# Deploy Scripts (hardcoded local paths & IPs)
|
||||||
# ===================
|
# ===================
|
||||||
|
|||||||
515
.windsurf/workflows/code-quality.md
Normal file
515
.windsurf/workflows/code-quality.md
Normal file
@@ -0,0 +1,515 @@
|
|||||||
|
---
|
||||||
|
description: Comprehensive code quality workflow with pre-commit hooks, formatting, linting, type checking, and security scanning
|
||||||
|
---
|
||||||
|
|
||||||
|
# Code Quality Workflow
|
||||||
|
|
||||||
|
## 🎯 **Overview**
|
||||||
|
Comprehensive code quality assurance workflow that ensures high standards across the AITBC codebase through automated pre-commit hooks, formatting, linting, type checking, and security scanning.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📋 **Workflow Steps**
|
||||||
|
|
||||||
|
### **Step 1: Setup Pre-commit Environment**
|
||||||
|
```bash
|
||||||
|
# Install pre-commit hooks
|
||||||
|
./venv/bin/pre-commit install
|
||||||
|
|
||||||
|
# Verify installation
|
||||||
|
./venv/bin/pre-commit --version
|
||||||
|
```
|
||||||
|
|
||||||
|
### **Step 2: Run All Quality Checks**
|
||||||
|
```bash
|
||||||
|
# Run all hooks on all files
|
||||||
|
./venv/bin/pre-commit run --all-files
|
||||||
|
|
||||||
|
# Run on staged files (git commit)
|
||||||
|
./venv/bin/pre-commit run
|
||||||
|
```
|
||||||
|
|
||||||
|
### **Step 3: Individual Quality Categories**
|
||||||
|
|
||||||
|
#### **🧹 Code Formatting**
|
||||||
|
```bash
|
||||||
|
# Black code formatting
|
||||||
|
./venv/bin/black --line-length=127 --check .
|
||||||
|
|
||||||
|
# Auto-fix formatting issues
|
||||||
|
./venv/bin/black --line-length=127 .
|
||||||
|
|
||||||
|
# Import sorting with isort
|
||||||
|
./venv/bin/isort --profile=black --line-length=127 .
|
||||||
|
```
|
||||||
|
|
||||||
|
#### **🔍 Linting & Code Analysis**
|
||||||
|
```bash
|
||||||
|
# Flake8 linting
|
||||||
|
./venv/bin/flake8 --max-line-length=127 --extend-ignore=E203,W503 .
|
||||||
|
|
||||||
|
# Pydocstyle documentation checking
|
||||||
|
./venv/bin/pydocstyle --convention=google .
|
||||||
|
|
||||||
|
# Python version upgrade checking
|
||||||
|
./venv/bin/pyupgrade --py311-plus .
|
||||||
|
```
|
||||||
|
|
||||||
|
#### **🔍 Type Checking**
|
||||||
|
```bash
|
||||||
|
# Core domain models type checking
|
||||||
|
./venv/bin/mypy --ignore-missing-imports --show-error-codes apps/coordinator-api/src/app/domain/job.py apps/coordinator-api/src/app/domain/miner.py apps/coordinator-api/src/app/domain/agent_portfolio.py
|
||||||
|
|
||||||
|
# Type checking coverage analysis
|
||||||
|
./scripts/type-checking/check-coverage.sh
|
||||||
|
|
||||||
|
# Full mypy checking
|
||||||
|
./venv/bin/mypy --ignore-missing-imports apps/coordinator-api/src/app/
|
||||||
|
```
|
||||||
|
|
||||||
|
#### **🛡️ Security Scanning**
|
||||||
|
```bash
|
||||||
|
# Bandit security scanning
|
||||||
|
./venv/bin/bandit -r . -f json -o bandit-report.json
|
||||||
|
|
||||||
|
# Safety dependency vulnerability check
|
||||||
|
./venv/bin/safety check --json --output safety-report.json
|
||||||
|
|
||||||
|
# Safety dependency check for requirements files
|
||||||
|
./venv/bin/safety check requirements.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
#### **🧪 Testing**
|
||||||
|
```bash
|
||||||
|
# Unit tests
|
||||||
|
pytest tests/unit/ --tb=short -q
|
||||||
|
|
||||||
|
# Security tests
|
||||||
|
pytest tests/security/ --tb=short -q
|
||||||
|
|
||||||
|
# Performance tests
|
||||||
|
pytest tests/performance/test_performance_lightweight.py::TestPerformance::test_cli_performance --tb=short -q
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 **Pre-commit Configuration**
|
||||||
|
|
||||||
|
### **Repository Structure**
|
||||||
|
```yaml
|
||||||
|
repos:
|
||||||
|
# Basic file checks
|
||||||
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||||
|
rev: v5.0.0
|
||||||
|
hooks:
|
||||||
|
- id: trailing-whitespace
|
||||||
|
- id: end-of-file-fixer
|
||||||
|
- id: check-yaml
|
||||||
|
- id: check-added-large-files
|
||||||
|
- id: check-json
|
||||||
|
- id: check-merge-conflict
|
||||||
|
- id: debug-statements
|
||||||
|
- id: check-docstring-first
|
||||||
|
- id: check-executables-have-shebangs
|
||||||
|
- id: check-toml
|
||||||
|
- id: check-xml
|
||||||
|
- id: check-case-conflict
|
||||||
|
- id: check-ast
|
||||||
|
|
||||||
|
# Code formatting
|
||||||
|
- repo: https://github.com/psf/black
|
||||||
|
rev: 26.3.1
|
||||||
|
hooks:
|
||||||
|
- id: black
|
||||||
|
language_version: python3
|
||||||
|
args: [--line-length=127]
|
||||||
|
|
||||||
|
# Import sorting
|
||||||
|
- repo: https://github.com/pycqa/isort
|
||||||
|
rev: 8.0.1
|
||||||
|
hooks:
|
||||||
|
- id: isort
|
||||||
|
args: [--profile=black, --line-length=127]
|
||||||
|
|
||||||
|
# Linting
|
||||||
|
- repo: https://github.com/pycqa/flake8
|
||||||
|
rev: 7.3.0
|
||||||
|
hooks:
|
||||||
|
- id: flake8
|
||||||
|
args: [--max-line-length=127, --extend-ignore=E203,W503]
|
||||||
|
|
||||||
|
# Type checking
|
||||||
|
- repo: https://github.com/pre-commit/mirrors-mypy
|
||||||
|
rev: v1.19.1
|
||||||
|
hooks:
|
||||||
|
- id: mypy
|
||||||
|
additional_dependencies: [types-requests, types-python-dateutil]
|
||||||
|
args: [--ignore-missing-imports]
|
||||||
|
|
||||||
|
# Security scanning
|
||||||
|
- repo: https://github.com/PyCQA/bandit
|
||||||
|
rev: 1.9.4
|
||||||
|
hooks:
|
||||||
|
- id: bandit
|
||||||
|
args: [-r, ., -f, json, -o, bandit-report.json]
|
||||||
|
pass_filenames: false
|
||||||
|
|
||||||
|
# Documentation checking
|
||||||
|
- repo: https://github.com/pycqa/pydocstyle
|
||||||
|
rev: 6.3.0
|
||||||
|
hooks:
|
||||||
|
- id: pydocstyle
|
||||||
|
args: [--convention=google]
|
||||||
|
|
||||||
|
# Python version upgrade
|
||||||
|
- repo: https://github.com/asottile/pyupgrade
|
||||||
|
rev: v3.21.2
|
||||||
|
hooks:
|
||||||
|
- id: pyupgrade
|
||||||
|
args: [--py311-plus]
|
||||||
|
|
||||||
|
# Dependency security
|
||||||
|
- repo: https://github.com/Lucas-C/pre-commit-hooks-safety
|
||||||
|
rev: v1.4.2
|
||||||
|
hooks:
|
||||||
|
- id: python-safety-dependencies-check
|
||||||
|
files: requirements.*\.txt$
|
||||||
|
|
||||||
|
- repo: https://github.com/Lucas-C/pre-commit-hooks-safety
|
||||||
|
rev: v1.3.2
|
||||||
|
hooks:
|
||||||
|
- id: python-safety-check
|
||||||
|
args: [--json, --output, safety-report.json]
|
||||||
|
|
||||||
|
# Local hooks
|
||||||
|
- repo: local
|
||||||
|
hooks:
|
||||||
|
- id: pytest-check
|
||||||
|
name: pytest-check
|
||||||
|
entry: pytest
|
||||||
|
language: system
|
||||||
|
args: [tests/unit/, --tb=short, -q]
|
||||||
|
pass_filenames: false
|
||||||
|
always_run: true
|
||||||
|
|
||||||
|
- id: security-check
|
||||||
|
name: security-check
|
||||||
|
entry: pytest
|
||||||
|
language: system
|
||||||
|
args: [tests/security/, --tb=short, -q]
|
||||||
|
pass_filenames: false
|
||||||
|
always_run: true
|
||||||
|
|
||||||
|
- id: performance-check
|
||||||
|
name: performance-check
|
||||||
|
entry: pytest
|
||||||
|
language: system
|
||||||
|
args: [tests/performance/test_performance_lightweight.py::TestPerformance::test_cli_performance, --tb=short, -q]
|
||||||
|
pass_filenames: false
|
||||||
|
always_run: true
|
||||||
|
|
||||||
|
- id: mypy-domain-core
|
||||||
|
name: mypy-domain-core
|
||||||
|
entry: ./venv/bin/mypy
|
||||||
|
language: system
|
||||||
|
args: [--ignore-missing-imports, --show-error-codes]
|
||||||
|
files: ^apps/coordinator-api/src/app/domain/(job|miner|agent_portfolio)\.py$
|
||||||
|
pass_filenames: false
|
||||||
|
|
||||||
|
- id: type-check-coverage
|
||||||
|
name: type-check-coverage
|
||||||
|
entry: ./scripts/type-checking/check-coverage.sh
|
||||||
|
language: script
|
||||||
|
files: ^apps/coordinator-api/src/app/
|
||||||
|
pass_filenames: false
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 **Quality Metrics & Reporting**
|
||||||
|
|
||||||
|
### **Coverage Reports**
|
||||||
|
```bash
|
||||||
|
# Type checking coverage
|
||||||
|
./scripts/type-checking/check-coverage.sh
|
||||||
|
|
||||||
|
# Security scan reports
|
||||||
|
cat bandit-report.json | jq '.results | length'
|
||||||
|
cat safety-report.json | jq '.vulnerabilities | length'
|
||||||
|
|
||||||
|
# Test coverage
|
||||||
|
pytest --cov=apps --cov-report=html tests/
|
||||||
|
```
|
||||||
|
|
||||||
|
### **Quality Score Calculation**
|
||||||
|
```python
|
||||||
|
# Quality score components:
|
||||||
|
# - Code formatting: 20%
|
||||||
|
# - Linting compliance: 20%
|
||||||
|
# - Type coverage: 25%
|
||||||
|
# - Test coverage: 20%
|
||||||
|
# - Security compliance: 15%
|
||||||
|
|
||||||
|
# Overall quality score >= 80% required
|
||||||
|
```
|
||||||
|
|
||||||
|
### **Automated Reporting**
|
||||||
|
```bash
|
||||||
|
# Generate comprehensive quality report
|
||||||
|
./scripts/quality/generate-quality-report.sh
|
||||||
|
|
||||||
|
# Quality dashboard metrics
|
||||||
|
curl http://localhost:8000/metrics/quality
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚀 **Integration with Development Workflow**
|
||||||
|
|
||||||
|
### **Before Commit**
|
||||||
|
```bash
|
||||||
|
# 1. Stage your changes
|
||||||
|
git add .
|
||||||
|
|
||||||
|
# 2. Pre-commit hooks run automatically
|
||||||
|
git commit -m "Your commit message"
|
||||||
|
|
||||||
|
# 3. If any hook fails, fix the issues and try again
|
||||||
|
```
|
||||||
|
|
||||||
|
### **Manual Quality Checks**
|
||||||
|
```bash
|
||||||
|
# Run all quality checks manually
|
||||||
|
./venv/bin/pre-commit run --all-files
|
||||||
|
|
||||||
|
# Check specific category
|
||||||
|
./venv/bin/black --check .
|
||||||
|
./venv/bin/flake8 .
|
||||||
|
./venv/bin/mypy apps/coordinator-api/src/app/
|
||||||
|
```
|
||||||
|
|
||||||
|
### **CI/CD Integration**
|
||||||
|
```yaml
|
||||||
|
# GitHub Actions workflow
|
||||||
|
name: Code Quality
|
||||||
|
on: [push, pull_request]
|
||||||
|
jobs:
|
||||||
|
quality:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Setup Python
|
||||||
|
uses: actions/setup-python@v4
|
||||||
|
with:
|
||||||
|
python-version: '3.13'
|
||||||
|
- name: Install dependencies
|
||||||
|
run: pip install -r requirements.txt
|
||||||
|
- name: Run pre-commit
|
||||||
|
run: ./venv/bin/pre-commit run --all-files
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 **Quality Standards**
|
||||||
|
|
||||||
|
### **Code Formatting Standards**
|
||||||
|
- **Black**: Line length 127 characters
|
||||||
|
- **isort**: Black profile compatibility
|
||||||
|
- **Python 3.13+**: Modern Python syntax
|
||||||
|
|
||||||
|
### **Linting Standards**
|
||||||
|
- **Flake8**: Line length 127, ignore E203, W503
|
||||||
|
- **Pydocstyle**: Google convention
|
||||||
|
- **No debug statements**: Production code only
|
||||||
|
|
||||||
|
### **Type Safety Standards**
|
||||||
|
- **MyPy**: Strict mode for new code
|
||||||
|
- **Coverage**: 90% minimum for core domain
|
||||||
|
- **Error handling**: Proper exception types
|
||||||
|
|
||||||
|
### **Security Standards**
|
||||||
|
- **Bandit**: Zero high-severity issues
|
||||||
|
- **Safety**: No known vulnerabilities
|
||||||
|
- **Dependencies**: Regular security updates
|
||||||
|
|
||||||
|
### **Testing Standards**
|
||||||
|
- **Coverage**: 80% minimum test coverage
|
||||||
|
- **Unit tests**: All business logic tested
|
||||||
|
- **Security tests**: Authentication and authorization
|
||||||
|
- **Performance tests**: Critical paths validated
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📈 **Quality Improvement Workflow**
|
||||||
|
|
||||||
|
### **1. Initial Setup**
|
||||||
|
```bash
|
||||||
|
# Install pre-commit hooks
|
||||||
|
./venv/bin/pre-commit install
|
||||||
|
|
||||||
|
# Run initial quality check
|
||||||
|
./venv/bin/pre-commit run --all-files
|
||||||
|
|
||||||
|
# Fix any issues found
|
||||||
|
./venv/bin/black .
|
||||||
|
./venv/bin/isort .
|
||||||
|
# Fix other issues manually
|
||||||
|
```
|
||||||
|
|
||||||
|
### **2. Daily Development**
|
||||||
|
```bash
|
||||||
|
# Make changes
|
||||||
|
vim your_file.py
|
||||||
|
|
||||||
|
# Stage and commit (pre-commit runs automatically)
|
||||||
|
git add your_file.py
|
||||||
|
git commit -m "Add new feature"
|
||||||
|
|
||||||
|
# If pre-commit fails, fix issues and retry
|
||||||
|
git commit -m "Add new feature"
|
||||||
|
```
|
||||||
|
|
||||||
|
### **3. Quality Monitoring**
|
||||||
|
```bash
|
||||||
|
# Check quality metrics
|
||||||
|
./scripts/quality/check-quality-metrics.sh
|
||||||
|
|
||||||
|
# Generate quality report
|
||||||
|
./scripts/quality/generate-quality-report.sh
|
||||||
|
|
||||||
|
# Review quality trends
|
||||||
|
./scripts/quality/quality-trends.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 **Troubleshooting**
|
||||||
|
|
||||||
|
### **Common Issues**
|
||||||
|
|
||||||
|
#### **Black Formatting Issues**
|
||||||
|
```bash
|
||||||
|
# Check formatting issues
|
||||||
|
./venv/bin/black --check .
|
||||||
|
|
||||||
|
# Auto-fix formatting
|
||||||
|
./venv/bin/black .
|
||||||
|
|
||||||
|
# Specific file
|
||||||
|
./venv/bin/black --check path/to/file.py
|
||||||
|
```
|
||||||
|
|
||||||
|
#### **Import Sorting Issues**
|
||||||
|
```bash
|
||||||
|
# Check import sorting
|
||||||
|
./venv/bin/isort --check-only .
|
||||||
|
|
||||||
|
# Auto-fix imports
|
||||||
|
./venv/bin/isort .
|
||||||
|
|
||||||
|
# Specific file
|
||||||
|
./venv/bin/isort path/to/file.py
|
||||||
|
```
|
||||||
|
|
||||||
|
#### **Type Checking Issues**
|
||||||
|
```bash
|
||||||
|
# Check type errors
|
||||||
|
./venv/bin/mypy apps/coordinator-api/src/app/
|
||||||
|
|
||||||
|
# Ignore specific errors
|
||||||
|
./venv/bin/mypy --ignore-missing-imports apps/coordinator-api/src/app/
|
||||||
|
|
||||||
|
# Show error codes
|
||||||
|
./venv/bin/mypy --show-error-codes apps/coordinator-api/src/app/
|
||||||
|
```
|
||||||
|
|
||||||
|
#### **Security Issues**
|
||||||
|
```bash
|
||||||
|
# Check security issues
|
||||||
|
./venv/bin/bandit -r .
|
||||||
|
|
||||||
|
# Generate security report
|
||||||
|
./venv/bin/bandit -r . -f json -o security-report.json
|
||||||
|
|
||||||
|
# Check dependencies
|
||||||
|
./venv/bin/safety check
|
||||||
|
```
|
||||||
|
|
||||||
|
### **Performance Optimization**
|
||||||
|
|
||||||
|
#### **Pre-commit Performance**
|
||||||
|
```bash
|
||||||
|
# Run hooks in parallel
|
||||||
|
./venv/bin/pre-commit run --all-files --parallel
|
||||||
|
|
||||||
|
# Skip slow hooks during development
|
||||||
|
./venv/bin/pre-commit run --all-files --hook-stage manual
|
||||||
|
|
||||||
|
# Cache dependencies
|
||||||
|
./venv/bin/pre-commit run --all-files --cache
|
||||||
|
```
|
||||||
|
|
||||||
|
#### **Selective Hook Running**
|
||||||
|
```bash
|
||||||
|
# Run specific hooks
|
||||||
|
./venv/bin/pre-commit run black flake8 mypy
|
||||||
|
|
||||||
|
# Run on specific files
|
||||||
|
./venv/bin/pre-commit run --files apps/coordinator-api/src/app/
|
||||||
|
|
||||||
|
# Skip hooks
|
||||||
|
./venv/bin/pre-commit run --all-files --skip mypy
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📋 **Quality Checklist**
|
||||||
|
|
||||||
|
### **Before Commit**
|
||||||
|
- [ ] Code formatted with Black
|
||||||
|
- [ ] Imports sorted with isort
|
||||||
|
- [ ] Linting passes with Flake8
|
||||||
|
- [ ] Type checking passes with MyPy
|
||||||
|
- [ ] Documentation follows Pydocstyle
|
||||||
|
- [ ] No security vulnerabilities
|
||||||
|
- [ ] All tests pass
|
||||||
|
- [ ] Performance tests pass
|
||||||
|
|
||||||
|
### **Before Merge**
|
||||||
|
- [ ] Code review completed
|
||||||
|
- [ ] Quality score >= 80%
|
||||||
|
- [ ] Test coverage >= 80%
|
||||||
|
- [ ] Type coverage >= 90% (core domain)
|
||||||
|
- [ ] Security scan clean
|
||||||
|
- [ ] Documentation updated
|
||||||
|
- [ ] Performance benchmarks met
|
||||||
|
|
||||||
|
### **Before Release**
|
||||||
|
- [ ] Full quality suite passes
|
||||||
|
- [ ] Integration tests pass
|
||||||
|
- [ ] Security audit complete
|
||||||
|
- [ ] Performance validation
|
||||||
|
- [ ] Documentation complete
|
||||||
|
- [ ] Release notes prepared
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎉 **Benefits**
|
||||||
|
|
||||||
|
### **Immediate Benefits**
|
||||||
|
- **Consistent Code**: Uniform formatting and style
|
||||||
|
- **Bug Prevention**: Type checking and linting catch issues early
|
||||||
|
- **Security**: Automated vulnerability scanning
|
||||||
|
- **Quality Assurance**: Comprehensive test coverage
|
||||||
|
|
||||||
|
### **Long-term Benefits**
|
||||||
|
- **Maintainability**: Clean, well-documented code
|
||||||
|
- **Developer Experience**: Automated quality gates
|
||||||
|
- **Team Consistency**: Shared quality standards
|
||||||
|
- **Production Readiness**: Enterprise-grade code quality
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Last Updated**: March 31, 2026
|
||||||
|
**Workflow Version**: 1.0
|
||||||
|
**Next Review**: April 30, 2026
|
||||||
523
.windsurf/workflows/type-checking-ci-cd.md
Normal file
523
.windsurf/workflows/type-checking-ci-cd.md
Normal file
@@ -0,0 +1,523 @@
|
|||||||
|
---
|
||||||
|
description: Comprehensive type checking workflow with CI/CD integration, coverage reporting, and quality gates
|
||||||
|
---
|
||||||
|
|
||||||
|
# Type Checking CI/CD Workflow
|
||||||
|
|
||||||
|
## 🎯 **Overview**
|
||||||
|
Comprehensive type checking workflow that ensures type safety across the AITBC codebase through automated CI/CD pipelines, coverage reporting, and quality gates.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📋 **Workflow Steps**
|
||||||
|
|
||||||
|
### **Step 1: Local Development Type Checking**
|
||||||
|
```bash
|
||||||
|
# Install dependencies
|
||||||
|
./venv/bin/pip install mypy sqlalchemy sqlmodel fastapi
|
||||||
|
|
||||||
|
# Check core domain models
|
||||||
|
./venv/bin/mypy --ignore-missing-imports --show-error-codes apps/coordinator-api/src/app/domain/job.py
|
||||||
|
./venv/bin/mypy --ignore-missing-imports --show-error-codes apps/coordinator-api/src/app/domain/miner.py
|
||||||
|
./venv/bin/mypy --ignore-missing-imports --show-error-codes apps/coordinator-api/src/app/domain/agent_portfolio.py
|
||||||
|
|
||||||
|
# Check entire domain directory
|
||||||
|
./venv/bin/mypy --ignore-missing-imports apps/coordinator-api/src/app/domain/
|
||||||
|
|
||||||
|
# Generate coverage report
|
||||||
|
./scripts/type-checking/check-coverage.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### **Step 2: Pre-commit Type Checking**
|
||||||
|
```bash
|
||||||
|
# Pre-commit hooks run automatically on commit
|
||||||
|
git add .
|
||||||
|
git commit -m "Add type-safe code"
|
||||||
|
|
||||||
|
# Manual pre-commit run
|
||||||
|
./venv/bin/pre-commit run mypy-domain-core
|
||||||
|
./venv/bin/pre-commit run type-check-coverage
|
||||||
|
```
|
||||||
|
|
||||||
|
### **Step 3: CI/CD Pipeline Type Checking**
|
||||||
|
```yaml
|
||||||
|
# GitHub Actions workflow triggers on:
|
||||||
|
# - Push to main/develop branches
|
||||||
|
# - Pull requests to main/develop branches
|
||||||
|
|
||||||
|
# Pipeline steps:
|
||||||
|
# 1. Checkout code
|
||||||
|
# 2. Setup Python 3.13
|
||||||
|
# 3. Cache dependencies
|
||||||
|
# 4. Install MyPy and dependencies
|
||||||
|
# 5. Run type checking on core models
|
||||||
|
# 6. Run type checking on entire domain
|
||||||
|
# 7. Generate reports
|
||||||
|
# 8. Upload artifacts
|
||||||
|
# 9. Calculate coverage
|
||||||
|
# 10. Enforce quality gates
|
||||||
|
```
|
||||||
|
|
||||||
|
### **Step 4: Coverage Analysis**
|
||||||
|
```bash
|
||||||
|
# Calculate type checking coverage
|
||||||
|
CORE_FILES=3
|
||||||
|
PASSING=$(./venv/bin/mypy --ignore-missing-imports apps/coordinator-api/src/app/domain/job.py apps/coordinator-api/src/app/domain/miner.py apps/coordinator-api/src/app/domain/agent_portfolio.py 2>&1 | grep -c "Success:" || echo "0")
|
||||||
|
COVERAGE=$((PASSING * 100 / CORE_FILES))
|
||||||
|
|
||||||
|
echo "Core domain coverage: $COVERAGE%"
|
||||||
|
|
||||||
|
# Quality gate: 80% minimum coverage
|
||||||
|
if [ "$COVERAGE" -ge 80 ]; then
|
||||||
|
echo "✅ Type checking coverage: $COVERAGE% (meets threshold)"
|
||||||
|
else
|
||||||
|
echo "❌ Type checking coverage: $COVERAGE% (below 80% threshold)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 **CI/CD Configuration**
|
||||||
|
|
||||||
|
### **GitHub Actions Workflow**
|
||||||
|
```yaml
|
||||||
|
name: Type Checking
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ main, develop ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ main, develop ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
type-check:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
python-version: [3.13]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Python ${{ matrix.python-version }}
|
||||||
|
uses: actions/setup-python@v4
|
||||||
|
with:
|
||||||
|
python-version: ${{ matrix.python-version }}
|
||||||
|
|
||||||
|
- name: Cache pip dependencies
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: ~/.cache/pip
|
||||||
|
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements*.txt') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-pip-
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
python -m pip install --upgrade pip
|
||||||
|
pip install mypy sqlalchemy sqlmodel fastapi
|
||||||
|
|
||||||
|
- name: Run type checking on core domain models
|
||||||
|
run: |
|
||||||
|
echo "Checking core domain models..."
|
||||||
|
mypy --ignore-missing-imports --show-error-codes apps/coordinator-api/src/app/domain/job.py
|
||||||
|
mypy --ignore-missing-imports --show-error-codes apps/coordinator-api/src/app/domain/miner.py
|
||||||
|
mypy --ignore-missing-imports --show-error-codes apps/coordinator-api/src/app/domain/agent_portfolio.py
|
||||||
|
|
||||||
|
- name: Run type checking on entire domain
|
||||||
|
run: |
|
||||||
|
echo "Checking entire domain directory..."
|
||||||
|
mypy --ignore-missing-imports apps/coordinator-api/src/app/domain/ || true
|
||||||
|
|
||||||
|
- name: Generate type checking report
|
||||||
|
run: |
|
||||||
|
echo "Generating type checking report..."
|
||||||
|
mkdir -p reports
|
||||||
|
mypy --ignore-missing-imports --txt-report reports/type-check-report.txt apps/coordinator-api/src/app/domain/ || true
|
||||||
|
|
||||||
|
- name: Upload type checking report
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
if: always()
|
||||||
|
with:
|
||||||
|
name: type-check-report
|
||||||
|
path: reports/
|
||||||
|
|
||||||
|
- name: Type checking coverage
|
||||||
|
run: |
|
||||||
|
echo "Calculating type checking coverage..."
|
||||||
|
CORE_FILES=3
|
||||||
|
PASSING=$(mypy --ignore-missing-imports apps/coordinator-api/src/app/domain/job.py apps/coordinator-api/src/app/domain/miner.py apps/coordinator-api/src/app/domain/agent_portfolio.py 2>&1 | grep -c "Success:" || echo "0")
|
||||||
|
COVERAGE=$((PASSING * 100 / CORE_FILES))
|
||||||
|
echo "Core domain coverage: $COVERAGE%"
|
||||||
|
echo "core_coverage=$COVERAGE" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Coverage badge
|
||||||
|
run: |
|
||||||
|
if [ "$core_coverage" -ge 80 ]; then
|
||||||
|
echo "✅ Type checking coverage: $core_coverage% (meets threshold)"
|
||||||
|
else
|
||||||
|
echo "❌ Type checking coverage: $core_coverage% (below 80% threshold)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 **Coverage Reporting**
|
||||||
|
|
||||||
|
### **Local Coverage Analysis**
|
||||||
|
```bash
|
||||||
|
# Run comprehensive coverage analysis
|
||||||
|
./scripts/type-checking/check-coverage.sh
|
||||||
|
|
||||||
|
# Generate detailed report
|
||||||
|
./venv/bin/mypy --ignore-missing-imports --txt-report reports/type-check-detailed.txt apps/coordinator-api/src/app/domain/
|
||||||
|
|
||||||
|
# Generate HTML report
|
||||||
|
./venv/bin/mypy --ignore-missing-imports --html-report reports/type-check-html apps/coordinator-api/src/app/domain/
|
||||||
|
```
|
||||||
|
|
||||||
|
### **Coverage Metrics**
|
||||||
|
```python
|
||||||
|
# Coverage calculation components:
|
||||||
|
# - Core domain models: 3 files (job.py, miner.py, agent_portfolio.py)
|
||||||
|
# - Passing files: Files with no type errors
|
||||||
|
# - Coverage percentage: (Passing / Total) * 100
|
||||||
|
# - Quality gate: 80% minimum coverage
|
||||||
|
|
||||||
|
# Example calculation:
|
||||||
|
CORE_FILES = 3
|
||||||
|
PASSING_FILES = 3
|
||||||
|
COVERAGE = (3 / 3) * 100 = 100%
|
||||||
|
```
|
||||||
|
|
||||||
|
### **Report Structure**
|
||||||
|
```
|
||||||
|
reports/
|
||||||
|
├── type-check-report.txt # Summary report
|
||||||
|
├── type-check-detailed.txt # Detailed analysis
|
||||||
|
├── type-check-html/ # HTML report
|
||||||
|
│ ├── index.html
|
||||||
|
│ ├── style.css
|
||||||
|
│ └── sources/
|
||||||
|
└── coverage-summary.json # Machine-readable metrics
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚀 **Integration Strategy**
|
||||||
|
|
||||||
|
### **Development Workflow Integration**
|
||||||
|
```bash
|
||||||
|
# 1. Local development
|
||||||
|
vim apps/coordinator-api/src/app/domain/new_model.py
|
||||||
|
|
||||||
|
# 2. Type checking
|
||||||
|
./venv/bin/mypy --ignore-missing-imports apps/coordinator-api/src/app/domain/new_model.py
|
||||||
|
|
||||||
|
# 3. Pre-commit validation
|
||||||
|
git add .
|
||||||
|
git commit -m "Add new type-safe model" # Pre-commit runs automatically
|
||||||
|
|
||||||
|
# 4. Push triggers CI/CD
|
||||||
|
git push origin feature-branch # GitHub Actions runs
|
||||||
|
```
|
||||||
|
|
||||||
|
### **Quality Gates**
|
||||||
|
```yaml
|
||||||
|
# Quality gate thresholds:
|
||||||
|
# - Core domain coverage: >= 80%
|
||||||
|
# - No critical type errors in core models
|
||||||
|
# - All new code must pass type checking
|
||||||
|
# - Type errors in existing code must be documented
|
||||||
|
|
||||||
|
# Gate enforcement:
|
||||||
|
# - CI/CD pipeline fails on low coverage
|
||||||
|
# - Pull requests blocked on type errors
|
||||||
|
# - Deployment requires type safety validation
|
||||||
|
```
|
||||||
|
|
||||||
|
### **Monitoring and Alerting**
|
||||||
|
```bash
|
||||||
|
# Type checking metrics dashboard
|
||||||
|
curl http://localhost:3000/d/type-checking-coverage
|
||||||
|
|
||||||
|
# Alert on coverage drop
|
||||||
|
if [ "$COVERAGE" -lt 80 ]; then
|
||||||
|
send_alert "Type checking coverage dropped to $COVERAGE%"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Weekly coverage trends
|
||||||
|
./scripts/type-checking/generate-coverage-trends.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 **Type Checking Standards**
|
||||||
|
|
||||||
|
### **Core Domain Requirements**
|
||||||
|
```python
|
||||||
|
# Core domain models must:
|
||||||
|
# 1. Have 100% type coverage
|
||||||
|
# 2. Use proper type hints for all fields
|
||||||
|
# 3. Handle Optional types correctly
|
||||||
|
# 4. Include proper return types
|
||||||
|
# 5. Use generic types for collections
|
||||||
|
|
||||||
|
# Example:
|
||||||
|
from typing import Any, Dict, Optional
|
||||||
|
from datetime import datetime
|
||||||
|
from sqlmodel import SQLModel, Field
|
||||||
|
|
||||||
|
class Job(SQLModel, table=True):
|
||||||
|
id: str = Field(primary_key=True)
|
||||||
|
name: str
|
||||||
|
payload: Dict[str, Any] = Field(default_factory=dict)
|
||||||
|
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||||
|
updated_at: Optional[datetime] = None
|
||||||
|
```
|
||||||
|
|
||||||
|
### **Service Layer Standards**
|
||||||
|
```python
|
||||||
|
# Service layer must:
|
||||||
|
# 1. Type all method parameters
|
||||||
|
# 2. Include return type annotations
|
||||||
|
# 3. Handle exceptions properly
|
||||||
|
# 4. Use dependency injection types
|
||||||
|
# 5. Document complex types
|
||||||
|
|
||||||
|
# Example:
|
||||||
|
from typing import List, Optional
|
||||||
|
from sqlmodel import Session
|
||||||
|
|
||||||
|
class JobService:
|
||||||
|
def __init__(self, session: Session) -> None:
|
||||||
|
self.session = session
|
||||||
|
|
||||||
|
def get_job(self, job_id: str) -> Optional[Job]:
|
||||||
|
"""Get a job by ID."""
|
||||||
|
return self.session.get(Job, job_id)
|
||||||
|
|
||||||
|
def create_job(self, job_data: JobCreate) -> Job:
|
||||||
|
"""Create a new job."""
|
||||||
|
job = Job.model_validate(job_data)
|
||||||
|
self.session.add(job)
|
||||||
|
self.session.commit()
|
||||||
|
self.session.refresh(job)
|
||||||
|
return job
|
||||||
|
```
|
||||||
|
|
||||||
|
### **API Router Standards**
|
||||||
|
```python
|
||||||
|
# API routers must:
|
||||||
|
# 1. Type all route parameters
|
||||||
|
# 2. Use Pydantic models for request/response
|
||||||
|
# 3. Include proper HTTP status types
|
||||||
|
# 4. Handle error responses
|
||||||
|
# 5. Document complex endpoints
|
||||||
|
|
||||||
|
# Example:
|
||||||
|
from fastapi import APIRouter, HTTPException, Depends
|
||||||
|
from typing import List
|
||||||
|
|
||||||
|
router = APIRouter(prefix="/jobs", tags=["jobs"])
|
||||||
|
|
||||||
|
@router.get("/", response_model=List[JobRead])
|
||||||
|
async def get_jobs(
|
||||||
|
skip: int = 0,
|
||||||
|
limit: int = 100,
|
||||||
|
session: Session = Depends(get_session)
|
||||||
|
) -> List[JobRead]:
|
||||||
|
"""Get all jobs with pagination."""
|
||||||
|
jobs = session.exec(select(Job).offset(skip).limit(limit)).all()
|
||||||
|
return jobs
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📈 **Progressive Type Safety Implementation**
|
||||||
|
|
||||||
|
### **Phase 1: Core Domain (Complete)**
|
||||||
|
```bash
|
||||||
|
# ✅ Completed
|
||||||
|
# - job.py: 100% type coverage
|
||||||
|
# - miner.py: 100% type coverage
|
||||||
|
# - agent_portfolio.py: 100% type coverage
|
||||||
|
|
||||||
|
# Status: All core models type-safe
|
||||||
|
```
|
||||||
|
|
||||||
|
### **Phase 2: Service Layer (In Progress)**
|
||||||
|
```bash
|
||||||
|
# 🔄 Current work
|
||||||
|
# - JobService: Adding type hints
|
||||||
|
# - MinerService: Adding type hints
|
||||||
|
# - AgentService: Adding type hints
|
||||||
|
|
||||||
|
# Commands:
|
||||||
|
./venv/bin/mypy --ignore-missing-imports apps/coordinator-api/src/app/services/
|
||||||
|
```
|
||||||
|
|
||||||
|
### **Phase 3: API Routers (Planned)**
|
||||||
|
```bash
|
||||||
|
# ⏳ Planned work
|
||||||
|
# - job_router.py: Add type hints
|
||||||
|
# - miner_router.py: Add type hints
|
||||||
|
# - agent_router.py: Add type hints
|
||||||
|
|
||||||
|
# Commands:
|
||||||
|
./venv/bin/mypy --ignore-missing-imports apps/coordinator-api/src/app/routers/
|
||||||
|
```
|
||||||
|
|
||||||
|
### **Phase 4: Strict Mode (Future)**
|
||||||
|
```toml
|
||||||
|
# pyproject.toml
|
||||||
|
[tool.mypy]
|
||||||
|
check_untyped_defs = true
|
||||||
|
disallow_untyped_defs = true
|
||||||
|
no_implicit_optional = true
|
||||||
|
strict_equality = true
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 **Troubleshooting**
|
||||||
|
|
||||||
|
### **Common Type Errors**
|
||||||
|
|
||||||
|
#### **Missing Import Error**
|
||||||
|
```bash
|
||||||
|
# Error: Name "uuid4" is not defined
|
||||||
|
# Solution: Add missing import
|
||||||
|
from uuid import uuid4
|
||||||
|
```
|
||||||
|
|
||||||
|
#### **SQLModel Field Type Error**
|
||||||
|
```bash
|
||||||
|
# Error: No overload variant of "Field" matches
|
||||||
|
# Solution: Use proper type annotations
|
||||||
|
payload: Dict[str, Any] = Field(default_factory=dict)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### **Optional Type Error**
|
||||||
|
```bash
|
||||||
|
# Error: Incompatible types in assignment
|
||||||
|
# Solution: Use Optional type annotation
|
||||||
|
updated_at: Optional[datetime] = None
|
||||||
|
```
|
||||||
|
|
||||||
|
#### **Generic Type Error**
|
||||||
|
```bash
|
||||||
|
# Error: Dict entry has incompatible type
|
||||||
|
# Solution: Use proper generic types
|
||||||
|
results: Dict[str, Any] = {}
|
||||||
|
```
|
||||||
|
|
||||||
|
### **Performance Optimization**
|
||||||
|
```bash
|
||||||
|
# Cache MyPy results
|
||||||
|
./venv/bin/mypy --incremental apps/coordinator-api/src/app/
|
||||||
|
|
||||||
|
# Use daemon mode for faster checking
|
||||||
|
./venv/bin/mypy --daemon apps/coordinator-api/src/app/
|
||||||
|
|
||||||
|
# Limit scope for large projects
|
||||||
|
./venv/bin/mypy apps/coordinator-api/src/app/domain/ --exclude apps/coordinator-api/src/app/domain/legacy/
|
||||||
|
```
|
||||||
|
|
||||||
|
### **Configuration Issues**
|
||||||
|
```bash
|
||||||
|
# Check MyPy configuration
|
||||||
|
./venv/bin/mypy --config-file pyproject.toml apps/coordinator-api/src/app/
|
||||||
|
|
||||||
|
# Show configuration
|
||||||
|
./venv/bin/mypy --show-config
|
||||||
|
|
||||||
|
# Debug configuration
|
||||||
|
./venv/bin/mypy --verbose apps/coordinator-api/src/app/
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📋 **Quality Checklist**
|
||||||
|
|
||||||
|
### **Before Commit**
|
||||||
|
- [ ] Core domain models pass type checking
|
||||||
|
- [ ] New code has proper type hints
|
||||||
|
- [ ] Optional types handled correctly
|
||||||
|
- [ ] Generic types used for collections
|
||||||
|
- [ ] Return types specified
|
||||||
|
|
||||||
|
### **Before PR**
|
||||||
|
- [ ] All modified files type-check
|
||||||
|
- [ ] Coverage meets 80% threshold
|
||||||
|
- [ ] No new type errors introduced
|
||||||
|
- [ ] Documentation updated for complex types
|
||||||
|
- [ ] Performance impact assessed
|
||||||
|
|
||||||
|
### **Before Merge**
|
||||||
|
- [ ] CI/CD pipeline passes
|
||||||
|
- [ ] Coverage badge shows green
|
||||||
|
- [ ] Type checking report clean
|
||||||
|
- [ ] All quality gates passed
|
||||||
|
- [ ] Team review completed
|
||||||
|
|
||||||
|
### **Before Release**
|
||||||
|
- [ ] Full type checking suite passes
|
||||||
|
- [ ] Coverage trends are positive
|
||||||
|
- [ ] No critical type issues
|
||||||
|
- [ ] Documentation complete
|
||||||
|
- [ ] Performance benchmarks met
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎉 **Benefits**
|
||||||
|
|
||||||
|
### **Immediate Benefits**
|
||||||
|
- **🔍 Bug Prevention**: Type errors caught before runtime
|
||||||
|
- **📚 Better Documentation**: Type hints serve as documentation
|
||||||
|
- **🔧 IDE Support**: Better autocomplete and error detection
|
||||||
|
- **🛡️ Safety**: Compile-time type checking
|
||||||
|
|
||||||
|
### **Long-term Benefits**
|
||||||
|
- **📈 Maintainability**: Easier refactoring with types
|
||||||
|
- **👥 Team Collaboration**: Shared type contracts
|
||||||
|
- **🚀 Development Speed**: Faster debugging with type errors
|
||||||
|
- **🎯 Code Quality**: Higher standards enforced automatically
|
||||||
|
|
||||||
|
### **Business Benefits**
|
||||||
|
- **⚡ Reduced Bugs**: Fewer runtime type errors
|
||||||
|
- **💰 Cost Savings**: Less time debugging type issues
|
||||||
|
- **📊 Quality Metrics**: Measurable type safety improvements
|
||||||
|
- **🔄 Consistency**: Enforced type standards across team
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 **Success Metrics**
|
||||||
|
|
||||||
|
### **Type Safety Metrics**
|
||||||
|
- **Core Domain Coverage**: 100% (achieved)
|
||||||
|
- **Service Layer Coverage**: Target 80%
|
||||||
|
- **API Router Coverage**: Target 70%
|
||||||
|
- **Overall Coverage**: Target 75%
|
||||||
|
|
||||||
|
### **Quality Metrics**
|
||||||
|
- **Type Errors**: Zero in core domain
|
||||||
|
- **CI/CD Failures**: Zero type-related failures
|
||||||
|
- **Developer Feedback**: Positive type checking experience
|
||||||
|
- **Performance Impact**: <10% overhead
|
||||||
|
|
||||||
|
### **Business Metrics**
|
||||||
|
- **Bug Reduction**: 50% fewer type-related bugs
|
||||||
|
- **Development Speed**: 20% faster debugging
|
||||||
|
- **Code Review Efficiency**: 30% faster reviews
|
||||||
|
- **Onboarding Time**: 40% faster for new developers
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Last Updated**: March 31, 2026
|
||||||
|
**Workflow Version**: 1.0
|
||||||
|
**Next Review**: April 30, 2026
|
||||||
Reference in New Issue
Block a user