bktide 1.0.1755639164 → 1.0.1765203819

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 CHANGED
@@ -37,25 +37,35 @@ echo 'source <(bktide completions zsh)' >> ~/.zshrc
37
37
  ```
38
38
 
39
39
  Completions provide:
40
- - Command suggestions (`bktide <Tab>`)
41
- - Option completions (`bktide builds --<Tab>`)
42
- - Value completions (`bktide --format <Tab>`)
40
+ - Command suggestions (ie `bktide <Tab>`)
41
+ - Option completions (ie `bktide builds --<Tab>`)
42
+ - Value completions (ie `bktide --format <Tab>`)
43
43
  - Dynamic completions for organizations and pipelines (Fish with jq installed)
44
44
 
45
45
  See [Shell Completions Guide](docs/shell-completions.md) for detailed installation and troubleshooting.
46
46
 
47
47
  ## Documentation
48
48
 
49
- - [Shell Completions](docs/shell-completions.md) - Complete guide for shell auto-completion setup
50
- - [Development Guide](docs/development.md) - Information about running and developing the CLI
51
- - [Authentication](docs/authentication.md) - How to authenticate with Buildkite
52
- - [Caching](docs/caching.md) - Information about the CLI's caching system
53
- - [Testing Guide](docs/testing-guide.md) - Running tests and testing strategy
54
- - [API Reference](docs/api-reference.md) - Complete command reference
55
- - [Troubleshooting](docs/troubleshooting.md) - Common issues and solutions
56
- - [Alfred Integration (Overview)](docs/alfred.md) - What the Alfred integration does and quick usage
57
- - [Alfred Installation](docs/alfred-installation.md) - End-user install, configuration, and troubleshooting
58
- - [Alfred Development](docs/alfred-development.md) - Packaging, wrapper behavior, metadata, and workflow wiring
49
+ Our documentation is organized by audience to help you find what you need:
50
+
51
+ ### 📖 [User Documentation](docs/user/) - For end users
52
+ - [Getting Started](docs/user/getting-started.md) - Quick start guide for new users
53
+ - [Authentication](docs/user/authentication.md) - How to authenticate with Buildkite
54
+ - [Shell Completions](docs/user/shell-completions.md) - Setting up auto-completion
55
+ - [Troubleshooting](docs/user/troubleshooting.md) - Common issues and solutions
56
+ - [Alfred Integration](docs/user/alfred/) - macOS Alfred workflow (installation, troubleshooting)
57
+
58
+ ### 👨‍💻 [Developer Documentation](docs/developer/) - For contributors
59
+ - [Contributing Guide](docs/developer/contributing.md) - How to contribute to the project
60
+ - [Development Guide](docs/developer/development.md) - Setup and coding guidelines
61
+ - [Alfred Workflow Development](docs/developer/alfred-workflow-development.md) - Building and packaging
62
+ - [Testing Strategy](docs/developer/testing/README.md) - Testing approach and procedures
63
+
64
+ ### 📚 [Reference Documentation](docs/reference/) - For everyone
65
+ - [Changelogs](docs/reference/) - What changed and when
66
+ - [Release Process](docs/reference/releasing.md) - How releases work
67
+
68
+ See [Documentation Overview](docs/README.md) for the complete structure and classification guide.
59
69
 
60
70
  ## Testing
61
71
 
@@ -67,7 +77,7 @@ npm run test:coverage # Generate coverage report
67
77
  npm run test:extract-patterns # Extract patterns from real data (requires token)
68
78
  ```
69
79
 
70
- See [Testing Guide](docs/testing/README.md) for details on the hybrid testing strategy.
80
+ See [Testing Strategy](docs/developer/testing/README.md) for details on the hybrid testing approach.
71
81
 
72
82
  ## Usage
73
83
 
@@ -139,7 +149,7 @@ bktide annotations <build>
139
149
 
140
150
  The build reference can be specified in two formats:
