Skip to content

Protocol planner

protocol_planner

PlanOperation dataclass

Describe the non-mutating plan for one relative path.

Source code in packages/axm-init/src/axm_init/core/protocol_planner.py
Python
@dataclass(frozen=True, slots=True)
class PlanOperation:
    """Describe the non-mutating plan for one relative path."""

    path: PurePosixPath
    status: PlanStatus
    content: str | None

PlanStatus

Bases: StrEnum

Classify one planned relative-path operation.

Source code in packages/axm-init/src/axm_init/core/protocol_planner.py
Python
class PlanStatus(StrEnum):
    """Classify one planned relative-path operation."""

    CREATE = "create"
    UPDATE = "update"
    UNCHANGED = "unchanged"
    CONFLICT = "conflict"

ProtocolScaffoldPlan dataclass

Hold ordered file operations and merged project metadata.

Source code in packages/axm-init/src/axm_init/core/protocol_planner.py
Python
@dataclass(frozen=True, slots=True)
class ProtocolScaffoldPlan:
    """Hold ordered file operations and merged project metadata."""

    operations: tuple[PlanOperation, ...]
    metadata: str

plan_protocol_scaffold(declaration, metadata, inventory)

Compute a deterministic scaffold plan without mutating caller state.

Source code in packages/axm-init/src/axm_init/core/protocol_planner.py
Python
def plan_protocol_scaffold(
    declaration: ProtocolScaffoldDecl,
    metadata: str,
    inventory: Mapping[str, str],
) -> ProtocolScaffoldPlan:
    """Compute a deterministic scaffold plan without mutating caller state."""
    merged_metadata = merge_protocol_metadata(metadata, declaration)
    profile_owned = _is_profile_owned(metadata, declaration)
    operations = tuple(
        _classify(planned, inventory, profile_owned=profile_owned)
        for planned in _planned_files(declaration)
    )
    return ProtocolScaffoldPlan(operations=operations, metadata=merged_metadata)