Die Infrastrukturschicht stellt alle Dienste bereit, die das System zum Laufen braucht. Sie kennt keine Geschäftslogik, sondern bietet reine technische Services.
context.py
Erfasst den Workspace-Kontext zur Laufzeit:
Python
@dataclass(frozen=True)
class PortContext:
source_root: Path
tests_root: Path
assets_root: Path
archive_root: Path
python_file_count: int
test_file_count: int
asset_file_count: int
archive_available: bool
def build_port_context(base: Path | None = None) -> PortContext:
root = base or Path(__file__).resolve().parent.parent
source_root = root / 'src'
tests_root = root / 'tests'
assets_root = root / 'assets'
archive_root = root / 'archive' / 'claude_code_ts_snapshot' / 'src'
return PortContext(
source_root=source_root,
tests_root=tests_root,
assets_root=assets_root,
archive_root=archive_root,
python_file_count=sum(1 for p in source_root.rglob('*.py') if p.is_file()),
test_file_count=sum(1 for p in tests_root.rglob('*.py') if p.is_file()),
asset_file_count=sum(1 for p in assets_root.rglob('*') if p.is_file()),
archive_available=archive_root.exists(),
)
Der PortContext ist wieder frozen — einmal erfasst, ändert er sich nicht. Das verhindert Inkonsistenzen während einer Session.
setup.py
Initialisiert die Arbeitsumgebung und führt Prefetch-Operationen durch:
Python
@dataclass(frozen=True)
class WorkspaceSetup:
python_version: str
implementation: str
platform_name: str
test_command: str = 'python3 -m unittest discover -s tests -v'
@dataclass(frozen=True)
class SetupReport:
setup: WorkspaceSetup
prefetches: tuple[PrefetchResult, ...]
deferred_init: DeferredInitResult
trusted: bool
cwd: Path
def run_setup(cwd: Path | None = None, trusted: bool = True) -> SetupReport:
root = cwd or Path(__file__).resolve().parent.parent
prefetches = [
start_mdm_raw_read(),
start_keychain_prefetch(),
start_project_scan(root),
]
return SetupReport(
setup=build_workspace_setup(),
prefetches=tuple(prefetches),
deferred_init=run_deferred_init(trusted=trusted),
trusted=trusted,
cwd=root,
)
session_store.py
Persistiert Sessions im Dateisystem:
.port_sessions/{session_id}.json
{
"session_id": "abc123...",
"messages": ["prompt1", "prompt2", ...],
"input_tokens": 1500,
"output_tokens": 800
}
✅
Design-Entscheidung
Die Infrastrukturschicht nutzt ausschließlich die Python-Standardbibliothek. Keine externen Abhängigkeiten für maximale Portabilität.