bktide 1.0.1755267617 → 1.0.1755559112

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 (93) hide show
  1. package/README.md +107 -1
  2. package/WORKFLOW_README.md +1 -1
  3. package/completions/bktide-dynamic.fish +171 -0
  4. package/completions/bktide.bash +124 -0
  5. package/completions/bktide.fish +107 -0
  6. package/completions/bktide.zsh +139 -0
  7. package/dist/commands/BaseCommand.js +7 -7
  8. package/dist/commands/BaseCommand.js.map +1 -1
  9. package/dist/commands/GenerateCompletions.js +238 -0
  10. package/dist/commands/GenerateCompletions.js.map +1 -0
  11. package/dist/commands/ListAnnotations.js +7 -0
  12. package/dist/commands/ListAnnotations.js.map +1 -1
  13. package/dist/commands/ListBuilds.js +67 -3
  14. package/dist/commands/ListBuilds.js.map +1 -1
  15. package/dist/commands/ListOrganizations.js +6 -0
  16. package/dist/commands/ListOrganizations.js.map +1 -1
  17. package/dist/commands/ListPipelines.js +87 -12
  18. package/dist/commands/ListPipelines.js.map +1 -1
  19. package/dist/commands/ManageToken.js +32 -9
  20. package/dist/commands/ManageToken.js.map +1 -1
  21. package/dist/commands/ShowBuild.js +88 -0
  22. package/dist/commands/ShowBuild.js.map +1 -0
  23. package/dist/commands/ShowViewer.js +7 -1
  24. package/dist/commands/ShowViewer.js.map +1 -1
  25. package/dist/commands/index.js +2 -0
  26. package/dist/commands/index.js.map +1 -1
  27. package/dist/formatters/FormatterFactory.js +4 -0
  28. package/dist/formatters/FormatterFactory.js.map +1 -1
  29. package/dist/formatters/annotations/PlainTextFormatter.js +37 -9
  30. package/dist/formatters/annotations/PlainTextFormatter.js.map +1 -1
  31. package/dist/formatters/build-detail/AlfredFormatter.js +113 -0
  32. package/dist/formatters/build-detail/AlfredFormatter.js.map +1 -0
  33. package/dist/formatters/build-detail/Formatter.js +3 -0
  34. package/dist/formatters/build-detail/Formatter.js.map +1 -0
  35. package/dist/formatters/build-detail/JsonFormatter.js +132 -0
  36. package/dist/formatters/build-detail/JsonFormatter.js.map +1 -0
  37. package/dist/formatters/build-detail/PlainTextFormatter.js +680 -0
  38. package/dist/formatters/build-detail/PlainTextFormatter.js.map +1 -0
  39. package/dist/formatters/build-detail/index.js +21 -0
  40. package/dist/formatters/build-detail/index.js.map +1 -0
  41. package/dist/formatters/builds/PlainTextFormatter.js +82 -60
  42. package/dist/formatters/builds/PlainTextFormatter.js.map +1 -1
  43. package/dist/formatters/errors/AlfredFormatter.js +20 -0
  44. package/dist/formatters/errors/AlfredFormatter.js.map +1 -1
  45. package/dist/formatters/errors/PlainTextFormatter.js +121 -23
  46. package/dist/formatters/errors/PlainTextFormatter.js.map +1 -1
  47. package/dist/formatters/organizations/PlainTextFormatter.js +37 -6
  48. package/dist/formatters/organizations/PlainTextFormatter.js.map +1 -1
  49. package/dist/formatters/pipelines/AlfredFormatter.js.map +1 -1
  50. package/dist/formatters/pipelines/Formatter.js.map +1 -1
  51. package/dist/formatters/pipelines/JsonFormatter.js.map +1 -1
  52. package/dist/formatters/pipelines/PlainTextFormatter.js +165 -19
  53. package/dist/formatters/pipelines/PlainTextFormatter.js.map +1 -1
  54. package/dist/formatters/token/AlfredFormatter.js +15 -2
  55. package/dist/formatters/token/AlfredFormatter.js.map +1 -1
  56. package/dist/formatters/token/PlainTextFormatter.js +56 -18
  57. package/dist/formatters/token/PlainTextFormatter.js.map +1 -1
  58. package/dist/formatters/viewer/PlainTextFormatter.js +8 -7
  59. package/dist/formatters/viewer/PlainTextFormatter.js.map +1 -1
  60. package/dist/graphql/queries.js +181 -0
  61. package/dist/graphql/queries.js.map +1 -1
  62. package/dist/index.js +67 -6
  63. package/dist/index.js.map +1 -1
  64. package/dist/services/BuildkiteClient.js +61 -1
  65. package/dist/services/BuildkiteClient.js.map +1 -1
  66. package/dist/services/CredentialManager.js +80 -10
  67. package/dist/services/CredentialManager.js.map +1 -1
  68. package/dist/ui/help.js +69 -0
  69. package/dist/ui/help.js.map +1 -0
  70. package/dist/ui/progress.js +356 -0
  71. package/dist/ui/progress.js.map +1 -0
  72. package/dist/ui/reporter.js +111 -0
  73. package/dist/ui/reporter.js.map +1 -0
  74. package/dist/ui/responsive-table.js +183 -0
  75. package/dist/ui/responsive-table.js.map +1 -0
  76. package/dist/ui/spinner.js +20 -0
  77. package/dist/ui/spinner.js.map +1 -0
  78. package/dist/ui/symbols.js +46 -0
  79. package/dist/ui/symbols.js.map +1 -0
  80. package/dist/ui/table.js +32 -0
  81. package/dist/ui/table.js.map +1 -0
  82. package/dist/ui/theme.js +280 -0
  83. package/dist/ui/theme.js.map +1 -0
  84. package/dist/ui/width.js +111 -0
  85. package/dist/ui/width.js.map +1 -0
  86. package/dist/utils/alfred.js +6 -0
  87. package/dist/utils/alfred.js.map +1 -0
  88. package/dist/utils/cli-error-handler.js +35 -20
  89. package/dist/utils/cli-error-handler.js.map +1 -1
  90. package/dist/utils/pagination.js +92 -0
  91. package/dist/utils/pagination.js.map +1 -0
  92. package/info.plist +51 -218
  93. package/package.json +24 -5
