feat(phase-16): enhanced Tests view, Red/Blue dashboard metrics, and Template admin panel (T-122, T-123, T-124)

This commit is contained in:
2026-02-09 13:00:07 +01:00
parent fd7f855008
commit a95defcee4
12 changed files with 1769 additions and 159 deletions

View File

@@ -1,6 +1,8 @@
import client from "./client";
import type { CoverageSummary, TacticCoverage } from "../types/models";
// ── V1 — Coverage ───────────────────────────────────────────────────
/** Fetch the global coverage summary. */
export async function getCoverageSummary(): Promise<CoverageSummary> {
const { data } = await client.get<CoverageSummary>("/metrics/summary");
@@ -12,3 +14,69 @@ export async function getCoverageByTactic(): Promise<TacticCoverage[]> {
const { data } = await client.get<TacticCoverage[]>("/metrics/by-tactic");
return data;
}
// ── V2 — Test Pipeline ──────────────────────────────────────────────
export interface TestPipelineCounts {
draft: number;
red_executing: number;
blue_evaluating: number;
in_review: number;
validated: number;
rejected: number;
total: number;
}
/** Fetch test counts per pipeline state. */
export async function getTestPipeline(): Promise<TestPipelineCounts> {
const { data } = await client.get<TestPipelineCounts>("/metrics/test-pipeline");
return data;
}
// ── V2 — Team Activity ──────────────────────────────────────────────
export interface TeamActivityItem {
team: string;
tests_completed: number;
tests_pending: number;
avg_completion_hours: number | null;
}
/** Fetch activity summary for Red and Blue teams. */
export async function getTeamActivity(): Promise<TeamActivityItem[]> {
const { data } = await client.get<TeamActivityItem[]>("/metrics/team-activity");
return data;
}
// ── V2 — Validation Rate ────────────────────────────────────────────
export interface ValidationRateItem {
role: string;
total_reviewed: number;
approved: number;
rejected: number;
approval_rate: number;
}
/** Fetch approval/rejection rates for managers. */
export async function getValidationRate(): Promise<ValidationRateItem[]> {
const { data } = await client.get<ValidationRateItem[]>("/metrics/validation-rate");
return data;
}
// ── V2 — Recent Tests ───────────────────────────────────────────────
export interface RecentTestItem {
id: string;
name: string;
state: string;
technique_mitre_id: string | null;
technique_name: string | null;
created_at: string | null;
}
/** Fetch the 10 most recently updated tests. */
export async function getRecentTests(): Promise<RecentTestItem[]> {
const { data } = await client.get<RecentTestItem[]>("/metrics/recent-tests");
return data;
}