generated from coulomb/repo-seed
- RepoRead schema: add last_sbom_at + sbom_source fields (already in model, now surfaced in API response) - repos.md: new dashboard page — KPI row (total/domains/ingested/gaps), domain-grouped coverage map with SBOM/EP/TD chips, per-repo table with gap highlighting, domain filter + gap-only toggle, ingest how-to section - observablehq.config.js: add Repos after Domains in nav Coverage state: 3 repos registered (custodian×1, railiance×2); 2 ingested (the-custodian + railiance-hosts), 1 gap (railiance-bootstrap — infra-only, no lockfile, expected) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
40 lines
942 B
Python
40 lines
942 B
Python
import uuid
|
|
from datetime import datetime
|
|
|
|
from pydantic import BaseModel, ConfigDict
|
|
|
|
|
|
class RepoCreate(BaseModel):
|
|
domain_slug: str
|
|
slug: str
|
|
name: str
|
|
local_path: str | None = None
|
|
remote_url: 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
|
|
description: str | None = None
|
|
topic_id: uuid.UUID | None = None
|
|
|
|
|
|
class RepoRead(BaseModel):
|
|
model_config = ConfigDict(from_attributes=True)
|
|
id: uuid.UUID
|
|
domain_id: uuid.UUID
|
|
slug: str
|
|
name: str
|
|
local_path: str | None = None
|
|
remote_url: 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
|
|
created_at: datetime
|
|
updated_at: datetime
|