141
151
  - **Slug format**: `org/pipeline/number` (e.g., `gusto/zenpayroll/1287418`)
142
- - **URL format**: `@https://buildkite.com/org/pipeline/builds/number` or `https://buildkite.com/org/pipeline/builds/number`
152
+ - **URL format**: `https://buildkite.com/org/pipeline/builds/number`
143
153
 
144
154
  Additional options:
145
155
  ```bash
@@ -165,7 +175,7 @@ View detailed information about a specific build including jobs and annotations.
165
175
  bktide build org/pipeline/123
166
176
 
167
177
  # View build by URL format
168
- bktide build @https://buildkite.com/org/pipeline/builds/123
178
+ bktide build https://buildkite.com/org/pipeline/builds/123
169
179
  ```
170
180
 
171
181
  Additional options:
@@ -315,12 +325,12 @@ Available log levels (from most to least verbose):
315
325
 
316
326
  ## Log Files
317
327
 
318
- All logs are written to `log/cli.log` in JSON format, which can be processed with tools like jq:
328
+ All logs are written to `~/.local/state/bktide/logs/cli.log` in JSON format, which can be processed with tools like jq:
319
329
 
320
330
  ```bash
321
331
  # View recent errors
322
- cat log/cli.log | grep -v '"level":30' | jq
332
+ cat ~/.local/state/bktide/logs/cli.log | grep -v '"level":30' | jq
323
333
 
324
334
  # Analyze performance
325
- cat log/cli.log | jq 'select(.duration != null) | {msg, duration}'
335
+ cat ~/.local/state/bktide/logs/cli.log | jq 'select(.duration != null) | {msg, duration}'
326
336
  ```
@@ -1,6 +1,8 @@
1
1
  import { BaseFormatter } from './Formatter.js';
2
2
  import { formatAnnotationBody } from '../../utils/textFormatter.js';
3
3
  import { SEMANTIC_COLORS, formatEmptyState, formatError } from '../../ui/theme.js';
4
+ import { useAscii } from '../../ui/symbols.js';
5
+ import { termWidth } from '../../ui/width.js';
4
6
  export class PlainTextFormatter extends BaseFormatter {
5
7
  name = 'PlainText';
6
8
  formatAnnotations(annotations, options) {
@@ -20,40 +22,97 @@ export class PlainTextFormatter extends BaseFormatter {
20
22
  ]);
21
23
  }
22
24
  const lines = [];
23
- // Style symbols for different annotation types
25
+ const isAscii = useAscii();
26
+ const terminalWidth = termWidth();
27
+ // Box drawing characters
28
+ const boxChars = isAscii ? {
29
+ horizontal: '-',
30
+ vertical: '|',
31
+ topLeft: '+',
32
+ topRight: '+',
33
+ bottomLeft: '+',
34
+ bottomRight: '+',
35
+ cross: '+',
36
+ verticalRight: '+',
37
+ verticalLeft: '+',
38
+ horizontalDown: '+',
39
+ horizontalUp: '+'
40
+ } : {
41
+ horizontal: '─',
42
+ vertical: '│',
43
+ topLeft: '┌',
44
+ topRight: '┐',
45
+ bottomLeft: '└',
46
+ bottomRight: '┘',
47
+ cross: '┼',
48
+ verticalRight: '├',
49
+ verticalLeft: '┤',
50
+ horizontalDown: '┬',
51
+ horizontalUp: '┴'
52
+ };
53
+ // Style symbols for different annotation types (handle both cases)
24
54
  const styleSymbols = {
25
- error: '✖',
26
- warning: '',
27
- info: '',
28
- success: ''
55
+ error: isAscii ? '[X]' : '✖',
56
+ ERROR: isAscii ? '[X]' : '✖',
57
+ warning: isAscii ? '[!]' : '⚠',
58
+ WARNING: isAscii ? '[!]' : '⚠',
59
+ info: isAscii ? '[i]' : 'ℹ',
60
+ INFO: isAscii ? '[i]' : 'ℹ',
61
+ success: isAscii ? '[✓]' : '✓',
62
+ SUCCESS: isAscii ? '[✓]' : '✓'
29
63
  };
