bktide 1.0.1755568192 → 1.0.1755655078
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/README.md +42 -0
- package/dist/commands/ShowBuild.js +27 -5
- package/dist/commands/ShowBuild.js.map +1 -1
- package/dist/formatters/annotations/PlainTextFormatter.js +79 -20
- package/dist/formatters/annotations/PlainTextFormatter.js.map +1 -1
- package/dist/formatters/build-detail/PlainTextFormatter.js +373 -133
- package/dist/formatters/build-detail/PlainTextFormatter.js.map +1 -1
- package/dist/graphql/fragments/index.js +3 -0
- package/dist/graphql/fragments/index.js.map +1 -0
- package/dist/graphql/fragments/jobs.js +112 -0
- package/dist/graphql/fragments/jobs.js.map +1 -0
- package/dist/graphql/queries.js +35 -57
- package/dist/graphql/queries.js.map +1 -1
- package/dist/scripts/extract-data-patterns.js +118 -0
- package/dist/scripts/extract-data-patterns.js.map +1 -0
- package/dist/services/BuildkiteClient.js +77 -1
- package/dist/services/BuildkiteClient.js.map +1 -1
- package/dist/test-helpers/DataProfiler.js +307 -0
- package/dist/test-helpers/DataProfiler.js.map +1 -0
- package/dist/test-helpers/PatternMockGenerator.js +590 -0
- package/dist/test-helpers/PatternMockGenerator.js.map +1 -0
- package/package.json +19 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlainTextFormatter.js","sourceRoot":"/","sources":["formatters/build-detail/PlainTextFormatter.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseBuildDetailFormatter, BuildDetail, BuildDetailFormatterOptions } from './Formatter.js';\nimport { formatDistanceToNow } from 'date-fns';\nimport { htmlToText } from 'html-to-text';\nimport { \n formatEmptyState,\n formatError,\n SEMANTIC_COLORS,\n formatBuildStatus,\n formatTips,\n TipStyle,\n getStateIcon,\n getAnnotationIcon,\n getProgressIcon,\n BUILD_STATUS_THEME\n} from '../../ui/theme.js';\n\n// Standard emoji mappings only\n// Only map universally recognized emoji codes, not Buildkite-specific ones\nconst STANDARD_EMOJI: Record<string, string> = {\n // Faces & emotions\n ':smile:': '😊',\n ':grin:': '😁',\n ':joy:': '😂',\n ':laughing:': '😆',\n ':blush:': '😊',\n ':heart_eyes:': '😍',\n ':sob:': '😭',\n ':cry:': '😢',\n ':angry:': '😠',\n ':rage:': '😡',\n ':thinking:': '🤔',\n ':confused:': '😕',\n ':neutral_face:': '😐',\n \n // Hands & gestures\n ':thumbsup:': '👍',\n ':thumbsdown:': '👎',\n ':clap:': '👏',\n ':wave:': '👋',\n ':raised_hand:': '✋',\n ':ok_hand:': '👌',\n ':pray:': '🙏',\n ':muscle:': '💪',\n ':point_left:': '👈',\n ':point_right:': '👉',\n ':point_up:': '👆',\n ':point_down:': '👇',\n \n // Objects & symbols\n ':heart:': '❤️',\n ':broken_heart:': '💔',\n ':star:': '⭐',\n ':sparkles:': '✨',\n ':boom:': '💥',\n ':fire:': '🔥',\n ':zap:': '⚡',\n ':rocket:': '🚀',\n ':sun:': '☀️',\n ':moon:': '🌙',\n ':cloud:': '☁️',\n ':umbrella:': '☔',\n ':snowflake:': '❄️',\n \n // Status symbols\n ':white_check_mark:': '✅',\n ':x:': '❌',\n ':warning:': '⚠️',\n ':exclamation:': '❗',\n ':question:': '❓',\n ':heavy_plus_sign:': '➕',\n ':heavy_minus_sign:': '➖',\n ':heavy_check_mark:': '✔️',\n \n // Common tools/tech (universally recognized)\n ':computer:': '💻',\n ':iphone:': '📱',\n ':email:': '📧',\n ':package:': '📦',\n ':lock:': '🔒',\n ':key:': '🔑',\n ':mag:': '🔍',\n ':bulb:': '💡',\n ':books:': '📚',\n ':memo:': '📝',\n ':pencil:': '✏️',\n ':art:': '🎨',\n ':camera:': '📷',\n ':movie_camera:': '🎥',\n ':musical_note:': '🎵',\n ':bell:': '🔔',\n ':link:': '🔗',\n ':paperclip:': '📎',\n ':hourglass:': '⏳',\n ':alarm_clock:': '⏰',\n ':stopwatch:': '⏱️',\n ':timer_clock:': '⏲️',\n ':calendar:': '📅',\n ':date:': '📅',\n};\n\nexport class PlainTextFormatter extends BaseBuildDetailFormatter {\n name = 'plain-text';\n \n private parseEmoji(text: string): string {\n if (!text) return text;\n // Only replace standard emoji codes, leave Buildkite-specific ones as-is\n return text.replace(/:[\\w_]+:/g, (match) => {\n return STANDARD_EMOJI[match] || match;\n });\n }\n \n formatBuildDetail(buildData: BuildDetail | null, options?: BuildDetailFormatterOptions): string {\n // Handle error cases first\n if (options?.hasError || !buildData) {\n return this.formatErrorState(options);\n }\n \n const build = buildData.build;\n \n // Choose display mode based on options\n if (options?.summary) {\n return this.formatSummaryLine(build);\n }\n \n if (options?.full) {\n return this.formatFullDetails(build, options);\n }\n \n // Default: contextual display based on state\n switch (build.state) {\n case 'FAILED':\n return this.formatFailedBuild(build, options);\n case 'RUNNING':\n return this.formatRunningBuild(build, options);\n case 'BLOCKED':\n return this.formatBlockedBuild(build, options);\n case 'PASSED':\n return this.formatPassedBuild(build, options);\n case 'CANCELED':\n return this.formatCanceledBuild(build, options);\n default:\n return this.formatDefaultBuild(build, options);\n }\n }\n \n private formatErrorState(options?: BuildDetailFormatterOptions): string {\n if (options?.errorType === 'not_found') {\n return formatEmptyState(\n 'Build not found',\n ['Check the build reference format', 'Verify the build exists']\n );\n }\n \n return formatError(options?.errorMessage || 'Unknown error');\n }\n \n private formatSummaryLine(build: any): string {\n const statusIcon = this.getStatusIcon(build.state);\n const coloredIcon = this.colorizeStatusIcon(statusIcon, build.state);\n const duration = this.formatDuration(build);\n const age = this.formatAge(build.createdAt);\n const stateFormatted = formatBuildStatus(build.state, { useSymbol: false });\n const branch = SEMANTIC_COLORS.identifier(build.branch);\n \n return `${coloredIcon} ${SEMANTIC_COLORS.label(`#${build.number}`)} ${stateFormatted} • ${duration} • ${branch} • ${age}`;\n }\n \n private formatPassedBuild(build: any, options?: BuildDetailFormatterOptions): string {\n const lines: string[] = [];\n \n // Header line\n lines.push(this.formatHeader(build));\n lines.push(this.formatCommitInfo(build));\n \n // Show annotations summary if present\n if (build.annotations?.edges?.length > 0) {\n lines.push('');\n lines.push(this.formatAnnotationSummary(build.annotations.edges));\n \n if (!options?.annotations) {\n lines.push('');\n const tips = formatTips(\n ['Use --annotations to view annotation details'],\n TipStyle.GROUPED\n );\n lines.push(tips);\n }\n }\n \n // Show annotations detail if requested\n if (options?.annotations) {\n lines.push('');\n lines.push(this.formatAnnotationDetails(build.annotations.edges));\n }\n \n return lines.join('\\n');\n }\n \n private formatFailedBuild(build: any, options?: BuildDetailFormatterOptions): string {\n const lines: string[] = [];\n \n // Header line\n lines.push(this.formatHeader(build));\n lines.push(this.formatCommitInfo(build));\n lines.push('');\n \n // Failed jobs summary\n const failedJobs = this.getFailedJobs(build.jobs?.edges);\n const allHints: string[] = [];\n \n if (failedJobs.length > 0) {\n const { summary, hints } = this.formatFailedJobsSummaryWithHints(failedJobs, options);\n lines.push(summary);\n allHints.push(...hints);\n }\n \n // Annotation summary\n if (build.annotations?.edges?.length > 0) {\n lines.push(this.formatAnnotationSummary(build.annotations.edges));\n }\n \n // Show detailed job info if requested\n if (options?.jobs || options?.failed) {\n lines.push('');\n lines.push(this.formatJobDetails(build.jobs?.edges, options));\n }\n \n // Show annotations detail if requested\n if (options?.annotations) {\n lines.push('');\n lines.push(this.formatAnnotationDetails(build.annotations.edges));\n }\n \n // Collect all hints for more info\n if (!options?.failed && failedJobs.length > 0) {\n allHints.push('Use --failed to show failure details');\n }\n if (!options?.annotations && build.annotations?.edges?.length > 0) {\n allHints.push('Use --annotations to view annotation details');\n }\n \n // Display all hints together\n if (allHints.length > 0) {\n lines.push('');\n lines.push(formatTips(allHints, TipStyle.GROUPED));\n }\n \n return lines.join('\\n');\n }\n \n private formatRunningBuild(build: any, options?: BuildDetailFormatterOptions): string {\n const lines: string[] = [];\n \n // Header line\n lines.push(this.formatHeader(build));\n lines.push(this.formatCommitInfo(build));\n lines.push('');\n \n // Progress information\n const jobStats = this.getJobStats(build.jobs?.edges);\n lines.push(`Progress: ${SEMANTIC_COLORS.count(String(jobStats.completed))}/${jobStats.total} complete, ${SEMANTIC_COLORS.info(String(jobStats.running))} running, ${jobStats.queued} queued`);\n \n // Show running jobs\n const runningJobs = this.getRunningJobs(build.jobs?.edges);\n if (runningJobs.length > 0) {\n const labels = runningJobs.map(j => this.parseEmoji(j.node.label)).join(', ');\n lines.push(`${SEMANTIC_COLORS.info('Running')}: ${labels}`);\n }\n \n // Annotation summary\n if (build.annotations?.edges?.length > 0) {\n lines.push('');\n lines.push(this.formatAnnotationSummary(build.annotations.edges));\n }\n \n // Show job details if requested\n if (options?.jobs) {\n lines.push('');\n lines.push(this.formatJobDetails(build.jobs?.edges, options));\n }\n \n // Show annotations detail if requested\n if (options?.annotations) {\n lines.push('');\n lines.push(this.formatAnnotationDetails(build.annotations.edges));\n }\n \n return lines.join('\\n');\n }\n \n private formatBlockedBuild(build: any, options?: BuildDetailFormatterOptions): string {\n const lines: string[] = [];\n \n // Header line\n lines.push(this.formatHeader(build));\n lines.push(this.formatCommitInfo(build));\n lines.push('');\n \n // Blocked information\n const blockedJobs = this.getBlockedJobs(build.jobs?.edges);\n if (blockedJobs.length > 0) {\n lines.push(`${getProgressIcon('BLOCKED_MESSAGE')} Blocked: \"${blockedJobs[0].node.label}\" (manual unblock required)`);\n }\n \n // Show jobs summary\n const jobStats = this.getJobStats(build.jobs?.edges);\n if (jobStats.completed > 0) {\n lines.push(`${getStateIcon('PASSED')} ${jobStats.completed} jobs passed before block`);\n }\n \n // Annotation summary\n if (build.annotations?.edges?.length > 0) {\n lines.push('');\n lines.push(this.formatAnnotationSummary(build.annotations.edges));\n }\n \n // Show job details if requested\n if (options?.jobs) {\n lines.push('');\n lines.push(this.formatJobDetails(build.jobs?.edges, options));\n }\n \n // Show annotations detail if requested\n if (options?.annotations) {\n lines.push('');\n lines.push(this.formatAnnotationDetails(build.annotations.edges));\n }\n \n return lines.join('\\n');\n }\n \n private formatCanceledBuild(build: any, options?: BuildDetailFormatterOptions): string {\n const lines: string[] = [];\n \n // Header line\n lines.push(this.formatHeader(build));\n lines.push(this.formatCommitInfo(build));\n lines.push('');\n \n // Canceled information\n if (build.createdBy) {\n const creator = build.createdBy.name || build.createdBy.email;\n lines.push(`Canceled by: ${creator}`);\n }\n \n // Show jobs summary\n const jobStats = this.getJobStats(build.jobs?.edges);\n lines.push(`Completed: ${jobStats.completed}/${jobStats.total} jobs before cancellation`);\n \n // Show job details if requested\n if (options?.jobs) {\n lines.push('');\n lines.push(this.formatJobDetails(build.jobs?.edges, options));\n }\n \n return lines.join('\\n');\n }\n \n private formatDefaultBuild(build: any, options?: BuildDetailFormatterOptions): string {\n return this.formatPassedBuild(build, options);\n }\n \n private formatFullDetails(build: any, options?: BuildDetailFormatterOptions): string {\n const lines: string[] = [];\n \n // Full header information\n lines.push(this.formatHeader(build));\n lines.push(this.formatCommitInfo(build));\n lines.push('');\n \n // Build metadata\n lines.push('Build Details:');\n lines.push(` URL: ${build.url}`);\n lines.push(` Organization: ${build.organization?.name || 'Unknown'}`);\n lines.push(` Pipeline: ${build.pipeline?.name || 'Unknown'}`);\n \n if (build.pullRequest) {\n // Try to construct PR URL from repository URL\n const repoUrl = build.pipeline?.repository?.url;\n if (repoUrl && repoUrl.includes('github.com')) {\n // Extract owner/repo from various GitHub URL formats\n const match = repoUrl.match(/github\\.com[/:]([\\w-]+)\\/([\\w-]+)/);\n if (match && build.pullRequest.id) {\n // Extract PR number from GraphQL ID if possible\n // GitHub PR IDs often contain the number\n const prUrl = `https://github.com/${match[1]}/${match[2]}/pull/${build.pullRequest.id}`;\n lines.push(` Pull Request: ${SEMANTIC_COLORS.url(prUrl)}`);\n } else {\n lines.push(` Pull Request: ${build.pullRequest.id}`);\n }\n } else {\n lines.push(` Pull Request: ${build.pullRequest.id}`);\n }\n }\n \n if (build.triggeredFrom) {\n lines.push(` Triggered from: ${build.triggeredFrom.pipeline?.name} #${build.triggeredFrom.number}`);\n }\n \n lines.push('');\n \n // Jobs section\n lines.push('Jobs:');\n lines.push(this.formatJobDetails(build.jobs?.edges, { ...options, full: true }));\n \n // Annotations section\n if (build.annotations?.edges?.length > 0) {\n lines.push('');\n lines.push('Annotations:');\n lines.push(this.formatAnnotationDetails(build.annotations.edges));\n }\n \n return lines.join('\\n');\n }\n \n private formatHeader(build: any): string {\n const statusIcon = this.getStatusIcon(build.state);\n // Apply appropriate color to the icon based on the state\n const coloredIcon = this.colorizeStatusIcon(statusIcon, build.state);\n const stateFormatted = formatBuildStatus(build.state, { useSymbol: false });\n const duration = this.formatDuration(build);\n const age = this.formatAge(build.createdAt);\n const branch = SEMANTIC_COLORS.identifier(build.branch);\n \n return `${coloredIcon} ${SEMANTIC_COLORS.label(`#${build.number}`)} ${stateFormatted} • ${duration} • ${branch} • ${age}`;\n }\n \n private formatCommitInfo(build: any): string {\n const shortSha = build.commit ? build.commit.substring(0, 7) : 'unknown';\n const message = build.message || 'No commit message';\n const truncatedMessage = message.length > 60 ? message.substring(0, 57) + '...' : message;\n \n return ` \"${truncatedMessage}\" (${shortSha})`;\n }\n \n private formatAnnotationSummary(annotations: any[]): string {\n if (!annotations || annotations.length === 0) {\n return '';\n }\n \n const lines: string[] = [];\n const total = annotations.length;\n \n // Header with count\n const counts = this.countAnnotationsByStyle(annotations);\n const countParts = [];\n if (counts.ERROR > 0) countParts.push(SEMANTIC_COLORS.error(`${counts.ERROR} error${counts.ERROR > 1 ? 's' : ''}`));\n if (counts.WARNING > 0) countParts.push(SEMANTIC_COLORS.warning(`${counts.WARNING} warning${counts.WARNING > 1 ? 's' : ''}`));\n if (counts.INFO > 0) countParts.push(SEMANTIC_COLORS.info(`${counts.INFO} info`));\n if (counts.SUCCESS > 0) countParts.push(SEMANTIC_COLORS.success(`${counts.SUCCESS} success`));\n \n lines.push(`${getAnnotationIcon('DEFAULT')} ${SEMANTIC_COLORS.count(String(total))} annotation${total > 1 ? 's' : ''}: ${countParts.join(', ')}`);\n \n // List each annotation with style and context\n const grouped = this.groupAnnotationsByStyle(annotations);\n const styleOrder = ['ERROR', 'WARNING', 'INFO', 'SUCCESS'];\n \n for (const style of styleOrder) {\n if (grouped[style]) {\n for (const annotation of grouped[style]) {\n const icon = this.getAnnotationIcon(style);\n const context = annotation.node.context || 'default';\n const styleColored = this.colorizeAnnotationStyle(style);\n lines.push(` ${icon} ${styleColored}: ${context}`);\n }\n }\n }\n \n return lines.join('\\n');\n }\n \n private formatAnnotationDetails(annotations: any[]): string {\n const lines: string[] = [];\n \n // Group annotations by style\n const grouped = this.groupAnnotationsByStyle(annotations);\n const styleOrder = ['ERROR', 'WARNING', 'INFO', 'SUCCESS'];\n \n for (const style of styleOrder) {\n if (grouped[style]) {\n for (const annotation of grouped[style]) {\n const icon = this.getAnnotationIcon(style);\n const context = annotation.node.context || 'default';\n const styleColored = this.colorizeAnnotationStyle(style);\n \n // When showing annotation details, always show the body text\n lines.push(`${icon} ${styleColored}: ${context}`);\n const body = htmlToText(annotation.node.body?.html || '', {\n wordwrap: 80,\n preserveNewlines: true\n });\n lines.push(body.split('\\n').map(l => ` ${l}`).join('\\n'));\n lines.push('');\n }\n }\n }\n \n return lines.join('\\n').trim();\n }\n \n private formatJobDetails(jobs: any[], options?: BuildDetailFormatterOptions): string {\n if (!jobs || jobs.length === 0) {\n return 'No jobs found';\n }\n \n const lines: string[] = [];\n const jobStats = this.getJobStats(jobs);\n \n // Summary line\n const parts = [];\n if (jobStats.passed > 0) parts.push(`${getStateIcon('PASSED')} ${jobStats.passed} passed`);\n if (jobStats.failed > 0) parts.push(`${getStateIcon('FAILED')} ${jobStats.failed} failed`);\n if (jobStats.running > 0) parts.push(`${getStateIcon('RUNNING')} ${jobStats.running} running`);\n if (jobStats.blocked > 0) parts.push(`${getStateIcon('BLOCKED')} ${jobStats.blocked} blocked`);\n if (jobStats.skipped > 0) parts.push(`${getStateIcon('SKIPPED')} ${jobStats.skipped} skipped`);\n \n lines.push(`Jobs: ${parts.join(' ')}`);\n lines.push('');\n \n // Filter jobs based on options\n let filteredJobs = jobs;\n if (options?.failed) {\n filteredJobs = this.getFailedJobs(jobs);\n }\n \n // Group jobs by state\n const grouped = this.groupJobsByState(filteredJobs);\n \n for (const [state, stateJobs] of Object.entries(grouped)) {\n if (stateJobs.length === 0) continue;\n \n const icon = this.getJobStateIcon(state);\n const stateColored = this.colorizeJobState(state);\n lines.push(`${icon} ${stateColored} (${SEMANTIC_COLORS.count(String(stateJobs.length))}):`);\n \n for (const job of stateJobs) {\n const label = this.parseEmoji(job.node.label);\n const duration = this.formatJobDuration(job.node);\n \n // Basic job line\n lines.push(` ${label} (${duration})`);\n \n // Show additional details if --jobs or --full\n if (options?.jobs || options?.full) {\n // Timing details\n if (job.node.startedAt) {\n const startTime = new Date(job.node.startedAt).toLocaleTimeString();\n const endTime = job.node.finishedAt \n ? new Date(job.node.finishedAt).toLocaleTimeString()\n : 'still running';\n lines.push(` ${SEMANTIC_COLORS.dim(`${getProgressIcon('TIMING')} ${startTime} → ${endTime}`)}`);\n }\n \n // Parallel group info\n if (job.node.parallelGroupIndex !== undefined && job.node.parallelGroupTotal) {\n lines.push(` ${SEMANTIC_COLORS.dim(`${getProgressIcon('PARALLEL')} Parallel: ${job.node.parallelGroupIndex + 1}/${job.node.parallelGroupTotal}`)}`);\n }\n \n // Retry info\n if (job.node.retried) {\n lines.push(` ${SEMANTIC_COLORS.warning(`${getProgressIcon('RETRY')} Retried`)}`);\n }\n }\n }\n lines.push('');\n }\n \n return lines.join('\\n').trim();\n }\n \n private formatFailedJobsSummaryWithHints(failedJobs: any[], options?: BuildDetailFormatterOptions): { summary: string; hints: string[] } {\n const hints: string[] = [];\n const summary = this.formatFailedJobsSummary(failedJobs, options, hints);\n return { summary, hints };\n }\n \n private formatFailedJobsSummary(failedJobs: any[], options?: BuildDetailFormatterOptions, hints?: string[]): string {\n const lines: string[] = [];\n \n // Group identical jobs by label\n const jobGroups = this.groupJobsByLabel(failedJobs);\n \n // Show all groups if --all-jobs, otherwise limit to 10\n const displayGroups = options?.allJobs \n ? jobGroups \n : jobGroups.slice(0, 10);\n \n for (const group of displayGroups) {\n const label = this.parseEmoji(group.label);\n if (group.count === 1) {\n const duration = this.formatJobDuration(group.jobs[0].node);\n lines.push(` ${SEMANTIC_COLORS.error('Failed')}: ${label} - ran ${duration}`);\n } else {\n // Multiple jobs with same label - show detailed breakdown\n const statusParts = [];\n \n if (group.stateCounts.failed > 0) {\n statusParts.push(`${group.stateCounts.failed} failed`);\n }\n if (group.stateCounts.broken > 0) {\n statusParts.push(`${group.stateCounts.broken} broken`);\n }\n if (group.stateCounts.notStarted > 0) {\n statusParts.push(`${group.stateCounts.notStarted} not started`);\n }\n if (group.stateCounts.passed > 0) {\n statusParts.push(`${group.stateCounts.passed} passed`);\n }\n if (group.stateCounts.other > 0) {\n statusParts.push(`${group.stateCounts.other} other`);\n }\n \n const statusInfo = statusParts.join(', ') || 'various states';\n \n // Show parallel info if it's a parallel job group\n const parallelInfo = group.parallelTotal > 0 ? ` (${group.count}/${group.parallelTotal} parallel)` : ` (${SEMANTIC_COLORS.count(String(group.count))} jobs)`;\n lines.push(` ${SEMANTIC_COLORS.error('Failed')}: ${label}${parallelInfo}: ${statusInfo}`);\n }\n }\n \n // Add summary if there are more job types and not showing all\n if (!options?.allJobs) {\n const remaining = jobGroups.length - displayGroups.length;\n if (remaining > 0) {\n lines.push(` ${SEMANTIC_COLORS.muted(`...and ${remaining} more job types`)}`);\n \n // If hints array is provided, add hint there; otherwise format inline\n if (hints) {\n hints.push('Use --all-jobs to show all jobs');\n } else {\n lines.push('');\n const tips = formatTips(\n ['Use --all-jobs to show all jobs'],\n TipStyle.GROUPED\n );\n lines.push(tips);\n }\n }\n }\n \n return lines.join('\\n');\n }\n \n private groupJobsByLabel(jobs: any[]): any[] {\n const groups = new Map<string, any>();\n \n for (const job of jobs) {\n const fullLabel = job.node.label || 'Unnamed job';\n \n // Strip parallel job index from label for grouping\n // e.g., \"deposit_and_filing_schedule_calculator rspec (1/22)\" -> \"deposit_and_filing_schedule_calculator rspec\"\n const baseLabel = fullLabel.replace(/\\s*\\(\\d+\\/\\d+\\)\\s*$/, '').trim();\n \n if (!groups.has(baseLabel)) {\n groups.set(baseLabel, {\n label: baseLabel,\n count: 0,\n jobs: [],\n parallelTotal: 0,\n stateCounts: {\n failed: 0,\n broken: 0,\n notStarted: 0,\n passed: 0,\n other: 0\n }\n });\n }\n \n const group = groups.get(baseLabel)!;\n group.count++;\n group.jobs.push(job);\n \n // Track the maximum parallel total for this job group\n if (job.node.parallelGroupTotal && job.node.parallelGroupTotal > group.parallelTotal) {\n group.parallelTotal = job.node.parallelGroupTotal;\n }\n \n\n \n // Count by state\n const state = job.node.state?.toUpperCase();\n \n // Use exit status as source of truth when available\n // Note: exitStatus comes as a string from Buildkite API\n if (job.node.exitStatus !== null && job.node.exitStatus !== undefined) {\n const exitCode = parseInt(job.node.exitStatus, 10);\n if (exitCode === 0) {\n group.stateCounts.passed++;\n } else {\n group.stateCounts.failed++;\n }\n } else if (!job.node.startedAt) {\n group.stateCounts.notStarted++;\n } else if (state === 'FINISHED' || state === 'COMPLETED') {\n // For finished jobs without exit status, check passed field\n if (job.node.passed === true) {\n group.stateCounts.passed++;\n } else if (job.node.passed === false) {\n group.stateCounts.failed++;\n } else {\n group.stateCounts.other++;\n }\n } else if (state === 'FAILED') {\n group.stateCounts.failed++;\n } else if (state === 'BROKEN') {\n group.stateCounts.broken++;\n } else if (state === 'PASSED' || job.node.passed === true) {\n group.stateCounts.passed++;\n } else {\n group.stateCounts.other++;\n }\n }\n \n // Convert to array and sort by count (most failures first)\n return Array.from(groups.values())\n .sort((a, b) => b.count - a.count);\n }\n \n private formatDuration(build: any): string {\n if (!build.startedAt) {\n return 'not started';\n }\n \n const start = new Date(build.startedAt);\n const end = build.finishedAt ? new Date(build.finishedAt) : new Date();\n const durationMs = end.getTime() - start.getTime();\n \n const minutes = Math.floor(durationMs / 60000);\n const seconds = Math.floor((durationMs % 60000) / 1000);\n \n if (build.state === 'RUNNING') {\n return `${minutes}m ${seconds}s elapsed`;\n }\n \n return `${minutes}m ${seconds}s`;\n }\n \n private formatJobDuration(job: any): string {\n if (!job.startedAt) {\n return 'not started';\n }\n \n const start = new Date(job.startedAt);\n const end = job.finishedAt ? new Date(job.finishedAt) : new Date();\n const durationMs = end.getTime() - start.getTime();\n \n const minutes = Math.floor(durationMs / 60000);\n const seconds = Math.floor((durationMs % 60000) / 1000);\n \n return `${minutes}m ${seconds}s`;\n }\n \n private formatAge(createdAt: string): string {\n return formatDistanceToNow(new Date(createdAt), { addSuffix: true });\n }\n \n private colorizeJobState(state: string): string {\n switch (state.toLowerCase()) {\n case 'failed':\n return SEMANTIC_COLORS.error(state);\n case 'passed':\n return SEMANTIC_COLORS.success(state);\n case 'running':\n return SEMANTIC_COLORS.info(state);\n case 'blocked':\n return SEMANTIC_COLORS.warning(state);\n case 'skipped':\n case 'canceled':\n return SEMANTIC_COLORS.muted(state);\n default:\n return state;\n }\n }\n \n private getStatusIcon(state: string): string {\n return getStateIcon(state);\n }\n \n private getJobStateIcon(state: string): string {\n return getStateIcon(state);\n }\n \n private getAnnotationIcon(style: string): string {\n return getAnnotationIcon(style);\n }\n \n private colorizeAnnotationStyle(style: string): string {\n switch (style.toUpperCase()) {\n case 'ERROR':\n return SEMANTIC_COLORS.error(style.toLowerCase());\n case 'WARNING':\n return SEMANTIC_COLORS.warning(style.toLowerCase());\n case 'INFO':\n return SEMANTIC_COLORS.info(style.toLowerCase());\n case 'SUCCESS':\n return SEMANTIC_COLORS.success(style.toLowerCase());\n default:\n return style.toLowerCase();\n }\n }\n \n private colorizeStatusIcon(icon: string, state: string): string {\n const upperState = state.toUpperCase();\n const theme = BUILD_STATUS_THEME[upperState as keyof typeof BUILD_STATUS_THEME];\n if (!theme) {\n return SEMANTIC_COLORS.muted(icon);\n }\n return theme.color(icon);\n }\n \n private getJobStats(jobs: any[]): any {\n const stats = {\n total: jobs?.length || 0,\n passed: 0,\n failed: 0,\n running: 0,\n blocked: 0,\n skipped: 0,\n queued: 0,\n completed: 0\n };\n \n if (!jobs) return stats;\n \n for (const job of jobs) {\n const state = job.node.state?.toUpperCase() || '';\n \n // If we have an exit status, use that as the source of truth\n // Note: exitStatus comes as a string from Buildkite API\n if (job.node.exitStatus !== null && job.node.exitStatus !== undefined) {\n const exitCode = parseInt(job.node.exitStatus, 10);\n if (exitCode === 0) {\n stats.passed++;\n stats.completed++;\n } else {\n stats.failed++;\n stats.completed++;\n }\n } else if (state === 'RUNNING') {\n stats.running++;\n } else if (state === 'BLOCKED') {\n stats.blocked++;\n } else if (state === 'SKIPPED' || state === 'CANCELED') {\n stats.skipped++;\n stats.completed++;\n } else if (state === 'SCHEDULED' || state === 'ASSIGNED') {\n stats.queued++;\n } else if (state === 'FINISHED' || state === 'COMPLETED') {\n // For finished jobs without exit status, check passed field\n if (job.node.passed === true) {\n stats.passed++;\n stats.completed++;\n } else if (job.node.passed === false) {\n stats.failed++;\n stats.completed++;\n }\n } else if (state === 'PASSED' || job.node.passed === true) {\n stats.passed++;\n stats.completed++;\n } else if (state === 'FAILED' || state === 'BROKEN' || job.node.passed === false) {\n stats.failed++;\n stats.completed++;\n }\n }\n \n return stats;\n }\n \n private getFailedJobs(jobs: any[]): any[] {\n if (!jobs) return [];\n \n return jobs.filter(job => {\n const state = job.node.state?.toUpperCase();\n \n // If we have an exit status, use that as the source of truth\n // Note: exitStatus comes as a string from Buildkite API\n if (job.node.exitStatus !== null && job.node.exitStatus !== undefined) {\n const exitCode = parseInt(job.node.exitStatus, 10);\n return exitCode !== 0;\n }\n \n // Otherwise fall back to state\n return state === 'FAILED' || state === 'BROKEN' || job.node.passed === false;\n });\n }\n \n private getRunningJobs(jobs: any[]): any[] {\n if (!jobs) return [];\n \n return jobs.filter(job => job.node.state?.toLowerCase() === 'running');\n }\n \n private getBlockedJobs(jobs: any[]): any[] {\n if (!jobs) return [];\n \n return jobs.filter(job => job.node.state?.toLowerCase() === 'blocked');\n }\n \n private groupJobsByState(jobs: any[]): Record<string, any[]> {\n const grouped: Record<string, any[]> = {\n 'Failed': [],\n 'Passed': [],\n 'Running': [],\n 'Blocked': [],\n 'Skipped': []\n };\n \n if (!jobs) return grouped;\n \n for (const job of jobs) {\n const state = job.node.state?.toUpperCase() || '';\n \n // If we have an exit status, use that as the source of truth\n // Note: exitStatus comes as a string from Buildkite API\n if (job.node.exitStatus !== null && job.node.exitStatus !== undefined) {\n const exitCode = parseInt(job.node.exitStatus, 10);\n if (exitCode === 0) {\n grouped['Passed'].push(job);\n } else {\n grouped['Failed'].push(job);\n }\n } else if (state === 'RUNNING') {\n grouped['Running'].push(job);\n } else if (state === 'BLOCKED') {\n grouped['Blocked'].push(job);\n } else if (state === 'SKIPPED' || state === 'CANCELED') {\n grouped['Skipped'].push(job);\n } else if (state === 'FINISHED' || state === 'COMPLETED') {\n // For finished jobs without exit status, check passed field\n if (job.node.passed === true) {\n grouped['Passed'].push(job);\n } else if (job.node.passed === false) {\n grouped['Failed'].push(job);\n }\n } else if (state === 'PASSED' || job.node.passed === true) {\n grouped['Passed'].push(job);\n } else if (state === 'FAILED' || state === 'BROKEN' || job.node.passed === false) {\n grouped['Failed'].push(job);\n }\n }\n \n return grouped;\n }\n \n private countAnnotationsByStyle(annotations: any[]): Record<string, number> {\n const counts: Record<string, number> = {\n ERROR: 0,\n WARNING: 0,\n INFO: 0,\n SUCCESS: 0\n };\n \n for (const annotation of annotations) {\n const style = annotation.node.style?.toUpperCase() || 'INFO';\n if (style in counts) {\n counts[style]++;\n }\n }\n \n return counts;\n }\n \n private groupAnnotationsByStyle(annotations: any[]): Record<string, any[]> {\n const grouped: Record<string, any[]> = {};\n \n for (const annotation of annotations) {\n const style = annotation.node.style?.toUpperCase() || 'INFO';\n if (!grouped[style]) {\n grouped[style] = [];\n }\n grouped[style].push(annotation);\n }\n \n return grouped;\n }\n \n formatError(action: string, error: any): string {\n return formatError(action, error);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"PlainTextFormatter.js","sourceRoot":"/","sources":["formatters/build-detail/PlainTextFormatter.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseBuildDetailFormatter, BuildDetail, BuildDetailFormatterOptions } from './Formatter.js';\nimport { formatDistanceToNow } from 'date-fns';\nimport { htmlToText } from 'html-to-text';\nimport { \n formatEmptyState,\n formatError,\n SEMANTIC_COLORS,\n formatBuildStatus,\n formatTips,\n TipStyle,\n getStateIcon,\n getAnnotationIcon,\n getProgressIcon,\n BUILD_STATUS_THEME\n} from '../../ui/theme.js';\nimport { useAscii } from '../../ui/symbols.js';\nimport { termWidth } from '../../ui/width.js';\n\n// Standard emoji mappings only\n// Only map universally recognized emoji codes, not Buildkite-specific ones\nconst STANDARD_EMOJI: Record<string, string> = {\n // Faces & emotions\n ':smile:': '😊',\n ':grin:': '😁',\n ':joy:': '😂',\n ':laughing:': '😆',\n ':blush:': '😊',\n ':heart_eyes:': '😍',\n ':sob:': '😭',\n ':cry:': '😢',\n ':angry:': '😠',\n ':rage:': '😡',\n ':thinking:': '🤔',\n ':confused:': '😕',\n ':neutral_face:': '😐',\n \n // Hands & gestures\n ':thumbsup:': '👍',\n ':thumbsdown:': '👎',\n ':clap:': '👏',\n ':wave:': '👋',\n ':raised_hand:': '✋',\n ':ok_hand:': '👌',\n ':pray:': '🙏',\n ':muscle:': '💪',\n ':point_left:': '👈',\n ':point_right:': '👉',\n ':point_up:': '👆',\n ':point_down:': '👇',\n \n // Objects & symbols\n ':heart:': '❤️',\n ':broken_heart:': '💔',\n ':star:': '⭐',\n ':sparkles:': '✨',\n ':boom:': '💥',\n ':fire:': '🔥',\n ':zap:': '⚡',\n ':rocket:': '🚀',\n ':sun:': '☀️',\n ':moon:': '🌙',\n ':cloud:': '☁️',\n ':umbrella:': '☔',\n ':snowflake:': '❄️',\n \n // Status symbols\n ':white_check_mark:': '✅',\n ':x:': '❌',\n ':warning:': '⚠️',\n ':exclamation:': '❗',\n ':question:': '❓',\n ':heavy_plus_sign:': '➕',\n ':heavy_minus_sign:': '➖',\n ':heavy_check_mark:': '✔️',\n \n // Common tools/tech (universally recognized)\n ':computer:': '💻',\n ':iphone:': '📱',\n ':email:': '📧',\n ':package:': '📦',\n ':lock:': '🔒',\n ':key:': '🔑',\n ':mag:': '🔍',\n ':bulb:': '💡',\n ':books:': '📚',\n ':memo:': '📝',\n ':pencil:': '✏️',\n ':art:': '🎨',\n ':camera:': '📷',\n ':movie_camera:': '🎥',\n ':musical_note:': '🎵',\n ':bell:': '🔔',\n ':link:': '🔗',\n ':paperclip:': '📎',\n ':hourglass:': '⏳',\n ':alarm_clock:': '⏰',\n ':stopwatch:': '⏱️',\n ':timer_clock:': '⏲️',\n ':calendar:': '📅',\n ':date:': '📅',\n};\n\nexport class PlainTextFormatter extends BaseBuildDetailFormatter {\n name = 'plain-text';\n \n private parseEmoji(text: string): string {\n if (!text) return text;\n // Only replace standard emoji codes, leave Buildkite-specific ones as-is\n return text.replace(/:[\\w_]+:/g, (match) => {\n return STANDARD_EMOJI[match] || match;\n });\n }\n \n formatBuildDetail(buildData: BuildDetail | null, options?: BuildDetailFormatterOptions): string {\n // Handle error cases first\n if (options?.hasError || !buildData) {\n return this.formatErrorState(options);\n }\n \n const build = buildData.build;\n \n // Choose display mode based on options\n if (options?.summary) {\n return this.formatSummaryLine(build);\n }\n \n if (options?.full) {\n return this.formatFullDetails(build, options);\n }\n \n // Default: contextual display based on state\n switch (build.state) {\n case 'FAILED':\n return this.formatFailedBuild(build, options);\n case 'RUNNING':\n return this.formatRunningBuild(build, options);\n case 'BLOCKED':\n return this.formatBlockedBuild(build, options);\n case 'PASSED':\n return this.formatPassedBuild(build, options);\n case 'CANCELED':\n return this.formatCanceledBuild(build, options);\n default:\n return this.formatDefaultBuild(build, options);\n }\n }\n \n private formatErrorState(options?: BuildDetailFormatterOptions): string {\n if (options?.errorType === 'not_found') {\n return formatEmptyState(\n 'Build not found',\n ['Check the build reference format', 'Verify the build exists']\n );\n }\n \n return formatError(options?.errorMessage || 'Unknown error');\n }\n \n private formatSummaryLine(build: any): string {\n const statusIcon = this.getStatusIcon(build.state);\n const coloredIcon = this.colorizeStatusIcon(statusIcon, build.state);\n const duration = this.formatDuration(build);\n const age = this.formatAge(build.createdAt);\n const stateFormatted = formatBuildStatus(build.state, { useSymbol: false });\n const branch = SEMANTIC_COLORS.identifier(build.branch);\n \n return `${coloredIcon} ${SEMANTIC_COLORS.label(`#${build.number}`)} ${stateFormatted} • ${duration} • ${branch} • ${age}`;\n }\n \n private formatPassedBuild(build: any, options?: BuildDetailFormatterOptions): string {\n const lines: string[] = [];\n \n // Header line\n lines.push(this.formatHeader(build));\n lines.push(this.formatCommitInfo(build));\n lines.push(''); // Blank line after commit info\n \n // Show annotations summary if present\n if (build.annotations?.edges?.length > 0) {\n lines.push(this.formatAnnotationSummary(build.annotations.edges));\n }\n \n // Jobs summary\n if (build.jobs?.edges?.length > 0) {\n if (build.annotations?.edges?.length > 0) {\n lines.push(''); // Add space between annotations and steps\n }\n lines.push(this.formatJobSummary(build.jobs, build.state));\n \n if (!options?.annotations) {\n lines.push('');\n const tips = formatTips(\n ['Use --annotations to view annotation details'],\n TipStyle.GROUPED\n );\n lines.push(tips);\n }\n }\n \n // Show annotations detail if requested\n if (options?.annotations) {\n lines.push('');\n lines.push(this.formatAnnotationDetails(build.annotations.edges));\n }\n \n return lines.join('\\n');\n }\n \n private formatFailedBuild(build: any, options?: BuildDetailFormatterOptions): string {\n const lines: string[] = [];\n \n // Header line\n lines.push(this.formatHeader(build));\n lines.push(this.formatCommitInfo(build));\n lines.push('');\n \n const allHints: string[] = [];\n \n // Annotation summary (first, as it appears first in UI)\n if (build.annotations?.edges?.length > 0) {\n lines.push(this.formatAnnotationSummary(build.annotations.edges));\n }\n \n // Jobs summary\n if (build.jobs?.edges?.length > 0) {\n if (build.annotations?.edges?.length > 0) {\n lines.push(''); // Add space between annotations and steps\n }\n lines.push(this.formatJobSummary(build.jobs, build.state));\n }\n \n // Show detailed job info if requested\n if (options?.jobs || options?.failed) {\n lines.push('');\n lines.push(this.formatJobDetails(build.jobs?.edges, options));\n }\n \n // Show annotations detail if requested\n if (options?.annotations) {\n lines.push('');\n lines.push(this.formatAnnotationDetails(build.annotations.edges));\n }\n \n // Collect all hints for more info\n const failedJobs = this.getFailedJobs(build.jobs?.edges);\n if (!options?.failed && failedJobs.length > 0) {\n allHints.push('Use --failed to show failure details');\n }\n if (!options?.annotations && build.annotations?.edges?.length > 0) {\n allHints.push('Use --annotations to view annotation details');\n }\n // Add hint about incomplete step data if truncated\n if (!options?.jobs && build.jobs?.pageInfo?.hasNextPage) {\n allHints.push('Use --jobs to fetch all step data (currently showing first 100 only)');\n }\n \n // Display all hints together\n if (allHints.length > 0) {\n lines.push('');\n lines.push(formatTips(allHints, TipStyle.GROUPED));\n }\n \n return lines.join('\\n');\n }\n \n private formatRunningBuild(build: any, options?: BuildDetailFormatterOptions): string {\n const lines: string[] = [];\n \n // Header line\n lines.push(this.formatHeader(build));\n lines.push(this.formatCommitInfo(build));\n lines.push('');\n \n // Annotations first (if any)\n if (build.annotations?.edges?.length > 0) {\n lines.push(this.formatAnnotationSummary(build.annotations.edges));\n }\n \n // Jobs summary with progress\n if (build.jobs?.edges?.length > 0) {\n if (build.annotations?.edges?.length > 0) {\n lines.push(''); // Add space between annotations and steps\n }\n lines.push(this.formatJobSummary(build.jobs, build.state));\n }\n \n // Show running jobs\n const runningJobs = this.getRunningJobs(build.jobs?.edges);\n if (runningJobs.length > 0) {\n const labels = runningJobs.map(j => this.parseEmoji(j.node.label)).join(', ');\n lines.push(`${SEMANTIC_COLORS.info('Running')}: ${labels}`);\n }\n \n // Annotation summary\n if (build.annotations?.edges?.length > 0) {\n lines.push('');\n lines.push(this.formatAnnotationSummary(build.annotations.edges));\n }\n \n // Show job details if requested\n if (options?.jobs) {\n lines.push('');\n lines.push(this.formatJobDetails(build.jobs?.edges, options));\n }\n \n // Show annotations detail if requested\n if (options?.annotations) {\n lines.push('');\n lines.push(this.formatAnnotationDetails(build.annotations.edges));\n }\n \n return lines.join('\\n');\n }\n \n private formatBlockedBuild(build: any, options?: BuildDetailFormatterOptions): string {\n const lines: string[] = [];\n \n // Header line\n lines.push(this.formatHeader(build));\n lines.push(this.formatCommitInfo(build));\n lines.push('');\n \n // Annotations first (if any)\n if (build.annotations?.edges?.length > 0) {\n lines.push(this.formatAnnotationSummary(build.annotations.edges));\n }\n \n // Jobs summary\n if (build.jobs?.edges?.length > 0) {\n if (build.annotations?.edges?.length > 0) {\n lines.push(''); // Add space between annotations and steps\n }\n lines.push(this.formatJobSummary(build.jobs, build.state));\n }\n \n // Blocked information\n const blockedJobs = this.getBlockedJobs(build.jobs?.edges);\n if (blockedJobs.length > 0) {\n lines.push('');\n lines.push(`${getProgressIcon('BLOCKED_MESSAGE')} Blocked: \"${blockedJobs[0].node.label}\" (manual unblock required)`);\n }\n \n // Show job details if requested\n if (options?.jobs) {\n lines.push('');\n lines.push(this.formatJobDetails(build.jobs?.edges, options));\n }\n \n // Show annotations detail if requested\n if (options?.annotations) {\n lines.push('');\n lines.push(this.formatAnnotationDetails(build.annotations.edges));\n }\n \n return lines.join('\\n');\n }\n \n private formatCanceledBuild(build: any, options?: BuildDetailFormatterOptions): string {\n const lines: string[] = [];\n \n // Header line\n lines.push(this.formatHeader(build));\n lines.push(this.formatCommitInfo(build));\n lines.push('');\n \n // Annotations first (if any)\n if (build.annotations?.edges?.length > 0) {\n lines.push(this.formatAnnotationSummary(build.annotations.edges));\n }\n \n // Jobs summary\n if (build.jobs?.edges?.length > 0) {\n if (build.annotations?.edges?.length > 0) {\n lines.push(''); // Add space between annotations and steps\n }\n lines.push(this.formatJobSummary(build.jobs, build.state));\n }\n \n // Canceled information\n if (build.createdBy) {\n lines.push('');\n const creator = build.createdBy.name || build.createdBy.email;\n lines.push(`Canceled by: ${creator}`);\n }\n \n // Show job details if requested\n if (options?.jobs) {\n lines.push('');\n lines.push(this.formatJobDetails(build.jobs?.edges, options));\n }\n \n return lines.join('\\n');\n }\n \n private formatDefaultBuild(build: any, options?: BuildDetailFormatterOptions): string {\n return this.formatPassedBuild(build, options);\n }\n \n private formatFullDetails(build: any, options?: BuildDetailFormatterOptions): string {\n const lines: string[] = [];\n \n // Full header information\n lines.push(this.formatHeader(build));\n lines.push(this.formatCommitInfo(build));\n lines.push('');\n \n // Build metadata\n lines.push('Build Details:');\n lines.push(` URL: ${build.url}`);\n lines.push(` Organization: ${build.organization?.name || 'Unknown'}`);\n lines.push(` Pipeline: ${build.pipeline?.name || 'Unknown'}`);\n \n if (build.pullRequest) {\n // Try to construct PR URL from repository URL\n const repoUrl = build.pipeline?.repository?.url;\n if (repoUrl && repoUrl.includes('github.com')) {\n // Extract owner/repo from various GitHub URL formats\n const match = repoUrl.match(/github\\.com[/:]([\\w-]+)\\/([\\w-]+)/);\n if (match && build.pullRequest.id) {\n // Extract PR number from GraphQL ID if possible\n // GitHub PR IDs often contain the number\n const prUrl = `https://github.com/${match[1]}/${match[2]}/pull/${build.pullRequest.id}`;\n lines.push(` Pull Request: ${SEMANTIC_COLORS.url(prUrl)}`);\n } else {\n lines.push(` Pull Request: ${build.pullRequest.id}`);\n }\n } else {\n lines.push(` Pull Request: ${build.pullRequest.id}`);\n }\n }\n \n if (build.triggeredFrom) {\n lines.push(` Triggered from: ${build.triggeredFrom.pipeline?.name} #${build.triggeredFrom.number}`);\n }\n \n lines.push('');\n \n // Steps section\n lines.push('Steps:');\n lines.push(this.formatJobDetails(build.jobs?.edges, { ...options, full: true }));\n \n // Annotations section\n if (build.annotations?.edges?.length > 0) {\n lines.push('');\n lines.push('Annotations:');\n lines.push(this.formatAnnotationDetails(build.annotations.edges));\n }\n \n return lines.join('\\n');\n }\n \n private formatHeader(build: any): string {\n const statusIcon = this.getStatusIcon(build.state);\n // Apply appropriate color to the icon based on the state\n const coloredIcon = this.colorizeStatusIcon(statusIcon, build.state);\n const stateFormatted = formatBuildStatus(build.state, { useSymbol: false });\n const duration = this.formatDuration(build);\n \n // Get first line of commit message\n const message = build.message || 'No commit message';\n const firstLineMessage = message.split('\\n')[0];\n const truncatedMessage = firstLineMessage.length > 80 ? firstLineMessage.substring(0, 77) + '...' : firstLineMessage;\n \n return `${coloredIcon} ${stateFormatted} ${truncatedMessage} ${SEMANTIC_COLORS.dim(`#${build.number}`)} ${SEMANTIC_COLORS.dim(duration)}`;\n }\n \n private formatCommitInfo(build: any): string {\n const shortSha = build.commit ? build.commit.substring(0, 7) : 'unknown';\n const branch = SEMANTIC_COLORS.identifier(build.branch);\n const age = this.formatAge(build.createdAt);\n \n // Get author information\n const author = build.createdBy?.name || build.createdBy?.email || 'Unknown';\n \n // Calculate indentation to align with commit message\n // Map each state to its proper indentation (icon + space + state text + space)\n const indentMap: Record<string, number> = {\n 'PASSED': 9, // ✓ PASSED \n 'FAILED': 9, // ✗ FAILED \n 'RUNNING': 10, // ⟳ RUNNING \n 'BLOCKED': 10, // ◼ BLOCKED \n 'CANCELED': 11, // ⊘ CANCELED \n 'SCHEDULED': 12, // ⏱ SCHEDULED \n 'SKIPPED': 10, // ⊙ SKIPPED \n };\n \n const indent = ' '.repeat(indentMap[build.state] || 9);\n \n return `${indent}${author} • ${branch} • ${shortSha} • ${SEMANTIC_COLORS.dim(`Created ${age}`)}`;\n }\n \n private formatAnnotationSummary(annotations: any[]): string {\n if (!annotations || annotations.length === 0) {\n return '';\n }\n \n const lines: string[] = [];\n const total = annotations.length;\n \n // Header with count\n const counts = this.countAnnotationsByStyle(annotations);\n const countParts = [];\n if (counts.ERROR > 0) countParts.push(SEMANTIC_COLORS.error(`${counts.ERROR} error${counts.ERROR > 1 ? 's' : ''}`));\n if (counts.WARNING > 0) countParts.push(SEMANTIC_COLORS.warning(`${counts.WARNING} warning${counts.WARNING > 1 ? 's' : ''}`));\n if (counts.INFO > 0) countParts.push(SEMANTIC_COLORS.info(`${counts.INFO} info`));\n if (counts.SUCCESS > 0) countParts.push(SEMANTIC_COLORS.success(`${counts.SUCCESS} success`));\n \n lines.push(`${getAnnotationIcon('DEFAULT')} ${SEMANTIC_COLORS.count(String(total))} annotation${total > 1 ? 's' : ''}: ${countParts.join(', ')}`);\n \n // List each annotation with style and context\n const grouped = this.groupAnnotationsByStyle(annotations);\n const styleOrder = ['ERROR', 'WARNING', 'INFO', 'SUCCESS'];\n \n for (const style of styleOrder) {\n if (grouped[style]) {\n for (const annotation of grouped[style]) {\n const icon = this.getAnnotationIcon(style);\n const context = annotation.node.context || 'default';\n const styleColored = this.colorizeAnnotationStyle(style);\n lines.push(` ${icon} ${styleColored}: ${context}`);\n }\n }\n }\n \n return lines.join('\\n');\n }\n \n private formatJobSummary(jobsData: any, buildState: string): string {\n const jobs = jobsData?.edges;\n if (!jobs || jobs.length === 0) {\n return '';\n }\n \n const lines: string[] = [];\n const jobStats = this.getJobStats(jobs);\n \n // Build summary parts based on job states\n const countParts = [];\n if (jobStats.failed > 0) countParts.push(SEMANTIC_COLORS.error(`${jobStats.failed} failed`));\n if (jobStats.passed > 0) countParts.push(SEMANTIC_COLORS.success(`${jobStats.passed} passed`));\n if (jobStats.running > 0) countParts.push(SEMANTIC_COLORS.info(`${jobStats.running} running`));\n if (jobStats.blocked > 0) countParts.push(SEMANTIC_COLORS.warning(`${jobStats.blocked} blocked`));\n // Don't show skipped jobs\n if (jobStats.canceled > 0) countParts.push(SEMANTIC_COLORS.muted(`${jobStats.canceled} canceled`));\n \n // Use appropriate icon based on build state\n const icon = buildState === 'FAILED' ? getStateIcon('FAILED') : \n buildState === 'RUNNING' ? getStateIcon('RUNNING') :\n buildState === 'PASSED' ? getStateIcon('PASSED') :\n buildState === 'BLOCKED' ? getStateIcon('BLOCKED') : '•';\n // Check if we have partial data\n const hasMorePages = jobsData?.pageInfo?.hasNextPage;\n const totalCount = jobsData?.count;\n \n if (hasMorePages) {\n const showing = jobs.length;\n const total = totalCount || `${showing}+`;\n lines.push(`${icon} Showing ${SEMANTIC_COLORS.count(String(showing))} of ${SEMANTIC_COLORS.count(String(total))} steps: ${countParts.join(', ')}`);\n lines.push(SEMANTIC_COLORS.warning('⚠️ Showing first 100 steps only (more available)'));\n lines.push(SEMANTIC_COLORS.dim(' → Use --jobs to fetch all step data and see accurate statistics'));\n } else {\n lines.push(`${icon} ${SEMANTIC_COLORS.count(String(jobStats.total))} step${jobStats.total > 1 ? 's' : ''}: ${countParts.join(', ')}`);\n }\n \n // For failed builds, show the specific failed job names\n if (buildState === 'FAILED') {\n const failedJobs = this.getFailedJobs(jobs);\n const jobGroups = this.groupJobsByLabel(failedJobs);\n \n // Show up to 3 failed job types\n const displayGroups = jobGroups.slice(0, 3);\n for (const group of displayGroups) {\n const label = this.parseEmoji(group.label);\n const icon = getStateIcon('FAILED');\n \n // Get duration for display\n const duration = group.count === 1 && group.jobs[0]?.node \n ? ` ${SEMANTIC_COLORS.dim(`- ran ${this.formatJobDuration(group.jobs[0].node)}`)}`\n : '';\n \n if (group.parallelTotal > 0) {\n lines.push(` ${icon} ${label} ${SEMANTIC_COLORS.dim(`(${group.stateCounts.failed || 0}/${group.parallelTotal} failed)`)}`);\n } else if (group.count > 1) {\n lines.push(` ${icon} ${label} ${SEMANTIC_COLORS.dim(`(${group.stateCounts.failed || 0} failed)`)}`);\n } else {\n lines.push(` ${icon} ${label}${duration}`);\n }\n }\n \n if (jobGroups.length > 3) {\n lines.push(` ${SEMANTIC_COLORS.muted(`...and ${jobGroups.length - 3} more`)}`);\n }\n }\n \n return lines.join('\\n');\n }\n \n private formatAnnotationDetails(annotations: any[]): string {\n const lines: string[] = [];\n const isAscii = useAscii();\n const terminalWidth = termWidth();\n \n // Box drawing characters\n const boxChars = isAscii ? {\n horizontal: '-',\n vertical: '|'\n } : {\n horizontal: '─',\n vertical: '│'\n };\n \n // Create a horizontal divider with padding and centering\n const createDivider = (width: number = 80) => {\n const padding = 2; // 1 space on each side\n const maxWidth = Math.min(width, terminalWidth - padding);\n const dividerLength = Math.max(20, maxWidth - padding); // Minimum 20 chars\n const divider = boxChars.horizontal.repeat(dividerLength);\n \n // Center the divider within the terminal width\n const totalPadding = terminalWidth - dividerLength;\n const leftPadding = Math.floor(totalPadding / 2);\n const spaces = ' '.repeat(Math.max(0, leftPadding));\n \n return SEMANTIC_COLORS.dim(spaces + divider);\n };\n \n // Group annotations by style\n const grouped = this.groupAnnotationsByStyle(annotations);\n const styleOrder = ['ERROR', 'WARNING', 'INFO', 'SUCCESS'];\n \n let annotationIndex = 0;\n for (const style of styleOrder) {\n if (grouped[style]) {\n for (const annotation of grouped[style]) {\n // Add divider between annotations (but not before the first one)\n if (annotationIndex > 0) {\n lines.push('');\n lines.push(createDivider());\n lines.push('');\n }\n \n const icon = this.getAnnotationIcon(style);\n const context = annotation.node.context || 'default';\n const colorFn = this.getStyleColorFunction(style);\n \n // Single line header with pipe: \"│ ℹ info: test-mapping-build\"\n const pipe = colorFn(boxChars.vertical);\n const header = `${pipe} ${icon} ${style.toLowerCase()}: ${context}`;\n lines.push(header);\n \n // Add blank line with pipe for visual continuity\n lines.push(pipe);\n \n // Format the body HTML with proper HTML/markdown handling\n const body = htmlToText(annotation.node.body?.html || '', {\n wordwrap: 80,\n preserveNewlines: true\n });\n \n // Add vertical pipes to the left of the body content for visual continuity\n // Use the same color as the header for the pipes\n const bodyLines = body.split('\\n');\n bodyLines.forEach((line) => {\n const paddedLine = line ? ` ${line}` : '';\n lines.push(`${pipe}${paddedLine}`);\n });\n \n annotationIndex++;\n }\n }\n }\n \n // Add summary footer for multiple annotations\n if (annotations.length > 1) {\n lines.push('');\n lines.push(createDivider());\n lines.push('');\n lines.push(SEMANTIC_COLORS.dim(`${SEMANTIC_COLORS.count(annotations.length.toString())} annotations found`));\n }\n \n return lines.join('\\n').trim();\n }\n \n private getStyleColorFunction(style: string): (s: string) => string {\n const styleColorMap: Record<string, (s: string) => string> = {\n 'ERROR': SEMANTIC_COLORS.error,\n 'WARNING': SEMANTIC_COLORS.warning,\n 'INFO': SEMANTIC_COLORS.info,\n 'SUCCESS': SEMANTIC_COLORS.success\n };\n return styleColorMap[style] || ((s: string) => s);\n }\n \n private formatJobDetails(jobs: any[], options?: BuildDetailFormatterOptions): string {\n if (!jobs || jobs.length === 0) {\n return 'No steps found';\n }\n \n const lines: string[] = [];\n const jobStats = this.getJobStats(jobs);\n \n // Summary line\n const parts = [];\n if (jobStats.passed > 0) parts.push(`${getStateIcon('PASSED')} ${jobStats.passed} passed`);\n if (jobStats.failed > 0) parts.push(`${getStateIcon('FAILED')} ${jobStats.failed} failed`);\n if (jobStats.running > 0) parts.push(`${getStateIcon('RUNNING')} ${jobStats.running} running`);\n if (jobStats.blocked > 0) parts.push(`${getStateIcon('BLOCKED')} ${jobStats.blocked} blocked`);\n // Don't show skipped jobs in summary\n \n lines.push(`Steps: ${parts.join(' ')}`);\n lines.push('');\n \n // Filter jobs based on options\n let filteredJobs = jobs;\n if (options?.failed) {\n filteredJobs = this.getFailedJobs(jobs);\n }\n \n // Group jobs by state first\n const grouped = this.groupJobsByState(filteredJobs);\n \n for (const [state, stateJobs] of Object.entries(grouped)) {\n if (stateJobs.length === 0) continue;\n \n const icon = this.getJobStateIcon(state);\n const stateColored = this.colorizeJobState(state);\n \n // Collapse parallel jobs with same label\n const collapsedGroups = this.collapseParallelJobs(stateJobs);\n \n lines.push(`${icon} ${stateColored} (${SEMANTIC_COLORS.count(String(stateJobs.length))}):`);\n \n for (const group of collapsedGroups) {\n if (group.isParallelGroup && group.jobs.length > 1) {\n // Collapsed parallel group display\n const label = this.parseEmoji(group.label);\n const total = group.parallelTotal || group.jobs.length;\n const passedCount = group.jobs.filter(j => this.isJobPassed(j.node)).length;\n const failedCount = group.jobs.filter(j => this.isJobFailed(j.node)).length;\n \n // Show summary line for parallel group\n if (failedCount > 0) {\n // If there are failures, show breakdown\n // Apply state color to label\n const coloredLabel = state === 'Failed' ? SEMANTIC_COLORS.error(label) : \n state === 'Passed' ? SEMANTIC_COLORS.success(label) :\n state === 'Running' ? SEMANTIC_COLORS.info(label) :\n state === 'Blocked' ? SEMANTIC_COLORS.warning(label) : label;\n lines.push(` ${coloredLabel} ${SEMANTIC_COLORS.dim(`(${passedCount}/${total} passed, ${failedCount} failed)`)}`);\n // Show failed steps individually\n const failedJobs = group.jobs.filter(j => this.isJobFailed(j.node));\n for (const job of failedJobs) {\n const duration = this.formatJobDuration(job.node);\n const parallelInfo = job.node.parallelGroupIndex !== undefined \n ? ` ${SEMANTIC_COLORS.dim(`[Parallel: ${job.node.parallelGroupIndex + 1}/${job.node.parallelGroupTotal}]`)}`\n : '';\n lines.push(` ${SEMANTIC_COLORS.error('↳ Failed')}: ${SEMANTIC_COLORS.dim(duration)}${parallelInfo}`);\n }\n } else {\n // All passed/running/blocked - just show summary\n const avgDuration = this.calculateAverageDuration(group.jobs);\n // Apply state color to label\n const coloredLabel = state === 'Passed' ? SEMANTIC_COLORS.success(label) : \n state === 'Failed' ? SEMANTIC_COLORS.error(label) :\n state === 'Running' ? SEMANTIC_COLORS.info(label) :\n state === 'Blocked' ? SEMANTIC_COLORS.warning(label) : label;\n lines.push(` ${coloredLabel} ${SEMANTIC_COLORS.dim(`(${total} parallel steps, avg: ${avgDuration})`)}`);\n }\n } else {\n // Single job or non-parallel group - display as before\n const job = group.jobs[0];\n const label = this.parseEmoji(job.node.label);\n const duration = this.formatJobDuration(job.node);\n \n // Apply state color to label\n const coloredLabel = state === 'Passed' ? SEMANTIC_COLORS.success(label) : \n state === 'Failed' ? SEMANTIC_COLORS.error(label) :\n state === 'Running' ? SEMANTIC_COLORS.info(label) :\n state === 'Blocked' ? SEMANTIC_COLORS.warning(label) : label;\n \n // Add parallel info inline if present\n const parallelInfo = (job.node.parallelGroupIndex !== undefined && job.node.parallelGroupTotal) \n ? ` ${SEMANTIC_COLORS.dim(`[Parallel: ${job.node.parallelGroupIndex + 1}/${job.node.parallelGroupTotal}]`)}`\n : '';\n \n // Basic step line with optional parallel info\n lines.push(` ${coloredLabel} ${SEMANTIC_COLORS.dim(`(${duration})`)}${parallelInfo}`);\n \n // Show additional details if --jobs or --full and single step\n if ((options?.jobs || options?.full) && !group.isParallelGroup) {\n // Retry info\n if (job.node.retried) {\n lines.push(` ${SEMANTIC_COLORS.warning(`${getProgressIcon('RETRY')} Retried`)}`);\n }\n }\n }\n }\n lines.push('');\n }\n \n return lines.join('\\n').trim();\n }\n \n\n \n private groupJobsByLabel(jobs: any[]): any[] {\n const groups = new Map<string, any>();\n \n for (const job of jobs) {\n const fullLabel = job.node.label || 'Unnamed job';\n \n // Strip parallel job index from label for grouping\n // e.g., \"deposit_and_filing_schedule_calculator rspec (1/22)\" -> \"deposit_and_filing_schedule_calculator rspec\"\n const baseLabel = fullLabel.replace(/\\s*\\(\\d+\\/\\d+\\)\\s*$/, '').trim();\n \n if (!groups.has(baseLabel)) {\n groups.set(baseLabel, {\n label: baseLabel,\n count: 0,\n jobs: [],\n parallelTotal: 0,\n stateCounts: {\n failed: 0,\n broken: 0,\n notStarted: 0,\n passed: 0,\n other: 0\n }\n });\n }\n \n const group = groups.get(baseLabel)!;\n group.count++;\n group.jobs.push(job);\n \n // Track the maximum parallel total for this job group\n if (job.node.parallelGroupTotal && job.node.parallelGroupTotal > group.parallelTotal) {\n group.parallelTotal = job.node.parallelGroupTotal;\n }\n \n\n \n // Count by state\n const state = job.node.state?.toUpperCase();\n \n // Use exit status as source of truth when available\n // Note: exitStatus comes as a string from Buildkite API\n if (job.node.exitStatus !== null && job.node.exitStatus !== undefined) {\n const exitCode = parseInt(job.node.exitStatus, 10);\n if (exitCode === 0) {\n group.stateCounts.passed++;\n } else {\n group.stateCounts.failed++;\n }\n } else if (!job.node.startedAt) {\n group.stateCounts.notStarted++;\n } else if (state === 'FINISHED' || state === 'COMPLETED') {\n // For finished jobs without exit status, check passed field\n if (job.node.passed === true) {\n group.stateCounts.passed++;\n } else if (job.node.passed === false) {\n group.stateCounts.failed++;\n } else {\n group.stateCounts.other++;\n }\n } else if (state === 'FAILED') {\n group.stateCounts.failed++;\n } else if (state === 'BROKEN') {\n group.stateCounts.broken++;\n } else if (state === 'PASSED' || job.node.passed === true) {\n group.stateCounts.passed++;\n } else {\n group.stateCounts.other++;\n }\n }\n \n // Convert to array and sort by count (most failures first)\n return Array.from(groups.values())\n .sort((a, b) => b.count - a.count);\n }\n \n private formatDuration(build: any): string {\n if (!build.startedAt) {\n return 'not started';\n }\n \n const start = new Date(build.startedAt);\n const end = build.finishedAt ? new Date(build.finishedAt) : new Date();\n const durationMs = end.getTime() - start.getTime();\n \n const minutes = Math.floor(durationMs / 60000);\n const seconds = Math.floor((durationMs % 60000) / 1000);\n \n if (build.state === 'RUNNING') {\n return `${minutes}m ${seconds}s elapsed`;\n }\n \n return `${minutes}m ${seconds}s`;\n }\n \n private formatJobDuration(job: any): string {\n if (!job.startedAt) {\n return 'not started';\n }\n \n const start = new Date(job.startedAt);\n const end = job.finishedAt ? new Date(job.finishedAt) : new Date();\n const durationMs = end.getTime() - start.getTime();\n \n const minutes = Math.floor(durationMs / 60000);\n const seconds = Math.floor((durationMs % 60000) / 1000);\n \n return `${minutes}m ${seconds}s`;\n }\n \n private formatAge(createdAt: string): string {\n return formatDistanceToNow(new Date(createdAt), { addSuffix: true });\n }\n \n private colorizeJobState(state: string): string {\n switch (state.toLowerCase()) {\n case 'failed':\n return SEMANTIC_COLORS.error(state);\n case 'passed':\n return SEMANTIC_COLORS.success(state);\n case 'running':\n return SEMANTIC_COLORS.info(state);\n case 'blocked':\n return SEMANTIC_COLORS.warning(state);\n case 'skipped':\n case 'canceled':\n return SEMANTIC_COLORS.muted(state);\n default:\n return state;\n }\n }\n \n private getStatusIcon(state: string): string {\n return getStateIcon(state);\n }\n \n private getJobStateIcon(state: string): string {\n return getStateIcon(state);\n }\n \n private getAnnotationIcon(style: string): string {\n return getAnnotationIcon(style);\n }\n \n private colorizeAnnotationStyle(style: string): string {\n switch (style.toUpperCase()) {\n case 'ERROR':\n return SEMANTIC_COLORS.error(style.toLowerCase());\n case 'WARNING':\n return SEMANTIC_COLORS.warning(style.toLowerCase());\n case 'INFO':\n return SEMANTIC_COLORS.info(style.toLowerCase());\n case 'SUCCESS':\n return SEMANTIC_COLORS.success(style.toLowerCase());\n default:\n return style.toLowerCase();\n }\n }\n \n private colorizeStatusIcon(icon: string, state: string): string {\n const upperState = state.toUpperCase();\n const theme = BUILD_STATUS_THEME[upperState as keyof typeof BUILD_STATUS_THEME];\n if (!theme) {\n return SEMANTIC_COLORS.muted(icon);\n }\n return theme.color(icon);\n }\n \n private getJobStats(jobs: any[]): any {\n const stats = {\n total: jobs?.length || 0,\n passed: 0,\n failed: 0,\n running: 0,\n blocked: 0,\n skipped: 0,\n canceled: 0,\n queued: 0,\n completed: 0\n };\n \n if (!jobs) return stats;\n \n for (const job of jobs) {\n const state = job.node.state?.toUpperCase() || '';\n \n // If we have an exit status, use that as the source of truth\n // Note: exitStatus comes as a string from Buildkite API\n if (job.node.exitStatus !== null && job.node.exitStatus !== undefined) {\n const exitCode = parseInt(job.node.exitStatus, 10);\n if (exitCode === 0) {\n stats.passed++;\n stats.completed++;\n } else {\n stats.failed++;\n stats.completed++;\n }\n } else if (state === 'RUNNING') {\n stats.running++;\n } else if (state === 'BLOCKED') {\n stats.blocked++;\n } else if (state === 'CANCELED' || state === 'CANCELLED') {\n stats.canceled++;\n stats.completed++;\n } else if (state === 'SKIPPED' || state === 'BROKEN') {\n // BROKEN jobs are functionally skipped - they don't run due to conditions not matching\n stats.skipped++;\n stats.completed++;\n } else if (state === 'SCHEDULED' || state === 'ASSIGNED') {\n stats.queued++;\n } else if (state === 'FINISHED' || state === 'COMPLETED') {\n // For finished jobs without exit status, check passed field\n if (job.node.passed === true) {\n stats.passed++;\n stats.completed++;\n } else if (job.node.passed === false) {\n stats.failed++;\n stats.completed++;\n }\n } else if (state === 'PASSED' || job.node.passed === true) {\n stats.passed++;\n stats.completed++;\n } else if (state === 'FAILED' || job.node.passed === false) {\n stats.failed++;\n stats.completed++;\n }\n }\n \n return stats;\n }\n \n private getFailedJobs(jobs: any[]): any[] {\n if (!jobs) return [];\n \n return jobs.filter(job => {\n const state = job.node.state?.toUpperCase();\n \n // BROKEN jobs are skipped/not run, not failed\n if (state === 'BROKEN' || state === 'SKIPPED') {\n return false;\n }\n \n // If we have an exit status, use that as the source of truth\n // Note: exitStatus comes as a string from Buildkite API\n if (job.node.exitStatus !== null && job.node.exitStatus !== undefined) {\n const exitCode = parseInt(job.node.exitStatus, 10);\n return exitCode !== 0;\n }\n \n // For FINISHED jobs, check the passed field\n if (state === 'FINISHED') {\n return job.node.passed === false;\n }\n \n // Otherwise check if explicitly failed\n return state === 'FAILED';\n });\n }\n \n private getRunningJobs(jobs: any[]): any[] {\n if (!jobs) return [];\n \n return jobs.filter(job => job.node.state?.toLowerCase() === 'running');\n }\n \n private getBlockedJobs(jobs: any[]): any[] {\n if (!jobs) return [];\n \n return jobs.filter(job => job.node.state?.toLowerCase() === 'blocked');\n }\n \n private groupJobsByState(jobs: any[]): Record<string, any[]> {\n const grouped: Record<string, any[]> = {\n 'Failed': [],\n 'Passed': [],\n 'Running': [],\n 'Blocked': []\n // Don't include Skipped - we don't display them\n };\n \n if (!jobs) return grouped;\n \n for (const job of jobs) {\n const state = job.node.state?.toUpperCase() || '';\n \n // If we have an exit status, use that as the source of truth\n // Note: exitStatus comes as a string from Buildkite API\n if (job.node.exitStatus !== null && job.node.exitStatus !== undefined) {\n const exitCode = parseInt(job.node.exitStatus, 10);\n if (exitCode === 0) {\n grouped['Passed'].push(job);\n } else {\n grouped['Failed'].push(job);\n }\n } else if (state === 'RUNNING') {\n grouped['Running'].push(job);\n } else if (state === 'BLOCKED') {\n grouped['Blocked'].push(job);\n } else if (state === 'SKIPPED' || state === 'CANCELED' || state === 'BROKEN') {\n // Don't display skipped/broken/canceled jobs - they're not shown in Buildkite UI\n // Skip these entirely\n } else if (state === 'FINISHED' || state === 'COMPLETED') {\n // For finished jobs without exit status, check passed field\n if (job.node.passed === true) {\n grouped['Passed'].push(job);\n } else if (job.node.passed === false) {\n grouped['Failed'].push(job);\n }\n } else if (state === 'PASSED' || job.node.passed === true) {\n grouped['Passed'].push(job);\n } else if (state === 'FAILED') {\n grouped['Failed'].push(job);\n }\n }\n \n return grouped;\n }\n \n private collapseParallelJobs(jobs: any[]): Array<{ \n label: string; \n jobs: any[]; \n isParallelGroup: boolean;\n parallelTotal?: number;\n }> {\n const groups: Map<string, any[]> = new Map();\n \n // Group jobs by label\n for (const job of jobs) {\n const label = job.node.label || 'Unnamed';\n if (!groups.has(label)) {\n groups.set(label, []);\n }\n groups.get(label)!.push(job);\n }\n \n // Convert to array and determine if each group is a parallel group\n const result = [];\n for (const [label, groupJobs] of groups.entries()) {\n // Check if this is a parallel group (multiple jobs with same label and parallel info)\n const hasParallelInfo = groupJobs.some(j => \n j.node.parallelGroupIndex !== undefined && j.node.parallelGroupTotal !== undefined\n );\n \n const isParallelGroup = hasParallelInfo && groupJobs.length > 1;\n \n // Get the total from the first job if available\n const parallelTotal = groupJobs[0]?.node?.parallelGroupTotal;\n \n result.push({\n label,\n jobs: groupJobs,\n isParallelGroup,\n parallelTotal\n });\n }\n \n return result;\n }\n \n private isJobPassed(job: any): boolean {\n const state = job.state?.toUpperCase();\n \n if (job.exitStatus !== null && job.exitStatus !== undefined) {\n return parseInt(job.exitStatus, 10) === 0;\n }\n \n if (state === 'PASSED') return true;\n if (state === 'FINISHED' || state === 'COMPLETED') {\n return job.passed === true;\n }\n \n return job.passed === true;\n }\n \n private isJobFailed(job: any): boolean {\n const state = job.state?.toUpperCase();\n \n if (job.exitStatus !== null && job.exitStatus !== undefined) {\n return parseInt(job.exitStatus, 10) !== 0;\n }\n \n if (state === 'FAILED') return true;\n if (state === 'FINISHED' || state === 'COMPLETED') {\n return job.passed === false;\n }\n \n return false;\n }\n \n private calculateAverageDuration(jobs: any[]): string {\n const durationsMs = jobs\n .filter(j => j.node.startedAt && j.node.finishedAt)\n .map(j => {\n const start = new Date(j.node.startedAt).getTime();\n const end = new Date(j.node.finishedAt).getTime();\n return end - start;\n });\n \n if (durationsMs.length === 0) {\n return 'unknown';\n }\n \n const avgMs = durationsMs.reduce((a, b) => a + b, 0) / durationsMs.length;\n const avgSeconds = Math.floor(avgMs / 1000);\n \n if (avgSeconds < 60) {\n return `${avgSeconds}s`;\n }\n \n const minutes = Math.floor(avgSeconds / 60);\n const seconds = avgSeconds % 60;\n \n if (minutes < 60) {\n return seconds > 0 ? `${minutes}m ${seconds}s` : `${minutes}m`;\n }\n \n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n return remainingMinutes > 0 ? `${hours}h ${remainingMinutes}m` : `${hours}h`;\n }\n \n private countAnnotationsByStyle(annotations: any[]): Record<string, number> {\n const counts: Record<string, number> = {\n ERROR: 0,\n WARNING: 0,\n INFO: 0,\n SUCCESS: 0\n };\n \n for (const annotation of annotations) {\n const style = annotation.node.style?.toUpperCase() || 'INFO';\n if (style in counts) {\n counts[style]++;\n }\n }\n \n return counts;\n }\n \n private groupAnnotationsByStyle(annotations: any[]): Record<string, any[]> {\n const grouped: Record<string, any[]> = {};\n \n for (const annotation of annotations) {\n const style = annotation.node.style?.toUpperCase() || 'INFO';\n if (!grouped[style]) {\n grouped[style] = [];\n }\n grouped[style].push(annotation);\n }\n \n return grouped;\n }\n \n formatError(action: string, error: any): string {\n return formatError(action, error);\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"/","sources":["graphql/fragments/index.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,wBAAwB,EACzB,MAAM,WAAW,CAAC","sourcesContent":["// Export all GraphQL fragments\nexport { \n JOB_SUMMARY_FIELDS, \n JOB_DETAIL_FIELDS, \n JOBS_CONNECTION,\n JOBS_CONNECTION_DETAILED \n} from './jobs.js';\n"]}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { gql } from 'graphql-request';
|
|
2
|
+
/**
|
|
3
|
+
* Fragment for basic job fields used in summary views
|
|
4
|
+
* This is the minimal set of fields needed for job lists
|
|
5
|
+
*/
|
|
6
|
+
export const JOB_SUMMARY_FIELDS = gql `
|
|
7
|
+
fragment JobSummaryFields on JobInterface {
|
|
8
|
+
... on JobTypeCommand {
|
|
9
|
+
id
|
|
10
|
+
uuid
|
|
11
|
+
label
|
|
12
|
+
state
|
|
13
|
+
exitStatus
|
|
14
|
+
startedAt
|
|
15
|
+
finishedAt
|
|
16
|
+
passed
|
|
17
|
+
parallelGroupIndex
|
|
18
|
+
parallelGroupTotal
|
|
19
|
+
}
|
|
20
|
+
... on JobTypeWait {
|
|
21
|
+
id
|
|
22
|
+
label
|
|
23
|
+
}
|
|
24
|
+
... on JobTypeTrigger {
|
|
25
|
+
id
|
|
26
|
+
label
|
|
27
|
+
state
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
`;
|
|
31
|
+
/**
|
|
32
|
+
* Fragment for detailed job fields used in full views
|
|
33
|
+
* Includes all summary fields plus additional details
|
|
34
|
+
*/
|
|
35
|
+
export const JOB_DETAIL_FIELDS = gql `
|
|
36
|
+
fragment JobDetailFields on JobInterface {
|
|
37
|
+
... on JobTypeCommand {
|
|
38
|
+
id
|
|
39
|
+
uuid
|
|
40
|
+
label
|
|
41
|
+
command
|
|
42
|
+
state
|
|
43
|
+
exitStatus
|
|
44
|
+
startedAt
|
|
45
|
+
finishedAt
|
|
46
|
+
passed
|
|
47
|
+
retried
|
|
48
|
+
parallelGroupIndex
|
|
49
|
+
parallelGroupTotal
|
|
50
|
+
retrySource {
|
|
51
|
+
... on JobTypeCommand {
|
|
52
|
+
id
|
|
53
|
+
uuid
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
agent {
|
|
57
|
+
... on Agent {
|
|
58
|
+
id
|
|
59
|
+
name
|
|
60
|
+
hostname
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
... on JobTypeWait {
|
|
65
|
+
id
|
|
66
|
+
label
|
|
67
|
+
}
|
|
68
|
+
... on JobTypeTrigger {
|
|
69
|
+
id
|
|
70
|
+
label
|
|
71
|
+
state
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
`;
|
|
75
|
+
/**
|
|
76
|
+
* Fragment for jobs connection with pagination info
|
|
77
|
+
* Can be used with either summary or detail fields
|
|
78
|
+
*/
|
|
79
|
+
export const JOBS_CONNECTION = gql `
|
|
80
|
+
fragment JobsConnection on JobConnection {
|
|
81
|
+
edges {
|
|
82
|
+
node {
|
|
83
|
+
...JobSummaryFields
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
pageInfo {
|
|
87
|
+
hasNextPage
|
|
88
|
+
endCursor
|
|
89
|
+
}
|
|
90
|
+
count
|
|
91
|
+
}
|
|
92
|
+
${JOB_SUMMARY_FIELDS}
|
|
93
|
+
`;
|
|
94
|
+
/**
|
|
95
|
+
* Fragment for detailed jobs connection
|
|
96
|
+
*/
|
|
97
|
+
export const JOBS_CONNECTION_DETAILED = gql `
|
|
98
|
+
fragment JobsConnectionDetailed on JobConnection {
|
|
99
|
+
edges {
|
|
100
|
+
node {
|
|
101
|
+
...JobDetailFields
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
pageInfo {
|
|
105
|
+
hasNextPage
|
|
106
|
+
endCursor
|
|
107
|
+
}
|
|
108
|
+
count
|
|
109
|
+
}
|
|
110
|
+
${JOB_DETAIL_FIELDS}
|
|
111
|
+
`;
|
|
112
|
+
//# sourceMappingURL=jobs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobs.js","sourceRoot":"/","sources":["graphql/fragments/jobs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAEtC;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;CAwBpC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuCnC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAA;;;;;;;;;;;;;IAa9B,kBAAkB;CACrB,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,CAAA;;;;;;;;;;;;;IAavC,iBAAiB;CACpB,CAAC","sourcesContent":["import { gql } from 'graphql-request';\n\n/**\n * Fragment for basic job fields used in summary views\n * This is the minimal set of fields needed for job lists\n */\nexport const JOB_SUMMARY_FIELDS = gql`\n fragment JobSummaryFields on JobInterface {\n ... on JobTypeCommand {\n id\n uuid\n label\n state\n exitStatus\n startedAt\n finishedAt\n passed\n parallelGroupIndex\n parallelGroupTotal\n }\n ... on JobTypeWait {\n id\n label\n }\n ... on JobTypeTrigger {\n id\n label\n state\n }\n }\n`;\n\n/**\n * Fragment for detailed job fields used in full views\n * Includes all summary fields plus additional details\n */\nexport const JOB_DETAIL_FIELDS = gql`\n fragment JobDetailFields on JobInterface {\n ... on JobTypeCommand {\n id\n uuid\n label\n command\n state\n exitStatus\n startedAt\n finishedAt\n passed\n retried\n parallelGroupIndex\n parallelGroupTotal\n retrySource {\n ... on JobTypeCommand {\n id\n uuid\n }\n }\n agent {\n ... on Agent {\n id\n name\n hostname\n }\n }\n }\n ... on JobTypeWait {\n id\n label\n }\n ... on JobTypeTrigger {\n id\n label\n state\n }\n }\n`;\n\n/**\n * Fragment for jobs connection with pagination info\n * Can be used with either summary or detail fields\n */\nexport const JOBS_CONNECTION = gql`\n fragment JobsConnection on JobConnection {\n edges {\n node {\n ...JobSummaryFields\n }\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n count\n }\n ${JOB_SUMMARY_FIELDS}\n`;\n\n/**\n * Fragment for detailed jobs connection\n */\nexport const JOBS_CONNECTION_DETAILED = gql`\n fragment JobsConnectionDetailed on JobConnection {\n edges {\n node {\n ...JobDetailFields\n }\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n count\n }\n ${JOB_DETAIL_FIELDS}\n`;\n"]}
|
package/dist/graphql/queries.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Common GraphQL queries for the Buildkite API
|
|
3
3
|
*/
|
|
4
4
|
import { gql } from 'graphql-request';
|
|
5
|
+
import { JOB_SUMMARY_FIELDS, JOB_DETAIL_FIELDS } from './fragments/index.js';
|
|
5
6
|
export const GET_VIEWER = gql `
|
|
6
7
|
query GetViewer {
|
|
7
8
|
viewer {
|
|
@@ -177,29 +178,14 @@ export const GET_BUILD_SUMMARY = gql `
|
|
|
177
178
|
jobs(first: 100) {
|
|
178
179
|
edges {
|
|
179
180
|
node {
|
|
180
|
-
...
|
|
181
|
-
id
|
|
182
|
-
uuid
|
|
183
|
-
label
|
|
184
|
-
state
|
|
185
|
-
exitStatus
|
|
186
|
-
startedAt
|
|
187
|
-
finishedAt
|
|
188
|
-
passed
|
|
189
|
-
parallelGroupIndex
|
|
190
|
-
parallelGroupTotal
|
|
191
|
-
}
|
|
192
|
-
... on JobTypeWait {
|
|
193
|
-
id
|
|
194
|
-
label
|
|
195
|
-
}
|
|
196
|
-
... on JobTypeTrigger {
|
|
197
|
-
id
|
|
198
|
-
label
|
|
199
|
-
state
|
|
200
|
-
}
|
|
181
|
+
...JobSummaryFields
|
|
201
182
|
}
|
|
202
183
|
}
|
|
184
|
+
pageInfo {
|
|
185
|
+
hasNextPage
|
|
186
|
+
endCursor
|
|
187
|
+
}
|
|
188
|
+
count
|
|
203
189
|
}
|
|
204
190
|
annotations(first: 50) {
|
|
205
191
|
edges {
|
|
@@ -215,6 +201,7 @@ export const GET_BUILD_SUMMARY = gql `
|
|
|
215
201
|
}
|
|
216
202
|
}
|
|
217
203
|
}
|
|
204
|
+
${JOB_SUMMARY_FIELDS}
|
|
218
205
|
`;
|
|
219
206
|
export const GET_BUILD_FULL = gql `
|
|
220
207
|
query GetBuildFull($slug: ID!) {
|
|
@@ -264,44 +251,14 @@ export const GET_BUILD_FULL = gql `
|
|
|
264
251
|
jobs(first: 100) {
|
|
265
252
|
edges {
|
|
266
253
|
node {
|
|
267
|
-
...
|
|
268
|
-
id
|
|
269
|
-
uuid
|
|
270
|
-
label
|
|
271
|
-
command
|
|
272
|
-
state
|
|
273
|
-
exitStatus
|
|
274
|
-
startedAt
|
|
275
|
-
finishedAt
|
|
276
|
-
passed
|
|
277
|
-
retried
|
|
278
|
-
parallelGroupIndex
|
|
279
|
-
parallelGroupTotal
|
|
280
|
-
retrySource {
|
|
281
|
-
... on JobTypeCommand {
|
|
282
|
-
id
|
|
283
|
-
uuid
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
agent {
|
|
287
|
-
... on Agent {
|
|
288
|
-
id
|
|
289
|
-
name
|
|
290
|
-
hostname
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
... on JobTypeWait {
|
|
295
|
-
id
|
|
296
|
-
label
|
|
297
|
-
}
|
|
298
|
-
... on JobTypeTrigger {
|
|
299
|
-
id
|
|
300
|
-
label
|
|
301
|
-
state
|
|
302
|
-
}
|
|
254
|
+
...JobDetailFields
|
|
303
255
|
}
|
|
304
256
|
}
|
|
257
|
+
pageInfo {
|
|
258
|
+
hasNextPage
|
|
259
|
+
endCursor
|
|
260
|
+
}
|
|
261
|
+
count
|
|
305
262
|
}
|
|
306
263
|
annotations(first: 100) {
|
|
307
264
|
edges {
|
|
@@ -319,5 +276,26 @@ export const GET_BUILD_FULL = gql `
|
|
|
319
276
|
}
|
|
320
277
|
}
|
|
321
278
|
}
|
|
279
|
+
${JOB_DETAIL_FIELDS}
|
|
280
|
+
`;
|
|
281
|
+
export const GET_BUILD_JOBS_PAGE = gql `
|
|
282
|
+
query GetBuildJobsPage($slug: ID!, $first: Int!, $after: String) {
|
|
283
|
+
build(slug: $slug) {
|
|
284
|
+
id
|
|
285
|
+
jobs(first: $first, after: $after) {
|
|
286
|
+
edges {
|
|
287
|
+
node {
|
|
288
|
+
...JobSummaryFields
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
pageInfo {
|
|
292
|
+
hasNextPage
|
|
293
|
+
endCursor
|
|
294
|
+
}
|
|
295
|
+
count
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
${JOB_SUMMARY_FIELDS}
|
|
322
300
|
`;
|
|
323
301
|
//# sourceMappingURL=queries.js.map
|