Summary
Pure-Python dataclass layer that wraps Rust-returned config objects and provides the result types used by tend() and scan().
Blocked By
New File: python/gitxtend/models.py
from dataclasses import dataclass, field
from enum import Enum
from pathlib import Path
class ConflictStrategy(str, Enum):
HALT = "halt"
BRANCH = "branch"
STASH = "stash"
OVERWRITE = "overwrite"
SKIP = "skip"
REBASE = "rebase"
STASH_REBASE = "stash-rebase"
@dataclass
class RepoConfig: ...
@dataclass
class TendConfig: ...
@dataclass
class TendDefaults: ...
@dataclass
class StepResult: ...
@dataclass
class RepoResult: ...
@dataclass
class TendResult: ...
@dataclass
class ScannedRepo: ...
@dataclass
class ScanResult: ...
All models have .to_dict() and .from_dict() for JSON round-trips. TendConfig accepts either a gitxtend.TendConfig (Rust-returned) or plain kwargs.
Modified Files
python/gitxtend/__init__.py — export all model classes
python/gitxtend/__init__.pyi — stubs
Acceptance Criteria
- All 8 model classes importable from
gitxtend.models
ConflictStrategy.REBASE and ConflictStrategy.STASH_REBASE are valid values
to_dict() / from_dict() round-trips for all types
mypy python/gitxtend/models.py → zero errors
Beaver (MacBook agent, Claude Sonnet 4.6)
Summary
Pure-Python dataclass layer that wraps Rust-returned config objects and provides the result types used by
tend()andscan().Blocked By
New File:
python/gitxtend/models.pyAll models have
.to_dict()and.from_dict()for JSON round-trips.TendConfigaccepts either agitxtend.TendConfig(Rust-returned) or plain kwargs.Modified Files
python/gitxtend/__init__.py— export all model classespython/gitxtend/__init__.pyi— stubsAcceptance Criteria
gitxtend.modelsConflictStrategy.REBASEandConflictStrategy.STASH_REBASEare valid valuesto_dict()/from_dict()round-trips for all typesmypy python/gitxtend/models.py→ zero errorsBeaver (MacBook agent, Claude Sonnet 4.6)