30
- // Style colors for different annotation types
64
+ // Style colors for different annotation types (handle both cases)
31
65
  const styleColors = {
32
66
  error: SEMANTIC_COLORS.error,
67
+ ERROR: SEMANTIC_COLORS.error,
33
68
  warning: SEMANTIC_COLORS.warning,
69
+ WARNING: SEMANTIC_COLORS.warning,
34
70
  info: SEMANTIC_COLORS.info,
35
- success: SEMANTIC_COLORS.success
71
+ INFO: SEMANTIC_COLORS.info,
72
+ success: SEMANTIC_COLORS.success,
73
+ SUCCESS: SEMANTIC_COLORS.success
74
+ };
75
+ // Create a horizontal divider with padding and centering
76
+ const createDivider = (width = 80) => {
77
+ const padding = 2; // 1 space on each side
78
+ const maxWidth = Math.min(width, terminalWidth - padding);
79
+ const dividerLength = Math.max(20, maxWidth - padding); // Minimum 20 chars
80
+ const divider = boxChars.horizontal.repeat(dividerLength);
81
+ // Center the divider within the terminal width
82
+ const totalPadding = terminalWidth - dividerLength;
83
+ const leftPadding = Math.floor(totalPadding / 2);
84
+ const spaces = ' '.repeat(Math.max(0, leftPadding));
85
+ return SEMANTIC_COLORS.dim(spaces + divider);
36
86
  };
37
87
  annotations.forEach((annotation, index) => {
88
+ const symbol = styleSymbols[annotation.style] || (isAscii ? '*' : '•');
89
+ const colorFn = styleColors[annotation.style] || ((s) => s);
90
+ // Add divider between annotations (but not before the first one)
38
91
  if (index > 0) {
39
- lines.push(''); // Add blank line between annotations
92
+ lines.push('');
93
+ lines.push(createDivider());
94
+ lines.push('');
40
95
  }
41
- const symbol = styleSymbols[annotation.style] || '•';
42
- const colorFn = styleColors[annotation.style] || ((s) => s);
43
- // Style with symbol and color
44
- lines.push(colorFn(`${symbol} ${annotation.context} (${annotation.style})`));
45
- lines.push('');
96
+ // Single line header with pipe: "│ ℹ info: test-mapping-build"
97
+ const pipe = colorFn(boxChars.vertical);
98
+ const header = `${pipe} ${symbol} ${annotation.style.toLowerCase()}: ${annotation.context}`;
99
+ lines.push(header);
100
+ // Add blank line with pipe for visual continuity
101
+ lines.push(pipe);
46
102
  // Format the body HTML with proper HTML/markdown handling
47
103
  const formattedBody = formatAnnotationBody(annotation.body.html);
48
- // Indent the formatted body properly
49
- const indentedBody = formattedBody
50
- .split('\n')
51
- .map(line => ` ${line}`)
52
- .join('\n');
53
- lines.push(indentedBody);
104
+ // Add vertical pipes to the left of the body content for visual continuity
105
+ // Use the same color as the header for the pipes
106
+ const bodyLines = formattedBody.split('\n');
107
+ bodyLines.forEach((line) => {
108
+ const paddedLine = line ? ` ${line}` : '';
109
+ lines.push(`${pipe}${paddedLine}`);
110
+ });
54
111
  });
55
- // Add summary if multiple annotations
112
+ // Add summary footer
56
113
  if (annotations.length > 1) {
114
+ lines.push('');
115
+ lines.push(createDivider());
57
116
  lines.push('');
58
117
  lines.push(SEMANTIC_COLORS.dim(`${SEMANTIC_COLORS.count(annotations.length.toString())} annotations found`));
59
118
  }
