from dataclasses import dataclass from enum import Enum from pathlib import Path class ProjectKind(Enum): DOTNET = "dotnet" class ResultCheckKind(Enum): TRX_HAS_TESTS = "trx_has_tests" PROJECT_IS_NET8 = "project_is_net8" @dataclass(frozen=True) class DotnetConfig: target: Path | None = None configuration: str = "Debug" test_projects: tuple[Path, ...] = () @dataclass(frozen=True) class TDDConfig: test_roots: tuple[Path, ...] test_patterns: tuple[str, ...] exclude: tuple[str, ...] = () @dataclass(frozen=True) class HarnessConfig: version: int project_type: str dotnet: DotnetConfig tdd: TDDConfig @dataclass(frozen=True) class ProjectSelection: kind: ProjectKind project_file: Path projects: tuple[Path, ...] = () @dataclass(frozen=True) class DiscoveryResult: selection: ProjectSelection | None @dataclass(frozen=True) class Toolchain: dotnet: Path sdk_version: str @dataclass(frozen=True) class CommandSpec: argv: tuple[str, ...] cwd: Path stage: str timeout_seconds: int = 1800 @dataclass(frozen=True) class ResultCheck: kind: ResultCheckKind path: Path | None = None @dataclass(frozen=True) class ValidationStep: command: CommandSpec checks: tuple[ResultCheck, ...] = () @dataclass(frozen=True) class ValidationPlan: project_kind: ProjectKind steps: tuple[ValidationStep, ...] @dataclass(frozen=True) class CommandResult: command: CommandSpec returncode: int stdout: str stderr: str