@@ -0,0 +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} 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 status = this.getStatusIcon(build.state);\n const duration = this.formatDuration(build);\n const age = this.formatAge(build.createdAt);\n \n return `${status} #${build.number} ${build.state.toLowerCase()} • ${duration} • ${build.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(SEMANTIC_COLORS.dim(`→ bin/bktide build ${build.number} --annotations # view annotations`));\n }\n }\n \n // Show annotations detail if requested\n if (options?.annotations) {\n lines.push('');\n lines.push(this.formatAnnotationDetails(build.annotations.edges, options));\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 if (failedJobs.length > 0) {\n lines.push(this.formatFailedJobsSummary(failedJobs));\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, options));\n }\n \n // Hints for more info (no Tips label)\n if (!options?.failed && failedJobs.length > 0) {\n lines.push('');\n lines.push(SEMANTIC_COLORS.dim(`→ bin/bktide build ${build.number} --failed # show failure details`));\n }\n if (!options?.annotations && build.annotations?.edges?.length > 0) {\n lines.push(SEMANTIC_COLORS.dim(`→ bin/bktide build ${build.number} --annotations # view annotations`));\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 // 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 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(`🚫 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(`✅ ${jobStats.completed} jobs passed before block`);\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 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 lines.push(` Pull Request: #${build.pullRequest.number}`);\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, { ...options, annotationsFull: true }));\n }\n \n return lines.join('\\n');\n }\n \n private formatHeader(build: any): string {\n const status = this.getStatusIcon(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 `${status} ${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 const counts = this.countAnnotationsByStyle(annotations);\n const parts = [];\n \n if (counts.ERROR > 0) parts.push(SEMANTIC_COLORS.error(`${counts.ERROR} error${counts.ERROR > 1 ? 's' : ''}`));\n if (counts.WARNING > 0) parts.push(SEMANTIC_COLORS.warning(`${counts.WARNING} warning${counts.WARNING > 1 ? 's' : ''}`));\n if (counts.INFO > 0) parts.push(SEMANTIC_COLORS.info(`${counts.INFO} info`));\n if (counts.SUCCESS > 0) parts.push(SEMANTIC_COLORS.success(`${counts.SUCCESS} success`));\n \n const total = annotations.length;\n return `📝 ${SEMANTIC_COLORS.count(String(total))} annotation${total > 1 ? 's' : ''}: ${parts.join(', ')}`;\n }\n \n private formatAnnotationDetails(annotations: any[], options?: BuildDetailFormatterOptions): string {\n const lines: string[] = [];\n \n // Group annotations by style\n const grouped = this.groupAnnotationsByStyle(annotations);\n \n for (const [style, items] of Object.entries(grouped)) {\n for (const annotation of items) {\n const icon = this.getAnnotationIcon(style);\n const context = annotation.node.context || 'default';\n \n if (options?.annotationsFull) {\n // Full content\n lines.push(`${icon} ${style} [${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 } else {\n // Summary only\n lines.push(`${icon} ${style} [${context}]`);\n }\n }\n }\n \n return lines.join('\\n');\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(`✅ ${jobStats.passed} passed`);\n if (jobStats.failed > 0) parts.push(`❌ ${jobStats.failed} failed`);\n if (jobStats.running > 0) parts.push(`🔄 ${jobStats.running} running`);\n if (jobStats.blocked > 0) parts.push(`⏸️ ${jobStats.blocked} blocked`);\n if (jobStats.skipped > 0) parts.push(`⏭️ ${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 const exitCode = job.node.exitStatus ? `, exit ${job.node.exitStatus}` : '';\n lines.push(` ${label} (${duration}${exitCode})`);\n \n if (options?.full && job.node.agent) {\n lines.push(` ${SEMANTIC_COLORS.dim(`Agent: ${job.node.agent.name || job.node.agent.hostname}`)}`);\n }\n }\n lines.push('');\n }\n \n return lines.join('\\n').trim();\n }\n \n private formatFailedJobsSummary(failedJobs: any[]): string {\n const lines: string[] = [];\n \n // Group identical jobs by label\n const jobGroups = this.groupJobsByLabel(failedJobs);\n \n // Show first 10 unique job types\n const displayGroups = 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 // Add exit codes if available\n if (group.exitCodes.length > 0) {\n const exitCodeStr = group.exitCodes.length === 1 \n ? `exit ${group.exitCodes[0]}`\n : `exits: ${group.exitCodes.join(', ')}`;\n statusParts.push(exitCodeStr);\n }\n \n const statusInfo = statusParts.join(', ') || 'various states';\n lines.push(` ${SEMANTIC_COLORS.error('Failed')}: ${label} (${SEMANTIC_COLORS.count(String(group.count))} jobs: ${statusInfo})`);\n }\n }\n \n // Add summary if there are more job types\n const remaining = jobGroups.length - displayGroups.length;\n if (remaining > 0) {\n lines.push(` ${SEMANTIC_COLORS.muted(`...and ${remaining} more job types`)}`);\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 label = job.node.label || 'Unnamed job';\n if (!groups.has(label)) {\n groups.set(label, {\n label,\n count: 0,\n jobs: [],\n exitCodes: new Set<number>(),\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(label)!;\n group.count++;\n group.jobs.push(job);\n \n // Track exit codes\n if (job.node.exitStatus !== null && job.node.exitStatus !== undefined) {\n group.exitCodes.add(job.node.exitStatus);\n }\n \n // Count by state\n const state = job.node.state?.toUpperCase();\n if (!job.node.startedAt) {\n group.stateCounts.notStarted++;\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 .map(g => ({ ...g, exitCodes: Array.from(g.exitCodes) }))\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 const icons: Record<string, string> = {\n 'PASSED': '✅',\n 'FAILED': '❌',\n 'RUNNING': '🔄',\n 'BLOCKED': '⏸️',\n 'CANCELED': '🚫',\n 'SCHEDULED': '📅',\n 'SKIPPED': '⏭️'\n };\n \n return icons[state] || '❓';\n }\n \n private getJobStateIcon(state: string): string {\n const icons: Record<string, string> = {\n 'passed': '✅',\n 'failed': '❌',\n 'running': '🔄',\n 'blocked': '⏸️',\n 'canceled': '🚫',\n 'scheduled': '📅',\n 'skipped': '⏭️'\n };\n \n return icons[state.toLowerCase()] || '❓';\n }\n \n private getAnnotationIcon(style: string): string {\n const icons: Record<string, string> = {\n 'ERROR': '❌',\n 'WARNING': '⚠️',\n 'INFO': 'ℹ️',\n 'SUCCESS': '✅'\n };\n \n return icons[style.toUpperCase()] || '📝';\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 (state === 'PASSED' || (job.node.passed === true && state !== 'BROKEN')) {\n stats.passed++;\n stats.completed++;\n } else if (state === 'FAILED' || state === 'BROKEN' || (job.node.exitStatus && job.node.exitStatus !== 0) || job.node.passed === false) {\n stats.failed++;\n stats.completed++;\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 }\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 return state === 'FAILED' || state === 'BROKEN' || (job.node.exitStatus && job.node.exitStatus !== 0) || 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 (state === 'FAILED' || state === 'BROKEN' || (job.node.exitStatus && job.node.exitStatus !== 0) || job.node.passed === false) {\n grouped['Failed'].push(job);\n } else if (state === 'PASSED' || (job.node.passed === true && state !== 'BROKEN')) {\n grouped['Passed'].push(job);\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 }\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"]}
@@ -0,0 +1,21 @@
1
+ import { PlainTextFormatter } from './PlainTextFormatter.js';
2
+ import { JsonFormatter } from './JsonFormatter.js';
3
+ import { AlfredFormatter } from './AlfredFormatter.js';
4
+ export function getBuildDetailFormatter(format) {
5
+ switch (format.toLowerCase()) {
6
+ case 'json':
7
+ return new JsonFormatter();
8
+ case 'alfred':
9
+ return new AlfredFormatter();
10
+ case 'plain':
11
+ case 'text':
12
+ case 'plain-text':
13
+ default:
14
+ return new PlainTextFormatter();
15
+ }
16
+ }
17
+ export { BaseBuildDetailFormatter } from './Formatter.js';
18
+ export { PlainTextFormatter } from './PlainTextFormatter.js';
19
+ export { JsonFormatter } from './JsonFormatter.js';
20
+ export { AlfredFormatter } from './AlfredFormatter.js';
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"/","sources":["formatters/build-detail/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,UAAU,uBAAuB,CAAC,MAAc;IACpD,QAAQ,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;QAC7B,KAAK,MAAM;YACT,OAAO,IAAI,aAAa,EAAE,CAAC;QAC7B,KAAK,QAAQ;YACX,OAAO,IAAI,eAAe,EAAE,CAAC;QAC/B,KAAK,OAAO,CAAC;QACb,KAAK,MAAM,CAAC;QACZ,KAAK,YAAY,CAAC;QAClB;YACE,OAAO,IAAI,kBAAkB,EAAE,CAAC;IACpC,CAAC;AACH,CAAC;AAED,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC","sourcesContent":["import { BaseBuildDetailFormatter } from './Formatter.js';\nimport { PlainTextFormatter } from './PlainTextFormatter.js';\nimport { JsonFormatter } from './JsonFormatter.js';\nimport { AlfredFormatter } from './AlfredFormatter.js';\n\nexport function getBuildDetailFormatter(format: string): BaseBuildDetailFormatter {\n switch (format.toLowerCase()) {\n case 'json':\n return new JsonFormatter();\n case 'alfred':\n return new AlfredFormatter();\n case 'plain':\n case 'text':\n case 'plain-text':\n default:\n return new PlainTextFormatter();\n }\n}\n\nexport { BaseBuildDetailFormatter } from './Formatter.js';\nexport { PlainTextFormatter } from './PlainTextFormatter.js';\nexport { JsonFormatter } from './JsonFormatter.js';\nexport { AlfredFormatter } from './AlfredFormatter.js';\n"]}
@@ -1,4 +1,7 @@
1
1
  import { BaseFormatter } from './Formatter.js';
