hazo_ui 3.3.0 → 3.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGE_LOG.md +42 -0
- package/README.md +41 -0
- package/dist/index.cjs +192 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +336 -173
- package/dist/index.d.ts +336 -173
- package/dist/index.js +185 -1
- package/dist/index.js.map +1 -1
- package/dist/test-harness/index.cjs.map +1 -1
- package/dist/test-harness/index.js.map +1 -1
- package/package.json +8 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/utils.ts","../../src/test-harness/ui/sidebar.tsx","../../src/test-harness/scenarios/api.ts","../../src/test-harness/runner/provider.tsx","../../src/test-harness/scenarios/assertions.ts","../../src/test-harness/scenarios/format.ts","../../src/test-harness/runner/copy_all.tsx","../../src/test-harness/runner/runner.tsx"],"names":["registry","useState","jsx","jsxs"],"mappings":"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","file":"index.js","sourcesContent":["// Utility functions for hazo_ui component library\n// Provides className merging utility (cn function)\n\nimport { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Merges class names using clsx and tailwind-merge\n * @param inputs - Class values to merge\n * @returns Merged class string\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n","// test-harness/ui/sidebar.tsx\n// SidebarLayout and AppSidebar components for hazo_* test-app layouts.\n// Two-column layout: fixed sidebar left, scrollable content right.\n\n\"use client\";\n\nimport React, { useState } from \"react\";\nimport { cn } from \"../../lib/utils\";\n\n// ────────────────────────────────────────────────────────────────────────────\n// Types\n// ────────────────────────────────────────────────────────────────────────────\n\nexport interface NavItem {\n label: string;\n href: string;\n icon?: React.ReactNode;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// SidebarLayout\n// ────────────────────────────────────────────────────────────────────────────\n\n/**\n * Two-column layout shell.\n * - Left column: sidebar (fixed height, scrollable internally)\n * - Right column: main content (fills remaining width, scrollable)\n */\nexport function SidebarLayout({\n sidebar,\n children,\n}: {\n sidebar: React.ReactNode;\n children: React.ReactNode;\n}): React.JSX.Element {\n return (\n <div className=\"cls_sidebar_layout flex h-screen w-full overflow-hidden bg-gray-50\">\n {/* Sidebar */}\n <aside className=\"cls_sidebar_aside flex-none w-60 h-full flex flex-col bg-white border-r border-gray-200 overflow-y-auto\">\n {sidebar}\n </aside>\n\n {/* Main content */}\n <main className=\"cls_sidebar_main flex-1 h-full overflow-y-auto\">\n {children}\n </main>\n </div>\n );\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// ActiveLink — renders a nav link with active state detection\n// ────────────────────────────────────────────────────────────────────────────\n\nfunction ActiveLink({\n item,\n current_path,\n}: {\n item: NavItem;\n current_path: string;\n}): React.JSX.Element {\n const is_active =\n item.href === \"/\"\n ? current_path === \"/\"\n : current_path === item.href || current_path.startsWith(item.href + \"/\");\n\n return (\n <a\n href={item.href}\n className={cn(\n \"flex items-center gap-2.5 rounded-md px-3 py-2 text-sm font-medium transition-colors\",\n is_active\n ? \"bg-blue-50 text-blue-700\"\n : \"text-gray-600 hover:bg-gray-100 hover:text-gray-900\"\n )}\n >\n {item.icon && (\n <span className={cn(\"flex-none text-base\", is_active ? \"text-blue-600\" : \"text-gray-400\")}>\n {item.icon}\n </span>\n )}\n {item.label}\n </a>\n );\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// AppSidebar\n// ────────────────────────────────────────────────────────────────────────────\n\n/**\n * Per-package navigation sidebar.\n * Reads the current pathname from window.location (SSR-safe via state initialisation).\n */\nexport function AppSidebar({\n pkg,\n navItems,\n}: {\n pkg: string;\n navItems: NavItem[];\n}): React.JSX.Element {\n const [collapsed, set_collapsed] = useState(false);\n\n // SSR-safe: default to \"/\" on server, update on client\n const [current_path, set_current_path] = useState(\"/\");\n\n // Update path on mount and on popstate\n React.useEffect(() => {\n function update_path(): void {\n set_current_path(window.location.pathname);\n }\n update_path();\n window.addEventListener(\"popstate\", update_path);\n return () => window.removeEventListener(\"popstate\", update_path);\n }, []);\n\n if (collapsed) {\n return (\n <div className=\"cls_app_sidebar_collapsed flex flex-col items-center py-3 gap-2 w-12 bg-white border-r border-gray-200 h-full\">\n <button\n onClick={() => set_collapsed(false)}\n className=\"p-1.5 rounded hover:bg-gray-100 text-gray-500\"\n aria-label=\"Expand sidebar\"\n >\n ▶\n </button>\n {navItems.map((item) => (\n <a\n key={item.href}\n href={item.href}\n className=\"p-1.5 rounded hover:bg-gray-100 text-gray-500 text-base\"\n title={item.label}\n >\n {item.icon ?? item.label.slice(0, 1)}\n </a>\n ))}\n </div>\n );\n }\n\n return (\n <div className=\"cls_app_sidebar flex flex-col h-full\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-gray-100\">\n <span className=\"font-semibold text-sm text-gray-800 truncate\">{pkg}</span>\n <button\n onClick={() => set_collapsed(true)}\n className=\"flex-none p-1 rounded hover:bg-gray-100 text-gray-400 hover:text-gray-600\"\n aria-label=\"Collapse sidebar\"\n >\n ◀\n </button>\n </div>\n\n {/* Nav */}\n <nav className=\"flex-1 overflow-y-auto px-2 py-2 space-y-0.5\">\n {navItems.map((item) => (\n <ActiveLink key={item.href} item={item} current_path={current_path} />\n ))}\n </nav>\n\n {/* Footer */}\n <div className=\"px-4 py-3 border-t border-gray-100\">\n <p className=\"text-xs text-gray-400\">Press ? for shortcuts</p>\n </div>\n </div>\n );\n}\n","// test-harness/scenarios/api.ts\n// Global scenario registry for the hazo_ui test harness.\n// Scenarios are registered at module load time via registerScenario().\n\nexport interface CaseDoc {\n /** What this test verifies, in plain language. */\n description: string;\n /** The inputs / preconditions the case feeds in (URL, payload, fixture, state). */\n inputs: string;\n /** The outputs / state the case asserts on success. */\n expectedOutputs: string;\n /** Known limitations, assumptions, or gotchas. Use \"None\" when not applicable. */\n caveats: string;\n}\n\nexport interface Case {\n name: string;\n run: () => Promise<void>;\n doc: CaseDoc;\n}\n\nexport interface Scenario {\n id: string;\n name: string;\n pkg: string;\n filePath?: string;\n cases: Case[];\n}\n\n// Module-level registry — shared across the entire process\nconst registry = new Map<string, Scenario>();\n\n/**\n * Parse the first non-test-harness file path from an Error stack string.\n * Returns something like \"/abs/path/to/scenario.ts\" or undefined.\n */\nfunction parse_caller_path(stack: string | undefined): string | undefined {\n if (!stack) return undefined;\n const lines = stack.split(\"\\n\");\n // Skip the first line (error message) and find frames outside test-harness\n for (const line of lines.slice(1)) {\n const match = line.match(/\\(([^)]+)\\)/) || line.match(/at\\s+(\\/[^\\s:]+)/);\n if (!match) continue;\n const raw = match[1] ?? match[0];\n const path_part = raw.split(\":\")[0];\n if (!path_part) continue;\n // Skip frames that are inside node internals or the test-harness itself\n if (\n path_part.includes(\"node:\") ||\n path_part.includes(\"test-harness/scenarios/api\") ||\n path_part.includes(\"<anonymous>\")\n ) {\n continue;\n }\n return path_part;\n }\n return undefined;\n}\n\n/**\n * Register a scenario with the global registry.\n * Call this at module load time in your scenario files.\n */\nexport function registerScenario(\n id: string,\n opts: {\n name: string;\n pkg: string;\n cases: Case[];\n }\n): void {\n const stack = new Error().stack;\n const filePath = parse_caller_path(stack);\n\n registry.set(id, {\n id,\n name: opts.name,\n pkg: opts.pkg,\n filePath,\n cases: opts.cases,\n });\n}\n\n/** Return the entire registry (read-only reference). */\nexport function getRegistry(): Map<string, Scenario> {\n return registry;\n}\n\n/** Clear the registry — used in tests only. */\nexport function clearRegistry(): void {\n registry.clear();\n}\n","// test-harness/runner/provider.tsx\n// AutoTestProvider — React context that drives scenario execution and holds run state.\n// Initialises from the global scenario registry populated by registerScenario() calls.\n\n\"use client\";\n\nimport React, { createContext, useCallback, useContext, useRef, useState } from \"react\";\nimport { getRegistry, type CaseDoc } from \"../scenarios/api\";\n\n// ────────────────────────────────────────────────────────────────────────────\n// Public types\n// ────────────────────────────────────────────────────────────────────────────\n\nexport type RunStatus = \"pending\" | \"running\" | \"passed\" | \"failed\";\n\nexport interface CaseResult {\n name: string;\n doc?: CaseDoc;\n scenarioId?: string;\n status: RunStatus;\n durationMs?: number;\n error?: Error;\n expected?: unknown;\n actual?: unknown;\n}\n\nexport interface ScenarioResult {\n id: string;\n name: string;\n status: RunStatus;\n cases: CaseResult[];\n}\n\nexport interface AutoTestContextValue {\n scenarios: Map<string, ScenarioResult>;\n runScenario(id: string): Promise<void>;\n runAll(): Promise<void>;\n reset(): void;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Context\n// ────────────────────────────────────────────────────────────────────────────\n\nconst AutoTestContext = createContext<AutoTestContextValue | null>(null);\n\n// ────────────────────────────────────────────────────────────────────────────\n// Helper: build initial ScenarioResult map from registry\n// ────────────────────────────────────────────────────────────────────────────\n\nfunction build_initial_state(): Map<string, ScenarioResult> {\n const registry = getRegistry();\n const map = new Map<string, ScenarioResult>();\n for (const [id, scenario] of registry) {\n map.set(id, {\n id,\n name: scenario.name,\n status: \"pending\",\n cases: scenario.cases.map((c) => ({\n name: c.name,\n doc: c.doc,\n status: \"pending\",\n })),\n });\n }\n return map;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Provider\n// ────────────────────────────────────────────────────────────────────────────\n\nexport function AutoTestProvider({\n pkg: _pkg,\n children,\n}: {\n pkg: string;\n children: React.ReactNode;\n}): React.JSX.Element {\n const [scenarios, set_scenarios] = useState<Map<string, ScenarioResult>>(\n () => build_initial_state()\n );\n\n // Use a ref so runAll can read the latest scenarios without stale closure\n const scenarios_ref = useRef(scenarios);\n scenarios_ref.current = scenarios;\n\n const update_scenario = useCallback(\n (id: string, updater: (prev: ScenarioResult) => ScenarioResult) => {\n set_scenarios((prev) => {\n const next = new Map(prev);\n const existing = next.get(id);\n if (existing) {\n next.set(id, updater(existing));\n }\n return next;\n });\n },\n []\n );\n\n const runScenario = useCallback(\n async (id: string): Promise<void> => {\n const registry = getRegistry();\n const scenario = registry.get(id);\n if (!scenario) return;\n\n // Mark the scenario as running\n update_scenario(id, (prev) => ({\n ...prev,\n status: \"running\",\n cases: prev.cases.map((c) => ({ ...c, status: \"pending\" })),\n }));\n\n let all_passed = true;\n\n for (let i = 0; i < scenario.cases.length; i++) {\n const case_def = scenario.cases[i];\n if (!case_def) continue;\n\n // Mark this case as running\n update_scenario(id, (prev) => {\n const updated_cases = [...prev.cases];\n updated_cases[i] = { ...updated_cases[i]!, status: \"running\" };\n return { ...prev, cases: updated_cases };\n });\n\n const start_ts = Date.now();\n let result_status: RunStatus = \"passed\";\n let error: Error | undefined;\n let expected: unknown;\n let actual: unknown;\n\n try {\n await case_def.run();\n } catch (err) {\n result_status = \"failed\";\n all_passed = false;\n error = err instanceof Error ? err : new Error(String(err));\n // Extract structured assertion data when available\n if (error && \"expected\" in error) expected = (error as { expected: unknown }).expected;\n if (error && \"actual\" in error) actual = (error as { actual: unknown }).actual;\n }\n\n const duration_ms = Date.now() - start_ts;\n\n update_scenario(id, (prev) => {\n const updated_cases = [...prev.cases];\n updated_cases[i] = {\n ...updated_cases[i]!,\n scenarioId: id,\n status: result_status,\n durationMs: duration_ms,\n error,\n expected,\n actual,\n };\n return { ...prev, cases: updated_cases };\n });\n }\n\n // Mark the overall scenario status\n update_scenario(id, (prev) => ({\n ...prev,\n status: all_passed ? \"passed\" : \"failed\",\n }));\n },\n [update_scenario]\n );\n\n const runAll = useCallback(async (): Promise<void> => {\n const ids = Array.from(getRegistry().keys());\n for (const id of ids) {\n await runScenario(id);\n }\n }, [runScenario]);\n\n const reset = useCallback((): void => {\n set_scenarios(build_initial_state());\n }, []);\n\n const value: AutoTestContextValue = {\n scenarios,\n runScenario,\n runAll,\n reset,\n };\n\n return (\n <AutoTestContext.Provider value={value}>\n {children}\n </AutoTestContext.Provider>\n );\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Hook\n// ────────────────────────────────────────────────────────────────────────────\n\nexport function useAutoTest(): AutoTestContextValue {\n const ctx = useContext(AutoTestContext);\n if (!ctx) {\n throw new Error(\"useAutoTest must be used within an <AutoTestProvider>\");\n }\n return ctx;\n}\n","// test-harness/scenarios/assertions.ts\n// Assertion helpers for hazo_ui test harness.\n// Each helper captures its own call-site for the \"← failed here\" marker in\n// formatAsClaudePrompt section 4.\n\n/**\n * Parse the call-site (file:line) from an Error stack, skipping frames that\n * are inside the assertions module itself.\n */\nfunction capture_call_site(stack: string | undefined): string | undefined {\n if (!stack) return undefined;\n const lines = stack.split(\"\\n\");\n for (const line of lines.slice(1)) {\n const match = line.match(/\\(([^)]+)\\)/) || line.match(/at\\s+(\\/[^\\s]+)/);\n if (!match) continue;\n const raw = match[1] ?? match[0];\n if (\n raw.includes(\"test-harness/scenarios/assertions\") ||\n raw.includes(\"node:\")\n ) {\n continue;\n }\n return raw; // e.g. \"/abs/path/to/file.ts:42:10\"\n }\n return undefined;\n}\n\n/**\n * Assertion error thrown by all helpers in this module.\n * Carries expected/actual values and the call-site string for prompt generation.\n */\nexport class HazoAssertionError extends Error {\n readonly expected: unknown;\n readonly actual: unknown;\n readonly callSite: string | undefined;\n\n constructor(\n message: string,\n expected: unknown,\n actual: unknown,\n callSite: string | undefined\n ) {\n super(message);\n this.name = \"HazoAssertionError\";\n this.expected = expected;\n this.actual = actual;\n this.callSite = callSite;\n }\n}\n\n/**\n * Assert that actual deep-equals expected.\n * Uses JSON serialisation for a lightweight but useful deep-equality check.\n */\nexport function assertEqual<T>(actual: T, expected: T): void {\n const callSite = capture_call_site(new Error().stack);\n const a_str = JSON.stringify(actual);\n const e_str = JSON.stringify(expected);\n if (a_str !== e_str) {\n throw new HazoAssertionError(\n `assertEqual failed: expected ${e_str}, got ${a_str}`,\n expected,\n actual,\n callSite\n );\n }\n}\n\n/**\n * Assert that fn throws (optionally an instance of ErrorClass).\n */\nexport function assertThrows(\n fn: () => unknown,\n ErrorClass?: new (...a: unknown[]) => Error\n): void {\n const callSite = capture_call_site(new Error().stack);\n let thrown: unknown = undefined;\n let did_throw = false;\n try {\n fn();\n } catch (err) {\n thrown = err;\n did_throw = true;\n }\n\n if (!did_throw) {\n throw new HazoAssertionError(\n `assertThrows failed: expected function to throw but it returned without throwing`,\n ErrorClass ? ErrorClass.name : \"Error\",\n \"no throw\",\n callSite\n );\n }\n\n if (ErrorClass && !(thrown instanceof ErrorClass)) {\n const actual_name =\n thrown instanceof Error ? thrown.constructor.name : String(thrown);\n throw new HazoAssertionError(\n `assertThrows failed: expected ${ErrorClass.name} but got ${actual_name}`,\n ErrorClass.name,\n actual_name,\n callSite\n );\n }\n}\n\n/**\n * Assert that the promise resolves without rejection.\n */\nexport async function assertResolves(promise: Promise<unknown>): Promise<void> {\n const callSite = capture_call_site(new Error().stack);\n try {\n await promise;\n } catch (err) {\n const msg =\n err instanceof Error ? err.message : String(err);\n throw new HazoAssertionError(\n `assertResolves failed: promise rejected with \"${msg}\"`,\n \"resolved\",\n `rejected: ${msg}`,\n callSite\n );\n }\n}\n\n/**\n * Assert that the promise rejects (optionally with a specific ErrorClass).\n */\nexport async function assertRejects(\n promise: Promise<unknown>,\n ErrorClass?: new (...a: unknown[]) => Error\n): Promise<void> {\n const callSite = capture_call_site(new Error().stack);\n let thrown: unknown = undefined;\n let did_reject = false;\n try {\n await promise;\n } catch (err) {\n thrown = err;\n did_reject = true;\n }\n\n if (!did_reject) {\n throw new HazoAssertionError(\n `assertRejects failed: expected promise to reject but it resolved`,\n ErrorClass ? ErrorClass.name : \"rejection\",\n \"resolved\",\n callSite\n );\n }\n\n if (ErrorClass && !(thrown instanceof ErrorClass)) {\n const actual_name =\n thrown instanceof Error ? thrown.constructor.name : String(thrown);\n throw new HazoAssertionError(\n `assertRejects failed: expected ${ErrorClass.name} but got ${actual_name}`,\n ErrorClass.name,\n actual_name,\n callSite\n );\n }\n}\n\n/**\n * Assert that str matches pattern.\n */\nexport function assertMatch(str: string, pattern: RegExp): void {\n const callSite = capture_call_site(new Error().stack);\n if (!pattern.test(str)) {\n throw new HazoAssertionError(\n `assertMatch failed: \"${str}\" did not match ${pattern}`,\n pattern.toString(),\n str,\n callSite\n );\n }\n}\n\n/**\n * Assert that arr includes value (using JSON equality).\n */\nexport function assertIncludes<T>(arr: T[], value: T): void {\n const callSite = capture_call_site(new Error().stack);\n const value_str = JSON.stringify(value);\n const found = arr.some((item) => JSON.stringify(item) === value_str);\n if (!found) {\n throw new HazoAssertionError(\n `assertIncludes failed: array does not contain ${value_str}`,\n value,\n arr,\n callSite\n );\n }\n}\n","// test-harness/scenarios/format.ts\n// Produces a self-contained, paste-ready prompt block from a failed test case.\n// Implements all 8 sections from test_harness_design.md §3.\n\n// Import from hazo_core's CLIENT entry, not the root barrel: the root barrel\n// pulls hazo_core/debug (Node createRequire('hazo_debug')) into the client\n// bundle, which Turbopack flags as unresolvable. The client entry exposes\n// optional_import without that server-only code.\nimport { optional_import } from \"hazo_core/client\";\nimport { HazoAssertionError } from \"./assertions\";\n\n// ────────────────────────────────────────────────────────────────────────────\n// Public types\n// ────────────────────────────────────────────────────────────────────────────\n\nexport interface FailedCase {\n pkg: string;\n scenarioId: string;\n caseName: string;\n correlationId?: string;\n durationMs?: number;\n failedAt: Date;\n error: Error;\n expected?: unknown;\n actual?: unknown;\n scenarioFilePath?: string;\n /** e.g. 'sqlite (in-memory)' or 'postgres' */\n adapter?: string;\n /** Config values to surface in section 7. Secret values are auto-redacted. */\n relevantConfig?: Record<string, string>;\n}\n\nexport interface FormatOptions {\n includeRingBuffer?: boolean;\n includeCodeContext?: boolean;\n maxRingBufferEntries?: number;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Secret filtering\n// ────────────────────────────────────────────────────────────────────────────\n\nconst SECRET_PATTERNS = [\n /AKIA[0-9A-Z]{16}/,\n /-----BEGIN.*PRIVATE KEY/,\n /eyJ[a-zA-Z0-9_-]+\\.eyJ/,\n];\n\nfunction redact_secrets(value: string): string {\n let result = value;\n for (const pattern of SECRET_PATTERNS) {\n result = result.replace(new RegExp(pattern.source, pattern.flags + \"g\"), \"<redacted>\");\n }\n return result;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Stack-trace parsing (no external deps — pure regex)\n// ────────────────────────────────────────────────────────────────────────────\n\ninterface StackFrame {\n file: string;\n line: number;\n col: number;\n}\n\nfunction parse_stack_frames(stack: string | undefined): StackFrame[] {\n if (!stack) return [];\n const frames: StackFrame[] = [];\n const lines = stack.split(\"\\n\");\n for (const line of lines.slice(1)) {\n // Matches: \" at Something (file:line:col)\" or \" at file:line:col\"\n const m =\n line.match(/at\\s+(?:\\S+\\s+)?\\(([^)]+):(\\d+):(\\d+)\\)/) ||\n line.match(/at\\s+(\\/[^\\s:]+):(\\d+):(\\d+)/);\n if (!m) continue;\n const file = m[1];\n const ln = parseInt(m[2], 10);\n const col = parseInt(m[3], 10);\n if (file && ln) {\n frames.push({ file, line: ln, col });\n }\n }\n return frames;\n}\n\n/** Return the deepest frame whose file path contains /src/ */\nfunction find_src_frame(frames: StackFrame[]): StackFrame | undefined {\n // \"deepest\" = last in the array (innermost call)\n const src_frames = frames.filter(\n (f) => f.file.includes(\"/src/\") && !f.file.includes(\"test-harness\")\n );\n return src_frames[src_frames.length - 1];\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// File reading (server/Node.js only — graceful fallback in browser)\n// ────────────────────────────────────────────────────────────────────────────\n\nfunction read_file_lines(file_path: string): string[] | null {\n try {\n // Dynamic require to avoid bundler errors in browser environments\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const fs = require(\"node:fs\") as typeof import(\"node:fs\");\n const content = fs.readFileSync(file_path, \"utf-8\");\n return content.split(\"\\n\");\n } catch {\n return null;\n }\n}\n\nfunction extract_context_lines(\n lines: string[],\n target_line: number,\n context: number,\n mark_text: string\n): string {\n const start = Math.max(0, target_line - context - 1);\n const end = Math.min(lines.length - 1, target_line + context - 1);\n const result: string[] = [];\n for (let i = start; i <= end; i++) {\n const line_num = i + 1;\n const line_content = lines[i] ?? \"\";\n if (line_num === target_line) {\n result.push(`${line_content} ${mark_text}`);\n } else {\n result.push(line_content);\n }\n }\n return result.join(\"\\n\");\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Simple diff computation\n// ────────────────────────────────────────────────────────────────────────────\n\nfunction compute_diff(expected: unknown, actual: unknown): string {\n if (\n typeof expected === \"object\" &&\n expected !== null &&\n typeof actual === \"object\" &&\n actual !== null\n ) {\n // JSON diff style — show added/removed keys\n const e_obj = expected as Record<string, unknown>;\n const a_obj = actual as Record<string, unknown>;\n const all_keys = new Set([...Object.keys(e_obj), ...Object.keys(a_obj)]);\n const lines: string[] = [];\n for (const key of all_keys) {\n const e_val = JSON.stringify(e_obj[key]);\n const a_val = JSON.stringify(a_obj[key]);\n if (e_val === a_val) {\n lines.push(` ${key}: ${e_val}`);\n } else if (key in e_obj && !(key in a_obj)) {\n lines.push(`- ${key}: ${e_val}`);\n } else if (!(key in e_obj) && key in a_obj) {\n lines.push(`+ ${key}: ${a_val}`);\n } else {\n lines.push(`- ${key}: ${e_val}`);\n lines.push(`+ ${key}: ${a_val}`);\n }\n }\n return lines.join(\"\\n\");\n }\n\n if (typeof expected === \"string\" && typeof actual === \"string\") {\n // Simple string diff — line-level\n const e_lines = expected.split(\"\\n\");\n const a_lines = actual.split(\"\\n\");\n const lines: string[] = [];\n const max = Math.max(e_lines.length, a_lines.length);\n for (let i = 0; i < max; i++) {\n const e_line = e_lines[i];\n const a_line = a_lines[i];\n if (e_line === a_line) {\n lines.push(` ${e_line ?? \"\"}`);\n } else {\n if (e_line !== undefined) lines.push(`- ${e_line}`);\n if (a_line !== undefined) lines.push(`+ ${a_line}`);\n }\n }\n return lines.join(\"\\n\");\n }\n\n // Primitives — side-by-side\n return `- ${JSON.stringify(expected)}\\n+ ${JSON.stringify(actual)}`;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// TASK footer generation\n// ────────────────────────────────────────────────────────────────────────────\n\nfunction build_task_footer(\n fc: FailedCase,\n src_frame: StackFrame | undefined,\n assertion_type: string\n): string {\n const loc = src_frame ? `\\`${src_frame.file}:${src_frame.line}\\`` : \"the source code\";\n const scenario = fc.scenarioId;\n const pkg = fc.pkg;\n\n let body: string;\n\n if (assertion_type === \"assertEqual\") {\n body =\n `The test expects ${JSON.stringify(fc.expected)}; the code returned ` +\n `${JSON.stringify(fc.actual)}. The suspect line in ${loc} returns the wrong value. ` +\n `Fix and re-run the \\`${scenario}\\` scenario.`;\n } else if (assertion_type.startsWith(\"assertThrows\")) {\n const msg = fc.error.message ?? \"\";\n if (msg.includes(\"returned without throwing\")) {\n body =\n `The test expects this call to throw ${JSON.stringify(fc.expected)} but it returned ` +\n `${JSON.stringify(fc.actual)} without throwing. Add the missing error case in ${loc}.`;\n } else {\n body =\n `Expected ${JSON.stringify(fc.expected)} but got ${JSON.stringify(fc.actual)}. ` +\n `The error type/code in ${loc} is wrong.`;\n }\n } else if (assertion_type === \"assertResolves\") {\n body =\n `The test expects the promise to resolve but it rejected. ` +\n `Check ${loc} for the rejection source.`;\n } else if (assertion_type === \"assertRejects\") {\n if (fc.actual === \"resolved\") {\n body =\n `The test expects the promise to reject but it resolved without error. ` +\n `Add the missing rejection case in ${loc}.`;\n } else {\n body =\n `Expected a rejection of type ${JSON.stringify(fc.expected)} but got ` +\n `${JSON.stringify(fc.actual)}. Fix the error type in ${loc}.`;\n }\n } else {\n body =\n `The assertion in ${loc} failed. Check the values and fix the implementation.`;\n }\n\n return (\n `## TASK\\n\\n` +\n `${body}\\n\\n` +\n `Verify your fix by re-running:\\n` +\n `\\`\\`\\`bash\\ncd ${pkg}/test-app && npm run dev # then Run scenario in the test-app\\n\\`\\`\\`\\n\\n` +\n `Or via the autotest runner: click \"Run\" next to the \\`${scenario}\\` scenario.`\n );\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Main formatter\n// ────────────────────────────────────────────────────────────────────────────\n\nexport async function formatAsClaudePrompt(\n fc: FailedCase,\n opts: FormatOptions = {}\n): Promise<string> {\n const {\n includeRingBuffer = true,\n includeCodeContext = true,\n maxRingBufferEntries = 15,\n } = opts;\n\n const sections: string[] = [];\n\n // ── Section 1: Header ────────────────────────────────────────────────────\n const cid = fc.correlationId ?? \"n/a\";\n const duration_str = fc.durationMs != null ? `${fc.durationMs}ms` : \"n/a\";\n const scenario_loc = fc.scenarioFilePath\n ? ` (\\`${fc.scenarioFilePath}\\`)`\n : \"\";\n\n sections.push(\n `# Failed: ${fc.pkg} / ${fc.scenarioId} / \"${fc.caseName}\"\\n\\n` +\n `**Package:** ${fc.pkg}\\n` +\n `**Scenario:** ${fc.scenarioId}${scenario_loc}\\n` +\n `**Case:** \"${fc.caseName}\"\\n` +\n `**Correlation ID:** ${cid}\\n` +\n `**Duration:** ${duration_str}\\n` +\n `**Failed at:** ${fc.failedAt.toISOString()}`\n );\n\n // ── Section 2: What went wrong ───────────────────────────────────────────\n sections.push(`## What went wrong\\n\\n${fc.error.message}`);\n\n // ── Section 3: Expected / Actual / Diff ──────────────────────────────────\n const has_assertion = fc.error instanceof HazoAssertionError;\n const expected = has_assertion ? (fc.error as HazoAssertionError).expected : fc.expected;\n const actual = has_assertion ? (fc.error as HazoAssertionError).actual : fc.actual;\n\n let exp_actual_section =\n `## Expected\\n\\n${JSON.stringify(expected, null, 2)}\\n\\n` +\n `## Actual\\n\\n${JSON.stringify(actual, null, 2)}\\n\\n` +\n `## Diff (computed)\\n\\n\\`\\`\\`\\n${compute_diff(expected, actual)}\\n\\`\\`\\``;\n sections.push(exp_actual_section);\n\n // ── Section 4: Test code ─────────────────────────────────────────────────\n if (includeCodeContext) {\n let test_code_section = \"## Test code\\n\\n\";\n const call_site =\n fc.error instanceof HazoAssertionError ? (fc.error as HazoAssertionError).callSite : undefined;\n\n if (fc.scenarioFilePath && call_site) {\n // call_site is like \"/abs/path.ts:42:10\" — extract line number\n const call_site_parts = call_site.split(\":\");\n const line_num = parseInt(call_site_parts[call_site_parts.length - 2] ?? \"0\", 10);\n\n const file_lines = read_file_lines(fc.scenarioFilePath);\n if (file_lines && line_num > 0) {\n const start = Math.max(0, line_num - 5 - 1);\n const end = Math.min(file_lines.length - 1, line_num + 5 - 1);\n const context = extract_context_lines(file_lines, line_num, 5, \"// ← failed here\");\n test_code_section +=\n `\\`${fc.scenarioFilePath}:${start + 1}-${end + 1}\\`\\n\\n` +\n `\\`\\`\\`ts\\n${context}\\n\\`\\`\\``;\n } else {\n test_code_section += `\\`${fc.scenarioFilePath}\\`\\n\\nsource unavailable`;\n }\n } else if (fc.scenarioFilePath) {\n test_code_section += `\\`${fc.scenarioFilePath}\\`\\n\\nsource unavailable (no call-site captured)`;\n } else {\n test_code_section += \"source unavailable\";\n }\n sections.push(test_code_section);\n }\n\n // ── Section 5: Code under test ───────────────────────────────────────────\n if (includeCodeContext) {\n let code_section = \"## Code under test\\n\\n\";\n const frames = parse_stack_frames(fc.error.stack);\n const src_frame = find_src_frame(frames);\n\n if (src_frame) {\n const src_lines = read_file_lines(src_frame.file);\n if (src_lines) {\n const start = Math.max(0, src_frame.line - 8 - 1);\n const end = Math.min(src_lines.length - 1, src_frame.line + 7 - 1);\n const context = extract_context_lines(src_lines, src_frame.line, 8, \"// ← suspect line\");\n code_section +=\n `\\`${src_frame.file}:${start + 1}-${end + 1}\\`\\n\\n` +\n `\\`\\`\\`ts\\n${context}\\n\\`\\`\\``;\n\n // All in-package frames as a sub-section\n const all_src = frames.filter(\n (f) => f.file.includes(\"/src/\") && !f.file.includes(\"test-harness\")\n );\n if (all_src.length > 1) {\n code_section +=\n \"\\n\\n**Stack (in-package frames):**\\n\" +\n all_src.map((f) => `- \\`${f.file}:${f.line}\\``).join(\"\\n\");\n }\n } else {\n code_section += `\\`${src_frame.file}:${src_frame.line}\\`\\n\\nsource unavailable`;\n }\n } else {\n code_section += \"source unavailable\";\n }\n sections.push(code_section);\n }\n\n // ── Section 6: Error chain ───────────────────────────────────────────────\n const chain_lines: string[] = [];\n let current: unknown = fc.error;\n let depth = 0;\n const include_stack =\n process.env.NODE_ENV !== \"production\" || process.env.HAZO_INCLUDE_STACK === \"1\";\n\n while (current instanceof Error && depth < 10) {\n const prefix = depth === 0 ? \"Top\" : \"caused by\";\n let entry = `- ${prefix}: \\`${current.constructor.name}: ${current.message}\\``;\n if (include_stack && current.stack) {\n entry += `\\n \\`\\`\\`\\n ${current.stack.split(\"\\n\").slice(0, 4).join(\"\\n \")}\\n \\`\\`\\``;\n }\n chain_lines.push(entry);\n current = (current as Error & { cause?: unknown }).cause;\n depth++;\n }\n\n if (chain_lines.length === 0) {\n chain_lines.push(\"- (no error captured)\");\n } else if (!(current instanceof Error) && depth > 0 && current === undefined) {\n chain_lines.push(\"- (No `cause`)\");\n }\n\n sections.push(`## Error chain\\n\\n${chain_lines.join(\"\\n\")}`);\n\n // ── Section 7: Context at test run ───────────────────────────────────────\n const node_env = redact_secrets(process.env.NODE_ENV ?? \"undefined\");\n const hazo_env = redact_secrets(process.env.HAZO_ENV ?? \"unset\");\n const node_ver = process.version ?? \"unknown\";\n\n const ctx_lines = [\n `- Node: ${node_ver}`,\n `- NODE_ENV: ${node_env}`,\n `- HAZO_ENV: ${hazo_env}`,\n ];\n if (fc.adapter) ctx_lines.push(`- Adapter: ${fc.adapter}`);\n if (fc.relevantConfig && Object.keys(fc.relevantConfig).length > 0) {\n ctx_lines.push(\"- Relevant config:\");\n for (const [k, v] of Object.entries(fc.relevantConfig)) {\n ctx_lines.push(` - \\`${k} = \"${redact_secrets(v)}\"\\``);\n }\n }\n\n sections.push(`## Context at test run\\n\\n${ctx_lines.join(\"\\n\")}`);\n\n // ── Section 8: Ring buffer ───────────────────────────────────────────────\n if (includeRingBuffer) {\n let ring_section = `## Ring buffer (last ${maxRingBufferEntries} events on this correlation ID)\\n\\n`;\n try {\n const hazo_logs = await optional_import<Record<string, unknown>>(\"hazo_logs\");\n const get_ring = hazo_logs?.[\"getRingBuffer\"] as\n | ((cid: string, n?: number) => unknown[] | undefined)\n | undefined;\n\n if (!hazo_logs || typeof get_ring !== \"function\") {\n ring_section += \"ring buffer not available (hazo_logs >= 2.0.0 required)\";\n } else if (fc.correlationId) {\n const entries = get_ring(fc.correlationId, maxRingBufferEntries);\n if (!entries || entries.length === 0) {\n ring_section += \"no buffered events\";\n } else {\n ring_section += \"```\\n\" + entries.map((e) => JSON.stringify(e)).join(\"\\n\") + \"\\n```\";\n }\n } else {\n ring_section += \"no correlation ID — ring buffer not queried\";\n }\n } catch {\n ring_section += \"ring buffer not available (hazo_logs >= 2.0.0 required)\";\n }\n sections.push(ring_section);\n }\n\n // ── TASK footer ──────────────────────────────────────────────────────────\n const frames_for_task = parse_stack_frames(fc.error.stack);\n const src_frame_for_task = find_src_frame(frames_for_task);\n\n // Determine assertion type from error message / class\n let assertion_type = \"unknown\";\n if (fc.error instanceof HazoAssertionError) {\n const msg = fc.error.message;\n if (msg.startsWith(\"assertEqual\")) assertion_type = \"assertEqual\";\n else if (msg.startsWith(\"assertThrows\")) assertion_type = \"assertThrows\";\n else if (msg.startsWith(\"assertResolves\")) assertion_type = \"assertResolves\";\n else if (msg.startsWith(\"assertRejects\")) assertion_type = \"assertRejects\";\n else if (msg.startsWith(\"assertMatch\")) assertion_type = \"assertMatch\";\n else if (msg.startsWith(\"assertIncludes\")) assertion_type = \"assertIncludes\";\n }\n\n sections.push(build_task_footer(fc, src_frame_for_task, assertion_type));\n\n return sections.join(\"\\n\\n---\\n\\n\");\n}\n","// test-harness/runner/copy_all.tsx\n// CopyAllFailuresButton — copies a TOC + all failure blocks to clipboard per spec §3.3.\n\n\"use client\";\n\nimport React, { useState } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport type { CaseResult } from \"./provider\";\nimport { formatAsClaudePrompt } from \"../scenarios/format\";\nimport { getRegistry } from \"../scenarios/api\";\nimport type { FailedCase } from \"../scenarios/format\";\n\n// ────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ────────────────────────────────────────────────────────────────────────────\n\nasync function build_copy_all_text(failed_cases: CaseResult[]): Promise<string> {\n const registry = getRegistry();\n const scenario_ids = Array.from(registry.keys());\n\n // Map case results to FailedCase objects — we need to find which scenario\n // each case belongs to by searching the registry.\n const failed_with_context: Array<{ fc: FailedCase; scenario_id: string }> = [];\n\n for (const cr of failed_cases) {\n if (!cr.error) continue;\n // Prefer the scenarioId stored on the CaseResult (populated by runScenario).\n // Fall back to searching the registry by case name for backwards compatibility.\n const scenario_id = cr.scenarioId\n ?? scenario_ids.find((sid) =>\n registry.get(sid)?.cases.some((c) => c.name === cr.name)\n );\n if (!scenario_id) continue;\n const scenario = registry.get(scenario_id);\n if (!scenario) continue;\n failed_with_context.push({\n fc: {\n pkg: scenario.pkg,\n scenarioId: scenario_id,\n caseName: cr.name,\n failedAt: new Date(),\n error: cr.error,\n durationMs: cr.durationMs,\n scenarioFilePath: scenario.filePath,\n expected: cr.expected,\n actual: cr.actual,\n },\n scenario_id,\n });\n }\n\n if (failed_with_context.length === 0) return \"\";\n\n // Count unique scenarios\n const unique_scenarios = new Set(failed_with_context.map((x) => x.scenario_id));\n\n // Build TOC\n const toc_lines = failed_with_context.map(\n ({ fc }, i) =>\n `${i + 1}. \\`${fc.pkg} / ${fc.scenarioId} / \"${fc.caseName}\"\\``\n );\n\n const header =\n `# Test failures (${failed_with_context.length} case${failed_with_context.length === 1 ? \"\" : \"s\"} ` +\n `failed across ${unique_scenarios.size} scenario${unique_scenarios.size === 1 ? \"\" : \"s\"})\\n\\n` +\n `## Failed cases\\n\\n` +\n toc_lines.join(\"\\n\");\n\n // Build each failure block\n const blocks = await Promise.all(\n failed_with_context.map(({ fc }) => formatAsClaudePrompt(fc))\n );\n\n return [header, ...blocks].join(\"\\n\\n---\\n\\n\");\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Component\n// ────────────────────────────────────────────────────────────────────────────\n\nexport function CopyAllFailuresButton({\n failedCases,\n}: {\n failedCases: CaseResult[];\n}): React.JSX.Element {\n const [state, set_state] = useState<\"idle\" | \"copying\" | \"copied\" | \"error\">(\"idle\");\n\n async function handle_click(): Promise<void> {\n set_state(\"copying\");\n try {\n const text = await build_copy_all_text(failedCases);\n if (!text) {\n set_state(\"idle\");\n return;\n }\n await navigator.clipboard.writeText(text);\n set_state(\"copied\");\n setTimeout(() => set_state(\"idle\"), 2500);\n } catch {\n set_state(\"error\");\n setTimeout(() => set_state(\"idle\"), 2500);\n }\n }\n\n const label_map = {\n idle: `Copy ${failedCases.length} failure${failedCases.length === 1 ? \"\" : \"s\"}`,\n copying: \"Copying...\",\n copied: \"Copied!\",\n error: \"Failed to copy\",\n };\n\n return (\n <button\n onClick={handle_click}\n disabled={state === \"copying\" || failedCases.length === 0}\n className={cn(\n \"px-3 py-1.5 rounded text-xs font-medium transition-colors border\",\n state === \"copied\"\n ? \"bg-green-50 border-green-300 text-green-700\"\n : state === \"error\"\n ? \"bg-red-50 border-red-300 text-red-700\"\n : \"bg-orange-50 border-orange-300 text-orange-700 hover:bg-orange-100\"\n )}\n >\n {label_map[state]}\n </button>\n );\n}\n","// test-harness/runner/runner.tsx\n// AutoTestRunner — renders all registered scenarios with Run / Run All controls\n// and per-case pass/fail/timing output.\n\n\"use client\";\n\nimport React, { useState } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { useAutoTest } from \"./provider\";\nimport type { CaseResult, ScenarioResult } from \"./provider\";\nimport { CopyAllFailuresButton } from \"./copy_all\";\nimport { getRegistry } from \"../scenarios/api\";\nimport { formatAsClaudePrompt } from \"../scenarios/format\";\nimport type { FailedCase } from \"../scenarios/format\";\n\n// ────────────────────────────────────────────────────────────────────────────\n// Status badge\n// ────────────────────────────────────────────────────────────────────────────\n\nfunction StatusBadge({ status }: { status: CaseResult[\"status\"] }): React.JSX.Element {\n const map: Record<string, string> = {\n pending: \"bg-gray-100 text-gray-500\",\n running: \"bg-blue-100 text-blue-600 animate-pulse\",\n passed: \"bg-green-100 text-green-700\",\n failed: \"bg-red-100 text-red-700\",\n };\n const label_map: Record<string, string> = {\n pending: \"pending\",\n running: \"running\",\n passed: \"passed\",\n failed: \"failed\",\n };\n return (\n <span\n className={cn(\n \"inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium\",\n map[status] ?? map[\"pending\"]\n )}\n >\n {label_map[status] ?? status}\n </span>\n );\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Status icon for individual cases\n// ────────────────────────────────────────────────────────────────────────────\n\nfunction StatusIcon({ status }: { status: CaseResult[\"status\"] }): React.JSX.Element {\n if (status === \"passed\") return <span className=\"text-green-600 font-bold\">✓</span>;\n if (status === \"failed\") return <span className=\"text-red-600 font-bold\">✗</span>;\n if (status === \"running\") return <span className=\"text-blue-500\">⟳</span>;\n return <span className=\"text-gray-400\">○</span>;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Copy prompt button for a single failed case\n// ────────────────────────────────────────────────────────────────────────────\n\nfunction CopySinglePromptButton({\n scenario_id,\n case_result,\n pkg,\n}: {\n scenario_id: string;\n case_result: CaseResult;\n pkg: string;\n}): React.JSX.Element {\n const [copied, set_copied] = useState(false);\n\n async function handle_copy(): Promise<void> {\n const scenario = getRegistry().get(scenario_id);\n if (!case_result.error) return;\n\n const fc: FailedCase = {\n pkg,\n scenarioId: scenario_id,\n caseName: case_result.name,\n failedAt: new Date(),\n error: case_result.error,\n durationMs: case_result.durationMs,\n scenarioFilePath: scenario?.filePath,\n expected: case_result.expected,\n actual: case_result.actual,\n };\n\n const text = await formatAsClaudePrompt(fc);\n await navigator.clipboard.writeText(text);\n set_copied(true);\n setTimeout(() => set_copied(false), 2000);\n }\n\n return (\n <button\n onClick={handle_copy}\n className=\"ml-2 text-xs text-blue-600 hover:text-blue-800 underline\"\n >\n {copied ? \"Copied!\" : \"Copy prompt\"}\n </button>\n );\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Case row — expands to show doc panel\n// ────────────────────────────────────────────────────────────────────────────\n\nfunction CaseRow({\n c,\n scenario_id,\n pkg,\n}: {\n c: CaseResult;\n scenario_id: string;\n pkg: string;\n}): React.JSX.Element {\n const [expanded, set_expanded] = useState(false);\n return (\n <div className=\"px-6 py-2\">\n <div className=\"flex items-center gap-2 text-sm\">\n {c.doc && (\n <button\n onClick={() => set_expanded((v) => !v)}\n className=\"text-gray-400 hover:text-gray-600 text-xs font-mono w-3 shrink-0\"\n aria-label={expanded ? \"Collapse doc\" : \"Expand doc\"}\n >\n {expanded ? \"▾\" : \"▸\"}\n </button>\n )}\n {!c.doc && <span className=\"w-3 shrink-0\" />}\n <StatusIcon status={c.status} />\n <span className={cn(\n \"flex-1\",\n c.status === \"failed\" ? \"text-red-700\" : \"text-gray-700\"\n )}>\n {c.name}\n </span>\n {c.durationMs != null && (\n <span className=\"text-xs text-gray-400\">{c.durationMs}ms</span>\n )}\n {c.status === \"failed\" && c.error && (\n <CopySinglePromptButton\n scenario_id={scenario_id}\n case_result={c}\n pkg={pkg}\n />\n )}\n </div>\n {expanded && c.doc && (\n <div className=\"mt-2 ml-8 text-xs rounded border border-gray-100 bg-gray-50 divide-y divide-gray-100\">\n <div className=\"px-3 py-2\">\n <span className=\"font-semibold text-gray-600\">Description</span>\n <p className=\"mt-0.5 text-gray-700\">{c.doc.description}</p>\n </div>\n <div className=\"px-3 py-2\">\n <span className=\"font-semibold text-gray-600\">Inputs</span>\n <p className=\"mt-0.5 text-gray-700\">{c.doc.inputs}</p>\n </div>\n <div className=\"px-3 py-2\">\n <span className=\"font-semibold text-gray-600\">Expected outputs</span>\n <p className=\"mt-0.5 text-gray-700\">{c.doc.expectedOutputs}</p>\n </div>\n <div className=\"px-3 py-2\">\n <span className=\"font-semibold text-gray-600\">Caveats</span>\n <p className=\"mt-0.5 text-gray-700\">{c.doc.caveats}</p>\n </div>\n </div>\n )}\n {c.status === \"failed\" && c.error && (\n <div className=\"mt-1 ml-8 text-xs text-red-600 bg-red-50 rounded px-2 py-1 font-mono\">\n {c.error.message}\n </div>\n )}\n </div>\n );\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Scenario row\n// ────────────────────────────────────────────────────────────────────────────\n\nfunction ScenarioRow({\n scenario,\n pkg,\n}: {\n scenario: ScenarioResult;\n pkg: string;\n}): React.JSX.Element {\n const { runScenario } = useAutoTest();\n const [expanded, set_expanded] = useState(false);\n\n const is_running = scenario.status === \"running\";\n\n return (\n <div className=\"border border-gray-200 rounded-lg overflow-hidden\">\n {/* Scenario header */}\n <div className=\"flex items-center justify-between px-4 py-3 bg-gray-50\">\n <div className=\"flex items-center gap-3\">\n <button\n onClick={() => set_expanded((v) => !v)}\n className=\"text-gray-500 hover:text-gray-700 text-sm font-mono\"\n aria-label={expanded ? \"Collapse cases\" : \"Expand cases\"}\n >\n {expanded ? \"▾\" : \"▸\"}\n </button>\n <span className=\"font-medium text-sm text-gray-800\">{scenario.name}</span>\n <StatusBadge status={scenario.status} />\n <span className=\"text-xs text-gray-400\">\n {scenario.cases.filter((c) => c.status === \"passed\").length}/\n {scenario.cases.length} passed\n </span>\n </div>\n <button\n disabled={is_running}\n onClick={() => runScenario(scenario.id)}\n className={cn(\n \"px-3 py-1 rounded text-xs font-medium transition-colors\",\n is_running\n ? \"bg-gray-100 text-gray-400 cursor-not-allowed\"\n : \"bg-blue-600 text-white hover:bg-blue-700 cursor-pointer\"\n )}\n >\n {is_running ? \"Running...\" : \"Run\"}\n </button>\n </div>\n\n {/* Case list */}\n {expanded && (\n <div className=\"divide-y divide-gray-100\">\n {scenario.cases.map((c, i) => (\n <CaseRow key={i} c={c} scenario_id={scenario.id} pkg={pkg} />\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// AutoTestRunner — main export\n// ────────────────────────────────────────────────────────────────────────────\n\nexport function AutoTestRunner(): React.JSX.Element {\n const { scenarios, runAll, reset } = useAutoTest();\n const registry = getRegistry();\n\n // Derive pkg from first registered scenario\n const first_scenario = Array.from(registry.values())[0];\n const pkg = first_scenario?.pkg ?? \"unknown\";\n\n const scenario_list = Array.from(scenarios.values());\n const any_running = scenario_list.some((s) => s.status === \"running\");\n const total_cases = scenario_list.reduce((acc, s) => acc + s.cases.length, 0);\n const passed_cases = scenario_list.reduce(\n (acc, s) => acc + s.cases.filter((c) => c.status === \"passed\").length,\n 0\n );\n const failed_cases_flat = scenario_list.flatMap((s) =>\n s.cases.filter((c) => c.status === \"failed\")\n );\n\n return (\n <div className=\"cls_auto_test_runner p-4 space-y-4\">\n {/* Toolbar */}\n <div className=\"flex items-center justify-between\">\n <div>\n <h2 className=\"text-base font-semibold text-gray-800\">Test Scenarios</h2>\n {total_cases > 0 && (\n <p className=\"text-xs text-gray-500 mt-0.5\">\n {passed_cases}/{total_cases} cases passed\n {failed_cases_flat.length > 0 && (\n <span className=\"text-red-600 ml-2\">\n · {failed_cases_flat.length} failed\n </span>\n )}\n </p>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n {failed_cases_flat.length > 0 && (\n <CopyAllFailuresButton failedCases={failed_cases_flat} />\n )}\n <button\n onClick={reset}\n disabled={any_running}\n className=\"px-3 py-1.5 rounded text-xs font-medium border border-gray-300 text-gray-600 hover:bg-gray-50 disabled:opacity-50\"\n >\n Reset\n </button>\n <button\n onClick={runAll}\n disabled={any_running}\n className={cn(\n \"px-4 py-1.5 rounded text-xs font-medium transition-colors\",\n any_running\n ? \"bg-gray-100 text-gray-400 cursor-not-allowed\"\n : \"bg-green-600 text-white hover:bg-green-700 cursor-pointer\"\n )}\n >\n {any_running ? \"Running...\" : \"Run All\"}\n </button>\n </div>\n </div>\n\n {/* Scenario list */}\n {scenario_list.length === 0 ? (\n <div className=\"text-sm text-gray-500 italic py-8 text-center\">\n No scenarios registered. Import your scenario files to populate this runner.\n </div>\n ) : (\n <div className=\"space-y-2\">\n {scenario_list.map((s) => (\n <ScenarioRow key={s.id} scenario={s} pkg={pkg} />\n ))}\n </div>\n )}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/lib/utils.ts","../../src/test-harness/ui/sidebar.tsx","../../src/test-harness/scenarios/api.ts","../../src/test-harness/runner/provider.tsx","../../src/test-harness/scenarios/assertions.ts","../../src/test-harness/scenarios/format.ts","../../src/test-harness/runner/copy_all.tsx","../../src/test-harness/runner/runner.tsx"],"names":["registry","useState","jsx","jsxs"],"mappings":"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","file":"index.js","sourcesContent":["// Utility functions for hazo_ui component library\n// Provides className merging utility (cn function)\n\nimport { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Merges class names using clsx and tailwind-merge\n * @param inputs - Class values to merge\n * @returns Merged class string\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n","// test-harness/ui/sidebar.tsx\n// SidebarLayout and AppSidebar components for hazo_* test-app layouts.\n// Two-column layout: fixed sidebar left, scrollable content right.\n\n\"use client\";\n\nimport React, { useState } from \"react\";\nimport { cn } from \"../../lib/utils\";\n\n// ────────────────────────────────────────────────────────────────────────────\n// Types\n// ────────────────────────────────────────────────────────────────────────────\n\nexport interface NavItem {\n label: string;\n href: string;\n icon?: React.ReactNode;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// SidebarLayout\n// ────────────────────────────────────────────────────────────────────────────\n\n/**\n * Two-column layout shell.\n * - Left column: sidebar (fixed height, scrollable internally)\n * - Right column: main content (fills remaining width, scrollable)\n */\nexport function SidebarLayout({\n sidebar,\n children,\n}: {\n sidebar: React.ReactNode;\n children: React.ReactNode;\n}): React.JSX.Element {\n return (\n <div className=\"cls_sidebar_layout flex h-screen w-full overflow-hidden bg-gray-50\">\n {/* Sidebar */}\n <aside className=\"cls_sidebar_aside flex-none w-60 h-full flex flex-col bg-white border-r border-gray-200 overflow-y-auto\">\n {sidebar}\n </aside>\n\n {/* Main content */}\n <main className=\"cls_sidebar_main flex-1 h-full overflow-y-auto\">\n {children}\n </main>\n </div>\n );\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// ActiveLink — renders a nav link with active state detection\n// ────────────────────────────────────────────────────────────────────────────\n\nfunction ActiveLink({\n item,\n current_path,\n}: {\n item: NavItem;\n current_path: string;\n}): React.JSX.Element {\n const is_active =\n item.href === \"/\"\n ? current_path === \"/\"\n : current_path === item.href || current_path.startsWith(item.href + \"/\");\n\n return (\n <a\n href={item.href}\n className={cn(\n \"flex items-center gap-2.5 rounded-md px-3 py-2 text-sm font-medium transition-colors\",\n is_active\n ? \"bg-blue-50 text-blue-700\"\n : \"text-gray-600 hover:bg-gray-100 hover:text-gray-900\"\n )}\n >\n {item.icon && (\n <span className={cn(\"flex-none text-base\", is_active ? \"text-blue-600\" : \"text-gray-400\")}>\n {item.icon}\n </span>\n )}\n {item.label}\n </a>\n );\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// AppSidebar\n// ────────────────────────────────────────────────────────────────────────────\n\n/**\n * Per-package navigation sidebar.\n * Reads the current pathname from window.location (SSR-safe via state initialisation).\n */\nexport function AppSidebar({\n pkg,\n navItems,\n}: {\n pkg: string;\n navItems: NavItem[];\n}): React.JSX.Element {\n const [collapsed, set_collapsed] = useState(false);\n\n // SSR-safe: default to \"/\" on server, update on client\n const [current_path, set_current_path] = useState(\"/\");\n\n // Update path on mount and on popstate\n React.useEffect(() => {\n function update_path(): void {\n set_current_path(window.location.pathname);\n }\n update_path();\n window.addEventListener(\"popstate\", update_path);\n return () => window.removeEventListener(\"popstate\", update_path);\n }, []);\n\n if (collapsed) {\n return (\n <div className=\"cls_app_sidebar_collapsed flex flex-col items-center py-3 gap-2 w-12 bg-white border-r border-gray-200 h-full\">\n <button\n onClick={() => set_collapsed(false)}\n className=\"p-1.5 rounded hover:bg-gray-100 text-gray-500\"\n aria-label=\"Expand sidebar\"\n >\n ▶\n </button>\n {navItems.map((item) => (\n <a\n key={item.href}\n href={item.href}\n className=\"p-1.5 rounded hover:bg-gray-100 text-gray-500 text-base\"\n title={item.label}\n >\n {item.icon ?? item.label.slice(0, 1)}\n </a>\n ))}\n </div>\n );\n }\n\n return (\n <div className=\"cls_app_sidebar flex flex-col h-full\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-gray-100\">\n <span className=\"font-semibold text-sm text-gray-800 truncate\">{pkg}</span>\n <button\n onClick={() => set_collapsed(true)}\n className=\"flex-none p-1 rounded hover:bg-gray-100 text-gray-400 hover:text-gray-600\"\n aria-label=\"Collapse sidebar\"\n >\n ◀\n </button>\n </div>\n\n {/* Nav */}\n <nav className=\"flex-1 overflow-y-auto px-2 py-2 space-y-0.5\">\n {navItems.map((item) => (\n <ActiveLink key={item.href} item={item} current_path={current_path} />\n ))}\n </nav>\n\n {/* Footer */}\n <div className=\"px-4 py-3 border-t border-gray-100\">\n <p className=\"text-xs text-gray-400\">Press ? for shortcuts</p>\n </div>\n </div>\n );\n}\n","// test-harness/scenarios/api.ts\n// Global scenario registry for the hazo_ui test harness.\n// Scenarios are registered at module load time via registerScenario().\n\nexport interface CaseDoc {\n /** What this test verifies, in plain language. */\n description: string;\n /** The inputs / preconditions the case feeds in (URL, payload, fixture, state). */\n inputs: string;\n /** The outputs / state the case asserts on success. */\n expectedOutputs: string;\n /** Known limitations, assumptions, or gotchas. Use \"None\" when not applicable. */\n caveats: string;\n}\n\nexport interface Case {\n name: string;\n run: () => Promise<void>;\n doc: CaseDoc;\n}\n\nexport interface Scenario {\n id: string;\n name: string;\n pkg: string;\n filePath?: string;\n cases: Case[];\n}\n\n// Module-level registry — shared across the entire process\nconst registry = new Map<string, Scenario>();\n\n/**\n * Parse the first non-test-harness file path from an Error stack string.\n * Returns something like \"/abs/path/to/scenario.ts\" or undefined.\n */\nfunction parse_caller_path(stack: string | undefined): string | undefined {\n if (!stack) return undefined;\n const lines = stack.split(\"\\n\");\n // Skip the first line (error message) and find frames outside test-harness\n for (const line of lines.slice(1)) {\n const match = line.match(/\\(([^)]+)\\)/) || line.match(/at\\s+(\\/[^\\s:]+)/);\n if (!match) continue;\n const raw = match[1] ?? match[0];\n const path_part = raw.split(\":\")[0];\n if (!path_part) continue;\n // Skip frames that are inside node internals or the test-harness itself\n if (\n path_part.includes(\"node:\") ||\n path_part.includes(\"test-harness/scenarios/api\") ||\n path_part.includes(\"<anonymous>\")\n ) {\n continue;\n }\n return path_part;\n }\n return undefined;\n}\n\n/**\n * Register a scenario with the global registry.\n * Call this at module load time in your scenario files.\n */\nexport function registerScenario(\n id: string,\n opts: {\n name: string;\n pkg: string;\n cases: Case[];\n }\n): void {\n const stack = new Error().stack;\n const filePath = parse_caller_path(stack);\n\n registry.set(id, {\n id,\n name: opts.name,\n pkg: opts.pkg,\n filePath,\n cases: opts.cases,\n });\n}\n\n/** Return the entire registry (read-only reference). */\nexport function getRegistry(): Map<string, Scenario> {\n return registry;\n}\n\n/** Clear the registry — used in tests only. */\nexport function clearRegistry(): void {\n registry.clear();\n}\n","// test-harness/runner/provider.tsx\n// AutoTestProvider — React context that drives scenario execution and holds run state.\n// Initialises from the global scenario registry populated by registerScenario() calls.\n\n\"use client\";\n\nimport React, { createContext, useCallback, useContext, useRef, useState } from \"react\";\nimport { getRegistry, type CaseDoc } from \"../scenarios/api\";\n\n// ────────────────────────────────────────────────────────────────────────────\n// Public types\n// ────────────────────────────────────────────────────────────────────────────\n\nexport type RunStatus = \"pending\" | \"running\" | \"passed\" | \"failed\";\n\nexport interface CaseResult {\n name: string;\n doc?: CaseDoc;\n scenarioId?: string;\n status: RunStatus;\n durationMs?: number;\n error?: Error;\n expected?: unknown;\n actual?: unknown;\n}\n\nexport interface ScenarioResult {\n id: string;\n name: string;\n status: RunStatus;\n cases: CaseResult[];\n}\n\nexport interface AutoTestContextValue {\n scenarios: Map<string, ScenarioResult>;\n runScenario(id: string): Promise<void>;\n runAll(): Promise<void>;\n reset(): void;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Context\n// ────────────────────────────────────────────────────────────────────────────\n\nconst AutoTestContext = createContext<AutoTestContextValue | null>(null);\n\n// ────────────────────────────────────────────────────────────────────────────\n// Helper: build initial ScenarioResult map from registry\n// ────────────────────────────────────────────────────────────────────────────\n\nfunction build_initial_state(): Map<string, ScenarioResult> {\n const registry = getRegistry();\n const map = new Map<string, ScenarioResult>();\n for (const [id, scenario] of registry) {\n map.set(id, {\n id,\n name: scenario.name,\n status: \"pending\",\n cases: scenario.cases.map((c) => ({\n name: c.name,\n doc: c.doc,\n status: \"pending\",\n })),\n });\n }\n return map;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Provider\n// ────────────────────────────────────────────────────────────────────────────\n\nexport function AutoTestProvider({\n pkg: _pkg,\n children,\n}: {\n pkg: string;\n children: React.ReactNode;\n}): React.JSX.Element {\n const [scenarios, set_scenarios] = useState<Map<string, ScenarioResult>>(\n () => build_initial_state()\n );\n\n // Use a ref so runAll can read the latest scenarios without stale closure\n const scenarios_ref = useRef(scenarios);\n scenarios_ref.current = scenarios;\n\n const update_scenario = useCallback(\n (id: string, updater: (prev: ScenarioResult) => ScenarioResult) => {\n set_scenarios((prev) => {\n const next = new Map(prev);\n const existing = next.get(id);\n if (existing) {\n next.set(id, updater(existing));\n }\n return next;\n });\n },\n []\n );\n\n const runScenario = useCallback(\n async (id: string): Promise<void> => {\n const registry = getRegistry();\n const scenario = registry.get(id);\n if (!scenario) return;\n\n // Mark the scenario as running\n update_scenario(id, (prev) => ({\n ...prev,\n status: \"running\",\n cases: prev.cases.map((c) => ({ ...c, status: \"pending\" })),\n }));\n\n let all_passed = true;\n\n for (let i = 0; i < scenario.cases.length; i++) {\n const case_def = scenario.cases[i];\n if (!case_def) continue;\n\n // Mark this case as running\n update_scenario(id, (prev) => {\n const updated_cases = [...prev.cases];\n updated_cases[i] = { ...updated_cases[i]!, status: \"running\" };\n return { ...prev, cases: updated_cases };\n });\n\n const start_ts = Date.now();\n let result_status: RunStatus = \"passed\";\n let error: Error | undefined;\n let expected: unknown;\n let actual: unknown;\n\n try {\n await case_def.run();\n } catch (err) {\n result_status = \"failed\";\n all_passed = false;\n error = err instanceof Error ? err : new Error(String(err));\n // Extract structured assertion data when available\n if (error && \"expected\" in error) expected = (error as { expected: unknown }).expected;\n if (error && \"actual\" in error) actual = (error as { actual: unknown }).actual;\n }\n\n const duration_ms = Date.now() - start_ts;\n\n update_scenario(id, (prev) => {\n const updated_cases = [...prev.cases];\n updated_cases[i] = {\n ...updated_cases[i]!,\n scenarioId: id,\n status: result_status,\n durationMs: duration_ms,\n error,\n expected,\n actual,\n };\n return { ...prev, cases: updated_cases };\n });\n }\n\n // Mark the overall scenario status\n update_scenario(id, (prev) => ({\n ...prev,\n status: all_passed ? \"passed\" : \"failed\",\n }));\n },\n [update_scenario]\n );\n\n const runAll = useCallback(async (): Promise<void> => {\n const ids = Array.from(getRegistry().keys());\n for (const id of ids) {\n await runScenario(id);\n }\n }, [runScenario]);\n\n const reset = useCallback((): void => {\n set_scenarios(build_initial_state());\n }, []);\n\n const value: AutoTestContextValue = {\n scenarios,\n runScenario,\n runAll,\n reset,\n };\n\n return (\n <AutoTestContext.Provider value={value}>\n {children}\n </AutoTestContext.Provider>\n );\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Hook\n// ────────────────────────────────────────────────────────────────────────────\n\nexport function useAutoTest(): AutoTestContextValue {\n const ctx = useContext(AutoTestContext);\n if (!ctx) {\n throw new Error(\"useAutoTest must be used within an <AutoTestProvider>\");\n }\n return ctx;\n}\n","// test-harness/scenarios/assertions.ts\n// Assertion helpers for hazo_ui test harness.\n// Each helper captures its own call-site for the \"← failed here\" marker in\n// formatAsClaudePrompt section 4.\n\n/**\n * Parse the call-site (file:line) from an Error stack, skipping frames that\n * are inside the assertions module itself.\n */\nfunction capture_call_site(stack: string | undefined): string | undefined {\n if (!stack) return undefined;\n const lines = stack.split(\"\\n\");\n for (const line of lines.slice(1)) {\n const match = line.match(/\\(([^)]+)\\)/) || line.match(/at\\s+(\\/[^\\s]+)/);\n if (!match) continue;\n const raw = match[1] ?? match[0];\n if (\n raw.includes(\"test-harness/scenarios/assertions\") ||\n raw.includes(\"node:\")\n ) {\n continue;\n }\n return raw; // e.g. \"/abs/path/to/file.ts:42:10\"\n }\n return undefined;\n}\n\n/**\n * Assertion error thrown by all helpers in this module.\n * Carries expected/actual values and the call-site string for prompt generation.\n */\nexport class HazoAssertionError extends Error {\n readonly expected: unknown;\n readonly actual: unknown;\n readonly callSite: string | undefined;\n\n constructor(\n message: string,\n expected: unknown,\n actual: unknown,\n callSite: string | undefined\n ) {\n super(message);\n this.name = \"HazoAssertionError\";\n this.expected = expected;\n this.actual = actual;\n this.callSite = callSite;\n }\n}\n\n/**\n * Assert that actual deep-equals expected.\n * Uses JSON serialisation for a lightweight but useful deep-equality check.\n */\nexport function assertEqual<T>(actual: T, expected: T): void {\n const callSite = capture_call_site(new Error().stack);\n const a_str = JSON.stringify(actual);\n const e_str = JSON.stringify(expected);\n if (a_str !== e_str) {\n throw new HazoAssertionError(\n `assertEqual failed: expected ${e_str}, got ${a_str}`,\n expected,\n actual,\n callSite\n );\n }\n}\n\n/**\n * Assert that fn throws (optionally an instance of ErrorClass).\n */\nexport function assertThrows(\n fn: () => unknown,\n ErrorClass?: new (...a: unknown[]) => Error\n): void {\n const callSite = capture_call_site(new Error().stack);\n let thrown: unknown = undefined;\n let did_throw = false;\n try {\n fn();\n } catch (err) {\n thrown = err;\n did_throw = true;\n }\n\n if (!did_throw) {\n throw new HazoAssertionError(\n `assertThrows failed: expected function to throw but it returned without throwing`,\n ErrorClass ? ErrorClass.name : \"Error\",\n \"no throw\",\n callSite\n );\n }\n\n if (ErrorClass && !(thrown instanceof ErrorClass)) {\n const actual_name =\n thrown instanceof Error ? thrown.constructor.name : String(thrown);\n throw new HazoAssertionError(\n `assertThrows failed: expected ${ErrorClass.name} but got ${actual_name}`,\n ErrorClass.name,\n actual_name,\n callSite\n );\n }\n}\n\n/**\n * Assert that the promise resolves without rejection.\n */\nexport async function assertResolves(promise: Promise<unknown>): Promise<void> {\n const callSite = capture_call_site(new Error().stack);\n try {\n await promise;\n } catch (err) {\n const msg =\n err instanceof Error ? err.message : String(err);\n throw new HazoAssertionError(\n `assertResolves failed: promise rejected with \"${msg}\"`,\n \"resolved\",\n `rejected: ${msg}`,\n callSite\n );\n }\n}\n\n/**\n * Assert that the promise rejects (optionally with a specific ErrorClass).\n */\nexport async function assertRejects(\n promise: Promise<unknown>,\n ErrorClass?: new (...a: unknown[]) => Error\n): Promise<void> {\n const callSite = capture_call_site(new Error().stack);\n let thrown: unknown = undefined;\n let did_reject = false;\n try {\n await promise;\n } catch (err) {\n thrown = err;\n did_reject = true;\n }\n\n if (!did_reject) {\n throw new HazoAssertionError(\n `assertRejects failed: expected promise to reject but it resolved`,\n ErrorClass ? ErrorClass.name : \"rejection\",\n \"resolved\",\n callSite\n );\n }\n\n if (ErrorClass && !(thrown instanceof ErrorClass)) {\n const actual_name =\n thrown instanceof Error ? thrown.constructor.name : String(thrown);\n throw new HazoAssertionError(\n `assertRejects failed: expected ${ErrorClass.name} but got ${actual_name}`,\n ErrorClass.name,\n actual_name,\n callSite\n );\n }\n}\n\n/**\n * Assert that str matches pattern.\n */\nexport function assertMatch(str: string, pattern: RegExp): void {\n const callSite = capture_call_site(new Error().stack);\n if (!pattern.test(str)) {\n throw new HazoAssertionError(\n `assertMatch failed: \"${str}\" did not match ${pattern}`,\n pattern.toString(),\n str,\n callSite\n );\n }\n}\n\n/**\n * Assert that arr includes value (using JSON equality).\n */\nexport function assertIncludes<T>(arr: T[], value: T): void {\n const callSite = capture_call_site(new Error().stack);\n const value_str = JSON.stringify(value);\n const found = arr.some((item) => JSON.stringify(item) === value_str);\n if (!found) {\n throw new HazoAssertionError(\n `assertIncludes failed: array does not contain ${value_str}`,\n value,\n arr,\n callSite\n );\n }\n}\n","// test-harness/scenarios/format.ts\n// Produces a self-contained, paste-ready prompt block from a failed test case.\n// Implements all 8 sections from test_harness_design.md §3.\n\n// Import from hazo_core's CLIENT entry, not the root barrel: the root barrel\n// pulls hazo_core/debug (Node createRequire('hazo_debug')) into the client\n// bundle, which Turbopack flags as unresolvable. The client entry exposes\n// optional_import without that server-only code.\nimport { optional_import } from \"hazo_core/client\";\nimport { HazoAssertionError } from \"./assertions\";\n\n// ────────────────────────────────────────────────────────────────────────────\n// Public types\n// ────────────────────────────────────────────────────────────────────────────\n\nexport interface FailedCase {\n pkg: string;\n scenarioId: string;\n caseName: string;\n correlationId?: string;\n durationMs?: number;\n failedAt: Date;\n error: Error;\n expected?: unknown;\n actual?: unknown;\n scenarioFilePath?: string;\n /** e.g. 'sqlite (in-memory)' or 'postgres' */\n adapter?: string;\n /** Config values to surface in section 7. Secret values are auto-redacted. */\n relevantConfig?: Record<string, string>;\n}\n\nexport interface FormatOptions {\n includeRingBuffer?: boolean;\n includeCodeContext?: boolean;\n maxRingBufferEntries?: number;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Secret filtering\n// ────────────────────────────────────────────────────────────────────────────\n\nconst SECRET_PATTERNS = [\n /AKIA[0-9A-Z]{16}/,\n /-----BEGIN.*PRIVATE KEY/,\n /eyJ[a-zA-Z0-9_-]+\\.eyJ/,\n];\n\nfunction redact_secrets(value: string): string {\n let result = value;\n for (const pattern of SECRET_PATTERNS) {\n result = result.replace(new RegExp(pattern.source, pattern.flags + \"g\"), \"<redacted>\");\n }\n return result;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Stack-trace parsing (no external deps — pure regex)\n// ────────────────────────────────────────────────────────────────────────────\n\ninterface StackFrame {\n file: string;\n line: number;\n col: number;\n}\n\nfunction parse_stack_frames(stack: string | undefined): StackFrame[] {\n if (!stack) return [];\n const frames: StackFrame[] = [];\n const lines = stack.split(\"\\n\");\n for (const line of lines.slice(1)) {\n // Matches: \" at Something (file:line:col)\" or \" at file:line:col\"\n const m =\n line.match(/at\\s+(?:\\S+\\s+)?\\(([^)]+):(\\d+):(\\d+)\\)/) ||\n line.match(/at\\s+(\\/[^\\s:]+):(\\d+):(\\d+)/);\n if (!m) continue;\n const file = m[1];\n const ln = parseInt(m[2], 10);\n const col = parseInt(m[3], 10);\n if (file && ln) {\n frames.push({ file, line: ln, col });\n }\n }\n return frames;\n}\n\n/** Return the deepest frame whose file path contains /src/ */\nfunction find_src_frame(frames: StackFrame[]): StackFrame | undefined {\n // \"deepest\" = last in the array (innermost call)\n const src_frames = frames.filter(\n (f) => f.file.includes(\"/src/\") && !f.file.includes(\"test-harness\")\n );\n return src_frames[src_frames.length - 1];\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// File reading (server/Node.js only — graceful fallback in browser)\n// ────────────────────────────────────────────────────────────────────────────\n\nfunction read_file_lines(file_path: string): string[] | null {\n try {\n // Bare \"fs\" (not \"node:fs\"): webpack rejects the \"node:\" scheme with\n // UnhandledSchemeError at build time before this try/catch can run, whereas\n // Next.js stubs the bare \"fs\" specifier to an empty module on the client\n // (resolve.fallback.fs = false), letting the runtime catch below degrade\n // gracefully in the browser. On the server \"fs\" resolves to the real\n // built-in. tsup emits __require(\"fs\") for both forms, so dist is unchanged.\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const fs = require(\"fs\") as typeof import(\"fs\");\n const content = fs.readFileSync(file_path, \"utf-8\");\n return content.split(\"\\n\");\n } catch {\n return null;\n }\n}\n\nfunction extract_context_lines(\n lines: string[],\n target_line: number,\n context: number,\n mark_text: string\n): string {\n const start = Math.max(0, target_line - context - 1);\n const end = Math.min(lines.length - 1, target_line + context - 1);\n const result: string[] = [];\n for (let i = start; i <= end; i++) {\n const line_num = i + 1;\n const line_content = lines[i] ?? \"\";\n if (line_num === target_line) {\n result.push(`${line_content} ${mark_text}`);\n } else {\n result.push(line_content);\n }\n }\n return result.join(\"\\n\");\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Simple diff computation\n// ────────────────────────────────────────────────────────────────────────────\n\nfunction compute_diff(expected: unknown, actual: unknown): string {\n if (\n typeof expected === \"object\" &&\n expected !== null &&\n typeof actual === \"object\" &&\n actual !== null\n ) {\n // JSON diff style — show added/removed keys\n const e_obj = expected as Record<string, unknown>;\n const a_obj = actual as Record<string, unknown>;\n const all_keys = new Set([...Object.keys(e_obj), ...Object.keys(a_obj)]);\n const lines: string[] = [];\n for (const key of all_keys) {\n const e_val = JSON.stringify(e_obj[key]);\n const a_val = JSON.stringify(a_obj[key]);\n if (e_val === a_val) {\n lines.push(` ${key}: ${e_val}`);\n } else if (key in e_obj && !(key in a_obj)) {\n lines.push(`- ${key}: ${e_val}`);\n } else if (!(key in e_obj) && key in a_obj) {\n lines.push(`+ ${key}: ${a_val}`);\n } else {\n lines.push(`- ${key}: ${e_val}`);\n lines.push(`+ ${key}: ${a_val}`);\n }\n }\n return lines.join(\"\\n\");\n }\n\n if (typeof expected === \"string\" && typeof actual === \"string\") {\n // Simple string diff — line-level\n const e_lines = expected.split(\"\\n\");\n const a_lines = actual.split(\"\\n\");\n const lines: string[] = [];\n const max = Math.max(e_lines.length, a_lines.length);\n for (let i = 0; i < max; i++) {\n const e_line = e_lines[i];\n const a_line = a_lines[i];\n if (e_line === a_line) {\n lines.push(` ${e_line ?? \"\"}`);\n } else {\n if (e_line !== undefined) lines.push(`- ${e_line}`);\n if (a_line !== undefined) lines.push(`+ ${a_line}`);\n }\n }\n return lines.join(\"\\n\");\n }\n\n // Primitives — side-by-side\n return `- ${JSON.stringify(expected)}\\n+ ${JSON.stringify(actual)}`;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// TASK footer generation\n// ────────────────────────────────────────────────────────────────────────────\n\nfunction build_task_footer(\n fc: FailedCase,\n src_frame: StackFrame | undefined,\n assertion_type: string\n): string {\n const loc = src_frame ? `\\`${src_frame.file}:${src_frame.line}\\`` : \"the source code\";\n const scenario = fc.scenarioId;\n const pkg = fc.pkg;\n\n let body: string;\n\n if (assertion_type === \"assertEqual\") {\n body =\n `The test expects ${JSON.stringify(fc.expected)}; the code returned ` +\n `${JSON.stringify(fc.actual)}. The suspect line in ${loc} returns the wrong value. ` +\n `Fix and re-run the \\`${scenario}\\` scenario.`;\n } else if (assertion_type.startsWith(\"assertThrows\")) {\n const msg = fc.error.message ?? \"\";\n if (msg.includes(\"returned without throwing\")) {\n body =\n `The test expects this call to throw ${JSON.stringify(fc.expected)} but it returned ` +\n `${JSON.stringify(fc.actual)} without throwing. Add the missing error case in ${loc}.`;\n } else {\n body =\n `Expected ${JSON.stringify(fc.expected)} but got ${JSON.stringify(fc.actual)}. ` +\n `The error type/code in ${loc} is wrong.`;\n }\n } else if (assertion_type === \"assertResolves\") {\n body =\n `The test expects the promise to resolve but it rejected. ` +\n `Check ${loc} for the rejection source.`;\n } else if (assertion_type === \"assertRejects\") {\n if (fc.actual === \"resolved\") {\n body =\n `The test expects the promise to reject but it resolved without error. ` +\n `Add the missing rejection case in ${loc}.`;\n } else {\n body =\n `Expected a rejection of type ${JSON.stringify(fc.expected)} but got ` +\n `${JSON.stringify(fc.actual)}. Fix the error type in ${loc}.`;\n }\n } else {\n body =\n `The assertion in ${loc} failed. Check the values and fix the implementation.`;\n }\n\n return (\n `## TASK\\n\\n` +\n `${body}\\n\\n` +\n `Verify your fix by re-running:\\n` +\n `\\`\\`\\`bash\\ncd ${pkg}/test-app && npm run dev # then Run scenario in the test-app\\n\\`\\`\\`\\n\\n` +\n `Or via the autotest runner: click \"Run\" next to the \\`${scenario}\\` scenario.`\n );\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Main formatter\n// ────────────────────────────────────────────────────────────────────────────\n\nexport async function formatAsClaudePrompt(\n fc: FailedCase,\n opts: FormatOptions = {}\n): Promise<string> {\n const {\n includeRingBuffer = true,\n includeCodeContext = true,\n maxRingBufferEntries = 15,\n } = opts;\n\n const sections: string[] = [];\n\n // ── Section 1: Header ────────────────────────────────────────────────────\n const cid = fc.correlationId ?? \"n/a\";\n const duration_str = fc.durationMs != null ? `${fc.durationMs}ms` : \"n/a\";\n const scenario_loc = fc.scenarioFilePath\n ? ` (\\`${fc.scenarioFilePath}\\`)`\n : \"\";\n\n sections.push(\n `# Failed: ${fc.pkg} / ${fc.scenarioId} / \"${fc.caseName}\"\\n\\n` +\n `**Package:** ${fc.pkg}\\n` +\n `**Scenario:** ${fc.scenarioId}${scenario_loc}\\n` +\n `**Case:** \"${fc.caseName}\"\\n` +\n `**Correlation ID:** ${cid}\\n` +\n `**Duration:** ${duration_str}\\n` +\n `**Failed at:** ${fc.failedAt.toISOString()}`\n );\n\n // ── Section 2: What went wrong ───────────────────────────────────────────\n sections.push(`## What went wrong\\n\\n${fc.error.message}`);\n\n // ── Section 3: Expected / Actual / Diff ──────────────────────────────────\n const has_assertion = fc.error instanceof HazoAssertionError;\n const expected = has_assertion ? (fc.error as HazoAssertionError).expected : fc.expected;\n const actual = has_assertion ? (fc.error as HazoAssertionError).actual : fc.actual;\n\n let exp_actual_section =\n `## Expected\\n\\n${JSON.stringify(expected, null, 2)}\\n\\n` +\n `## Actual\\n\\n${JSON.stringify(actual, null, 2)}\\n\\n` +\n `## Diff (computed)\\n\\n\\`\\`\\`\\n${compute_diff(expected, actual)}\\n\\`\\`\\``;\n sections.push(exp_actual_section);\n\n // ── Section 4: Test code ─────────────────────────────────────────────────\n if (includeCodeContext) {\n let test_code_section = \"## Test code\\n\\n\";\n const call_site =\n fc.error instanceof HazoAssertionError ? (fc.error as HazoAssertionError).callSite : undefined;\n\n if (fc.scenarioFilePath && call_site) {\n // call_site is like \"/abs/path.ts:42:10\" — extract line number\n const call_site_parts = call_site.split(\":\");\n const line_num = parseInt(call_site_parts[call_site_parts.length - 2] ?? \"0\", 10);\n\n const file_lines = read_file_lines(fc.scenarioFilePath);\n if (file_lines && line_num > 0) {\n const start = Math.max(0, line_num - 5 - 1);\n const end = Math.min(file_lines.length - 1, line_num + 5 - 1);\n const context = extract_context_lines(file_lines, line_num, 5, \"// ← failed here\");\n test_code_section +=\n `\\`${fc.scenarioFilePath}:${start + 1}-${end + 1}\\`\\n\\n` +\n `\\`\\`\\`ts\\n${context}\\n\\`\\`\\``;\n } else {\n test_code_section += `\\`${fc.scenarioFilePath}\\`\\n\\nsource unavailable`;\n }\n } else if (fc.scenarioFilePath) {\n test_code_section += `\\`${fc.scenarioFilePath}\\`\\n\\nsource unavailable (no call-site captured)`;\n } else {\n test_code_section += \"source unavailable\";\n }\n sections.push(test_code_section);\n }\n\n // ── Section 5: Code under test ───────────────────────────────────────────\n if (includeCodeContext) {\n let code_section = \"## Code under test\\n\\n\";\n const frames = parse_stack_frames(fc.error.stack);\n const src_frame = find_src_frame(frames);\n\n if (src_frame) {\n const src_lines = read_file_lines(src_frame.file);\n if (src_lines) {\n const start = Math.max(0, src_frame.line - 8 - 1);\n const end = Math.min(src_lines.length - 1, src_frame.line + 7 - 1);\n const context = extract_context_lines(src_lines, src_frame.line, 8, \"// ← suspect line\");\n code_section +=\n `\\`${src_frame.file}:${start + 1}-${end + 1}\\`\\n\\n` +\n `\\`\\`\\`ts\\n${context}\\n\\`\\`\\``;\n\n // All in-package frames as a sub-section\n const all_src = frames.filter(\n (f) => f.file.includes(\"/src/\") && !f.file.includes(\"test-harness\")\n );\n if (all_src.length > 1) {\n code_section +=\n \"\\n\\n**Stack (in-package frames):**\\n\" +\n all_src.map((f) => `- \\`${f.file}:${f.line}\\``).join(\"\\n\");\n }\n } else {\n code_section += `\\`${src_frame.file}:${src_frame.line}\\`\\n\\nsource unavailable`;\n }\n } else {\n code_section += \"source unavailable\";\n }\n sections.push(code_section);\n }\n\n // ── Section 6: Error chain ───────────────────────────────────────────────\n const chain_lines: string[] = [];\n let current: unknown = fc.error;\n let depth = 0;\n const include_stack =\n process.env.NODE_ENV !== \"production\" || process.env.HAZO_INCLUDE_STACK === \"1\";\n\n while (current instanceof Error && depth < 10) {\n const prefix = depth === 0 ? \"Top\" : \"caused by\";\n let entry = `- ${prefix}: \\`${current.constructor.name}: ${current.message}\\``;\n if (include_stack && current.stack) {\n entry += `\\n \\`\\`\\`\\n ${current.stack.split(\"\\n\").slice(0, 4).join(\"\\n \")}\\n \\`\\`\\``;\n }\n chain_lines.push(entry);\n current = (current as Error & { cause?: unknown }).cause;\n depth++;\n }\n\n if (chain_lines.length === 0) {\n chain_lines.push(\"- (no error captured)\");\n } else if (!(current instanceof Error) && depth > 0 && current === undefined) {\n chain_lines.push(\"- (No `cause`)\");\n }\n\n sections.push(`## Error chain\\n\\n${chain_lines.join(\"\\n\")}`);\n\n // ── Section 7: Context at test run ───────────────────────────────────────\n const node_env = redact_secrets(process.env.NODE_ENV ?? \"undefined\");\n const hazo_env = redact_secrets(process.env.HAZO_ENV ?? \"unset\");\n const node_ver = process.version ?? \"unknown\";\n\n const ctx_lines = [\n `- Node: ${node_ver}`,\n `- NODE_ENV: ${node_env}`,\n `- HAZO_ENV: ${hazo_env}`,\n ];\n if (fc.adapter) ctx_lines.push(`- Adapter: ${fc.adapter}`);\n if (fc.relevantConfig && Object.keys(fc.relevantConfig).length > 0) {\n ctx_lines.push(\"- Relevant config:\");\n for (const [k, v] of Object.entries(fc.relevantConfig)) {\n ctx_lines.push(` - \\`${k} = \"${redact_secrets(v)}\"\\``);\n }\n }\n\n sections.push(`## Context at test run\\n\\n${ctx_lines.join(\"\\n\")}`);\n\n // ── Section 8: Ring buffer ───────────────────────────────────────────────\n if (includeRingBuffer) {\n let ring_section = `## Ring buffer (last ${maxRingBufferEntries} events on this correlation ID)\\n\\n`;\n try {\n const hazo_logs = await optional_import<Record<string, unknown>>(\"hazo_logs\");\n const get_ring = hazo_logs?.[\"getRingBuffer\"] as\n | ((cid: string, n?: number) => unknown[] | undefined)\n | undefined;\n\n if (!hazo_logs || typeof get_ring !== \"function\") {\n ring_section += \"ring buffer not available (hazo_logs >= 2.0.0 required)\";\n } else if (fc.correlationId) {\n const entries = get_ring(fc.correlationId, maxRingBufferEntries);\n if (!entries || entries.length === 0) {\n ring_section += \"no buffered events\";\n } else {\n ring_section += \"```\\n\" + entries.map((e) => JSON.stringify(e)).join(\"\\n\") + \"\\n```\";\n }\n } else {\n ring_section += \"no correlation ID — ring buffer not queried\";\n }\n } catch {\n ring_section += \"ring buffer not available (hazo_logs >= 2.0.0 required)\";\n }\n sections.push(ring_section);\n }\n\n // ── TASK footer ──────────────────────────────────────────────────────────\n const frames_for_task = parse_stack_frames(fc.error.stack);\n const src_frame_for_task = find_src_frame(frames_for_task);\n\n // Determine assertion type from error message / class\n let assertion_type = \"unknown\";\n if (fc.error instanceof HazoAssertionError) {\n const msg = fc.error.message;\n if (msg.startsWith(\"assertEqual\")) assertion_type = \"assertEqual\";\n else if (msg.startsWith(\"assertThrows\")) assertion_type = \"assertThrows\";\n else if (msg.startsWith(\"assertResolves\")) assertion_type = \"assertResolves\";\n else if (msg.startsWith(\"assertRejects\")) assertion_type = \"assertRejects\";\n else if (msg.startsWith(\"assertMatch\")) assertion_type = \"assertMatch\";\n else if (msg.startsWith(\"assertIncludes\")) assertion_type = \"assertIncludes\";\n }\n\n sections.push(build_task_footer(fc, src_frame_for_task, assertion_type));\n\n return sections.join(\"\\n\\n---\\n\\n\");\n}\n","// test-harness/runner/copy_all.tsx\n// CopyAllFailuresButton — copies a TOC + all failure blocks to clipboard per spec §3.3.\n\n\"use client\";\n\nimport React, { useState } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport type { CaseResult } from \"./provider\";\nimport { formatAsClaudePrompt } from \"../scenarios/format\";\nimport { getRegistry } from \"../scenarios/api\";\nimport type { FailedCase } from \"../scenarios/format\";\n\n// ────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ────────────────────────────────────────────────────────────────────────────\n\nasync function build_copy_all_text(failed_cases: CaseResult[]): Promise<string> {\n const registry = getRegistry();\n const scenario_ids = Array.from(registry.keys());\n\n // Map case results to FailedCase objects — we need to find which scenario\n // each case belongs to by searching the registry.\n const failed_with_context: Array<{ fc: FailedCase; scenario_id: string }> = [];\n\n for (const cr of failed_cases) {\n if (!cr.error) continue;\n // Prefer the scenarioId stored on the CaseResult (populated by runScenario).\n // Fall back to searching the registry by case name for backwards compatibility.\n const scenario_id = cr.scenarioId\n ?? scenario_ids.find((sid) =>\n registry.get(sid)?.cases.some((c) => c.name === cr.name)\n );\n if (!scenario_id) continue;\n const scenario = registry.get(scenario_id);\n if (!scenario) continue;\n failed_with_context.push({\n fc: {\n pkg: scenario.pkg,\n scenarioId: scenario_id,\n caseName: cr.name,\n failedAt: new Date(),\n error: cr.error,\n durationMs: cr.durationMs,\n scenarioFilePath: scenario.filePath,\n expected: cr.expected,\n actual: cr.actual,\n },\n scenario_id,\n });\n }\n\n if (failed_with_context.length === 0) return \"\";\n\n // Count unique scenarios\n const unique_scenarios = new Set(failed_with_context.map((x) => x.scenario_id));\n\n // Build TOC\n const toc_lines = failed_with_context.map(\n ({ fc }, i) =>\n `${i + 1}. \\`${fc.pkg} / ${fc.scenarioId} / \"${fc.caseName}\"\\``\n );\n\n const header =\n `# Test failures (${failed_with_context.length} case${failed_with_context.length === 1 ? \"\" : \"s\"} ` +\n `failed across ${unique_scenarios.size} scenario${unique_scenarios.size === 1 ? \"\" : \"s\"})\\n\\n` +\n `## Failed cases\\n\\n` +\n toc_lines.join(\"\\n\");\n\n // Build each failure block\n const blocks = await Promise.all(\n failed_with_context.map(({ fc }) => formatAsClaudePrompt(fc))\n );\n\n return [header, ...blocks].join(\"\\n\\n---\\n\\n\");\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Component\n// ────────────────────────────────────────────────────────────────────────────\n\nexport function CopyAllFailuresButton({\n failedCases,\n}: {\n failedCases: CaseResult[];\n}): React.JSX.Element {\n const [state, set_state] = useState<\"idle\" | \"copying\" | \"copied\" | \"error\">(\"idle\");\n\n async function handle_click(): Promise<void> {\n set_state(\"copying\");\n try {\n const text = await build_copy_all_text(failedCases);\n if (!text) {\n set_state(\"idle\");\n return;\n }\n await navigator.clipboard.writeText(text);\n set_state(\"copied\");\n setTimeout(() => set_state(\"idle\"), 2500);\n } catch {\n set_state(\"error\");\n setTimeout(() => set_state(\"idle\"), 2500);\n }\n }\n\n const label_map = {\n idle: `Copy ${failedCases.length} failure${failedCases.length === 1 ? \"\" : \"s\"}`,\n copying: \"Copying...\",\n copied: \"Copied!\",\n error: \"Failed to copy\",\n };\n\n return (\n <button\n onClick={handle_click}\n disabled={state === \"copying\" || failedCases.length === 0}\n className={cn(\n \"px-3 py-1.5 rounded text-xs font-medium transition-colors border\",\n state === \"copied\"\n ? \"bg-green-50 border-green-300 text-green-700\"\n : state === \"error\"\n ? \"bg-red-50 border-red-300 text-red-700\"\n : \"bg-orange-50 border-orange-300 text-orange-700 hover:bg-orange-100\"\n )}\n >\n {label_map[state]}\n </button>\n );\n}\n","// test-harness/runner/runner.tsx\n// AutoTestRunner — renders all registered scenarios with Run / Run All controls\n// and per-case pass/fail/timing output.\n\n\"use client\";\n\nimport React, { useState } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { useAutoTest } from \"./provider\";\nimport type { CaseResult, ScenarioResult } from \"./provider\";\nimport { CopyAllFailuresButton } from \"./copy_all\";\nimport { getRegistry } from \"../scenarios/api\";\nimport { formatAsClaudePrompt } from \"../scenarios/format\";\nimport type { FailedCase } from \"../scenarios/format\";\n\n// ────────────────────────────────────────────────────────────────────────────\n// Status badge\n// ────────────────────────────────────────────────────────────────────────────\n\nfunction StatusBadge({ status }: { status: CaseResult[\"status\"] }): React.JSX.Element {\n const map: Record<string, string> = {\n pending: \"bg-gray-100 text-gray-500\",\n running: \"bg-blue-100 text-blue-600 animate-pulse\",\n passed: \"bg-green-100 text-green-700\",\n failed: \"bg-red-100 text-red-700\",\n };\n const label_map: Record<string, string> = {\n pending: \"pending\",\n running: \"running\",\n passed: \"passed\",\n failed: \"failed\",\n };\n return (\n <span\n className={cn(\n \"inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium\",\n map[status] ?? map[\"pending\"]\n )}\n >\n {label_map[status] ?? status}\n </span>\n );\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Status icon for individual cases\n// ────────────────────────────────────────────────────────────────────────────\n\nfunction StatusIcon({ status }: { status: CaseResult[\"status\"] }): React.JSX.Element {\n if (status === \"passed\") return <span className=\"text-green-600 font-bold\">✓</span>;\n if (status === \"failed\") return <span className=\"text-red-600 font-bold\">✗</span>;\n if (status === \"running\") return <span className=\"text-blue-500\">⟳</span>;\n return <span className=\"text-gray-400\">○</span>;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Copy prompt button for a single failed case\n// ────────────────────────────────────────────────────────────────────────────\n\nfunction CopySinglePromptButton({\n scenario_id,\n case_result,\n pkg,\n}: {\n scenario_id: string;\n case_result: CaseResult;\n pkg: string;\n}): React.JSX.Element {\n const [copied, set_copied] = useState(false);\n\n async function handle_copy(): Promise<void> {\n const scenario = getRegistry().get(scenario_id);\n if (!case_result.error) return;\n\n const fc: FailedCase = {\n pkg,\n scenarioId: scenario_id,\n caseName: case_result.name,\n failedAt: new Date(),\n error: case_result.error,\n durationMs: case_result.durationMs,\n scenarioFilePath: scenario?.filePath,\n expected: case_result.expected,\n actual: case_result.actual,\n };\n\n const text = await formatAsClaudePrompt(fc);\n await navigator.clipboard.writeText(text);\n set_copied(true);\n setTimeout(() => set_copied(false), 2000);\n }\n\n return (\n <button\n onClick={handle_copy}\n className=\"ml-2 text-xs text-blue-600 hover:text-blue-800 underline\"\n >\n {copied ? \"Copied!\" : \"Copy prompt\"}\n </button>\n );\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Case row — expands to show doc panel\n// ────────────────────────────────────────────────────────────────────────────\n\nfunction CaseRow({\n c,\n scenario_id,\n pkg,\n}: {\n c: CaseResult;\n scenario_id: string;\n pkg: string;\n}): React.JSX.Element {\n const [expanded, set_expanded] = useState(false);\n return (\n <div className=\"px-6 py-2\">\n <div className=\"flex items-center gap-2 text-sm\">\n {c.doc && (\n <button\n onClick={() => set_expanded((v) => !v)}\n className=\"text-gray-400 hover:text-gray-600 text-xs font-mono w-3 shrink-0\"\n aria-label={expanded ? \"Collapse doc\" : \"Expand doc\"}\n >\n {expanded ? \"▾\" : \"▸\"}\n </button>\n )}\n {!c.doc && <span className=\"w-3 shrink-0\" />}\n <StatusIcon status={c.status} />\n <span className={cn(\n \"flex-1\",\n c.status === \"failed\" ? \"text-red-700\" : \"text-gray-700\"\n )}>\n {c.name}\n </span>\n {c.durationMs != null && (\n <span className=\"text-xs text-gray-400\">{c.durationMs}ms</span>\n )}\n {c.status === \"failed\" && c.error && (\n <CopySinglePromptButton\n scenario_id={scenario_id}\n case_result={c}\n pkg={pkg}\n />\n )}\n </div>\n {expanded && c.doc && (\n <div className=\"mt-2 ml-8 text-xs rounded border border-gray-100 bg-gray-50 divide-y divide-gray-100\">\n <div className=\"px-3 py-2\">\n <span className=\"font-semibold text-gray-600\">Description</span>\n <p className=\"mt-0.5 text-gray-700\">{c.doc.description}</p>\n </div>\n <div className=\"px-3 py-2\">\n <span className=\"font-semibold text-gray-600\">Inputs</span>\n <p className=\"mt-0.5 text-gray-700\">{c.doc.inputs}</p>\n </div>\n <div className=\"px-3 py-2\">\n <span className=\"font-semibold text-gray-600\">Expected outputs</span>\n <p className=\"mt-0.5 text-gray-700\">{c.doc.expectedOutputs}</p>\n </div>\n <div className=\"px-3 py-2\">\n <span className=\"font-semibold text-gray-600\">Caveats</span>\n <p className=\"mt-0.5 text-gray-700\">{c.doc.caveats}</p>\n </div>\n </div>\n )}\n {c.status === \"failed\" && c.error && (\n <div className=\"mt-1 ml-8 text-xs text-red-600 bg-red-50 rounded px-2 py-1 font-mono\">\n {c.error.message}\n </div>\n )}\n </div>\n );\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Scenario row\n// ────────────────────────────────────────────────────────────────────────────\n\nfunction ScenarioRow({\n scenario,\n pkg,\n}: {\n scenario: ScenarioResult;\n pkg: string;\n}): React.JSX.Element {\n const { runScenario } = useAutoTest();\n const [expanded, set_expanded] = useState(false);\n\n const is_running = scenario.status === \"running\";\n\n return (\n <div className=\"border border-gray-200 rounded-lg overflow-hidden\">\n {/* Scenario header */}\n <div className=\"flex items-center justify-between px-4 py-3 bg-gray-50\">\n <div className=\"flex items-center gap-3\">\n <button\n onClick={() => set_expanded((v) => !v)}\n className=\"text-gray-500 hover:text-gray-700 text-sm font-mono\"\n aria-label={expanded ? \"Collapse cases\" : \"Expand cases\"}\n >\n {expanded ? \"▾\" : \"▸\"}\n </button>\n <span className=\"font-medium text-sm text-gray-800\">{scenario.name}</span>\n <StatusBadge status={scenario.status} />\n <span className=\"text-xs text-gray-400\">\n {scenario.cases.filter((c) => c.status === \"passed\").length}/\n {scenario.cases.length} passed\n </span>\n </div>\n <button\n disabled={is_running}\n onClick={() => runScenario(scenario.id)}\n className={cn(\n \"px-3 py-1 rounded text-xs font-medium transition-colors\",\n is_running\n ? \"bg-gray-100 text-gray-400 cursor-not-allowed\"\n : \"bg-blue-600 text-white hover:bg-blue-700 cursor-pointer\"\n )}\n >\n {is_running ? \"Running...\" : \"Run\"}\n </button>\n </div>\n\n {/* Case list */}\n {expanded && (\n <div className=\"divide-y divide-gray-100\">\n {scenario.cases.map((c, i) => (\n <CaseRow key={i} c={c} scenario_id={scenario.id} pkg={pkg} />\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// AutoTestRunner — main export\n// ────────────────────────────────────────────────────────────────────────────\n\nexport function AutoTestRunner(): React.JSX.Element {\n const { scenarios, runAll, reset } = useAutoTest();\n const registry = getRegistry();\n\n // Derive pkg from first registered scenario\n const first_scenario = Array.from(registry.values())[0];\n const pkg = first_scenario?.pkg ?? \"unknown\";\n\n const scenario_list = Array.from(scenarios.values());\n const any_running = scenario_list.some((s) => s.status === \"running\");\n const total_cases = scenario_list.reduce((acc, s) => acc + s.cases.length, 0);\n const passed_cases = scenario_list.reduce(\n (acc, s) => acc + s.cases.filter((c) => c.status === \"passed\").length,\n 0\n );\n const failed_cases_flat = scenario_list.flatMap((s) =>\n s.cases.filter((c) => c.status === \"failed\")\n );\n\n return (\n <div className=\"cls_auto_test_runner p-4 space-y-4\">\n {/* Toolbar */}\n <div className=\"flex items-center justify-between\">\n <div>\n <h2 className=\"text-base font-semibold text-gray-800\">Test Scenarios</h2>\n {total_cases > 0 && (\n <p className=\"text-xs text-gray-500 mt-0.5\">\n {passed_cases}/{total_cases} cases passed\n {failed_cases_flat.length > 0 && (\n <span className=\"text-red-600 ml-2\">\n · {failed_cases_flat.length} failed\n </span>\n )}\n </p>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n {failed_cases_flat.length > 0 && (\n <CopyAllFailuresButton failedCases={failed_cases_flat} />\n )}\n <button\n onClick={reset}\n disabled={any_running}\n className=\"px-3 py-1.5 rounded text-xs font-medium border border-gray-300 text-gray-600 hover:bg-gray-50 disabled:opacity-50\"\n >\n Reset\n </button>\n <button\n onClick={runAll}\n disabled={any_running}\n className={cn(\n \"px-4 py-1.5 rounded text-xs font-medium transition-colors\",\n any_running\n ? \"bg-gray-100 text-gray-400 cursor-not-allowed\"\n : \"bg-green-600 text-white hover:bg-green-700 cursor-pointer\"\n )}\n >\n {any_running ? \"Running...\" : \"Run All\"}\n </button>\n </div>\n </div>\n\n {/* Scenario list */}\n {scenario_list.length === 0 ? (\n <div className=\"text-sm text-gray-500 italic py-8 text-center\">\n No scenarios registered. Import your scenario files to populate this runner.\n </div>\n ) : (\n <div className=\"space-y-2\">\n {scenario_list.map((s) => (\n <ScenarioRow key={s.id} scenario={s} pkg={pkg} />\n ))}\n </div>\n )}\n </div>\n );\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hazo_ui",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.4.1",
|
|
4
4
|
"description": "Set of UI components for common interaction elements in a SaaS app",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -50,7 +50,13 @@
|
|
|
50
50
|
"peerDependencies": {
|
|
51
51
|
"react": "^18.0.0 || ^19.0.0",
|
|
52
52
|
"react-dom": "^18.0.0 || ^19.0.0",
|
|
53
|
-
"hazo_core": "^1.1.0"
|
|
53
|
+
"hazo_core": "^1.1.0",
|
|
54
|
+
"hazo_state": "^0.1.0"
|
|
55
|
+
},
|
|
56
|
+
"peerDependenciesMeta": {
|
|
57
|
+
"hazo_state": {
|
|
58
|
+
"optional": true
|
|
59
|
+
}
|
|
54
60
|
},
|
|
55
61
|
"dependencies": {
|
|
56
62
|
"@dnd-kit/core": "^6.1.0",
|