generated from coulomb/repo-seed
- Migration e2f3a4b5c6d7: add last_state_synced_at to managed_repos
- consistency_check.py: PATCH last_state_synced_at after fix run;
fix ~ treated as non-empty state_hub_task_id (C-03 vs C-11);
fix _inject_task_id_into_block skipping injection when field exists
with null value
- install_hooks.sh: idempotent post-commit hook installer for all
registered repos (make install-hooks REPO= / install-hooks-all)
- gitea_inventory.py: compare coulomb Gitea org against state-hub
registered repos — registered / unregistered / hub-only sections
- infra/README.md: document systemd user timer + crontab fallback
- systemd user timer: custodian-sync.{service,timer} runs
fix-consistency-all every 15 min (enabled)
- dashboard/src/repo-sync.md: Repo Sync Health page — sync age table,
unregistered Gitea repos, hub-only repos
- api/routers/repos.py: GET /repos/{slug}/dispatch endpoint returning
active goal, pending tasks per workstream, human interventions
- mcp_server/server.py: get_repo_dispatch() MCP tool
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
67 lines
1.6 KiB
Python
67 lines
1.6 KiB
Python
import uuid
|
|
from datetime import datetime
|
|
from typing import Any
|
|
|
|
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
|
|
last_state_synced_at: datetime | None = None
|
|
|
|
|
|
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
|
|
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
|
|
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 RepoDispatch(BaseModel):
|
|
repo_slug: str
|
|
active_goal: dict[str, Any] | None
|
|
active_workstreams: list[DispatchWorkstream]
|
|
human_interventions: list[DispatchTask]
|
|
last_state_synced_at: datetime | None
|