# ============================================================================= # AngelaMos | 2026 # Justfile - AngelusVigil AI Threat Detection # ============================================================================= set dotenv-load set export set shell := ["bash", "-uc"] set windows-shell := ["powershell.exe", "-NoLogo", "-Command"] project := file_name(justfile_directory()) version := `git describe --tags --always 2>/dev/null || echo "dev"` # ============================================================================= # Default # ============================================================================= default: @just --list --unsorted # ============================================================================= # Linting and Formatting # ============================================================================= [group('lint')] ruff *ARGS: cd backend && uv run ruff check app/ cli/ ml/ tests/ {{ARGS}} [group('lint')] ruff-fix: cd backend && uv run ruff check app/ cli/ ml/ tests/ --fix [group('lint')] yapf *ARGS: cd backend && uv run yapf -rip app/ cli/ ml/ tests/ {{ARGS}} [group('lint')] pylint *ARGS: cd backend && uv run pylint app cli ml {{ARGS}} [group('lint')] lint: ruff pylint # ============================================================================= # Type Checking # ============================================================================= [group('types')] mypy *ARGS: cd backend && uv run mypy app/ cli/ ml/ {{ARGS}} [group('types')] typecheck: mypy # ============================================================================= # Testing # ============================================================================= [group('test')] pytest *ARGS: cd backend && uv run pytest tests/ {{ARGS}} [group('test')] test: pytest [group('test')] test-v *ARGS: cd backend && uv run pytest tests/ -v {{ARGS}} [group('test')] test-cov: cd backend && uv run pytest tests/ --cov=app --cov=cli --cov=ml --cov-report=term-missing --cov-report=html # ============================================================================= # CI / Quality # ============================================================================= [group('ci')] ci: lint typecheck test [group('ci')] check: ruff mypy # ============================================================================= # Docker Compose (Production) # ============================================================================= [group('docker')] up *ARGS: docker compose up {{ARGS}} [group('docker')] start *ARGS: docker compose up -d {{ARGS}} [group('docker')] down *ARGS: docker compose down {{ARGS}} [group('docker')] stop: docker compose stop [group('docker')] build *ARGS: docker compose build {{ARGS}} [group('docker')] rebuild: docker compose build --no-cache [group('docker')] logs *SERVICE: docker compose logs -f {{SERVICE}} [group('docker')] ps: docker compose ps [group('docker')] shell service='backend': docker compose exec -it {{service}} /bin/bash # ============================================================================= # Docker Compose (Dev) # ============================================================================= [group('dev')] dev-up *ARGS: docker compose -f dev.compose.yml up {{ARGS}} [group('dev')] dev-start *ARGS: docker compose -f dev.compose.yml up -d {{ARGS}} [group('dev')] dev-down *ARGS: docker compose -f dev.compose.yml down {{ARGS}} [group('dev')] dev-stop: docker compose -f dev.compose.yml stop [group('dev')] dev-build *ARGS: docker compose -f dev.compose.yml build {{ARGS}} [group('dev')] dev-rebuild: docker compose -f dev.compose.yml build --no-cache [group('dev')] dev-logs *SERVICE: docker compose -f dev.compose.yml logs -f {{SERVICE}} [group('dev')] dev-ps: docker compose -f dev.compose.yml ps [group('dev')] dev-shell service='backend': docker compose -f dev.compose.yml exec -it {{service}} /bin/bash # ============================================================================= # Database (Docker) # ============================================================================= [group('db')] migrate *ARGS: docker compose exec backend uv run alembic upgrade {{ARGS}} [group('db')] migration message: docker compose exec backend uv run alembic revision --autogenerate -m "{{message}}" [group('db')] rollback: docker compose exec backend uv run alembic downgrade -1 [group('db')] db-history: docker compose exec backend uv run alembic history --verbose [group('db')] db-current: docker compose exec backend uv run alembic current # ============================================================================= # Database (Local - no Docker) # ============================================================================= [group('db-local')] migrate-local *ARGS: cd backend && uv run alembic upgrade {{ARGS}} [group('db-local')] migration-local message: cd backend && uv run alembic revision --autogenerate -m "{{message}}" [group('db-local')] rollback-local: cd backend && uv run alembic downgrade -1 [group('db-local')] db-history-local: cd backend && uv run alembic history --verbose [group('db-local')] db-current-local: cd backend && uv run alembic current # ============================================================================= # AngelusVigil CLI # ============================================================================= [group('vigil')] serve *ARGS: cd backend && uv run python -m app {{ARGS}} [group('vigil')] vigil-config: cd backend && uv run vigil config [group('vigil')] vigil-health: curl -sf http://localhost:8000/health | python -m json.tool [group('vigil')] vigil-train *ARGS: cd backend && uv run vigil train {{ARGS}} [group('vigil')] vigil-replay *ARGS: cd backend && uv run vigil replay {{ARGS}} [group('vigil')] vigil-download-csic: cd backend && uv run python -m ml.download_csic [group('vigil')] vigil-status: curl -sf http://localhost:8000/models/status | python -m json.tool # ============================================================================= # Setup # ============================================================================= [group('setup')] setup: setup-backend env @echo "Setup complete!" [group('setup')] setup-backend: @echo "Setting up backend..." cd backend && uv sync --all-groups @echo "Backend setup complete (with dev + ml deps)!" [group('setup')] env: @echo "Creating .env file..." @if [ ! -f .env ]; then cp .env.example .env; echo "Created .env from example"; fi @echo ".env ready! Please update with your values." # ============================================================================= # Utilities # ============================================================================= [group('util')] info: @echo "Project: {{project}}" @echo "Version: {{version}}" @echo "OS: {{os()}} ({{arch()}})" [group('util')] clean: -rm -rf backend/.mypy_cache -rm -rf backend/.pytest_cache -rm -rf backend/.ruff_cache -rm -rf backend/htmlcov -rm -rf backend/.coverage @echo "Cache directories cleaned" # ============================================================================= # Dev-Log (target app for realistic log generation) # ============================================================================= [group('devlog')] devlog-up *ARGS: cd dev-log && docker compose up -d {{ARGS}} [group('devlog')] devlog-down *ARGS: cd dev-log && docker compose down {{ARGS}} [group('devlog')] devlog-build: cd dev-log && docker compose build [group('devlog')] devlog-logs: cd dev-log && docker compose logs -f [group('devlog')] devlog-simulate mode='mixed' count='100' delay='0.1': python dev-log/simulate.py {{mode}} -n {{count}} -d {{delay}} [group('devlog')] devlog-normal count='200': python dev-log/simulate.py normal -n {{count}} -d 0.05 [group('devlog')] devlog-attack count='50': python dev-log/simulate.py mixed -n {{count}} -d 0.1 [group('util')] [confirm("Remove all containers, volumes, and build artifacts?")] nuke: @echo "Nuking everything..." -docker compose -f dev.compose.yml down -v -docker compose down -v -rm -rf backend/.venv -rm -rf backend/__pycache__ -rm -rf backend/.pytest_cache -rm -rf backend/.mypy_cache -rm -rf backend/.ruff_cache @echo "Nuke complete!"