feat: add plugin framework with UI contributions and suite selection

- Implemented PluginBlocks component to render various plugin UI elements.
- Created SuitePicker for selecting test suites and questions.
- Introduced usePluginUI hook for managing plugin UI state and manifest.
- Developed DocsPage for comprehensive plugin framework documentation.
- Added PluginPage to render pages declared by plugins based on the current path.
This commit is contained in:
Netherwarlord
2026-07-28 03:00:55 -04:00
parent adf61ae1a0
commit 8f246fabbc
73 changed files with 4972 additions and 640 deletions
+6 -2
View File
@@ -53,6 +53,7 @@ def build_test_record(
total=total,
title=outcome.title,
filename=outcome.filename,
suite=outcome.suite,
prompt=prompt_text,
ok=outcome.status == "ok",
response=outcome.response,
@@ -65,14 +66,17 @@ def build_test_record(
def build_run_record(
run: "RunState",
*,
prompts_by_filename: Dict[str, str],
prompts_by_id: Dict[str, str],
report_path: Optional[Path] = None,
) -> RunRecord:
# Keyed by qualified "<suite>/<file>" ID. Looking a prompt up by bare
# filename would hand a grader the wrong question's text whenever two
# suites in one run share a filename, which is the common case.
tests = [
build_test_record(
outcome,
total=run.total,
prompt_text=prompts_by_filename.get(outcome.filename, ""),
prompt_text=prompts_by_id.get(outcome.question_id, ""),
)
for outcome in run.outcomes
]