generated from coulomb/repo-seed
Add self-scoping assessment export command
This commit is contained in:
@@ -8,6 +8,7 @@ from repo_registry.core.models import CharacteristicRebuildResult, Repository
|
||||
from repo_registry.core.service import RegistryService
|
||||
from repo_registry.llm_extraction import LLMCandidateExtractor, create_llm_connect_adapter
|
||||
from repo_registry.repo_ingestion.git import GitIngestionService
|
||||
from repo_registry.self_scoping.assessment import artifact_json, export_assessment_artifact
|
||||
from repo_registry.storage.sqlite import NotFoundError, RegistryStore
|
||||
from repo_registry.web_api.app import Settings
|
||||
|
||||
@@ -44,6 +45,37 @@ def build_parser() -> argparse.ArgumentParser:
|
||||
)
|
||||
rebuild.add_argument("--database-path", help="Override REPO_REGISTRY_DATABASE_PATH.")
|
||||
rebuild.add_argument("--checkout-root", help="Override REPO_REGISTRY_CHECKOUT_ROOT.")
|
||||
export = subparsers.add_parser(
|
||||
"export-assessment",
|
||||
help="Export a completed analysis run as a self-scoping assessment artifact.",
|
||||
)
|
||||
export.add_argument("--repo", required=True, help="Repository id or exact repository name.")
|
||||
export.add_argument("--analysis-run", type=int, required=True, help="Completed analysis run id.")
|
||||
export.add_argument("--output", help="Write artifact JSON to this path instead of stdout.")
|
||||
export.add_argument(
|
||||
"--role",
|
||||
choices=["baseline", "challenger", "negative_regression_seed"],
|
||||
default="challenger",
|
||||
help="Assessment artifact role.",
|
||||
)
|
||||
export.add_argument(
|
||||
"--outcome",
|
||||
choices=[
|
||||
"baseline",
|
||||
"challenger",
|
||||
"preferred",
|
||||
"tied",
|
||||
"rejected",
|
||||
"superseded",
|
||||
"needs-human",
|
||||
],
|
||||
default="challenger",
|
||||
help="Initial assessment outcome.",
|
||||
)
|
||||
export.add_argument("--reviewer", default="codex", help="Reviewer name recorded in the artifact.")
|
||||
export.add_argument("--summary", help="Assessment summary override.")
|
||||
export.add_argument("--database-path", help="Override REPO_REGISTRY_DATABASE_PATH.")
|
||||
export.add_argument("--checkout-root", help="Override REPO_REGISTRY_CHECKOUT_ROOT.")
|
||||
return parser
|
||||
|
||||
|
||||
@@ -52,6 +84,8 @@ def main(argv: Sequence[str] | None = None) -> int:
|
||||
args = parser.parse_args(argv)
|
||||
if args.command == "rebuild-characteristics":
|
||||
return rebuild_characteristics_command(args, parser)
|
||||
if args.command == "export-assessment":
|
||||
return export_assessment_command(args, parser)
|
||||
parser.error(f"unknown command: {args.command}")
|
||||
return 2
|
||||
|
||||
@@ -88,6 +122,38 @@ def rebuild_characteristics_command(
|
||||
return 0
|
||||
|
||||
|
||||
def export_assessment_command(
|
||||
args: argparse.Namespace,
|
||||
parser: argparse.ArgumentParser,
|
||||
) -> int:
|
||||
service = service_from_args(args)
|
||||
repositories = selected_repositories(service, args)
|
||||
if not repositories:
|
||||
parser.error("no repositories matched the requested target")
|
||||
if len(repositories) > 1:
|
||||
parser.error("assessment export requires exactly one repository")
|
||||
repository = repositories[0]
|
||||
try:
|
||||
artifact = export_assessment_artifact(
|
||||
service,
|
||||
repository.id,
|
||||
args.analysis_run,
|
||||
role=args.role,
|
||||
outcome=args.outcome,
|
||||
reviewer=args.reviewer,
|
||||
summary=args.summary,
|
||||
)
|
||||
except (NotFoundError, ValueError) as exc:
|
||||
parser.error(str(exc))
|
||||
|
||||
content = artifact_json(artifact)
|
||||
if args.output:
|
||||
Path(args.output).write_text(content, encoding="utf-8")
|
||||
else:
|
||||
print(content, end="")
|
||||
return 0
|
||||
|
||||
|
||||
def service_from_args(args: argparse.Namespace) -> RegistryService:
|
||||
settings = Settings()
|
||||
database_path = Path(args.database_path or settings.database_path)
|
||||
@@ -96,7 +162,8 @@ def service_from_args(args: argparse.Namespace) -> RegistryService:
|
||||
store = RegistryStore(database_path)
|
||||
store.initialize()
|
||||
llm_extractor = None
|
||||
if not args.no_llm and settings.llm_enabled and settings.llm_provider:
|
||||
no_llm = getattr(args, "no_llm", True)
|
||||
if not no_llm and settings.llm_enabled and settings.llm_provider:
|
||||
adapter = create_llm_connect_adapter(settings.llm_provider, model=settings.llm_model)
|
||||
llm_extractor = LLMCandidateExtractor(adapter)
|
||||
return RegistryService(
|
||||
@@ -111,7 +178,7 @@ def selected_repositories(
|
||||
args: argparse.Namespace,
|
||||
) -> list[Repository]:
|
||||
repositories = service.list_repositories()
|
||||
if args.all:
|
||||
if getattr(args, "all", False):
|
||||
return repositories
|
||||
repo = str(args.repo)
|
||||
if repo.isdigit():
|
||||
|
||||
Reference in New Issue
Block a user