@@ -1 +1 @@
1
- {"version":3,"file":"PlainTextFormatter.js","sourceRoot":"/","sources":["formatters/annotations/PlainTextFormatter.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseFormatter, AnnotationFormatterOptions } from './Formatter.js';\nimport { Annotation } from '../../types/index.js';\nimport { formatAnnotationBody } from '../../utils/textFormatter.js';\nimport { SEMANTIC_COLORS, formatEmptyState, formatError } from '../../ui/theme.js';\n\nexport class PlainTextFormatter extends BaseFormatter {\n name = 'PlainText';\n\n formatAnnotations(annotations: Annotation[], options?: AnnotationFormatterOptions): string {\n if (options?.hasError) {\n return formatError(options.errorMessage || 'Failed to fetch annotations', {\n showHelp: true,\n helpCommand: 'bktide annotations --help'\n });\n }\n\n if (!annotations || annotations.length === 0) {\n const message = options?.contextFilter\n ? `No annotations found for this build with context '${options.contextFilter}'`\n : 'No annotations found for this build';\n \n return formatEmptyState(message, [\n 'Annotations are created by build steps',\n 'Check the build has completed and has annotation steps'\n ]);\n }\n\n const lines: string[] = [];\n \n // Style symbols for different annotation types\n const styleSymbols: Record<string, string> = {\n error: '✖',\n warning: '⚠',\n info: 'ℹ',\n success: '✓'\n };\n \n // Style colors for different annotation types\n const styleColors: 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 \n annotations.forEach((annotation, index) => {\n if (index > 0) {\n lines.push(''); // Add blank line between annotations\n }\n \n const symbol = styleSymbols[annotation.style] || '•';\n const colorFn = styleColors[annotation.style] || ((s: string) => s);\n \n // Style with symbol and color\n lines.push(colorFn(`${symbol} ${annotation.context} (${annotation.style})`));\n lines.push('');\n \n // Format the body HTML with proper HTML/markdown handling\n const formattedBody = formatAnnotationBody(annotation.body.html);\n \n // Indent the formatted body properly\n const indentedBody = formattedBody\n .split('\\n')\n .map(line => ` ${line}`)\n .join('\\n');\n \n lines.push(indentedBody);\n });\n \n // Add summary if multiple annotations\n if (annotations.length > 1) {\n lines.push('');\n lines.push(SEMANTIC_COLORS.dim(`${SEMANTIC_COLORS.count(annotations.length.toString())} annotations found`));\n }\n\n return lines.join('\\n');\n }\n}\n"]}
1
+ {"version":3,"file":"PlainTextFormatter.js","sourceRoot":"/","sources":["formatters/annotations/PlainTextFormatter.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseFormatter, AnnotationFormatterOptions } from './Formatter.js';\nimport { Annotation } from '../../types/index.js';\nimport { formatAnnotationBody } from '../../utils/textFormatter.js';\nimport { SEMANTIC_COLORS, formatEmptyState, formatError } from '../../ui/theme.js';\nimport { useAscii } from '../../ui/symbols.js';\nimport { termWidth } from '../../ui/width.js';\n\nexport class PlainTextFormatter extends BaseFormatter {\n name = 'PlainText';\n\n formatAnnotations(annotations: Annotation[], options?: AnnotationFormatterOptions): string {\n if (options?.hasError) {\n return formatError(options.errorMessage || 'Failed to fetch annotations', {\n showHelp: true,\n helpCommand: 'bktide annotations --help'\n });\n }\n\n if (!annotations || annotations.length === 0) {\n const message = options?.contextFilter\n ? `No annotations found for this build with context '${options.contextFilter}'`\n : 'No annotations found for this build';\n \n return formatEmptyState(message, [\n 'Annotations are created by build steps',\n 'Check the build has completed and has annotation steps'\n ]);\n }\n\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 topLeft: '+',\n topRight: '+',\n bottomLeft: '+',\n bottomRight: '+',\n cross: '+',\n verticalRight: '+',\n verticalLeft: '+',\n horizontalDown: '+',\n horizontalUp: '+'\n } : {\n horizontal: '─',\n vertical: '│',\n topLeft: '┌',\n topRight: '┐',\n bottomLeft: '└',\n bottomRight: '┘',\n cross: '┼',\n verticalRight: '├',\n verticalLeft: '┤',\n horizontalDown: '┬',\n horizontalUp: '┴'\n };\n \n // Style symbols for different annotation types (handle both cases)\n const styleSymbols: Record<string, string> = {\n error: isAscii ? '[X]' : '✖',\n ERROR: isAscii ? '[X]' : '✖',\n warning: isAscii ? '[!]' : '⚠',\n WARNING: isAscii ? '[!]' : '⚠',\n info: isAscii ? '[i]' : 'ℹ',\n INFO: isAscii ? '[i]' : 'ℹ',\n success: isAscii ? '[]' : '✓',\n SUCCESS: isAscii ? '[✓]' : '✓'\n };\n \n // Style colors for different annotation types (handle both cases)\n const styleColors: Record<string, (s: string) => string> = {\n error: SEMANTIC_COLORS.error,\n ERROR: SEMANTIC_COLORS.error,\n warning: SEMANTIC_COLORS.warning,\n WARNING: SEMANTIC_COLORS.warning,\n info: SEMANTIC_COLORS.info,\n INFO: SEMANTIC_COLORS.info,\n success: SEMANTIC_COLORS.success,\n SUCCESS: SEMANTIC_COLORS.success\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 annotations.forEach((annotation, index) => {\n const symbol = styleSymbols[annotation.style] || (isAscii ? '*' : '•');\n const colorFn = styleColors[annotation.style] || ((s: string) => s);\n \n // Add divider between annotations (but not before the first one)\n if (index > 0) {\n lines.push('');\n lines.push(createDivider());\n lines.push('');\n }\n \n // Single line header with pipe: \"│ ℹ info: test-mapping-build\"\n const pipe = colorFn(boxChars.vertical);\n const header = `${pipe} ${symbol} ${annotation.style.toLowerCase()}: ${annotation.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 formattedBody = formatAnnotationBody(annotation.body.html);\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 = formattedBody.split('\\n');\n bodyLines.forEach((line) => {\n const paddedLine = line ? ` ${line}` : '';\n lines.push(`${pipe}${paddedLine}`);\n });\n });\n \n // Add summary footer\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');\n }\n}\n"]}
@@ -2,6 +2,8 @@ import { BaseBuildDetailFormatter } from './Formatter.js';
2
2
  import { formatDistanceToNow } from 'date-fns';
