Source code for pjkm.core.models.task

"""Task system models: phases, definitions, results, and events."""

from __future__ import annotations

from enum import IntEnum
from typing import Literal

from pydantic import BaseModel, Field


[docs] class Phase(IntEnum): """Execution phases in strict order."""
[docs] SCAFFOLD = 1
[docs] CONFIGURE = 2
[docs] INSTALL = 3
[docs] VERIFY = 4
[docs] class TaskDefinition(BaseModel): """Metadata describing a registered task."""
[docs] id: str
[docs] phase: Phase
[docs] depends_on: list[str] = Field(default_factory=list)
[docs] description: str = ""
[docs] class TaskResult(BaseModel): """Outcome of executing a single task."""
[docs] task_id: str
[docs] success: bool
[docs] message: str = ""
[docs] files_created: list[str] = Field(default_factory=list)
[docs] files_modified: list[str] = Field(default_factory=list)
[docs] duration_ms: float = 0.0
[docs] skipped: bool = False
[docs] class TaskStarted(BaseModel): """Emitted when a task begins execution."""
[docs] kind: Literal["task_started"] = "task_started"
[docs] task_id: str
[docs] phase: Phase
[docs] description: str
[docs] class TaskProgress(BaseModel): """Emitted for intermediate task status updates."""
[docs] kind: Literal["task_progress"] = "task_progress"
[docs] task_id: str
[docs] message: str
[docs] fraction: float = 0.0
[docs] class TaskCompleted(BaseModel): """Emitted when a task finishes."""
[docs] kind: Literal["task_completed"] = "task_completed"
[docs] task_id: str
[docs] result: TaskResult
[docs] class PhaseStarted(BaseModel): """Emitted when a phase begins."""
[docs] kind: Literal["phase_started"] = "phase_started"
[docs] phase: Phase
[docs] class PhaseCompleted(BaseModel): """Emitted when all tasks in a phase have finished."""
[docs] kind: Literal["phase_completed"] = "phase_completed"
[docs] phase: Phase
[docs] TaskEvent = TaskStarted | TaskProgress | TaskCompleted | PhaseStarted | PhaseCompleted