@midscene/test 1.17.8-beta-20261106101231.0 → 1.17.8

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.
Files changed (51) hide show
  1. package/dist/es/154.mjs +2 -0
  2. package/dist/es/164.mjs +1469 -0
  3. package/dist/es/164.mjs.map +1 -0
  4. package/dist/es/183.mjs +295 -0
  5. package/dist/es/183.mjs.map +1 -0
  6. package/dist/es/1~112.mjs +372 -0
  7. package/dist/es/1~112.mjs.map +1 -0
  8. package/dist/es/209.mjs +1 -0
  9. package/dist/es/299.mjs +1886 -0
  10. package/dist/es/299.mjs.map +1 -0
  11. package/dist/es/398.mjs +5 -0
  12. package/dist/es/398.mjs.map +1 -0
  13. package/dist/es/431.mjs +375 -0
  14. package/dist/es/431.mjs.map +1 -0
  15. package/dist/es/470.mjs +1 -0
  16. package/dist/es/487.mjs +1 -0
  17. package/dist/es/629.mjs +1 -0
  18. package/dist/es/793.mjs +1 -0
  19. package/dist/es/822.mjs +1 -0
  20. package/dist/es/946.mjs +1 -0
  21. package/dist/es/cli/index.mjs +3 -2196
  22. package/dist/es/cli/index.mjs.map +1 -1
  23. package/dist/es/cli/model-command.mjs +1 -296
  24. package/dist/es/index.mjs +10 -409
  25. package/dist/es/index.mjs.map +1 -1
  26. package/dist/es/midscene/index.mjs +9 -9
  27. package/dist/es/midscene/index.mjs.map +1 -1
  28. package/dist/es/runtime/index.mjs +4 -5
  29. package/dist/es/runtime/index.mjs.map +1 -1
  30. package/dist/es/test-cli.mjs +1 -3786
  31. package/dist/lib/0~703.js.map +1 -1
  32. package/dist/lib/cli/index.js +45 -58
  33. package/dist/lib/cli/index.js.map +1 -1
  34. package/dist/lib/cli/model-command.js +1 -1
  35. package/dist/lib/cli/model-command.js.map +1 -1
  36. package/dist/lib/index.js +8 -37
  37. package/dist/lib/index.js.map +1 -1
  38. package/dist/lib/midscene/index.js +1 -1
  39. package/dist/lib/midscene/index.js.map +1 -1
  40. package/dist/lib/runtime/index.js +1 -1
  41. package/dist/lib/runtime/index.js.map +1 -1
  42. package/dist/lib/test-cli.js +884 -877
  43. package/dist/lib/test-cli.js.map +1 -1
  44. package/dist/types/cli/index.d.ts +4 -0
  45. package/package.json +20 -21
  46. package/dist/es/1~4.mjs +0 -383
  47. package/dist/es/1~4.mjs.map +0 -1
  48. package/dist/es/1~731.mjs +0 -306
  49. package/dist/es/1~731.mjs.map +0 -1
  50. package/dist/es/cli/model-command.mjs.map +0 -1
  51. package/dist/es/test-cli.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"164.mjs","sources":["../../json|/home/runner/work/midscene/midscene/packages/test/package.json","../../src/cli/error-format.ts","../../src/cli/failure-format.ts","../../src/cli/terminal-progress.ts","../../src/cli/warning-format.ts","../../src/cli/terminal-reporter.ts","../../src/cli/github-reporter.ts","../../src/cli/node-spec.ts","../../src/cli/terminal-output.ts","../../src/cli/test-command.ts","../../src/test-cli.ts"],"sourcesContent":["var __rspack_ns_object = {\"rE\":\"1.17.8\"}","import { inspect } from 'node:util';\n\n/** Keep native Error stacks, causes, and aggregate errors in CLI diagnostics. */\nexport const formatCliError = (error: unknown): string =>\n typeof error === 'string'\n ? error\n : inspect(error, { colors: false, depth: null, customInspect: false });\n\n/** Keep actionable messages and distinct causes; verbose output retains full stacks. */\nexport function formatConciseError(error: unknown): string {\n const seen = new Set<unknown>();\n const messages: string[] = [];\n let current = error;\n while (current instanceof Error && !seen.has(current)) {\n seen.add(current);\n // Node wrappers add location already shown by the reporter, sometimes twice.\n if (\n (current as Error & { code?: string }).code === 'NODE_EXECUTION_ERROR' &&\n current.cause !== undefined\n ) {\n current = current.cause;\n continue;\n }\n if (current.message && !messages.includes(current.message))\n messages.push(current.message);\n if (current instanceof AggregateError) {\n for (const nested of current.errors) {\n if (nested === current || seen.has(nested)) continue;\n seen.add(nested);\n messages.push(\n nested instanceof Error ? nested.message : String(nested),\n );\n }\n }\n current = current.cause;\n }\n if (!messages.length)\n return current instanceof Error ? current.message : formatCliError(current);\n return messages.join('\\nCaused by: ');\n}\n","import { isAbsolute, relative, win32 } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { inspect, stripVTControlCharacters } from 'node:util';\nimport { sanitizeReportValue } from '@midscene/core/internal/test-runner';\nimport type { StepRunResult } from '@midscene/core/internal/test-runner';\nimport { formatConciseError } from './error-format';\n\nexport interface CliFailureContext {\n projectName?: string;\n caseName?: string;\n sourcePath?: string;\n projectRoot?: string;\n phase?: string;\n step?: StepRunResult;\n stepCount?: number;\n attempt?: { index: number; total: number };\n fileAttempt?: { index: number; total: number };\n}\n\nconst oneLine = (value: string): string =>\n stripVTControlCharacters(value).replace(/\\s+/g, ' ').trim();\nconst shorten = (value: string, length: number): string => {\n const text = oneLine(value);\n return text.length <= length ? text : `${text.slice(0, length - 1)}…`;\n};\n\nfunction unwrapFrameLocation(location: string): string {\n if (!location.endsWith(')')) return location;\n // Real file frames have an absolute path or file URL. Recognize that\n // boundary explicitly so unmatched parentheses in a path remain literal.\n // Search only for the bounded prefix; matching the entire suffix at every\n // candidate would cause quadratic backtracking on malformed stack lines.\n const absoluteStart = location.search(\n / \\((?:file:\\/\\/|[A-Za-z]:[\\\\/]|\\/|\\\\\\\\)/,\n );\n if (absoluteStart !== -1) return location.slice(absoluteStart + 2, -1);\n\n // Synthetic frames can have relative filenames. Match the closing wrapper\n // instead of splitting on parentheses that belong to the function name.\n let depth = 0;\n for (let index = location.length - 1; index >= 0; index--) {\n if (location[index] === ')') depth++;\n else if (location[index] === '(' && --depth === 0) {\n return location[index - 1] === ' '\n ? location.slice(index + 1, -1)\n : location;\n }\n }\n return location;\n}\n\n/** Follow original causes first, retaining only application code frames. */\nexport function firstBusinessFrame(\n error: unknown,\n projectRoot?: string,\n): string | undefined {\n const seen = new Set<object>();\n const frames: string[] = [];\n const visit = (value: unknown, depth = 0) => {\n if (!value || typeof value !== 'object' || seen.has(value) || depth > 12)\n return;\n seen.add(value);\n const detail = value as {\n cause?: unknown;\n errors?: unknown[];\n stack?: unknown;\n };\n visit(detail.cause, depth + 1);\n if (Array.isArray(detail.errors))\n for (const child of detail.errors.slice(0, 10)) visit(child, depth + 1);\n if (typeof detail.stack !== 'string') return;\n for (const line of detail.stack.split('\\n')) {\n if (!line.trim().startsWith('at ')) continue;\n const location = unwrapFrameLocation(\n line\n .trim()\n .slice(3)\n .replace(/^async /, ''),\n );\n const match = location.match(/^(.*):(\\d+):(\\d+)$/);\n if (!match) continue;\n let file = match[1];\n if (file.startsWith('file://')) {\n try {\n file = fileURLToPath(file);\n } catch {\n continue;\n }\n }\n const normalized = file.replace(/\\\\/g, '/');\n if (\n normalized.startsWith('node:') ||\n normalized.includes('/node_modules/') ||\n /(?:^|\\/)packages\\/(?:core|test|shared|web-integration)\\/(?:dist|src)\\//.test(\n normalized,\n ) ||\n !/\\.[cm]?[jt]sx?$/.test(normalized)\n )\n continue;\n frames.push(`${file}:${match[2]}:${match[3]}`);\n }\n };\n visit(error);\n const chosen = frames[0];\n if (!chosen || !projectRoot) return chosen;\n const match = chosen.match(/^(.*):(\\d+):(\\d+)$/)!;\n const file = match[1];\n const paths = /^[A-Za-z]:[\\\\/]/.test(file) ? win32 : { isAbsolute, relative };\n const display = paths.isAbsolute(file)\n ? paths.relative(projectRoot, file)\n : file;\n return `${display.replace(/\\\\/g, '/')}:${match[2]}:${match[3]}`;\n}\n\n/** Format a bounded preview of the resolved input. */\nexport function formatFailureInput(input: unknown): string[] {\n if (input === undefined) return [];\n const value = sanitizeReportValue(input).value;\n const render = (value: unknown) =>\n shorten(\n typeof value === 'string'\n ? value\n : inspect(value, {\n colors: false,\n depth: 2,\n maxArrayLength: 4,\n maxStringLength: 180,\n breakLength: Number.POSITIVE_INFINITY,\n customInspect: false,\n getters: false,\n }),\n 160,\n );\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const entries = Object.entries(value);\n const rows = entries\n .slice(0, 4)\n .map(([key, value]) => `${shorten(key, 48)}: ${render(value)}`);\n if (entries.length > 4)\n rows.push(`… ${entries.length - 4} more fields (see Summary)`);\n return rows;\n }\n return [render(value)];\n}\n\nexport function formatFailureDetails(\n source: string,\n error: unknown,\n context: CliFailureContext = {},\n): { title: string; body: string[] } {\n const title = context.projectName\n ? `[${oneLine(context.projectName)}] ${oneLine(context.caseName ?? context.sourcePath ?? context.phase ?? source)}`\n : oneLine(source);\n const body: string[] = [];\n const field = (label: string, value: string) =>\n body.push(` ${label.padEnd(9)}${value}`);\n const step = context.step;\n if (step) {\n const phase = step.phase === 'steps' ? '' : `${step.phase} `;\n const index = step.stepIndex + 1;\n const position =\n context.stepCount === undefined\n ? String(index)\n : `${index}/${Math.max(index, context.stepCount)}`;\n field('Step', `${phase}${position} · ${oneLine(step.node)}`);\n } else if (context.phase) field('Phase', oneLine(context.phase));\n if (context.sourcePath) {\n const location = step?.meta.sourceLocation;\n field(\n 'Location',\n `${oneLine(context.sourcePath)}${location ? `:${location.line}` : ''}`,\n );\n }\n for (const [label, attempt] of [\n ['Attempt', context.attempt],\n ['File try', context.fileAttempt],\n ] as const)\n if (attempt && (attempt.total > 1 || attempt.index > 0))\n field(label, `${attempt.index + 1}/${attempt.total}`);\n if (body.length) body.push('');\n const lines = stripVTControlCharacters(formatConciseError(error)).split(\n /\\r?\\n/,\n );\n body.push(\n ` Error: ${shorten(lines[0], 320)}`,\n ...lines.slice(1, 6).map((line) => ` ${shorten(line, 320)}`),\n );\n if (lines.length > 6)\n body.push(' … (use --reporter verbose for details)');\n const input = step ? formatFailureInput(step.input) : [];\n if (input.length) {\n body.push('');\n input.forEach((line, index) => field(index === 0 ? 'Input' : '', line));\n }\n const frame = firstBusinessFrame(error, context.projectRoot);\n if (frame) body.push('', ` at ${oneLine(frame)}`);\n return { title, body };\n}\n","import { stripVTControlCharacters } from 'node:util';\nimport stringWidth from 'string-width';\n\ninterface ProgressIO {\n write?(message: string): void;\n columns?: number;\n rows?: number;\n}\n\nconst graphemes = new Intl.Segmenter(undefined, { granularity: 'grapheme' });\nconst SYNC_START = '\\u001b[?2026h';\nconst SYNC_END = '\\u001b[?2026l';\n\nexport const truncateTerminalLine = (text: string, columns: number): string => {\n if (columns <= 0) return '';\n if (stringWidth(text) <= columns) return text;\n // Never split an ANSI sequence or grapheme when shortening a styled row.\n let output = '';\n let width = 0;\n for (const { segment } of graphemes.segment(stripVTControlCharacters(text))) {\n width += stringWidth(segment);\n if (width > columns - 1) break;\n output += segment;\n }\n return `${output}…`;\n};\n\n/** Owns only the transient block, with the cursor on a blank line below it. */\nexport class TerminalProgress {\n private lines: string[] = [];\n private content: string[] = [];\n private footer: string[] = [];\n\n constructor(private io: ProgressIO) {}\n\n private erase(): string {\n if (!this.lines.length) return '';\n const columns = Math.max(1, this.io.columns ?? 100);\n const occupiedRows = this.lines.reduce(\n (sum, line) => sum + Math.max(1, Math.ceil(stringWidth(line) / columns)),\n 0,\n );\n const rows = Math.min(occupiedRows, Math.max(0, (this.io.rows ?? 24) - 1));\n this.lines = [];\n return `\\r${rows ? `\\u001b[${rows}A` : ''}\\u001b[0J`;\n }\n\n private frame(previousHeight = 0): string {\n const availableRows = Math.max(0, (this.io.rows ?? 24) - 2);\n const columns = Math.max(0, (this.io.columns ?? 100) - 1);\n if (!availableRows || !columns) return '';\n const footer = this.footer.slice(0, availableRows);\n const budget = availableRows - footer.length;\n const overflow = this.content.length > budget;\n const visible = Math.max(0, budget - (overflow ? 1 : 0));\n const body = this.content.slice(0, visible);\n if (overflow && budget > 0)\n body.push(` … ${this.content.length - visible} more rows`);\n const lines = [...body, ...footer].map((line) =>\n truncateTerminalLine(line, columns),\n );\n const blanks = Math.max(\n 0,\n Math.min(previousHeight, availableRows) - lines.length,\n );\n this.lines = [...Array.from({ length: blanks }, () => ''), ...lines];\n return this.lines.length ? `${this.lines.join('\\n')}\\n` : '';\n }\n\n render(content: string[], footer: string[]): void {\n this.update(content, footer);\n const previousHeight = this.lines.length;\n const erase = this.erase();\n this.io.write?.(\n `${SYNC_START}${erase}${this.frame(previousHeight)}${SYNC_END}`,\n );\n }\n\n update(content: string[], footer: string[]): void {\n this.content = content;\n this.footer = footer;\n }\n\n /** Insert permanent output above the live block as one synchronized frame. */\n output(message: string, write: (message: string) => void): void {\n this.io.write?.(SYNC_START);\n try {\n const erase = this.erase();\n if (erase) this.io.write?.(erase);\n write(message.endsWith('\\n') ? message : `${message}\\n`);\n const frame = this.frame();\n if (frame) this.io.write?.(frame);\n } finally {\n this.io.write?.(SYNC_END);\n }\n }\n\n clear(): void {\n const erase = this.erase();\n this.content = [];\n this.footer = [];\n if (erase) this.io.write?.(`${SYNC_START}${erase}${SYNC_END}`);\n }\n}\n","import { stripVTControlCharacters } from 'node:util';\nimport type { ConsoleLogEntry, ConsoleLogScope } from '@midscene/shared/logger';\n\nconst oneLine = (text: string): string =>\n stripVTControlCharacters(text).replace(/\\s+/g, ' ').trim();\n\nexport function formatWarningScope(scope?: ConsoleLogScope): string {\n if (!scope) return '';\n const parts = [`[${oneLine(scope.projectName)}]`];\n if (scope.sourcePath) parts.push(oneLine(scope.sourcePath));\n if (scope.caseName) parts.push(oneLine(scope.caseName));\n if (scope.phase) {\n const phase = scope.phase === 'steps' ? 'step' : scope.phase;\n parts.push(\n `${phase}${scope.stepIndex === undefined ? '' : `[${scope.stepIndex + 1}]`}${scope.node ? ` ${oneLine(scope.node)}` : ''}`,\n );\n }\n return `${parts.join(' › ')} · `;\n}\n\n/** Prefer the underlying provider message, excluding stacks and response dumps. */\nfunction errorMessage(error: unknown): string {\n const seen = new Set<unknown>();\n let current = error;\n let message = '';\n let status: number | undefined;\n while (current && typeof current === 'object' && !seen.has(current)) {\n seen.add(current);\n const detail = current as {\n message?: unknown;\n cause?: unknown;\n status?: unknown;\n };\n if (typeof detail.message === 'string') message = detail.message;\n if (typeof detail.status === 'number') status = detail.status;\n current = detail.cause;\n }\n const firstLine = oneLine((message || String(error)).split(/\\r?\\n/)[0]);\n return status && !firstLine.startsWith(String(status))\n ? `${status}: ${firstLine}`\n : firstLine;\n}\n\nexport function formatWarning(entry: ConsoleLogEntry): string {\n const details = entry.warning;\n let message: string;\n if (details?.kind === 'model-request-retry') {\n message = `model request retry ${details.attempt + 1}/${details.maxAttempts} in ${details.delayMs / 1000}s (${oneLine(details.modelName)}): ${errorMessage(details.error)}`;\n } else {\n const error = entry.args?.find((arg) => arg instanceof Error);\n const prefix =\n typeof entry.args?.[0] === 'string'\n ? oneLine(entry.args[0].split(/\\r?\\n/)[0]).replace(/:\\s*$/, '')\n : '';\n message = error\n ? `${prefix ? `${prefix}: ` : ''}${errorMessage(error)}`\n : oneLine(entry.message.split(/\\r?\\n/)[0]);\n message = message.replace(/^\\[midscene:warning\\]\\s*/, '');\n }\n if (message.startsWith('waitForNetworkIdle is skipped for Playwright.'))\n message = 'Playwright: post-action network-idle wait skipped.';\n return message.length > 240 ? `${message.slice(0, 239)}…` : message;\n}\n\nexport function warningKey(entry: ConsoleLogEntry, message: string): string {\n const details = entry.warning;\n if (details?.kind === 'model-request-retry')\n return `${entry.topic}\\n${JSON.stringify(entry.scope)}\\n${details.callId}\\n${details.attempt}`;\n // Repeated compatibility notices are run-wide; errors retain their owner.\n const scope = entry.args?.some((arg) => arg instanceof Error)\n ? JSON.stringify(entry.scope)\n : '';\n return `${entry.topic}\\n${scope}\\n${message}`;\n}\n","import { stripVTControlCharacters } from 'node:util';\nimport type { TestRunReportMetrics } from '@midscene/core';\nimport type {\n CaseRunOutcome,\n CaseRunResult,\n StepExecutionInfo,\n} from '@midscene/core/internal/test-runner';\nimport type { ConsoleLogEntry } from '@midscene/shared/logger';\nimport chalk from 'chalk';\nimport stringWidth from 'string-width';\nimport { version } from '../../package.json';\nimport { formatCliError } from './error-format';\nimport { type CliFailureContext, formatFailureDetails } from './failure-format';\nimport { CliModelUsage, formatModelUsage } from './model-usage';\nimport type { TestReporterEvent } from './reporter-events';\nimport { TerminalProgress, truncateTerminalLine } from './terminal-progress';\nimport type {\n TestExecutionProjectRunResult,\n TestProjectRunResult,\n} from './types';\nimport {\n formatWarning,\n formatWarningScope,\n warningKey,\n} from './warning-format';\n\nexport type TerminalReporterMode = 'default' | 'verbose';\nexport interface ReporterIO {\n log(message: string): void;\n error(message: string): void;\n write?(message: string): void;\n isTTY?: boolean;\n columns?: number;\n rows?: number;\n onResize?(listener: () => void): () => void;\n}\nconst oneLine = (value: string) =>\n stripVTControlCharacters(value).replace(/\\s+/g, ' ').trim();\nexport const formatDuration = (ms: number): string => {\n if (ms < 1000) return `${Math.round(ms)}ms`;\n if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\n return `${Math.floor(ms / 60_000)}m ${Math.floor((ms % 60_000) / 1000)}s`;\n};\nconst identity = (project: string, path: string, name?: string) =>\n `[${oneLine(project)}] ${oneLine(path)}${name ? ` › ${oneLine(name)}` : ''}`;\nconst projectPhaseLabel = (phase: 'setup' | 'teardown') =>\n phase === 'setup' ? 'setting up' : 'cleaning up';\ninterface FileState {\n projectName: string;\n sourcePath: string;\n total: number;\n outcomes: Map<string, CaseRunOutcome>;\n attemptOutcomes: Map<string, CaseRunOutcome>;\n started: boolean;\n printed: boolean;\n status?: 'success' | 'failed' | 'not-run';\n durationMs: number;\n retries: number;\n completionOrder: number;\n}\ninterface ActiveTask {\n file: FileState;\n name?: string;\n step?: string;\n since: number;\n attempt: number;\n maxAttempts?: number;\n runId?: string;\n phase?: string;\n stepIndex?: number;\n caseIndex?: number;\n warning?: string;\n}\ntype LiveChild =\n | { outcome: CaseRunOutcome }\n | { task: ActiveTask }\n | { summary: string; failed: boolean };\ntype LiveMode = 'full' | 'recent' | 'compact' | 'active';\n\n// Document status describes its lifecycle; failed Cases must also fail the file.\nconst fileStatus = (\n status: FileState['status'],\n cases: readonly CaseRunOutcome[],\n): FileState['status'] => {\n if (status === 'failed' || cases.some((item) => item.status === 'failed'))\n return 'failed';\n if (cases.length && cases.every((item) => item.status === 'not-run'))\n return 'not-run';\n if (cases.some((item) => item.status === 'not-run')) return 'failed';\n return status ?? (cases.length ? 'success' : 'not-run');\n};\n\nexport class TerminalReporter {\n private total = 0;\n private completionOrder = 0;\n private totalFiles = 0;\n private files = new Map<string, FileState>();\n private warnings = new Map<string, { scope: string; message: string }>();\n private latestNotice?: string;\n private usage = new CliModelUsage();\n private finalMetrics?: TestRunReportMetrics;\n private attempts = new Map<string, { run: CaseRunResult; max: number }>();\n private active = new Map<string, ActiveTask>();\n private projectPhases = new Map<\n string,\n { phase: 'setup' | 'teardown'; since: number }\n >();\n private failures: {\n source: string;\n error: unknown;\n context?: CliFailureContext;\n }[] = [];\n private lastOutput = Date.now();\n private startedAt = Date.now();\n private timer?: ReturnType<typeof setInterval>;\n private scheduled?: ReturnType<typeof setTimeout>;\n private progressView: TerminalProgress;\n private removeResizeListener?: () => void;\n private color;\n\n constructor(\n private io: ReporterIO,\n readonly mode: TerminalReporterMode = 'default',\n ) {\n this.progressView = new TerminalProgress(io);\n this.color = new chalk.Instance({\n level: io.isTTY && !process.env.NO_COLOR ? 1 : 0,\n });\n }\n private get interactive(): boolean {\n return !!this.io.isTTY && !!this.io.write && this.mode === 'default';\n }\n private log(message: string): void {\n if (this.interactive)\n this.output(`${message}\\n`, (text) => this.io.write!(text));\n else this.io.log(message);\n this.lastOutput = Date.now();\n }\n /** Called only by the standalone CLI's scoped stdout/stderr capture. */\n output(message: string, write: (message: string) => void): void {\n this.renderProgress(false);\n this.progressView.output(message, write);\n this.lastOutput = Date.now();\n }\n progress(message: string): void {\n if (this.mode === 'verbose') this.log(message);\n }\n console(entry: ConsoleLogEntry): void {\n if (entry.type === 'report') {\n if (this.mode === 'verbose') this.log(entry.message);\n return;\n }\n const scope = formatWarningScope(entry.scope);\n if (this.mode === 'verbose') {\n const kind =\n entry.warning?.kind === 'model-request-retry'\n ? 'model request retry · '\n : entry.warning?.kind === 'model-request-detail'\n ? 'model request error · '\n : '';\n this.log(`WARN ${scope}${kind}${entry.message}`);\n return;\n }\n // The request retry notice carries this failure once; terminal failures\n // are presented with their Case result and final failure details.\n if (entry.warning?.kind === 'model-request-detail') return;\n const message = formatWarning(entry);\n const key = warningKey(entry, message);\n if (this.warnings.has(key)) return;\n this.warnings.set(key, { scope, message });\n if (this.interactive) {\n let attached = false;\n if (entry.warning?.kind === 'model-request-retry' && entry.scope) {\n const owner = entry.scope;\n for (const [id, task] of this.active) {\n if (\n task.file.projectName !== owner.projectName ||\n (owner.sourcePath && task.file.sourcePath !== owner.sourcePath) ||\n (owner.caseId && id !== owner.caseId) ||\n (owner.runId && task.runId !== owner.runId) ||\n (owner.phase && task.phase !== owner.phase) ||\n (owner.stepIndex !== undefined &&\n task.stepIndex !== owner.stepIndex)\n )\n continue;\n task.warning = message;\n attached = true;\n }\n }\n if (!attached)\n this.latestNotice = message.startsWith('Playwright:')\n ? 'Playwright: network-idle wait skipped.'\n : `${scope}${message}`;\n this.schedule();\n return;\n }\n this.log(`${this.color.yellow('WARN')} ${this.color.dim(scope)}${message}`);\n }\n\n private file(projectName: string, sourcePath: string, total = 0): FileState {\n const key = `${projectName}\\0${sourcePath}`;\n let file = this.files.get(key);\n if (!file) {\n file = {\n projectName,\n sourcePath,\n total,\n outcomes: new Map(),\n attemptOutcomes: new Map(),\n started: false,\n printed: false,\n durationMs: 0,\n retries: 0,\n completionOrder: 0,\n };\n this.files.set(key, file);\n }\n file.total = Math.max(file.total, total);\n return file;\n }\n\n event(event: TestReporterEvent): void {\n if (event.type === 'run-start') {\n this.total = event.cases;\n this.totalFiles = event.documents;\n this.startedAt = event.startedAt\n ? Date.parse(event.startedAt)\n : Date.now();\n for (const file of event.files ?? [])\n this.file(file.projectName, file.sourcePath, file.cases);\n const c = this.color;\n this.log(\n `\\n ${c.bgGreen.black.bold(' RUN ')} ${c.green(`midscene-test v${version}`)} ${c.dim(oneLine(event.projectRoot ?? process.cwd()))}`,\n );\n this.log(\n ` ${c.dim(`${event.projects} projects · ${event.documents} files · ${event.cases} cases`)}`,\n );\n if (\n event.maxConcurrentProjects !== undefined &&\n event.maxConcurrentFiles !== undefined\n )\n this.log(\n ` ${c.dim(`Concurrency ${event.maxConcurrentProjects ?? 'unlimited'} projects · ${event.maxConcurrentFiles ?? 'unlimited'} files (global limits)`)}`,\n );\n if (event.configPath)\n this.log(` ${c.dim(`Config ${oneLine(event.configPath)}`)}`);\n for (const model of event.configuredModels ?? [])\n this.log(\n ` ${c.dim('Models (env)')} ${oneLine(model.name)} ${c.dim(`· ${model.intents.map(oneLine).join(', ')}`)}`,\n );\n this.log('');\n if (this.mode === 'default') {\n this.timer = setInterval(\n () => this.tick(),\n this.interactive ? 1000 : 30_000,\n );\n this.timer.unref();\n if (this.interactive)\n this.removeResizeListener = this.io.onResize?.(() =>\n this.renderProgress(),\n );\n this.renderProgress();\n }\n } else if (event.type === 'project-end') {\n this.completeProject(event.project);\n this.schedule();\n } else if (event.type === 'project-phase') {\n if (event.phase === 'running')\n this.projectPhases.delete(event.projectName);\n else\n this.projectPhases.set(event.projectName, {\n phase: event.phase,\n since: Date.now(),\n });\n this.schedule();\n } else if (event.type === 'document-start') {\n this.file(event.projectName, event.sourcePath, event.cases).started =\n true;\n this.schedule();\n } else if (event.type === 'document-end') {\n const file = this.file(\n event.document.projectName,\n event.document.sourcePath,\n event.cases.length,\n );\n file.status = fileStatus(event.document.status, event.cases);\n file.started = true;\n file.completionOrder = ++this.completionOrder;\n file.durationMs = event.durationMs;\n file.retries = event.document.attemptIndex ?? 0;\n file.outcomes = new Map(\n event.cases.map((outcome) => [outcome.caseId, outcome]),\n );\n file.attemptOutcomes.clear();\n for (const [key, task] of this.active)\n if (task.file === file) this.active.delete(key);\n if (!this.interactive) this.printFile(file);\n this.schedule();\n } else if (event.type === 'step-start') {\n this.startStep(event.projectName, event.info);\n } else if (event.type === 'step-end') {\n if (event.result) this.usage.add(event.result);\n const key =\n event.info.scope === 'case'\n ? event.info.case.caseId\n : event.info.document.documentId;\n const task = this.active.get(key);\n if (task) {\n if (event.info.scope === 'document') this.active.delete(key);\n else {\n task.step = undefined;\n task.warning = undefined;\n }\n }\n this.schedule();\n } else if (event.type === 'case-attempt-end') {\n this.attempts.set(event.attempt.caseId, {\n run: event.attempt,\n max: event.maxAttempts,\n });\n } else if (event.type === 'case-end' || event.type === 'case-progress') {\n const file = this.file(\n event.outcome.projectName,\n event.outcome.sourcePath,\n );\n if (event.type === 'case-progress') {\n file.attemptOutcomes.set(event.outcome.caseId, event.outcome);\n file.retries = Math.max(file.retries, event.documentAttemptIndex);\n } else {\n file.attemptOutcomes.delete(event.outcome.caseId);\n file.outcomes.set(event.outcome.caseId, event.outcome);\n file.retries = Math.max(file.retries, event.documentRetries ?? 0);\n }\n this.active.delete(event.outcome.caseId);\n this.schedule();\n } else if (event.type === 'document-retry') {\n const file = this.file(\n event.document.projectName,\n event.document.sourcePath,\n );\n file.outcomes.clear();\n file.attemptOutcomes.clear();\n file.status = undefined;\n file.completionOrder = 0;\n for (const [key, task] of this.active)\n if (task.file === file) this.active.delete(key);\n this.log(\n this.color.yellow(\n ` ↻ ${identity(file.projectName, file.sourcePath)} · file retry ${(event.document.attemptIndex ?? 0) + 2}/${event.maxAttempts}`,\n ),\n );\n this.schedule();\n }\n }\n\n private startStep(projectName: string, info: StepExecutionInfo): void {\n const position = info.scope === 'case' ? info.case : info.document;\n const file = this.file(projectName, position.sourcePath);\n file.started = true;\n const key =\n info.scope === 'case' ? info.case.caseId : info.document.documentId;\n const attempt = info.scope === 'case' ? info.case.attemptIndex : 0;\n const previous = this.attempts.get(key);\n if (previous && previous.run.attemptIndex < attempt) {\n this.attempts.delete(key);\n if (this.mode === 'default' && !this.interactive)\n this.log(\n this.color.yellow(\n ` ↻ ${identity(projectName, position.sourcePath, info.scope === 'case' ? info.case.name : undefined)} · case retry · attempt ${attempt + 1}/${previous.max}`,\n ),\n );\n }\n const existing = this.active.get(key);\n const now = Date.now();\n this.active.set(key, {\n file,\n name: info.scope === 'case' ? info.case.name : undefined,\n step: `${position.phase === 'steps' ? 'step' : position.phase} ${position.stepIndex + 1}/${info.stepCount} · ${oneLine(info.node)}`,\n since: existing?.attempt === attempt ? existing.since : now,\n attempt,\n maxAttempts: previous?.max ?? existing?.maxAttempts,\n runId:\n info.scope === 'case' ? info.case.runId : info.document.documentRunId,\n phase: position.phase,\n stepIndex: position.stepIndex,\n caseIndex: info.scope === 'case' ? info.case.caseIndex : undefined,\n });\n this.schedule();\n }\n\n private schedule(): void {\n if (!this.interactive || !this.timer || this.scheduled) return;\n this.scheduled = setTimeout(() => {\n this.scheduled = undefined;\n this.renderProgress();\n }, 100);\n this.scheduled.unref();\n }\n private counts(items: readonly { status?: string }[], total: number): string {\n const failed = items.filter((item) => item.status === 'failed').length;\n const passed = items.filter((item) => item.status === 'success').length;\n const notRun = items.filter((item) => item.status === 'not-run').length;\n return this.stateCounts(passed, failed, notRun, total);\n }\n private stateCounts(\n passed: number,\n failed: number,\n notRun: number,\n total: number,\n ): string {\n const c = this.color;\n return (\n [\n failed ? c.red.bold(`${failed} failed`) : '',\n c.green.bold(`${passed} passed`),\n notRun ? c.yellow(`${notRun} not run`) : '',\n ]\n .filter(Boolean)\n .join(c.dim(' | ')) + c.dim(` (${total})`)\n );\n }\n private footer(\n durationMs = Date.now() - this.startedAt,\n result?: TestProjectRunResult,\n ): string[] {\n const files = [...this.files.values()];\n const cases = files.flatMap((file) => [...file.outcomes.values()]);\n const c = this.color;\n const metrics = result ? this.finalMetrics : this.usage.snapshot();\n return [\n ` ${c.dim('Test Files')} ${this.counts(files, this.totalFiles)}`,\n ` ${c.dim(' Cases')} ${result ? this.stateCounts(result.summary.passed, result.summary.failed, result.summary.notRun, result.summary.total) : this.counts(cases, this.total)}`,\n ` ${c.dim(' Start at')} ${new Date(this.startedAt).toLocaleTimeString('en-GB', { hour12: false })}`,\n ` ${c.dim(' Duration')} ${formatDuration(durationMs)}`,\n ...formatModelUsage(metrics).map(\n (model, index) =>\n ` ${c.dim(index ? ' ' : ' Models:')} ${model}`,\n ),\n ...(!result || this.warnings.size\n ? [\n ` ${c.dim(' Warnings')} ${this.warnings.size ? c.yellow(String(this.warnings.size)) : c.dim('0')}${!result && this.latestNotice ? c.dim(` · ${this.latestNotice}`) : ''}`,\n ]\n : []),\n ];\n }\n private renderProgress(render = true): void {\n if (!this.interactive || !this.timer) return;\n const projects = new Map<string, FileState[]>();\n const files = [...this.files.values()]\n .filter((file) => file.started && !file.printed)\n .sort(\n (a, b) =>\n a.projectName.localeCompare(b.projectName) ||\n a.sourcePath.localeCompare(b.sourcePath),\n );\n for (const file of files) {\n const group = projects.get(file.projectName) ?? [];\n group.push(file);\n projects.set(file.projectName, group);\n }\n for (const projectName of this.projectPhases.keys())\n if (!projects.has(projectName)) projects.set(projectName, []);\n const footer = this.footer();\n const budget = Math.max(0, (this.io.rows ?? 24) - 2 - footer.length - 1);\n let lines = this.liveTree(projects, 'full');\n if (lines.length > budget) lines = this.liveTree(projects, 'recent');\n if (lines.length > budget) lines = this.liveTree(projects, 'compact');\n if (lines.length > budget) lines = this.liveTree(projects, 'active');\n if (lines.length) lines.push('');\n if (render) this.progressView.render(lines, footer);\n else this.progressView.update(lines, footer);\n }\n\n private liveTree(\n projects: Map<string, FileState[]>,\n mode: LiveMode,\n ): string[] {\n const c = this.color;\n const lines: string[] = [];\n const groups = [...projects];\n const isActive = ([projectName, files]: [string, FileState[]]) =>\n this.projectPhases.has(projectName) || files.some((file) => !file.status);\n if (mode !== 'full')\n groups.sort((a, b) => Number(isActive(b)) - Number(isActive(a)));\n for (const [projectName, files] of groups) {\n const phase = this.projectPhases.get(projectName);\n const running = files.filter((file) => !file.status);\n const completed = files.filter((file) => file.status);\n const recent = [...completed]\n .sort((a, b) => b.completionOrder - a.completionOrder)\n .slice(0, mode === 'recent' ? 1 : 0);\n const visible = mode === 'full' ? files : [...running, ...recent];\n const hidden = completed.filter((file) => !visible.includes(file));\n const hiddenFailures = hidden.filter(\n (file) => file.status === 'failed',\n ).length;\n const details = [\n phase\n ? c.yellow(\n `${projectPhaseLabel(phase.phase)} ${formatDuration(Date.now() - phase.since)}`,\n )\n : '',\n c.yellow(\n `${running.length} ${running.length === 1 ? 'file' : 'files'} running`,\n ),\n completed.length ? c.dim(`${completed.length} completed`) : '',\n mode === 'active' && hiddenFailures\n ? c.red(`${hiddenFailures} failed`)\n : '',\n ].filter(Boolean);\n lines.push(\n this.liveRow(\n ` ${c.yellow('❯')} ${c.bold(oneLine(projectName))}`,\n c.dim(' · ') + details.join(c.dim(' · ')),\n ),\n );\n for (const [fileIndex, file] of visible.entries()) {\n const lastFile =\n fileIndex === visible.length - 1 &&\n (!hidden.length || mode === 'active');\n const stem = lastFile ? ' ' : ` ${c.dim('│')} `;\n const outcomes = [\n ...new Map([...file.attemptOutcomes, ...file.outcomes]).values(),\n ].sort((a, b) => a.caseIndex - b.caseIndex);\n const failedCases = outcomes.filter(\n (outcome) => outcome.status === 'failed',\n ).length;\n lines.push(\n this.liveRow(\n ` ${c.dim(lastFile ? '└─' : '├─')} ${file.status ? `${this.statusSymbol(file.status)} ` : ''}${oneLine(file.sourcePath)}`,\n ` ${c.dim(`${outcomes.length}/${file.total} cases`)}${file.status ? c.dim(` ${formatDuration(file.durationMs)}`) : ''}${mode === 'active' && failedCases ? c.red(` · ${failedCases} failed`) : ''}`,\n ),\n );\n const tasks = [...this.active.values()].filter(\n (task) => task.file === file,\n );\n const shown =\n mode === 'full'\n ? outcomes\n : mode === 'recent'\n ? outcomes.slice(-1)\n : [];\n const children: LiveChild[] = [\n ...tasks.map((task) => ({ task })),\n ...shown.map((outcome) => ({ outcome })),\n ];\n if (mode === 'full')\n children.sort(\n (a, b) => this.liveChildIndex(a) - this.liveChildIndex(b),\n );\n const hiddenCases = outcomes.filter(\n (outcome) => !shown.includes(outcome),\n );\n if (hiddenCases.length && mode !== 'active') {\n const failed = hiddenCases.filter(\n (outcome) => outcome.status === 'failed',\n ).length;\n children.push({\n summary: `… ${hiddenCases.length} completed ${hiddenCases.length === 1 ? 'case' : 'cases'}${failed ? ` · ${failed} failed` : ''}`,\n failed: failed > 0,\n });\n }\n for (const [index, child] of children.entries()) {\n const last = index === children.length - 1;\n const prefix = `${stem}${c.dim(last ? '└─' : '├─')} `;\n if ('outcome' in child) {\n lines.push(\n this.liveRow(\n `${prefix}${this.formatCaseResult(child.outcome, file.retries)}`,\n '',\n ),\n );\n continue;\n }\n if ('summary' in child) {\n lines.push(\n this.liveRow(\n `${prefix}${child.failed ? c.red(child.summary) : c.dim(child.summary)}`,\n '',\n ),\n );\n continue;\n }\n const { task } = child;\n const hint =\n task.name && task.step\n ? truncateTerminalLine(\n ` · ${task.step}`,\n Math.floor(Math.max(0, (this.io.columns ?? 100) - 1) / 2),\n )\n : '';\n const retry = task.attempt\n ? ` · attempt ${task.attempt + 1}${task.maxAttempts ? `/${task.maxAttempts}` : ''}`\n : '';\n lines.push(\n this.liveRow(\n `${prefix}${oneLine(task.name ?? task.step ?? 'file lifecycle')}`,\n `${c.dim(hint)} ${c.yellow(formatDuration(Date.now() - task.since))}${c.yellow(retry)}`,\n ),\n );\n if (task.warning)\n lines.push(\n this.liveRow(\n `${stem}${last ? ' ' : `${c.dim('│')} `}${c.dim('└─')} ${c.yellow(`⚠ ${task.warning}`)}`,\n '',\n ),\n );\n }\n }\n if (hidden.length && mode !== 'active') {\n const summary = `… ${hidden.length} completed ${hidden.length === 1 ? 'file' : 'files'}${hiddenFailures ? ` · ${hiddenFailures} failed` : ''}`;\n lines.push(\n this.liveRow(\n ` ${c.dim('└─')} ${hiddenFailures ? c.red(summary) : c.dim(summary)}`,\n '',\n ),\n );\n }\n }\n return lines;\n }\n\n private liveChildIndex(child: LiveChild): number {\n if ('outcome' in child) return child.outcome.caseIndex;\n if ('summary' in child) return Number.MAX_SAFE_INTEGER;\n return (\n child.task.caseIndex ??\n (child.task.phase === 'beforeAll' ? -1 : Number.MAX_SAFE_INTEGER)\n );\n }\n\n private liveRow(label: string, suffix: string): string {\n const columns = Math.max(0, (this.io.columns ?? 100) - 1);\n const tail = truncateTerminalLine(suffix, columns);\n return truncateTerminalLine(label, columns - stringWidth(tail)) + tail;\n }\n private tick(): void {\n if (this.interactive) {\n this.renderProgress();\n return;\n }\n if (\n (this.active.size || this.projectPhases.size) &&\n Date.now() - this.lastOutput >= 30_000\n )\n this.log(\n `… Still running: ${[\n ...[...this.projectPhases].map(\n ([projectName, phase]) =>\n `[${oneLine(projectName)}] · ${projectPhaseLabel(phase.phase)} (${formatDuration(Date.now() - phase.since)})`,\n ),\n ...[...this.active.values()].map(\n (task) =>\n `${identity(task.file.projectName, task.file.sourcePath, task.name)} · ${task.step ?? 'between steps'} (${formatDuration(Date.now() - task.since)})`,\n ),\n ].join(' | ')}`,\n );\n }\n\n private formatCaseResult(\n outcome: CaseRunOutcome,\n documentRetries: number,\n ): string {\n const c = this.color;\n const attempts = outcome.attempts ?? (outcome.run ? [outcome.run] : []);\n const retries = Math.max(\n attempts.length - 1,\n outcome.run?.attemptIndex ?? 0,\n );\n const duration = formatDuration(\n attempts.reduce((sum, attempt) => sum + attempt.durationMs, 0),\n );\n const symbol =\n outcome.status === 'success'\n ? c.green('✓')\n : outcome.status === 'failed'\n ? c.red('×')\n : c.yellow('–');\n const detail =\n outcome.status === 'not-run'\n ? c.dim(` · ${outcome.notRunReason ?? 'not run'}`)\n : ` ${c.dim(duration)}${retries ? c.yellow(` · ${outcome.status === 'success' ? 'passed after retry' : 'failed after retries'} (${retries + 1} attempts)`) : documentRetries ? c.yellow(` · file retried ${documentRetries}x`) : ''}`;\n return `${symbol} ${oneLine(outcome.name)}${detail}`;\n }\n private statusSymbol(status: FileState['status']): string {\n return status === 'failed'\n ? this.color.red('×')\n : status === 'not-run'\n ? this.color.yellow('–')\n : this.color.green('✓');\n }\n\n private resultFileLines(file: FileState, lastFile: boolean): string[] {\n const c = this.color;\n const stem = lastFile ? ' ' : ` ${c.dim('│')} `;\n const cases = [...file.outcomes.values()].sort(\n (a, b) => a.caseIndex - b.caseIndex,\n );\n const failed = cases.filter((item) => item.status === 'failed').length;\n const notRun = cases.filter((item) => item.status === 'not-run').length;\n const stats = `(${cases.length} cases${failed ? ` | ${failed} failed` : ''}${notRun ? ` | ${notRun} not run` : ''})`;\n return [\n ` ${c.dim(lastFile ? '└─' : '├─')} ${this.statusSymbol(file.status)} ${c.bold(oneLine(file.sourcePath))} ${c.dim(stats)} ${c.dim(formatDuration(file.durationMs))}`,\n ...cases.map(\n (item, caseIndex) =>\n `${stem}${c.dim(caseIndex === cases.length - 1 ? '└─' : '├─')} ${this.formatCaseResult(item, file.retries)}`,\n ),\n ];\n }\n\n private printFile(file: FileState): void {\n if (file.printed) return;\n file.printed = true;\n this.log(\n [\n '',\n ` ${this.color.bold(oneLine(file.projectName))}`,\n ...this.resultFileLines(file, true),\n ].join('\\n'),\n );\n }\n\n private printProject(\n projectName: string,\n files: readonly FileState[],\n failed: boolean,\n ): void {\n if (!files.length || files.every((file) => file.printed)) return;\n const c = this.color;\n const status =\n failed || files.some((file) => file.status === 'failed')\n ? 'failed'\n : files.every((file) => file.status === 'not-run')\n ? 'not-run'\n : files.some((file) => file.status === 'not-run')\n ? 'failed'\n : 'success';\n const lines = [\n '',\n ` ${this.statusSymbol(status)} ${c.bold(oneLine(projectName))} ${c.dim(`(${files.length} ${files.length === 1 ? 'file' : 'files'})`)}`,\n ];\n for (const [index, file] of files.entries()) {\n if (file.printed) continue;\n file.printed = true;\n lines.push(...this.resultFileLines(file, index === files.length - 1));\n }\n this.log(lines.join('\\n'));\n }\n\n failure(source: string, error: unknown, context?: CliFailureContext): void {\n this.failures.push({ source, error, context });\n }\n\n private completeProject(project: TestExecutionProjectRunResult): void {\n this.projectPhases.delete(project.name);\n const projectFiles = new Set<FileState>();\n const documents = new Map(\n project.documents.map((document) => [document.documentId, document]),\n );\n const resultSources = new Set([\n ...project.cases.map((outcome) => outcome.sourcePath),\n ...project.documents.map((document) => document.sourcePath),\n ...project.collectionErrors.map((error) => error.sourcePath),\n ]);\n // Preserve plan order for selected files and actual results, excluding\n // files whose Cases were all filtered out before execution.\n for (const plan of project.plans ?? []) {\n const selected = plan.cases.filter((item) => item.selected).length;\n if (selected || resultSources.has(plan.sourcePath))\n projectFiles.add(this.file(project.name, plan.sourcePath, selected));\n }\n for (const outcome of project.cases)\n this.file(project.name, outcome.sourcePath).outcomes.set(\n outcome.caseId,\n outcome,\n );\n for (const document of documents.values()) {\n const file = this.file(project.name, document.sourcePath);\n file.status = document.status;\n file.retries = document.attemptIndex ?? 0;\n file.durationMs = project.documents\n .filter((item) => item.documentId === document.documentId)\n .reduce((sum, item) => sum + item.durationMs, 0);\n }\n for (const error of project.collectionErrors)\n this.file(project.name, error.sourcePath).status = 'failed';\n for (const file of this.files.values())\n if (file.projectName === project.name) {\n file.attemptOutcomes.clear();\n const cases = [...file.outcomes.values()];\n file.status = fileStatus(file.status, cases);\n projectFiles.add(file);\n }\n for (const [key, task] of this.active)\n if (task.file.projectName === project.name) this.active.delete(key);\n if (this.interactive)\n this.printProject(\n project.name,\n [...projectFiles],\n project.status === 'failed',\n );\n else for (const file of projectFiles) this.printFile(file);\n }\n\n finish(result: TestProjectRunResult): void {\n this.dispose();\n this.finalMetrics = result.metrics ?? this.usage.snapshot();\n if (result.startedAt) this.startedAt = Date.parse(result.startedAt);\n for (const project of result.projects) this.completeProject(project);\n this.total = result.summary.total;\n this.totalFiles = this.files.size;\n }\n\n private sectionHeading(label: string, kind: 'warning' | 'failure'): void {\n const c = this.color;\n const width = Math.max(0, (this.io.columns ?? 80) - 2);\n const title = truncateTerminalLine(` ${label} `, width);\n const padding = Math.max(0, width - stringWidth(title));\n const left = Math.floor(padding / 2);\n const line = kind === 'warning' ? c.yellow : c.red;\n const badge =\n kind === 'warning' ? c.bgYellow.black.bold : c.bgRed.white.bold;\n this.log(\n `\\n ${line('─'.repeat(left))}${badge(title)}${line('─'.repeat(padding - left))}\\n`,\n );\n }\n\n summary(result: TestProjectRunResult): void {\n const c = this.color;\n if (this.interactive && this.warnings.size) {\n this.sectionHeading(`Warnings ${this.warnings.size}`, 'warning');\n for (const warning of [...this.warnings.values()].slice(0, 5))\n this.log(\n ` ${c.yellow('WARN')} ${c.dim(warning.scope)}${warning.message}`,\n );\n if (this.warnings.size > 5)\n this.log(\n c.dim(\n ` … ${this.warnings.size - 5} more warnings; see debug logs or --reporter verbose.`,\n ),\n );\n }\n if (this.failures.length) {\n this.sectionHeading(`Failures ${this.failures.length}`, 'failure');\n for (const failure of this.failures) {\n if (this.mode === 'default') {\n const detail = formatFailureDetails(\n failure.source,\n failure.error,\n failure.context,\n );\n const body = detail.body\n .map((line) => {\n if (line.startsWith(' Error:')) return c.red(line);\n if (line.startsWith(' at ')) return c.dim(line);\n return line.replace(\n /^ {2}(?:Step|Location|Attempt|File try|Phase|Input)\\s+/,\n (label) => c.dim(label),\n );\n })\n .join('\\n');\n const block = `${c.bgRed.white.bold(' FAIL ')} ${c.bold(detail.title)}\\n${body}\\n`;\n if (this.interactive) this.log(block);\n else\n this.io.error(`FAIL ${detail.title}\\n${detail.body.join('\\n')}\\n`);\n continue;\n }\n const message = formatCliError(failure.error);\n this.io.error(\n `FAIL midscene-test: ${failure.source}:\\n${message\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n')}\\n`,\n );\n }\n }\n this.log(`\\n${this.footer(result.durationMs, result).join('\\n')}`);\n this.log('');\n this.failures = [];\n }\n\n dispose(): void {\n if (this.timer) clearInterval(this.timer);\n if (this.scheduled) clearTimeout(this.scheduled);\n this.timer = undefined;\n this.scheduled = undefined;\n this.removeResizeListener?.();\n this.removeResizeListener = undefined;\n this.progressView.clear();\n }\n}\n","import { appendFileSync } from 'node:fs';\nimport { relative, resolve, sep } from 'node:path';\nimport { renderTestBadgeLines } from '../report/badge';\nimport { formatDuration } from './terminal-reporter';\nimport type { TestProjectRunResult } from './types';\n\nconst escapeData = (text: string) =>\n text.replace(/%/g, '%25').replace(/\\r/g, '%0D').replace(/\\n/g, '%0A');\nconst escapeProperty = (text: string) =>\n escapeData(text).replace(/:/g, '%3A').replace(/,/g, '%2C');\nconst markdown = (text: string) =>\n text.replace(\n /[&<>`\\r\\n]/g,\n (char) =>\n ({\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '`': '&#96;',\n '\\r': ' ',\n '\\n': ' ',\n })[char]!,\n );\n\n// Entity references are not decoded inside code spans, so paths are kept\n// as is, fenced with more backticks than the longest run they contain.\nconst code = (text: string) => {\n const value = text.replace(/[\\r\\n]+/g, ' ');\n const longest = Math.max(\n 0,\n ...(value.match(/`+/g) ?? []).map((run) => run.length),\n );\n const fence = '`'.repeat(longest + 1);\n const pad = value.startsWith('`') || value.endsWith('`') ? ' ' : '';\n return `${fence}${pad}${value}${pad}${fence}`;\n};\n\n/** Annotations use real source files. Step positions remain in the title when no source line is available. */\nexport function githubFailureAnnotation(\n source: string,\n message: string,\n file?: string,\n): string | undefined {\n if (process.env.GITHUB_ACTIONS !== 'true') return;\n const workspace = process.env.GITHUB_WORKSPACE ?? process.cwd();\n const path = file\n ? relative(workspace, resolve(file)).split(sep).join('/')\n : undefined;\n return `::error ${path ? `file=${escapeProperty(path)},` : ''}title=${escapeProperty(source)}::${escapeData(message)}`;\n}\n\nexport function writeGitHubSummary(result: TestProjectRunResult): void {\n const output = process.env.GITHUB_STEP_SUMMARY;\n if (process.env.GITHUB_ACTIONS !== 'true' || !output) return;\n const failedCases = [\n ...new Map(result.cases.map((item) => [item.caseId, item])).values(),\n ].filter((item) => item.status === 'failed');\n const summary = [\n '## Midscene Test',\n '',\n ...renderTestBadgeLines(result),\n '| Passed | Failed | Not run | Passed after retry | Duration |',\n '| ---: | ---: | ---: | ---: | ---: |',\n `| ${result.summary.passed} | ${result.summary.failed} | ${result.summary.notRun} | ${result.summary.passedAfterRetry} | ${formatDuration(result.durationMs)} |`,\n '',\n 'Passed after retry is included in Passed.',\n '',\n ...failedCases.map(\n (item) =>\n `- Failed: **${markdown(item.name)}** — ${markdown(item.projectName)}/${code(item.sourcePath)}`,\n ),\n ...(result.summary.collectionErrors\n ? [`- Collection errors: ${result.summary.collectionErrors}`]\n : []),\n ...(result.summary.documentFailures\n ? [`- Failed files: ${result.summary.documentFailures}`]\n : []),\n ...(result.summary.projectFailures\n ? [`- Failed projects: ${result.summary.projectFailures}`]\n : []),\n '',\n ...(result.reportPath\n ? [`Report artifact entry: ${code(result.reportPath)}`]\n : []),\n `Structured results: ${code(result.summaryPath)}`,\n '',\n ].join('\\n');\n appendFileSync(output, `${summary}\\n`);\n}\n","import { z } from 'zod/v4';\nimport type { NodeDefinition } from '../node/types';\nimport type { TestFileSelection } from './test-project';\n\nexport interface NodeSpecDocument {\n markdown: string;\n warnings: readonly string[];\n}\n\nconst GENERATED_COMMENT =\n '<!-- Generated by `midscene-test nodes`. Do not edit directly. -->';\n\nexport const sortNodesForSpec = (\n nodes: readonly NodeDefinition<any, any, any>[],\n): NodeDefinition<any, any, any>[] => {\n const priority = (name: string) =>\n name === 'aiAct' ? 0 : name === 'aiAssert' ? 1 : 2;\n return [...nodes].sort(\n (left, right) =>\n priority(left.name) - priority(right.name) ||\n (left.name < right.name ? -1 : left.name > right.name ? 1 : 0),\n );\n};\n\nconst escapeTableCell = (value: string): string =>\n value\n .trim()\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\\|/g, '\\\\|')\n .replace(/\\r\\n|\\r|\\n/g, '<br>');\n\nconst renderNodeOverview = (\n nodes: readonly NodeDefinition<any, any, any>[],\n): string => {\n const heading = '## Available Nodes';\n if (nodes.length === 0) {\n return `${heading}\\n\\nNo nodes are registered by the current Test Project.`;\n }\n const rows = nodes.map(\n (node) =>\n `| ${escapeTableCell(node.name)} | ${escapeTableCell(node.description || 'Description not declared.')} |`,\n );\n return `${heading}\\n\\nThis table lists all available Nodes. See [Node Details](#node-details) below for each Node's usage and input schema.\\n\\n${['| Node | Description |', '| --- | --- |', ...rows].join('\\n')}`;\n};\n\ninterface NodeSpecLocation {\n configPath?: string;\n projects: readonly { name: string; files: TestFileSelection }[];\n}\n\nconst renderWorkflowLocations = (location?: NodeSpecLocation): string => {\n const sections = [\n '## Where to use these Nodes',\n 'Use these Nodes in Workflow Documents (`.yaml` or `.yml` files) selected by an Execution Project. Case file patterns and the config file path below are relative to this spec file. Case file patterns use glob syntax. A custom `--config` path does not change where case files are selected.',\n 'Projects created by `midscene-test create` select `cases/**/*.{yaml,yml}` by default, so you can write test cases in `cases/example.yaml` or subdirectories of `cases/`. If an Execution Project has no `files` configuration, Midscene Test searches `**/*.{yaml,yml}` recursively instead. Check `projects[].files` in your configuration before choosing a file location.',\n ];\n if (location) {\n sections.push(\n `**Config file:** ${location.configPath ? `\\`${location.configPath}\\`` : 'No config file loaded.'}`,\n );\n for (const project of location.projects) {\n const patterns = project.files.include\n .map((pattern) => `\\`${pattern}\\``)\n .join(', ');\n const projectLabel =\n location.projects.length > 1 || project.name !== 'default'\n ? ` (Execution Project: ${project.name})`\n : '';\n const excludes = project.files.exclude?.length\n ? `; excludes: ${project.files.exclude.map((pattern) => `\\`${pattern}\\``).join(', ')}`\n : '';\n sections.push(`**Case files:** ${patterns}${projectLabel}${excludes}`);\n }\n }\n sections.push(\n 'Files matching `files.exclude` are not selected. Midscene Test always ignores `.git/`, `.midscene/`, `midscene_run/`, and `node_modules/` directories, including nested ones.',\n 'Call a Node in `cases[].steps`, or in the Workflow Document lifecycle steps `beforeAll`, `beforeEach`, `afterEach`, and `afterAll`. Root Nodes are shared defaults; `projects[].nodes` adds local Nodes and overrides same-named root Nodes only within that Execution Project. Each Execution Project supplies its own runtime environment.',\n );\n return sections.join('\\n\\n');\n};\n\nconst WORKFLOW_STEP_CONTRACT = `## Workflow Step Contract\n\nEach step uses a node name as its key. The \\`$\\` object contains engine metadata and is not part of the node input.\n\n\\`\\`\\`yaml\ncases:\n - name: Example case\n steps:\n - node.name:\n prompt: Describe the task.\n $:\n timeout: 30000\n continue-on-error: false\n\\`\\`\\`\n\nA Node may map a string step value to one declared input field. Each Node section states whether it supports this shorthand and names the target field.\n\nEach Node's returned \\`data\\` is saved on that Step's result. Results are not named or automatically passed to later Steps. A failed Case does not stop later Cases by default; \\`test.bail\\` controls early stopping across the run.`;\n\nconst sortJsonValue = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(sortJsonValue);\n if (typeof value !== 'object' || value === null) return value;\n\n return Object.fromEntries(\n Object.entries(value)\n .sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))\n .map(([key, child]) => [key, sortJsonValue(child)]),\n );\n};\n\nconst assertSelfContainedRefs = (value: unknown, node: string): void => {\n if (Array.isArray(value)) {\n for (const child of value) assertSelfContainedRefs(child, node);\n return;\n }\n if (typeof value !== 'object' || value === null) return;\n\n for (const [key, child] of Object.entries(value)) {\n if (key === '$ref' && typeof child === 'string' && !child.startsWith('#')) {\n throw new Error(\n `Cannot describe node \"${node}\": inputSchema generated an external $ref.`,\n );\n }\n assertSelfContainedRefs(child, node);\n }\n};\n\nconst toJsonSchema = (node: NodeDefinition<any, any, any>): unknown => {\n try {\n const schema = z.toJSONSchema(node.inputSchema!, {\n target: 'draft-2020-12',\n io: 'input',\n unrepresentable: 'throw',\n cycles: 'ref',\n reused: 'ref',\n });\n assertSelfContainedRefs(schema, node.name);\n return sortJsonValue(schema);\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.startsWith(`Cannot describe node \"${node.name}\":`)\n ) {\n throw error;\n }\n throw new Error(\n `Cannot describe node \"${node.name}\": inputSchema contains a Zod type that cannot be represented as JSON Schema.`,\n { cause: error },\n );\n }\n};\n\nconst renderNode = (\n node: NodeDefinition<any, any, any>,\n warnings: string[],\n): string => {\n const sections = [`### \\`${node.name}\\``];\n\n if (node.title) sections.push(`**Title:** ${node.title.trim()}`);\n if (node.description) {\n sections.push(node.description.trim());\n } else {\n warnings.push(`node \"${node.name}\" has no description`);\n sections.push(\n `> Description not declared. Do not infer this node's behavior.`,\n );\n }\n\n if (node.stringInputKey === false || node.stringInputKey === undefined) {\n sections.push('**String shorthand:** Not supported by this Node.');\n } else {\n sections.push(\n `**String shorthand:** Maps to \\`{ ${node.stringInputKey}: value }\\`.`,\n );\n }\n\n sections.push('#### Input Schema');\n if (node.inputSchema) {\n sections.push(\n `\\`\\`\\`json\\n${JSON.stringify(toJsonSchema(node), null, 2)}\\n\\`\\`\\``,\n );\n } else {\n warnings.push(`node \"${node.name}\" has no inputSchema`);\n sections.push(\n '> Input schema not declared. Do not invent input fields for this node.',\n );\n }\n\n return sections.join('\\n\\n');\n};\n\nexport const renderNodeSpec = (\n nodes: readonly NodeDefinition<any, any, any>[],\n location?: NodeSpecLocation,\n): NodeSpecDocument => {\n const warnings: string[] = [];\n const sortedNodes = sortNodesForSpec(nodes);\n const sections = [\n GENERATED_COMMENT,\n '# Midscene Test Node Spec',\n 'This document describes the Nodes available in YAML test files (`.yaml` or `.yml`) for the Midscene Test framework (`@midscene/test`). It lists the Nodes registered by the current Test Project, their inputs, and how to call them in test steps and lifecycle hooks.',\n [\n 'Learn about the framework and YAML test authoring:',\n '',\n '- [Midscene Test overview](https://midscenejs.com/midscene-test/overview): framework concepts and the role of Nodes.',\n '- [Create and use test projects](https://midscenejs.com/midscene-test/use): write YAML cases, run tests, and inspect results.',\n '- [Configure test projects](https://midscenejs.com/midscene-test/configuration): register Nodes, select case files, and manage runtime resources.',\n ].join('\\n'),\n renderNodeOverview(sortedNodes),\n renderWorkflowLocations(location),\n WORKFLOW_STEP_CONTRACT,\n ];\n\n if (sortedNodes.length > 0) {\n sections.push('## Node Details');\n for (const node of sortedNodes) sections.push(renderNode(node, warnings));\n }\n\n return {\n markdown: `${sections.join('\\n\\n')}\\n`,\n warnings,\n };\n};\n","/** CLI-only interception. SDK consumers never have their streams patched. */\nexport function captureTerminalOutput(\n output: (message: string, write: (message: string) => void) => void,\n streams: readonly Pick<NodeJS.WritableStream, 'write'>[] = [\n process.stdout,\n process.stderr,\n ],\n): () => void {\n const cleanups: (() => void)[] = [];\n for (const stream of streams) {\n const original = stream.write;\n const forward = original.bind(stream);\n const intercepted: typeof stream.write = (\n chunk: string | Uint8Array,\n encoding?: BufferEncoding | ((error?: Error | null) => void),\n callback?: (error?: Error | null) => void,\n ): boolean => {\n const done = typeof encoding === 'function' ? encoding : callback;\n const message =\n typeof chunk === 'string' ? chunk : Buffer.from(chunk).toString();\n let accepted = true;\n output(message, (text) => {\n accepted = forward(text, done);\n });\n return accepted;\n };\n stream.write = intercepted;\n cleanups.push(() => {\n if (stream.write === intercepted) stream.write = original;\n });\n }\n return () => {\n for (const cleanup of cleanups) cleanup();\n };\n}\n","import { existsSync, realpathSync, statSync, writeFileSync } from 'node:fs';\nimport { relative, resolve, sep } from 'node:path';\nimport { WorkflowExecutionFailure } from '@midscene/core/internal/test-runner';\nimport { runWithConsoleLogHandler } from '@midscene/shared/logger';\nimport { version } from '../../package.json';\nimport { formatCliError, formatConciseError } from './error-format';\nimport type { CliFailureContext } from './failure-format';\nimport { githubFailureAnnotation } from './github-reporter';\nimport { renderNodeSpec, sortNodesForSpec } from './node-spec';\nimport { prepareTestRun } from './prepare-test-run';\nimport { runPreparedTestProject } from './run-prepared-project';\nimport { captureTerminalOutput } from './terminal-output';\nimport {\n TerminalReporter,\n type TerminalReporterMode,\n} from './terminal-reporter';\nimport { loadTestProject } from './test-project';\nimport {\n DEFAULT_TEST_FILE_SELECTION,\n discoverTestConfig,\n} from './test-project-runner';\nimport type { TestProjectRunResult } from './types';\n\nexport interface TestCliIO {\n log(message: string): void;\n error(message: string): void;\n write?(message: string): void;\n isTTY?: boolean;\n columns?: number;\n rows?: number;\n onResize?(listener: () => void): () => void;\n}\n\ninterface ParsedTestArgs {\n command?: 'nodes';\n cwd: string;\n projectRoot?: string;\n testPath?: string;\n configPath?: string;\n resultDir?: string;\n projectNames?: string[];\n reporter?: TerminalReporterMode;\n}\n\nexport const parseTestCliArgs = (\n args: string[],\n cwd = process.cwd(),\n): ParsedTestArgs => {\n const command = args[0] === 'nodes' ? args[0] : undefined;\n const commandOffset = command ? 1 : 0;\n let inputPath: string | undefined;\n let configPath: string | undefined;\n let resultDir: string | undefined;\n const projectNames: string[] = [];\n let reporter: TerminalReporterMode | undefined;\n\n for (let index = commandOffset; index < args.length; index += 1) {\n const token = args[index];\n const equal = token.startsWith('-') ? token.indexOf('=') : -1;\n const arg = equal < 0 ? token : token.slice(0, equal);\n const inlineValue = equal < 0 ? undefined : token.slice(equal + 1);\n if (!arg.startsWith('-')) {\n if (inputPath)\n throw new Error('Only one test file or directory is allowed.');\n inputPath = resolve(cwd, arg);\n continue;\n }\n if (\n arg === '--config' ||\n arg === '--result-dir' ||\n arg === '--project' ||\n arg === '--reporter'\n ) {\n const value = inlineValue ?? args[index + 1];\n if (!value || value.startsWith('--'))\n throw new Error(`${arg} requires a value.`);\n if (arg === '--config') configPath = value;\n else if (arg === '--result-dir') resultDir = resolve(cwd, value);\n else if (arg === '--project') projectNames.push(value);\n else {\n if (value !== 'default' && value !== 'verbose')\n throw new Error(\n `Unknown reporter: ${value}. Expected default or verbose.`,\n );\n reporter = value;\n }\n if (inlineValue === undefined) index += 1;\n } else {\n throw new Error(`Unknown option: ${token}`);\n }\n }\n\n if (command === 'nodes' && resultDir) {\n throw new Error('--result-dir is not supported by nodes.');\n }\n if (command === 'nodes' && reporter)\n throw new Error('--reporter is not supported by nodes.');\n if (command === 'nodes' && projectNames.length > 1) {\n throw new Error('nodes accepts only one --project name.');\n }\n return {\n ...(command ? { command } : {}),\n cwd,\n ...(command ? { projectRoot: inputPath } : { testPath: inputPath }),\n configPath,\n resultDir,\n ...(projectNames.length > 0 ? { projectNames } : {}),\n ...(reporter ? { reporter } : {}),\n };\n};\n\nconst defaultCliIO: TestCliIO = {\n log: console.log,\n error: console.error,\n write: process.stdout.write.bind(process.stdout),\n isTTY: Boolean(process.stdout.isTTY && !process.env.CI),\n get columns() {\n return process.stdout.columns;\n },\n get rows() {\n return process.stdout.rows;\n },\n onResize(listener) {\n process.stdout.on('resize', listener);\n return () => process.stdout.off('resize', listener);\n },\n};\n\nconst testCliHelp = `Midscene Test: run native cases/steps Test projects.\n\nUsage:\n midscene-test [file.yaml | directory] [options]\n midscene-test --config <midscene.config.ts> [options]\n midscene-test nodes [directory] [--config midscene.config.ts]\n midscene-test create --help\n midscene-test model verify Check model connectivity and Midscene compatibility\n\nOptions:\n --config <path> Native TypeScript or JavaScript Test config\n --project <name> Select a native execution Project (repeatable)\n --result-dir <path> Store Test result files in this directory\n --reporter <default|verbose> Concise Case results or full step diagnostics\n --help, -h Show this help\n --version Show the package version\n\nWith a config, run paths filter project files. Without one, they select standalone inputs.\nRun paths never change config discovery or the artifact root.\nFor test runs, config discovery checks cwd only; --config is relative to cwd.\nThe selected config directory becomes the test root.\nFile include/exclude and tag rules still apply to explicit paths.\n\nLegacy tasks/flow YAML and its CLI options belong to the midscene command.\n`;\n\nconst assertDirectory = (path: string, label: string): void => {\n if (!existsSync(path) || !statSync(path).isDirectory()) {\n throw new Error(`${label} does not exist or is not a directory: ${path}`);\n }\n};\n\nconst runNodesCommand = async (\n options: ParsedTestArgs,\n io: TestCliIO,\n): Promise<void> => {\n const cwd = resolve(options.cwd);\n assertDirectory(cwd, 'Test working directory');\n const projectRoot = options.projectRoot\n ? resolve(cwd, options.projectRoot)\n : undefined;\n if (projectRoot) assertDirectory(projectRoot, 'Test project directory');\n\n const configSearchRoot = projectRoot ?? cwd;\n const configPath = options.configPath\n ? resolve(configSearchRoot, options.configPath)\n : discoverTestConfig(configSearchRoot);\n if (options.configPath && /\\.ya?ml$/i.test(configPath!)) {\n throw new Error(\n `midscene-test nodes --config only accepts a native TypeScript or JavaScript project config: ${configPath}.`,\n );\n }\n if (options.configPath && (!configPath || !existsSync(configPath))) {\n throw new Error(`Midscene config does not exist: ${configPath}`);\n }\n\n const project = await loadTestProject(configPath);\n const projectName = options.projectNames?.[0];\n const selectedProjects = projectName\n ? project.projects.filter((candidate) => candidate.name === projectName)\n : project.projects;\n if (selectedProjects.length === 0) {\n throw new Error(`Unknown Midscene project: ${projectName}`);\n }\n // Check every Project before writing, including when only one is selected.\n const filenames = new Map<string, string>();\n const owners = new Map<string, string>();\n for (const executionProject of project.projects) {\n const safeName = executionProject.name\n .normalize('NFC')\n // biome-ignore lint/suspicious/noControlCharactersInRegex: filenames cannot contain control characters.\n .replace(/[<>:\"/\\\\|?*\\u0000-\\u001f]/g, '-')\n .replace(/[. ]+$/g, '-');\n const filename = project.hasExplicitProjects\n ? `midscene-node-spec.${safeName}.md`\n : 'midscene-node-spec.md';\n const key = filename.toLowerCase();\n const owner = owners.get(key);\n if (owner !== undefined) {\n throw new Error(\n `Projects \"${owner}\" and \"${executionProject.name}\" generate the same Node Spec filename: ${filename}`,\n );\n }\n owners.set(key, executionProject.name);\n filenames.set(executionProject.name, filename);\n }\n const specs = selectedProjects.map((executionProject) => {\n const nodes = sortNodesForSpec(executionProject.nodes.definitions());\n const document = renderNodeSpec(nodes, {\n configPath: configPath\n ? relative(configSearchRoot, configPath).split(sep).join('/')\n : undefined,\n projects: [\n {\n name: executionProject.name,\n files: executionProject.files ?? DEFAULT_TEST_FILE_SELECTION,\n },\n ],\n });\n return { executionProject, nodes, document };\n });\n for (const { executionProject, nodes, document } of specs) {\n for (const warning of document.warnings) {\n io.error(`midscene-test nodes: ${warning}`);\n }\n const specPath = resolve(\n configSearchRoot,\n filenames.get(executionProject.name)!,\n );\n writeFileSync(specPath, document.markdown);\n if (project.hasExplicitProjects || projectName) {\n io.log(`Execution Project: ${executionProject.name}`);\n }\n io.log(`Registered Nodes (${nodes.length}):`);\n if (nodes.length === 0) {\n io.log('No nodes are registered by the current Test Project.');\n }\n for (const node of nodes) {\n io.log(\n `- ${node.name}: ${node.description?.trim() || 'Description not declared.'}`,\n );\n }\n io.log(`\\nNode Spec generated: ${specPath}`);\n }\n};\n\nconst reportTestProjectResult = (\n result: TestProjectRunResult,\n io: TestCliIO,\n reporter: TerminalReporter,\n projectRoot: string,\n infrastructureErrors: readonly unknown[] = result.errors ?? [],\n): number => {\n reporter.finish(result);\n const reportedErrors = new Set<Error>();\n const reportError = (\n source: string,\n error: unknown,\n sourcePath?: string,\n context?: CliFailureContext,\n ): void => {\n if (error instanceof Error && reportedErrors.has(error)) return;\n reporter.failure(source, error, { projectRoot, ...context });\n const annotation = githubFailureAnnotation(\n source,\n formatConciseError(error),\n sourcePath ? resolve(projectRoot, sourcePath) : undefined,\n );\n if (annotation) io.log(annotation);\n // Infrastructure failures carry raw errors that can also be causes of\n // the contextual errors already printed from the execution result.\n const pending = [error];\n while (pending.length > 0) {\n const current = pending.pop();\n if (!(current instanceof Error) || reportedErrors.has(current)) continue;\n reportedErrors.add(current);\n pending.push(current.cause);\n if (current instanceof AggregateError) pending.push(...current.errors);\n }\n };\n for (const failure of result.collectionErrors) {\n reportError(\n `${failure.projectName}/${failure.sourcePath}`,\n failure.error,\n failure.sourcePath,\n {\n projectName: failure.projectName,\n sourcePath: failure.sourcePath,\n phase: 'collection',\n },\n );\n }\n const finalDocuments = new Map(\n result.documents.map((document) => [document.documentId, document]),\n );\n const documentContext = (\n projectName: string,\n documentId: string,\n sourcePath: string,\n ) => {\n const project = result.projects.find(\n (project) => project.name === projectName,\n );\n const document = finalDocuments.get(documentId);\n const plan =\n document?.plan ??\n project?.plans?.find((plan) => plan.documentId === documentId);\n const fileIndex = document?.attemptIndex ?? 0;\n return {\n plan,\n projectName,\n sourcePath,\n ...(plan?.retry.scope === 'document'\n ? {\n fileAttempt: {\n index: fileIndex,\n total: Math.max(fileIndex + 1, plan.retry.count + 1),\n },\n }\n : {}),\n caseAttempts:\n plan?.retry.scope === 'document'\n ? 1\n : (plan?.retry.count ?? project?.retry ?? 0) + 1,\n };\n };\n const finalCases = new Map(\n result.cases.map((outcome) => [outcome.caseId, outcome]),\n );\n for (const outcome of finalCases.values()) {\n if (outcome.status !== 'failed' || !outcome.run) continue;\n const run = outcome.run;\n const source = `${run.projectName}/${run.sourcePath} / ${run.name}`;\n const { caseAttempts, plan, ...scope } = documentContext(\n run.projectName,\n outcome.documentId,\n run.sourcePath,\n );\n const context: CliFailureContext = {\n ...scope,\n caseName: run.name,\n attempt: {\n index: run.attemptIndex,\n total: Math.max(caseAttempts, run.attemptIndex + 1),\n },\n };\n const casePlan = plan?.cases.find((item) => item.caseId === outcome.caseId);\n for (const [phase, steps] of [\n ['beforeEach', run.beforeEach],\n ['steps', run.steps],\n ['afterEach', run.afterEach],\n ] as const) {\n for (const step of steps) {\n if (step.error) {\n reportError(\n `${source} / ${step.phase}[${step.stepIndex + 1}] ${step.node}${run.attemptIndex ? ` (failed after ${run.attemptIndex + 1} attempts)` : ''}`,\n step.error,\n run.sourcePath,\n { ...context, step, stepCount: casePlan?.[phase].length },\n );\n }\n }\n }\n for (const [phase, errors] of [\n ['execution', run.executionErrors],\n ['teardown', run.teardownErrors],\n ] as const) {\n for (const error of errors ?? [])\n reportError(source, error, run.sourcePath, { ...context, phase });\n }\n }\n for (const document of finalDocuments.values()) {\n if (document.status !== 'failed') continue;\n const source = `${document.projectName}/${document.sourcePath}`;\n const {\n caseAttempts: _,\n plan,\n ...context\n } = documentContext(\n document.projectName,\n document.documentId,\n document.sourcePath,\n );\n for (const [phase, steps] of [\n ['beforeAll', document.beforeAll],\n ['afterAll', document.afterAll],\n ] as const) {\n for (const step of steps) {\n if (step.error) {\n reportError(\n `${source} / ${step.phase}[${step.stepIndex + 1}] ${step.node}`,\n step.error,\n document.sourcePath,\n { ...context, step, stepCount: plan?.[phase].length },\n );\n }\n }\n }\n for (const [phase, errors] of [\n ['execution', document.executionErrors],\n ['teardown', document.teardownErrors],\n ] as const) {\n for (const error of errors ?? [])\n reportError(source, error, document.sourcePath, { ...context, phase });\n }\n for (const failure of document.hostErrors ?? []) {\n reportError(\n `${source} / host ${failure.phase}`,\n failure.error,\n document.sourcePath,\n { ...context, phase: `host ${failure.phase}` },\n );\n }\n }\n for (const project of result.projects) {\n if (project.lifecycle?.setupError) {\n reportError(\n `${project.name} / setup`,\n project.lifecycle.setupError,\n undefined,\n { projectName: project.name, phase: 'setup' },\n );\n }\n for (const error of project.lifecycle?.teardownErrors ?? []) {\n reportError(`${project.name} / teardown`, error, undefined, {\n projectName: project.name,\n phase: 'teardown',\n });\n }\n }\n for (const error of infrastructureErrors) {\n reportError('infrastructure', error);\n }\n reporter.summary(result);\n if (reporter.mode === 'verbose') io.log(`Results: ${result.resultDir}`);\n io.log(`Summary: ${result.summaryPath}`);\n if (result.markdownPath && reporter.mode === 'verbose')\n io.log(`Markdown: ${result.markdownPath}`);\n if (result.reportPath) io.log(`Report: ${result.reportPath}`);\n return result.exitCode;\n};\n\nexport async function runTestCli(\n args: string[],\n io: TestCliIO = defaultCliIO,\n // The executable entry owns external publishing of completed run results.\n onResult?: (result: TestProjectRunResult) => void,\n): Promise<number> {\n try {\n if (args[0] === 'model') {\n const { runModelCommand } = await import('./model-command');\n return runModelCommand(args, undefined, {\n stdout: io.log,\n stderr: io.error,\n });\n }\n if (args[0] === 'create') {\n const { runCreateCommand } = await import('./create-command');\n await runCreateCommand(args.slice(1), io);\n return 0;\n }\n if (args.includes('--help') || args.includes('-h')) {\n io.log(testCliHelp);\n return 0;\n }\n if (args.includes('--version')) {\n io.log(version);\n return 0;\n }\n const options = parseTestCliArgs(args);\n if (options.command === 'nodes') {\n await runNodesCommand(options, io);\n return 0;\n }\n const reporter = new TerminalReporter(io, options.reporter);\n const restoreOutput =\n io === defaultCliIO && io.isTTY && options.reporter !== 'verbose'\n ? captureTerminalOutput((message, write) =>\n reporter.output(message, write),\n )\n : undefined;\n try {\n return await runWithConsoleLogHandler(\n (entry) => reporter.console(entry),\n async () => {\n const plan = await prepareTestRun({\n ...options,\n onProgress: (message) => reporter.progress(message),\n onEvent: (event) => reporter.event(event),\n });\n const projectRoot = realpathSync(plan.projectRoot);\n let result: TestProjectRunResult;\n try {\n result = await runPreparedTestProject(plan);\n } catch (error) {\n if (!(error instanceof WorkflowExecutionFailure)) throw error;\n reportTestProjectResult(\n error.result,\n io,\n reporter,\n projectRoot,\n error.errors,\n );\n onResult?.(error.result);\n return 1;\n }\n const exitCode = reportTestProjectResult(\n result,\n io,\n reporter,\n projectRoot,\n );\n onResult?.(result);\n return exitCode;\n },\n );\n } finally {\n try {\n reporter.dispose();\n } finally {\n restoreOutput?.();\n }\n }\n } catch (error) {\n io.error(formatCliError(error));\n return 1;\n }\n}\n","import { writeGitHubSummary } from './cli/github-reporter';\nimport { runTestCli } from './cli/test-command';\n\nvoid runTestCli(process.argv.slice(2), undefined, writeGitHubSummary).then(\n (exitCode) => {\n process.exitCode = exitCode;\n },\n);\n"],"names":["formatCliError","error","inspect","formatConciseError","seen","Set","messages","current","Error","undefined","AggregateError","nested","String","oneLine","value","stripVTControlCharacters","shorten","length","text","unwrapFrameLocation","location","absoluteStart","depth","index","firstBusinessFrame","projectRoot","frames","visit","detail","Array","child","line","match","file","fileURLToPath","normalized","chosen","paths","win32","isAbsolute","relative","display","formatFailureInput","input","sanitizeReportValue","render","Number","entries","Object","rows","key","formatFailureDetails","source","context","title","body","field","label","step","phase","position","Math","attempt","lines","frame","graphemes","Intl","SYNC_START","SYNC_END","truncateTerminalLine","columns","stringWidth","output","width","segment","TerminalProgress","occupiedRows","sum","previousHeight","availableRows","footer","budget","overflow","visible","blanks","content","erase","message","write","io","formatWarningScope","scope","parts","errorMessage","status","firstLine","formatWarning","entry","details","arg","prefix","warningKey","JSON","formatDuration","ms","identity","project","path","name","projectPhaseLabel","fileStatus","cases","item","TerminalReporter","Date","kind","attached","owner","id","task","projectName","sourcePath","total","Map","event","c","version","process","model","setInterval","outcome","info","previous","existing","now","setTimeout","items","failed","passed","notRun","Boolean","durationMs","result","files","metrics","formatModelUsage","projects","a","b","group","mode","groups","isActive","running","completed","recent","hidden","hiddenFailures","fileIndex","lastFile","stem","outcomes","failedCases","tasks","shown","children","hiddenCases","last","hint","retry","summary","suffix","tail","documentRetries","attempts","retries","duration","symbol","stats","caseIndex","projectFiles","documents","document","resultSources","plan","selected","padding","left","badge","warning","failure","block","clearInterval","clearTimeout","CliModelUsage","chalk","escapeData","escapeProperty","markdown","char","code","longest","run","fence","pad","githubFailureAnnotation","workspace","resolve","sep","writeGitHubSummary","renderTestBadgeLines","appendFileSync","GENERATED_COMMENT","sortNodesForSpec","nodes","priority","right","escapeTableCell","renderNodeOverview","heading","node","renderWorkflowLocations","sections","patterns","pattern","projectLabel","excludes","WORKFLOW_STEP_CONTRACT","sortJsonValue","assertSelfContainedRefs","toJsonSchema","schema","z","renderNode","warnings","renderNodeSpec","sortedNodes","captureTerminalOutput","streams","cleanups","stream","original","forward","intercepted","chunk","encoding","callback","done","Buffer","accepted","cleanup","parseTestCliArgs","args","cwd","command","commandOffset","inputPath","configPath","resultDir","projectNames","reporter","token","equal","inlineValue","defaultCliIO","console","listener","testCliHelp","assertDirectory","existsSync","statSync","runNodesCommand","options","configSearchRoot","discoverTestConfig","loadTestProject","selectedProjects","candidate","filenames","owners","executionProject","safeName","filename","specs","DEFAULT_TEST_FILE_SELECTION","specPath","writeFileSync","reportTestProjectResult","infrastructureErrors","reportedErrors","reportError","annotation","pending","finalDocuments","documentContext","documentId","finalCases","caseAttempts","casePlan","steps","errors","_","runTestCli","onResult","runModelCommand","runCreateCommand","restoreOutput","runWithConsoleLogHandler","prepareTestRun","realpathSync","runPreparedTestProject","WorkflowExecutionFailure","exitCode"],"mappings":"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"}