2
+ import { renderTable } from '../../ui/table.js';
3
+ import { renderResponsiveTable, isNarrowTerminal, isMobileTerminal } from '../../ui/responsive-table.js';
4
+ import { SEMANTIC_COLORS, formatBuildStatus, formatEmptyState, formatError, formatTips, TipStyle } from '../../ui/theme.js';
2
5
  export class PlainTextFormatter extends BaseFormatter {
3
6
  name = 'plain-text';
4
7
  formatBuilds(builds, options) {
@@ -19,95 +22,114 @@ export class PlainTextFormatter extends BaseFormatter {
19
22
  }
20
23
  // Handle empty results (no error, just no data)
21
24
  if (builds.length === 0) {
22
- let output = 'No builds found.';
25
+ let message = 'No builds found';
26
+ const suggestions = [];
23
27
  // Add user info if provided
24
28
  if (options?.userName) {
25
- output = `No builds found for ${options.userName}`;
29
+ message = `No builds found for ${SEMANTIC_COLORS.label(options.userName)}`;
26
30
  if (options?.userEmail || options?.userId) {
27
- output += ` (${options.userEmail || options.userId})`;
31
+ message += ` ${SEMANTIC_COLORS.dim(`(${options.userEmail || options.userId})`)}`;
28
32
  }
29
- output += '.';
30
33
  }
31
- // Add organization suggestion if applicable
34
+ // Add suggestions based on context
32
35
  if (!options?.orgSpecified) {
33
- output += '\nTry specifying an organization with --org to narrow your search.';
36
+ suggestions.push('Try specifying an organization with --org <name>');
34
37
  }
35
- return output;
38
+ suggestions.push('Use --count to increase the number of results');
39
+ return formatEmptyState(message, suggestions);
36
40
  }
37
- let output = `Found ${builds.length} builds:\n`;
38
- output += '==============================================\n';
39
- builds.forEach((build) => {
40
- try {
41
- output += `${build.pipeline?.slug || 'Unknown pipeline'} #${build.number}\n`;
42
- output += `State: ${build.state || 'Unknown'}\n`;
43
- output += `Branch: ${build.branch || 'Unknown'}\n`;
44
- output += `Message: ${build.message || 'No message'}\n`;
45
- const createdDate = (build.created_at || build.createdAt) ?
46
- new Date(build.created_at || build.createdAt).toLocaleString() : 'Unknown';
47
- const startedDate = (build.started_at || build.startedAt) ?
48
- new Date(build.started_at || build.startedAt).toLocaleString() : 'Not started';
49
- const finishedDate = (build.finished_at || build.finishedAt) ?
50
- new Date(build.finished_at || build.finishedAt).toLocaleString() : 'Not finished';
51
- output += `Created: ${createdDate}\n`;
52
- output += `Started: ${startedDate}\n`;
53
- output += `Finished: ${finishedDate}\n`;
54
- output += `URL: ${build.web_url || build.url || 'No URL'}\n`;
55
- output += '------------------\n';
56
- }
57
- catch (error) {
58
- output += `Error displaying build: ${error}\n`;
59
- if (options?.debug) {
60
- output += `Build data: ${JSON.stringify(build, null, 2)}\n`;
61
- }
62
- output += '------------------\n';
63
- }
41
+ const lines = [];
42
+ // Build a tabular summary view for scan-ability
43
+ const headers = ['PIPELINE', 'NUMBER', 'STATE', 'BRANCH'].map(h => SEMANTIC_COLORS.heading(h));
44
+ const dataRows = [];
45
+ builds.forEach((b) => {
46
+ dataRows.push([
47
+ b.pipeline?.slug || SEMANTIC_COLORS.muted('unknown'),
48
+ SEMANTIC_COLORS.identifier(`#${b.number}`),
49
+ formatBuildStatus(b.state || 'UNKNOWN', { useSymbol: false }),
50
+ b.branch || SEMANTIC_COLORS.dim('(no branch)')
51
+ ]);
64
52
  });
65
- // Summary and guidance lines
66
- output += `\nShowing ${builds.length} builds. Use --count and --page options to see more.\n`;
53
+ // Use responsive table for narrow terminals
54
+ if (isNarrowTerminal()) {
55
+ // Configure columns with priorities for narrow displays
56
+ const columns = [
57
+ { header: 'PIPELINE', priority: 3, minWidth: 10, truncate: true },
58
+ { header: 'NUMBER', priority: 10, minWidth: 6, align: 'right' },
59
+ { header: 'STATE', priority: 9, minWidth: 8 },
60
+ { header: 'BRANCH', priority: 1, minWidth: 6, truncate: true }
61
+ ];
62
+ if (isMobileTerminal()) {
63
+ // For very narrow terminals, show only most important columns
64
+ columns[0].priority = 2; // Lower pipeline priority
65
+ columns[3].priority = 0; // Hide branch on mobile
66
+ }
67
+ lines.push(renderResponsiveTable(headers, dataRows, { columns }));
68
+ }
69
+ else {
70
+ // Use standard table for wide terminals
71
+ const rows = [headers, ...dataRows];
72
+ lines.push(renderTable(rows, { preserveWidths: true }));
73
+ }
74
+ // Summary line (dimmed as auxiliary info)
75
+ lines.push('');
76
+ lines.push(SEMANTIC_COLORS.dim(`Found ${SEMANTIC_COLORS.count(builds.length.toString())} builds`));
77
+ // Add contextual hints if searching multiple orgs
67
78
  if (options?.organizationsCount && options.organizationsCount > 1 && !options.orgSpecified) {
68
- output += `Searched across ${options.organizationsCount} organizations. Use --org to filter to a specific organization.\n`;
79
+ const hints = [`Searched across ${options.organizationsCount} organizations. Use --org to filter to a specific organization.`];
80
+ lines.push('');
81
+ lines.push(formatTips(hints, TipStyle.INDIVIDUAL));
69
82
  }
70
- return output;
83
+ return lines.join('\n');
71
84
  }
72
85
  formatAccessError(options) {
73
- let output = '';
74
- if (options?.userName) {
75
- output = `No builds found for ${options.userName}`;
76
- if (options?.userEmail || options?.userId) {
77
- output += ` (${options.userEmail || options.userId})`;
78
- }
79
- output += '. ';
80
- }
86
+ let message = 'Access Denied';
81
87
  if (options?.orgSpecified && options?.accessErrors && options.accessErrors.length > 0) {
82
- output += options.accessErrors[0];
88
+ message = options.accessErrors[0];
83
89
  }
84
90
  else {
85
- output += 'You don\'t have access to the specified organization(s).';
91
+ message = 'You don\'t have access to the specified organization(s).';
86
92
  }
87
- return output;
93
+ return formatError(message, {
94
+ showHelp: true,
95
+ helpCommand: 'bktide orgs',
96
+ suggestions: [
97
+ 'Check your organization name is correct',
98
+ 'Run "bktide orgs" to see available organizations',
99
+ 'Verify your token has the correct permissions'
100
+ ]
101
+ });
88
102
  }
89
103
  formatNotFoundError(options) {
90
- let output = '';
104
+ let message = 'No builds found';
91
105
  if (options?.userName) {
92
- output = `No builds found for ${options.userName}`;
106
+ message = `No builds found for ${options.userName}`;
93
107
  if (options?.userEmail || options?.userId) {
94
- output += ` (${options.userEmail || options.userId})`;
108
+ message += ` (${options.userEmail || options.userId})`;
95
109
  }
96
- output += '.';
97
- }
98
- else {
99
- output = 'No builds found.';
100
110
  }
111
+ const suggestions = [];
101
112
  if (!options?.orgSpecified) {
102
- output += '\nTry specifying an organization with --org to narrow your search.';
113
+ suggestions.push('Try specifying an organization with --org <name>');
103
114
  }
104
- return output;
115
+ suggestions.push('Check your filters are correct');
116
+ suggestions.push('Try broadening your search');
117
+ return formatEmptyState(message, suggestions);
105
118
  }
106
119
  formatApiError(options) {
107
- return options?.errorMessage || 'An API error occurred while fetching builds.';
120
+ const message = options?.errorMessage || 'Failed to fetch builds from Buildkite';
121
+ return formatError(message, {
122
+ showHelp: true,
123
+ helpCommand: 'bktide builds --help',
124
+ suggestions: ['This might be a temporary issue. Try again in a moment.']
125
+ });
108
126
  }
109
127
  formatGenericError(options) {
110
- return options?.errorMessage || 'An error occurred while fetching builds.';
128
+ const message = options?.errorMessage || 'An unexpected error occurred';
129
+ return formatError(message, {
130
+ showHelp: true,
131
+ helpCommand: 'bktide builds --help'
132
+ });
111
133
  }
112
134
  }
113
135
  //# sourceMappingURL=PlainTextFormatter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlainTextFormatter.js","sourceRoot":"/","sources":["formatters/builds/PlainTextFormatter.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseFormatter, BuildFormatterOptions } from './Formatter.js';\nimport { Build } from '../../types/index.js';\n\nexport class PlainTextFormatter extends BaseFormatter {\n name = 'plain-text';\n \n formatBuilds(builds: Build[], options?: BuildFormatterOptions): string {\n // Handle error cases first\n if (options?.hasError) {\n if (options.errorType === 'access') {\n return this.formatAccessError(options);\n } else if (options.errorType === 'not_found') {\n return this.formatNotFoundError(options);\n } else if (options.errorType === 'api') {\n return this.formatApiError(options);\n } else {\n return this.formatGenericError(options);\n }\n }\n \n // Handle empty results (no error, just no data)\n if (builds.length === 0) {\n let output = 'No builds found.';\n \n // Add user info if provided\n if (options?.userName) {\n output = `No builds found for ${options.userName}`;\n if (options?.userEmail || options?.userId) {\n output += ` (${options.userEmail || options.userId})`;\n }\n output += '.';\n }\n \n // Add organization suggestion if applicable\n if (!options?.orgSpecified) {\n output += '\\nTry specifying an organization with --org to narrow your search.';\n }\n \n return output;\n }\n\n let output = `Found ${builds.length} builds:\\n`;\n output += '==============================================\\n';\n \n builds.forEach((build: Build) => {\n try {\n output += `${build.pipeline?.slug || 'Unknown pipeline'} #${build.number}\\n`;\n output += `State: ${build.state || 'Unknown'}\\n`;\n output += `Branch: ${build.branch || 'Unknown'}\\n`;\n output += `Message: ${build.message || 'No message'}\\n`;\n \n const createdDate = (build.created_at || build.createdAt) ? \n new Date(build.created_at || build.createdAt as string).toLocaleString() : 'Unknown';\n \n const startedDate = (build.started_at || build.startedAt) ? \n new Date(build.started_at || build.startedAt as string).toLocaleString() : 'Not started';\n \n const finishedDate = (build.finished_at || build.finishedAt) ? \n new Date(build.finished_at || build.finishedAt as string).toLocaleString() : 'Not finished';\n \n output += `Created: ${createdDate}\\n`;\n output += `Started: ${startedDate}\\n`;\n output += `Finished: ${finishedDate}\\n`;\n output += `URL: ${build.web_url || build.url || 'No URL'}\\n`;\n output += '------------------\\n';\n } catch (error) {\n output += `Error displaying build: ${error}\\n`;\n if (options?.debug) {\n output += `Build data: ${JSON.stringify(build, null, 2)}\\n`;\n }\n output += '------------------\\n';\n }\n });\n \n // Summary and guidance lines\n output += `\\nShowing ${builds.length} builds. Use --count and --page options to see more.\\n`;\n if (options?.organizationsCount && options.organizationsCount > 1 && !options.orgSpecified) {\n output += `Searched across ${options.organizationsCount} organizations. Use --org to filter to a specific organization.\\n`;\n }\n \n return output;\n }\n \n private formatAccessError(options?: BuildFormatterOptions): string {\n let output = '';\n \n if (options?.userName) {\n output = `No builds found for ${options.userName}`;\n if (options?.userEmail || options?.userId) {\n output += ` (${options.userEmail || options.userId})`;\n }\n output += '. ';\n }\n \n if (options?.orgSpecified && options?.accessErrors && options.accessErrors.length > 0) {\n output += options.accessErrors[0];\n } else {\n output += 'You don\\'t have access to the specified organization(s).';\n }\n \n return output;\n }\n \n private formatNotFoundError(options?: BuildFormatterOptions): string {\n let output = '';\n \n if (options?.userName) {\n output = `No builds found for ${options.userName}`;\n if (options?.userEmail || options?.userId) {\n output += ` (${options.userEmail || options.userId})`;\n }\n output += '.';\n } else {\n output = 'No builds found.';\n }\n \n if (!options?.orgSpecified) {\n output += '\\nTry specifying an organization with --org to narrow your search.';\n }\n \n return output;\n }\n \n private formatApiError(options?: BuildFormatterOptions): string {\n return options?.errorMessage || 'An API error occurred while fetching builds.';\n }\n \n private formatGenericError(options?: BuildFormatterOptions): string {\n return options?.errorMessage || 'An error occurred while fetching builds.';\n }\n} "]}
1
+ {"version":3,"file":"PlainTextFormatter.js","sourceRoot":"/","sources":["formatters/builds/PlainTextFormatter.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseFormatter, BuildFormatterOptions } from './Formatter.js';\nimport { Build } from '../../types/index.js';\nimport { renderTable } from '../../ui/table.js';\nimport { renderResponsiveTable, isNarrowTerminal, isMobileTerminal } from '../../ui/responsive-table.js';\nimport { \n SEMANTIC_COLORS, \n formatBuildStatus,\n formatEmptyState,\n formatError,\n formatTips,\n TipStyle\n} from '../../ui/theme.js';\n\nexport class PlainTextFormatter extends BaseFormatter {\n name = 'plain-text';\n \n formatBuilds(builds: Build[], options?: BuildFormatterOptions): string {\n // Handle error cases first\n if (options?.hasError) {\n if (options.errorType === 'access') {\n return this.formatAccessError(options);\n } else if (options.errorType === 'not_found') {\n return this.formatNotFoundError(options);\n } else if (options.errorType === 'api') {\n return this.formatApiError(options);\n } else {\n return this.formatGenericError(options);\n }\n }\n \n // Handle empty results (no error, just no data)\n if (builds.length === 0) {\n let message = 'No builds found';\n const suggestions: string[] = [];\n \n // Add user info if provided\n if (options?.userName) {\n message = `No builds found for ${SEMANTIC_COLORS.label(options.userName)}`;\n if (options?.userEmail || options?.userId) {\n message += ` ${SEMANTIC_COLORS.dim(`(${options.userEmail || options.userId})`)}`;\n }\n }\n \n // Add suggestions based on context\n if (!options?.orgSpecified) {\n suggestions.push('Try specifying an organization with --org <name>');\n }\n suggestions.push('Use --count to increase the number of results');\n \n return formatEmptyState(message, suggestions);\n }\n\n const lines: string[] = [];\n \n // Build a tabular summary view for scan-ability\n const headers = ['PIPELINE', 'NUMBER', 'STATE', 'BRANCH'].map(\n h => SEMANTIC_COLORS.heading(h)\n );\n \n const dataRows: string[][] = [];\n builds.forEach((b: Build) => {\n dataRows.push([\n b.pipeline?.slug || SEMANTIC_COLORS.muted('unknown'),\n SEMANTIC_COLORS.identifier(`#${b.number}`),\n formatBuildStatus(b.state || 'UNKNOWN', { useSymbol: false }),\n b.branch || SEMANTIC_COLORS.dim('(no branch)')\n ]);\n });\n \n // Use responsive table for narrow terminals\n if (isNarrowTerminal()) {\n // Configure columns with priorities for narrow displays\n const columns = [\n { header: 'PIPELINE', priority: 3, minWidth: 10, truncate: true },\n { header: 'NUMBER', priority: 10, minWidth: 6, align: 'right' as const },\n { header: 'STATE', priority: 9, minWidth: 8 },\n { header: 'BRANCH', priority: 1, minWidth: 6, truncate: true }\n ];\n \n if (isMobileTerminal()) {\n // For very narrow terminals, show only most important columns\n columns[0].priority = 2; // Lower pipeline priority\n columns[3].priority = 0; // Hide branch on mobile\n }\n \n lines.push(renderResponsiveTable(headers, dataRows, { columns }));\n } else {\n // Use standard table for wide terminals\n const rows: string[][] = [headers, ...dataRows];\n lines.push(renderTable(rows, { preserveWidths: true }));\n }\n \n // Summary line (dimmed as auxiliary info)\n lines.push('');\n lines.push(SEMANTIC_COLORS.dim(`Found ${SEMANTIC_COLORS.count(builds.length.toString())} builds`));\n \n // Add contextual hints if searching multiple orgs\n if (options?.organizationsCount && options.organizationsCount > 1 && !options.orgSpecified) {\n const hints = [`Searched across ${options.organizationsCount} organizations. Use --org to filter to a specific organization.`];\n lines.push('');\n lines.push(formatTips(hints, TipStyle.INDIVIDUAL));\n }\n \n return lines.join('\\n');\n }\n \n private formatAccessError(options?: BuildFormatterOptions): string {\n let message = 'Access Denied';\n \n if (options?.orgSpecified && options?.accessErrors && options.accessErrors.length > 0) {\n message = options.accessErrors[0];\n } else {\n message = 'You don\\'t have access to the specified organization(s).';\n }\n \n return formatError(message, {\n showHelp: true,\n helpCommand: 'bktide orgs',\n suggestions: [\n 'Check your organization name is correct',\n 'Run \"bktide orgs\" to see available organizations',\n 'Verify your token has the correct permissions'\n ]\n });\n }\n \n private formatNotFoundError(options?: BuildFormatterOptions): string {\n let message = 'No builds found';\n \n if (options?.userName) {\n message = `No builds found for ${options.userName}`;\n if (options?.userEmail || options?.userId) {\n message += ` (${options.userEmail || options.userId})`;\n }\n }\n \n const suggestions: string[] = [];\n if (!options?.orgSpecified) {\n suggestions.push('Try specifying an organization with --org <name>');\n }\n suggestions.push('Check your filters are correct');\n suggestions.push('Try broadening your search');\n \n return formatEmptyState(message, suggestions);\n }\n \n private formatApiError(options?: BuildFormatterOptions): string {\n const message = options?.errorMessage || 'Failed to fetch builds from Buildkite';\n return formatError(message, {\n showHelp: true,\n helpCommand: 'bktide builds --help',\n suggestions: ['This might be a temporary issue. Try again in a moment.']\n });\n }\n \n private formatGenericError(options?: BuildFormatterOptions): string {\n const message = options?.errorMessage || 'An unexpected error occurred';\n return formatError(message, {\n showHelp: true,\n helpCommand: 'bktide builds --help'\n });\n }\n} "]}
@@ -1,4 +1,5 @@
1
1
  import { BaseErrorFormatter } from './Formatter.js';
2
+ import { isRunningInAlfred } from '../../utils/alfred.js';
2
3
  /**
3
4
  * Alfred formatter for errors
4
5
  *
@@ -16,6 +17,25 @@ export class AlfredFormatter extends BaseErrorFormatter {
16
17
  */
17
18
  formatError(errors, options) {
18
19
  const errorArray = Array.isArray(errors) ? errors : [errors];
20
+ // Alfred first-run UX: if running in Alfred and token is missing, show setup item
21
+ const missingToken = errorArray.some(err => {
22
+ const msg = err instanceof Error ? err.message : String(err);
23
+ return /API token required|No token/i.test(msg);
24
+ });
25
+ if (isRunningInAlfred() && missingToken && !process.env.BUILDKITE_API_TOKEN && !process.env.BK_TOKEN) {
26
+ return JSON.stringify({
27
+ items: [
28
+ {
29
+ uid: 'set-token',
30
+ title: 'Set Buildkite token',
31
+ subtitle: 'Open Workflow Configuration to paste your token',
32
+ arg: 'alfred:open-config',
33
+ icon: { path: 'icons/info.png' },
34
+ valid: true
35
+ }
36
+ ]
37
+ });
38
+ }
19
39
  const items = [];
20
40
  for (const error of errorArray) {
21
41
  // Add main error item
@@ -1 +1 @@
1
- {"version":3,"file":"AlfredFormatter.js","sourceRoot":"/","sources":["formatters/errors/AlfredFormatter.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseErrorFormatter, ErrorFormatter, ErrorFormatterOptions } from './Formatter.js';\n\n/**\n * Alfred formatter for errors\n * \n * This formatter provides Alfred-compatible JSON output for error conditions\n * that can be processed by Alfred workflows\n */\nexport class AlfredFormatter extends BaseErrorFormatter implements ErrorFormatter {\n name = 'alfred';\n\n /**\n * Format one or more errors for display in Alfred JSON format\n * \n * @param errors The error(s) to format\n * @param options Formatting options\n * @returns Alfred JSON formatted error message\n */\n formatError(errors: unknown | unknown[], options?: ErrorFormatterOptions): string {\n const errorArray = Array.isArray(errors) ? errors : [errors];\n const items = [];\n\n for (const error of errorArray) {\n // Add main error item\n items.push({\n uid: 'error',\n title: `Error: ${this.getErrorMessage(error)}`,\n subtitle: this.getErrorSubtitle(error),\n arg: this.getErrorMessage(error),\n icon: {\n path: 'icons/error.png'\n },\n valid: true\n });\n\n // Add stack trace items if debug is enabled\n if (options?.debug) {\n const stack = this.getStackTrace(error);\n if (stack) {\n const stackItems = stack.split('\\n').map((line, index) => ({\n uid: `stack-${index}`,\n title: line.trim(),\n subtitle: 'Stack trace line',\n arg: line,\n icon: {\n path: 'icons/stack.png'\n },\n valid: true\n }));\n items.push(...stackItems);\n }\n\n // Add API errors if present\n const apiErrors = this.getApiErrors(error);\n if (apiErrors?.length) {\n apiErrors.forEach((apiError, index) => {\n items.push({\n uid: `api-error-${index}`,\n title: `API Error: ${apiError.message || 'Unknown error'}`,\n subtitle: apiError.path ? `Path: ${apiError.path.join('.')}` : 'API Error',\n arg: apiError.message || 'Unknown error',\n icon: {\n path: 'icons/api-error.png'\n },\n valid: true\n });\n });\n }\n\n // Add request details if available\n const request = this.getRequestDetails(error);\n if (request) {\n items.push({\n uid: 'request-details',\n title: 'Request Details',\n subtitle: `${request.method || 'Unknown'} ${request.url || 'Unknown URL'}`,\n arg: `${request.method || 'Unknown'} ${request.url || 'Unknown URL'}`,\n icon: {\n path: 'icons/request.png'\n },\n valid: false\n });\n }\n }\n }\n\n // Add system info if debug is enabled\n if (options?.debug) {\n items.push({\n uid: 'system-info',\n title: 'System Information',\n subtitle: `Node ${process.version} on ${process.platform} (${process.arch})`,\n arg: `Node ${process.version} on ${process.platform} (${process.arch})`,\n icon: {\n path: 'icons/info.png'\n },\n valid: false\n });\n }\n\n return JSON.stringify({ items });\n }\n\n /**\n * Get a subtitle for the error to display in Alfred\n * @param error The error object\n * @returns A subtitle string\n */\n private getErrorSubtitle(error: unknown): string {\n const errorName = this.getErrorName(error);\n const apiErrors = this.getApiErrors(error);\n \n if (apiErrors?.length) {\n const firstError = apiErrors[0];\n return `API Error: ${firstError.message || 'Unknown error'}`;\n }\n \n return `${errorName} - Press Enter to copy error message`;\n }\n} "]}
1
+ {"version":3,"file":"AlfredFormatter.js","sourceRoot":"/","sources":["formatters/errors/AlfredFormatter.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseErrorFormatter, ErrorFormatter, ErrorFormatterOptions } from './Formatter.js';\nimport { isRunningInAlfred } from '../../utils/alfred.js';\n\n/**\n * Alfred formatter for errors\n * \n * This formatter provides Alfred-compatible JSON output for error conditions\n * that can be processed by Alfred workflows\n */\nexport class AlfredFormatter extends BaseErrorFormatter implements ErrorFormatter {\n name = 'alfred';\n\n /**\n * Format one or more errors for display in Alfred JSON format\n * \n * @param errors The error(s) to format\n * @param options Formatting options\n * @returns Alfred JSON formatted error message\n */\n formatError(errors: unknown | unknown[], options?: ErrorFormatterOptions): string {\n const errorArray = Array.isArray(errors) ? errors : [errors];\n\n // Alfred first-run UX: if running in Alfred and token is missing, show setup item\n const missingToken = errorArray.some(err => {\n const msg = err instanceof Error ? err.message : String(err);\n return /API token required|No token/i.test(msg);\n });\n if (isRunningInAlfred() && missingToken && !process.env.BUILDKITE_API_TOKEN && !process.env.BK_TOKEN) {\n return JSON.stringify({\n items: [\n {\n uid: 'set-token',\n title: 'Set Buildkite token',\n subtitle: 'Open Workflow Configuration to paste your token',\n arg: 'alfred:open-config',\n icon: { path: 'icons/info.png' },\n valid: true\n }\n ]\n });\n }\n const items = [];\n\n for (const error of errorArray) {\n // Add main error item\n items.push({\n uid: 'error',\n title: `Error: ${this.getErrorMessage(error)}`,\n subtitle: this.getErrorSubtitle(error),\n arg: this.getErrorMessage(error),\n icon: {\n path: 'icons/error.png'\n },\n valid: true\n });\n\n // Add stack trace items if debug is enabled\n if (options?.debug) {\n const stack = this.getStackTrace(error);\n if (stack) {\n const stackItems = stack.split('\\n').map((line, index) => ({\n uid: `stack-${index}`,\n title: line.trim(),\n subtitle: 'Stack trace line',\n arg: line,\n icon: {\n path: 'icons/stack.png'\n },\n valid: true\n }));\n items.push(...stackItems);\n }\n\n // Add API errors if present\n const apiErrors = this.getApiErrors(error);\n if (apiErrors?.length) {\n apiErrors.forEach((apiError, index) => {\n items.push({\n uid: `api-error-${index}`,\n title: `API Error: ${apiError.message || 'Unknown error'}`,\n subtitle: apiError.path ? `Path: ${apiError.path.join('.')}` : 'API Error',\n arg: apiError.message || 'Unknown error',\n icon: {\n path: 'icons/api-error.png'\n },\n valid: true\n });\n });\n }\n\n // Add request details if available\n const request = this.getRequestDetails(error);\n if (request) {\n items.push({\n uid: 'request-details',\n title: 'Request Details',\n subtitle: `${request.method || 'Unknown'} ${request.url || 'Unknown URL'}`,\n arg: `${request.method || 'Unknown'} ${request.url || 'Unknown URL'}`,\n icon: {\n path: 'icons/request.png'\n },\n valid: false\n });\n }\n }\n }\n\n // Add system info if debug is enabled\n if (options?.debug) {\n items.push({\n uid: 'system-info',\n title: 'System Information',\n subtitle: `Node ${process.version} on ${process.platform} (${process.arch})`,\n arg: `Node ${process.version} on ${process.platform} (${process.arch})`,\n icon: {\n path: 'icons/info.png'\n },\n valid: false\n });\n }\n\n return JSON.stringify({ items });\n }\n\n /**\n * Get a subtitle for the error to display in Alfred\n * @param error The error object\n * @returns A subtitle string\n */\n private getErrorSubtitle(error: unknown): string {\n const errorName = this.getErrorName(error);\n const apiErrors = this.getApiErrors(error);\n \n if (apiErrors?.length) {\n const firstError = apiErrors[0];\n return `API Error: ${firstError.message || 'Unknown error'}`;\n }\n \n return `${errorName} - Press Enter to copy error message`;\n }\n} "]}