810485ecc8
---ci--- phase: 7 milestone: v0.1 status: complete requirements: covered: [REQ-001, REQ-002, REQ-003, REQ-004, REQ-005, REQ-006, REQ-007, REQ-008, REQ-009, REQ-010, REQ-011, REQ-012, REQ-013, REQ-014, REQ-015, REQ-016, REQ-017, REQ-018, REQ-019, REQ-020, REQ-021, REQ-022, REQ-023, REQ-024, REQ-025, REQ-026, REQ-027, REQ-028] partial: [] ---/ci--- Milestone v0.1 (nextcraft-ui-prototype) complete. Summary: - 7 phases (P0 pre-execution + P1-P6 execution + P7 final review) - 28 requirements covered (all complete) - 4 surfaces: Learner (7 pages), Marketplace (5), Employer Dashboard (4), Admin (4) - 19 routes, 104 TypeScript files - Shared component library (5 primitives + design tokens) - Mock data: 5 competency stacks (70 competencies), 20 jobs, 15 candidates, 10 employers - Tech: Next.js 15, Tailwind CSS v4, lucide-react, recharts, @xyflow/react, Inter font - Storybook with 6 stories - Dark mode, breadcrumbs, role switcher, responsive design - Build passes, typecheck passes, Storybook build passes Phases: P0 pre-execution → v0.0.1 P1 project-scaffolding → v0.0.2 P2 learner-surface → v0.0.3 P3 marketplace-surface → v0.0.4 P4 employer-dashboard → v0.0.5 P5 admin-surface → v0.0.6 P6 polish-integration → v0.0.7 P7 final-review-ship → v0.1.0 (milestone release)
101 lines
3.5 KiB
TypeScript
101 lines
3.5 KiB
TypeScript
import type { Learner, Artifact, OralDefense, Microcredential } from '@nextcraft/types';
|
|
|
|
export const primaryLearner: Learner = {
|
|
id: 'learner-001',
|
|
name: 'Alex Rivera',
|
|
email: 'alex.rivera@example.com',
|
|
avatar: 'https://i.pravatar.cc/150?img=16',
|
|
ageGroup: '18+',
|
|
enrolledStacks: ['stack-orchestration', 'stack-safety'],
|
|
progress: {
|
|
'stack-orchestration': 62,
|
|
'stack-safety': 41,
|
|
},
|
|
};
|
|
|
|
export const learnerMicrocredentials: Microcredential[] = [
|
|
{ id: 'mc-001', competencyId: 'stack-orchestration-c001', issuedAt: '2026-07-12T00:00:00Z', verified: true, score: 94 },
|
|
{ id: 'mc-002', competencyId: 'stack-orchestration-c004', issuedAt: '2026-07-28T00:00:00Z', verified: true, score: 91 },
|
|
{ id: 'mc-003', competencyId: 'stack-orchestration-c006', issuedAt: '2026-08-04T00:00:00Z', verified: true, score: 88 },
|
|
{ id: 'mc-004', competencyId: 'stack-safety-c021', issuedAt: '2026-08-20T00:00:00Z', verified: true, score: 90 },
|
|
{ id: 'mc-005', competencyId: 'stack-orchestration-c003', issuedAt: null, verified: false, score: null },
|
|
];
|
|
|
|
export const learnerArtifacts: Artifact[] = [
|
|
{
|
|
id: 'art-001',
|
|
name: 'Multi-agent research assistant',
|
|
type: 'code',
|
|
url: 'https://example.com/artifacts/research-assistant',
|
|
description: 'A LangGraph-based assistant that plans, retrieves, and drafts cited literature reviews with an eval harness.',
|
|
createdAt: '2026-08-22T14:30:00Z',
|
|
},
|
|
{
|
|
id: 'art-002',
|
|
name: 'RAG retrieval quality dashboard',
|
|
type: 'code',
|
|
url: 'https://example.com/artifacts/rag-dashboard',
|
|
description: 'Streamlit dashboard comparing chunking strategies and rerankers across 800 evaluation queries.',
|
|
createdAt: '2026-08-15T09:12:00Z',
|
|
},
|
|
{
|
|
id: 'art-003',
|
|
name: 'Model card for internal Q&A agent',
|
|
type: 'document',
|
|
url: 'https://example.com/artifacts/model-card',
|
|
description: 'Capabilities, limitations, intended use, and red-team findings for a document-grounded Q&A agent.',
|
|
createdAt: '2026-08-19T11:00:00Z',
|
|
},
|
|
{
|
|
id: 'art-004',
|
|
name: 'Prompt regression suite',
|
|
type: 'code',
|
|
url: 'https://example.com/artifacts/prompt-regression',
|
|
description: 'Pytest-based suite of 320 prompt assertions with LLM-as-judge scoring and CI integration.',
|
|
createdAt: '2026-08-08T16:45:00Z',
|
|
},
|
|
{
|
|
id: 'art-005',
|
|
name: 'Agent topology diagram',
|
|
type: 'design',
|
|
url: 'https://example.com/artifacts/topology',
|
|
description: 'Architecture diagram for a plan-and-execute agent with reflection and tool-retrieval sub-graphs.',
|
|
createdAt: '2026-07-30T10:20:00Z',
|
|
},
|
|
];
|
|
|
|
export const upcomingDefenses: OralDefense[] = [
|
|
{
|
|
id: 'def-001',
|
|
competencyId: 'stack-orchestration-c003',
|
|
transcript: '',
|
|
score: null,
|
|
status: 'scheduled',
|
|
},
|
|
{
|
|
id: 'def-002',
|
|
competencyId: 'stack-orchestration-c008',
|
|
transcript: '',
|
|
score: null,
|
|
status: 'scheduled',
|
|
},
|
|
{
|
|
id: 'def-003',
|
|
competencyId: 'stack-safety-c019',
|
|
transcript: '',
|
|
score: null,
|
|
status: 'pending',
|
|
},
|
|
];
|
|
|
|
export const learnerSummary = {
|
|
enrolledStacks: primaryLearner.enrolledStacks.length,
|
|
microcredentialsEarned: learnerMicrocredentials.filter((m) => m.verified).length,
|
|
artifactsSubmitted: learnerArtifacts.length,
|
|
upcomingDefenses: upcomingDefenses.filter((d) => d.status === 'scheduled').length,
|
|
averageScore:
|
|
learnerMicrocredentials
|
|
.filter((m) => m.score !== null)
|
|
.reduce((acc, m) => acc + (m.score ?? 0), 0) /
|
|
Math.max(1, learnerMicrocredentials.filter((m) => m.score !== null).length),
|
|
}; |