3
3
  import { htmlToText } from 'html-to-text';
4
4
  import { formatEmptyState, formatError, SEMANTIC_COLORS, formatBuildStatus, formatTips, TipStyle, getStateIcon, getAnnotationIcon, getProgressIcon, BUILD_STATUS_THEME } from '../../ui/theme.js';
5
+ import { useAscii } from '../../ui/symbols.js';
6
+ import { termWidth } from '../../ui/width.js';
5
7
  // Standard emoji mappings only
6
8
  // Only map universally recognized emoji codes, not Buildkite-specific ones
7
9
  const STANDARD_EMOJI = {
@@ -499,28 +501,84 @@ export class PlainTextFormatter extends BaseBuildDetailFormatter {
499
501
  }
500
502
  formatAnnotationDetails(annotations) {
501
503
  const lines = [];
504
+ const isAscii = useAscii();
505
+ const terminalWidth = termWidth();
506
+ // Box drawing characters
507
+ const boxChars = isAscii ? {
508
+ horizontal: '-',
509
+ vertical: '|'
510
+ } : {
511
+ horizontal: '─',
512
+ vertical: '│'
513
+ };
514
+ // Create a horizontal divider with padding and centering
515
+ const createDivider = (width = 80) => {
516
+ const padding = 2; // 1 space on each side
517
+ const maxWidth = Math.min(width, terminalWidth - padding);
518
+ const dividerLength = Math.max(20, maxWidth - padding); // Minimum 20 chars
519
+ const divider = boxChars.horizontal.repeat(dividerLength);
520
+ // Center the divider within the terminal width
521
+ const totalPadding = terminalWidth - dividerLength;
522
+ const leftPadding = Math.floor(totalPadding / 2);
523
+ const spaces = ' '.repeat(Math.max(0, leftPadding));
524
+ return SEMANTIC_COLORS.dim(spaces + divider);
525
+ };
502
526
  // Group annotations by style
503
527
  const grouped = this.groupAnnotationsByStyle(annotations);
504
528
  const styleOrder = ['ERROR', 'WARNING', 'INFO', 'SUCCESS'];
529
+ let annotationIndex = 0;
505
530
  for (const style of styleOrder) {
506
531
  if (grouped[style]) {
507
532
  for (const annotation of grouped[style]) {
533
+ // Add divider between annotations (but not before the first one)
534
+ if (annotationIndex > 0) {
535
+ lines.push('');
536
+ lines.push(createDivider());
537
+ lines.push('');
538
+ }
508
539
  const icon = this.getAnnotationIcon(style);
509
540
  const context = annotation.node.context || 'default';
510
- const styleColored = this.colorizeAnnotationStyle(style);
511
- // When showing annotation details, always show the body text
512
- lines.push(`${icon} ${styleColored}: ${context}`);
541
+ const colorFn = this.getStyleColorFunction(style);
542
+ // Single line header with pipe: "│ info: test-mapping-build"
543
+ const pipe = colorFn(boxChars.vertical);
544
+ const header = `${pipe} ${icon} ${style.toLowerCase()}: ${context}`;
545
+ lines.push(header);
546
+ // Add blank line with pipe for visual continuity
547
+ lines.push(pipe);
548
+ // Format the body HTML with proper HTML/markdown handling
513
549
  const body = htmlToText(annotation.node.body?.html || '', {
514
550
  wordwrap: 80,
515
551
  preserveNewlines: true
516
552
  });
517
- lines.push(body.split('\n').map(l => ` ${l}`).join('\n'));
518
- lines.push('');
553
+ // Add vertical pipes to the left of the body content for visual continuity
554
+ // Use the same color as the header for the pipes
555
+ const bodyLines = body.split('\n');
556
+ bodyLines.forEach((line) => {
557
+ const paddedLine = line ? ` ${line}` : '';
558
+ lines.push(`${pipe}${paddedLine}`);
559
+ });
560
+ annotationIndex++;
519
561
  }
520
562
  }
521
563
  }
564
+ // Add summary footer for multiple annotations
565
+ if (annotations.length > 1) {
566
+ lines.push('');
567
+ lines.push(createDivider());
568
+ lines.push('');
569
+ lines.push(SEMANTIC_COLORS.dim(`${SEMANTIC_COLORS.count(annotations.length.toString())} annotations found`));
570
+ }
522
571
  return lines.join('\n').trim();
523
572
  }
573
+ getStyleColorFunction(style) {
574
+ const styleColorMap = {
575
+ 'ERROR': SEMANTIC_COLORS.error,
576
+ 'WARNING': SEMANTIC_COLORS.warning,
577
+ 'INFO': SEMANTIC_COLORS.info,
578
+ 'SUCCESS': SEMANTIC_COLORS.success
579
+ };
580
+ return styleColorMap[style] || ((s) => s);
581
+ }
524
582
  formatJobDetails(jobs, options) {
525
583
  if (!jobs || jobs.length === 0) {
526
584
  return 'No steps found';
@@ -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 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 \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 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"]}
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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bktide",
3
- "version": "1.0.1755639164",
3
+ "version": "1.0.1765203819",
4
4
  "description": "Command-line interface for Buildkite CI/CD workflows with rich shell completions (Fish, Bash, Zsh) and Alfred workflow integration for macOS power users",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",