"""Abstract CI/CD connector interface.""" from __future__ import annotations from dataclasses import dataclass from datetime import datetime from typing import Protocol, Optional, Sequence @dataclass(frozen=True) class BuildInfo: build_id: str pipeline_name: str status: str # success | failed | running | cancelled started_at: Optional[datetime] = None finished_at: Optional[datetime] = None triggered_by: Optional[str] = None branch: Optional[str] = None commit_sha: Optional[str] = None url: Optional[str] = None @dataclass(frozen=True) class DeploymentInfo: deployment_id: str environment: str # dev | staging | prod | ... status: str # success | failed | in_progress version_ref: Optional[str] = None started_at: Optional[datetime] = None finished_at: Optional[datetime] = None target: Optional[str] = None url: Optional[str] = None class CICDConnector(Protocol): """Jenkins / GitLab CI / GitHub Actions / ArgoCD / ...""" async def get_build(self, pipeline: str, build_id: str) -> Optional[BuildInfo]: ... async def list_builds(self, pipeline: str, limit: int = 50) -> Sequence[BuildInfo]: ... async def get_deployment(self, deployment_id: str) -> Optional[DeploymentInfo]: ... async def list_deployments(self, environment: str, limit: int = 50) -> Sequence[DeploymentInfo]: ...