generated from coulomb/repo-seed
127 lines
3.2 KiB
Python
127 lines
3.2 KiB
Python
import uuid
|
|
from datetime import date, datetime
|
|
from typing import Any, Literal
|
|
|
|
from pydantic import BaseModel, ConfigDict, Field
|
|
|
|
|
|
class RepoCreate(BaseModel):
|
|
domain_slug: str
|
|
slug: str
|
|
name: str
|
|
local_path: str | None = None
|
|
remote_url: str | None = None
|
|
git_fingerprint: str | None = None
|
|
description: str | None = None
|
|
topic_id: uuid.UUID | None = None
|
|
|
|
|
|
class RepoUpdate(BaseModel):
|
|
name: str | None = None
|
|
local_path: str | None = None
|
|
remote_url: str | None = None
|
|
git_fingerprint: str | None = None
|
|
description: str | None = None
|
|
topic_id: uuid.UUID | None = None
|
|
last_state_synced_at: datetime | None = None
|
|
|
|
|
|
class RepoPathRegister(BaseModel):
|
|
"""Register a machine-local path for a repo on a specific host."""
|
|
host: str
|
|
path: str
|
|
|
|
|
|
class RepoOnboardRequest(BaseModel):
|
|
"""Start scripted onboarding for a working copy that is visible to State Hub."""
|
|
domain_slug: str
|
|
project_path: str
|
|
agent_profile: Literal["claude-code", "codex"] = "codex"
|
|
additional: bool = False
|
|
|
|
|
|
class RepoOnboardResult(BaseModel):
|
|
ok: bool
|
|
repo_slug: str | None = None
|
|
agent_profile: str
|
|
command: list[str]
|
|
stdout: str = ""
|
|
stderr: str = ""
|
|
|
|
|
|
class RepoRead(BaseModel):
|
|
model_config = ConfigDict(from_attributes=True)
|
|
id: uuid.UUID
|
|
domain_id: uuid.UUID
|
|
domain_slug: str # derived from domain relationship
|
|
slug: str
|
|
name: str
|
|
local_path: str | None = None
|
|
host_paths: dict = {}
|
|
remote_url: str | None = None
|
|
git_fingerprint: str | None = None
|
|
description: str | None = None
|
|
status: str
|
|
topic_id: uuid.UUID | None = None
|
|
sbom_source: str | None = None
|
|
last_sbom_at: datetime | None = None
|
|
last_state_synced_at: datetime | None = None
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
|
|
class DispatchTask(BaseModel):
|
|
id: uuid.UUID
|
|
title: str
|
|
priority: str
|
|
status: str
|
|
needs_human: bool
|
|
|
|
|
|
class DispatchWorkstream(BaseModel):
|
|
id: uuid.UUID
|
|
title: str
|
|
status: str
|
|
pending_tasks: list[DispatchTask]
|
|
|
|
|
|
class PendingInterfaceChange(BaseModel):
|
|
id: uuid.UUID
|
|
title: str
|
|
change_type: str
|
|
interface_type: str
|
|
origin_repo_slug: str
|
|
affected_paths: list[str]
|
|
planned_for: date | None
|
|
published_at: datetime | None
|
|
|
|
|
|
class ScopeIssueDetail(BaseModel):
|
|
id: str
|
|
label: str
|
|
status: str
|
|
detail: str
|
|
missing_sections: list[str] = Field(default_factory=list)
|
|
invalid_capability_blocks: list[dict[str, Any]] = Field(default_factory=list)
|
|
needs_refresh_sections: list[str] = Field(default_factory=list)
|
|
|
|
|
|
class RepoDispatch(BaseModel):
|
|
repo_slug: str
|
|
active_goal: dict[str, Any] | None
|
|
active_workstreams: list[DispatchWorkstream]
|
|
human_interventions: list[DispatchTask]
|
|
pending_interface_changes: list[PendingInterfaceChange]
|
|
scope_needs_review: bool
|
|
scope_issue_details: list[ScopeIssueDetail]
|
|
last_state_synced_at: datetime | None
|
|
|
|
|
|
class RepoScopeHealth(BaseModel):
|
|
repo_slug: str
|
|
domain_slug: str | None = None
|
|
local_path: str | None = None
|
|
path_available: bool
|
|
scope_needs_review: bool
|
|
scope_issue_details: list[ScopeIssueDetail]
|