generated from coulomb/repo-seed
Add consumer alignment review kit
This commit is contained in:
@@ -6,6 +6,8 @@ from pathlib import Path
|
||||
import json
|
||||
from typing import Any
|
||||
|
||||
import yaml
|
||||
|
||||
from . import generation
|
||||
from . import profiles
|
||||
from .bench import (
|
||||
@@ -22,6 +24,15 @@ from .validation import structural_checks
|
||||
REPO_ROOT = Path(__file__).resolve().parents[2]
|
||||
DEFAULT_INFOSPACE_ROOT = REPO_ROOT / "infospace"
|
||||
|
||||
REVIEW_KIT_COMPONENTS = {
|
||||
"manifest": "agent/review-kit/review-kit.yaml",
|
||||
"workflow": "agent/review-kit/review-workflow.yaml",
|
||||
"scorecard": "agent/review-kit/scorecard.yaml",
|
||||
"model_selection_guide": "agent/review-kit/model-selection-guide.yaml",
|
||||
"schema": "schemas/alignment-review.schema.yaml",
|
||||
}
|
||||
ALIGNMENT_TEMPLATE_PATH = "agent/templates/consumer-alignment-workplan.template.md"
|
||||
|
||||
|
||||
class CanonServiceError(Exception):
|
||||
def __init__(
|
||||
@@ -120,6 +131,45 @@ def list_standards(root: Path | str | None = None) -> dict[str, Any]:
|
||||
return list_artifacts(root, kind="standard")
|
||||
|
||||
|
||||
def review_kit(root: Path | str | None = None) -> dict[str, Any]:
|
||||
context = load_context(root)
|
||||
components = {
|
||||
name: {
|
||||
"path": relative,
|
||||
"content": _read_yaml_component(context.infospace_root, relative),
|
||||
}
|
||||
for name, relative in REVIEW_KIT_COMPONENTS.items()
|
||||
}
|
||||
template = alignment_template(root)
|
||||
return {
|
||||
"ok": True,
|
||||
"review_kit": components["manifest"]["content"],
|
||||
"components": components,
|
||||
"template": {
|
||||
"path": template["path"],
|
||||
"content": template["content"],
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
def alignment_template(root: Path | str | None = None) -> dict[str, Any]:
|
||||
context = load_context(root)
|
||||
path = context.infospace_root / ALIGNMENT_TEMPLATE_PATH
|
||||
try:
|
||||
content = path.read_text(encoding="utf-8")
|
||||
except FileNotFoundError as exc:
|
||||
raise CanonServiceError(
|
||||
"missing_alignment_template",
|
||||
"Consumer alignment workplan template not found.",
|
||||
{"path": str(path)},
|
||||
) from exc
|
||||
return {
|
||||
"ok": True,
|
||||
"path": ALIGNMENT_TEMPLATE_PATH,
|
||||
"content": content,
|
||||
}
|
||||
|
||||
|
||||
def validate_canon(root: Path | str | None = None) -> dict[str, Any]:
|
||||
context = load_context(root)
|
||||
errors: list[dict[str, Any]] = []
|
||||
@@ -311,6 +361,25 @@ def read_view(name: str, root: Path | str | None = None) -> dict[str, Any]:
|
||||
) from exc
|
||||
|
||||
|
||||
def _read_yaml_component(infospace_root: Path, relative: str) -> Any:
|
||||
path = infospace_root / relative
|
||||
try:
|
||||
with path.open("r", encoding="utf-8") as handle:
|
||||
return yaml.safe_load(handle) or {}
|
||||
except FileNotFoundError as exc:
|
||||
raise CanonServiceError(
|
||||
"missing_review_kit_component",
|
||||
f"Review kit component not found: {relative}",
|
||||
{"path": str(path)},
|
||||
) from exc
|
||||
except yaml.YAMLError as exc:
|
||||
raise CanonServiceError(
|
||||
"invalid_review_kit_component",
|
||||
f"Review kit component is not valid YAML: {relative}",
|
||||
{"path": str(path), "reason": str(exc)},
|
||||
) from exc
|
||||
|
||||
|
||||
def _artifact_to_dict(
|
||||
artifact: KnowledgeArtifact,
|
||||
infospace_root: Path,
|
||||
|
||||
Reference in New Issue
Block a user