bktide 1.0.1755266193 → 1.0.1755547716

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/README.md +107 -1
  2. package/WORKFLOW_README.md +1 -1
  3. package/completions/bktide-dynamic.fish +171 -0
  4. package/completions/bktide.bash +124 -0
  5. package/completions/bktide.fish +107 -0
  6. package/completions/bktide.zsh +139 -0
  7. package/dist/commands/BaseCommand.js +7 -7
  8. package/dist/commands/BaseCommand.js.map +1 -1
  9. package/dist/commands/GenerateCompletions.js +238 -0
  10. package/dist/commands/GenerateCompletions.js.map +1 -0
  11. package/dist/commands/ListAnnotations.js +7 -0
  12. package/dist/commands/ListAnnotations.js.map +1 -1
  13. package/dist/commands/ListBuilds.js +67 -3
  14. package/dist/commands/ListBuilds.js.map +1 -1
  15. package/dist/commands/ListOrganizations.js +6 -0
  16. package/dist/commands/ListOrganizations.js.map +1 -1
  17. package/dist/commands/ListPipelines.js +87 -12
  18. package/dist/commands/ListPipelines.js.map +1 -1
  19. package/dist/commands/ManageToken.js +32 -9
  20. package/dist/commands/ManageToken.js.map +1 -1
  21. package/dist/commands/ShowViewer.js +7 -1
  22. package/dist/commands/ShowViewer.js.map +1 -1
  23. package/dist/commands/index.js +1 -0
  24. package/dist/commands/index.js.map +1 -1
  25. package/dist/formatters/annotations/PlainTextFormatter.js +37 -9
  26. package/dist/formatters/annotations/PlainTextFormatter.js.map +1 -1
  27. package/dist/formatters/builds/PlainTextFormatter.js +82 -60
  28. package/dist/formatters/builds/PlainTextFormatter.js.map +1 -1
  29. package/dist/formatters/errors/AlfredFormatter.js +20 -0
  30. package/dist/formatters/errors/AlfredFormatter.js.map +1 -1
  31. package/dist/formatters/errors/PlainTextFormatter.js +121 -23
  32. package/dist/formatters/errors/PlainTextFormatter.js.map +1 -1
  33. package/dist/formatters/organizations/PlainTextFormatter.js +37 -6
  34. package/dist/formatters/organizations/PlainTextFormatter.js.map +1 -1
  35. package/dist/formatters/pipelines/AlfredFormatter.js.map +1 -1
  36. package/dist/formatters/pipelines/Formatter.js.map +1 -1
  37. package/dist/formatters/pipelines/JsonFormatter.js.map +1 -1
  38. package/dist/formatters/pipelines/PlainTextFormatter.js +165 -19
  39. package/dist/formatters/pipelines/PlainTextFormatter.js.map +1 -1
  40. package/dist/formatters/token/AlfredFormatter.js +15 -2
  41. package/dist/formatters/token/AlfredFormatter.js.map +1 -1
  42. package/dist/formatters/token/PlainTextFormatter.js +56 -18
  43. package/dist/formatters/token/PlainTextFormatter.js.map +1 -1
  44. package/dist/formatters/viewer/PlainTextFormatter.js +8 -7
  45. package/dist/formatters/viewer/PlainTextFormatter.js.map +1 -1
  46. package/dist/index.js +47 -6
  47. package/dist/index.js.map +1 -1
  48. package/dist/services/CredentialManager.js +80 -10
  49. package/dist/services/CredentialManager.js.map +1 -1
  50. package/dist/ui/help.js +69 -0
  51. package/dist/ui/help.js.map +1 -0
  52. package/dist/ui/progress.js +356 -0
  53. package/dist/ui/progress.js.map +1 -0
  54. package/dist/ui/reporter.js +111 -0
  55. package/dist/ui/reporter.js.map +1 -0
  56. package/dist/ui/responsive-table.js +183 -0
  57. package/dist/ui/responsive-table.js.map +1 -0
  58. package/dist/ui/spinner.js +20 -0
  59. package/dist/ui/spinner.js.map +1 -0
  60. package/dist/ui/symbols.js +46 -0
  61. package/dist/ui/symbols.js.map +1 -0
  62. package/dist/ui/table.js +32 -0
  63. package/dist/ui/table.js.map +1 -0
  64. package/dist/ui/theme.js +280 -0
  65. package/dist/ui/theme.js.map +1 -0
  66. package/dist/ui/width.js +111 -0
  67. package/dist/ui/width.js.map +1 -0
  68. package/dist/utils/alfred.js +6 -0
  69. package/dist/utils/alfred.js.map +1 -0
  70. package/dist/utils/cli-error-handler.js +35 -20
  71. package/dist/utils/cli-error-handler.js.map +1 -1
  72. package/dist/utils/pagination.js +92 -0
  73. package/dist/utils/pagination.js.map +1 -0
  74. package/info.plist +51 -218
  75. package/package.json +23 -5
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Utilities for handling pagination in API responses
3
+ */
4
+ import { Progress } from '../ui/progress.js';
5
+ /**
6
+ * Parse a Link header string into structured data
7
+ * @param header The Link header value from the response
8
+ * @returns Parsed link information including page numbers
9
+ */
10
+ export function parseLinkHeader(header) {
11
+ const links = {};
12
+ if (!header)
13
+ return links;
14
+ // Match: <url>; rel="relation"
15
+ const regex = /<([^>]+)>;\s*rel="([^"]+)"/g;
16
+ let match;
17
+ while ((match = regex.exec(header)) !== null) {
18
+ const url = match[1];
19
+ const rel = match[2];
20
+ // Store the URL for each relation
21
+ if (rel === 'next')
22
+ links.next = url;
23
+ if (rel === 'prev')
24
+ links.prev = url;
25
+ if (rel === 'first')
26
+ links.first = url;
27
+ if (rel === 'last')
28
+ links.last = url;
29
+ // Extract page number from last page
30
+ if (rel === 'last') {
31
+ const pageMatch = url.match(/[?&]page=(\d+)/);
32
+ if (pageMatch) {
33
+ links.lastPage = parseInt(pageMatch[1], 10);
34
+ links.totalPages = links.lastPage;
35
+ }
36
+ }
37
+ }
38
+ return links;
39
+ }
40
+ /**
41
+ * Helper to run operations on a list of items with progress tracking
42
+ * @param items Array of items to process
43
+ * @param operation Async operation to run for each item
44
+ * @param options Configuration for progress display
45
+ */
46
+ export async function withCountedProgress(items, operation, options = {}) {
47
+ if (!items || items.length === 0) {
48
+ return;
49
+ }
50
+ const progress = Progress.bar({
51
+ total: items.length,
52
+ label: options.label || 'Processing',
53
+ format: options.format
54
+ });
55
+ try {
56
+ for (let i = 0; i < items.length; i++) {
57
+ const label = options.itemLabel ?
58
+ options.itemLabel(items[i], i) :
59
+ `Processing item ${i + 1}/${items.length}`;
60
+ progress.update(i, label);
61
+ await operation(items[i], i);
62
+ }
63
+ // Update to 100%
64
+ progress.update(items.length, 'Complete');
65
+ // Show completion message
66
+ const completeMessage = options.onComplete ?
67
+ options.onComplete(items.length) :
68
+ `Processed ${items.length} items`;
69
+ progress.complete(completeMessage);
70
+ }
71
+ catch (error) {
72
+ progress.stop();
73
+ throw error;
74
+ }
75
+ }
76
+ /**
77
+ * Extract current page number from URL
78
+ */
79
+ export function getCurrentPage(url) {
80
+ const match = url.match(/[?&]page=(\d+)/);
81
+ return match ? parseInt(match[1], 10) : 1;
82
+ }
83
+ /**
84
+ * Check if we can show determinate progress based on headers
85
+ */
86
+ export function canShowDeterminateProgress(linkHeader) {
87
+ if (!linkHeader)
88
+ return false;
89
+ const info = parseLinkHeader(linkHeader);
90
+ return info.totalPages !== undefined && info.totalPages > 0;
91
+ }
92
+ //# sourceMappingURL=pagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.js","sourceRoot":"/","sources":["utils/pagination.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Utilities for handling pagination in API responses\n */\n\nimport { Progress } from '../ui/progress.js';\n\n/**\n * Parse Link header from REST API responses\n * Following RFC 5988 standard for web linking\n */\nexport interface LinkHeaderInfo {\n next?: string;\n prev?: string;\n first?: string;\n last?: string;\n lastPage?: number;\n totalPages?: number;\n}\n\n/**\n * Parse a Link header string into structured data\n * @param header The Link header value from the response\n * @returns Parsed link information including page numbers\n */\nexport function parseLinkHeader(header: string): LinkHeaderInfo {\n const links: LinkHeaderInfo = {};\n \n if (!header) return links;\n \n // Match: <url>; rel=\"relation\"\n const regex = /<([^>]+)>;\\s*rel=\"([^\"]+)\"/g;\n let match;\n \n while ((match = regex.exec(header)) !== null) {\n const url = match[1];\n const rel = match[2];\n \n // Store the URL for each relation\n if (rel === 'next') links.next = url;\n if (rel === 'prev') links.prev = url;\n if (rel === 'first') links.first = url;\n if (rel === 'last') links.last = url;\n \n // Extract page number from last page\n if (rel === 'last') {\n const pageMatch = url.match(/[?&]page=(\\d+)/);\n if (pageMatch) {\n links.lastPage = parseInt(pageMatch[1], 10);\n links.totalPages = links.lastPage;\n }\n }\n }\n \n return links;\n}\n\n/**\n * Helper to run operations on a list of items with progress tracking\n * @param items Array of items to process\n * @param operation Async operation to run for each item\n * @param options Configuration for progress display\n */\nexport async function withCountedProgress<T>(\n items: T[],\n operation: (item: T, index: number) => Promise<void>,\n options: {\n label?: string;\n format?: string;\n itemLabel?: (item: T, index: number) => string;\n showPercentage?: boolean;\n showCounts?: boolean;\n onComplete?: (count: number) => string;\n } = {}\n): Promise<void> {\n if (!items || items.length === 0) {\n return;\n }\n \n const progress = Progress.bar({\n total: items.length,\n label: options.label || 'Processing',\n format: options.format\n });\n \n try {\n for (let i = 0; i < items.length; i++) {\n const label = options.itemLabel ? \n options.itemLabel(items[i], i) : \n `Processing item ${i + 1}/${items.length}`;\n \n progress.update(i, label);\n await operation(items[i], i);\n }\n \n // Update to 100%\n progress.update(items.length, 'Complete');\n \n // Show completion message\n const completeMessage = options.onComplete ?\n options.onComplete(items.length) :\n `Processed ${items.length} items`;\n \n progress.complete(completeMessage);\n } catch (error) {\n progress.stop();\n throw error;\n }\n}\n\n/**\n * Extract current page number from URL\n */\nexport function getCurrentPage(url: string): number {\n const match = url.match(/[?&]page=(\\d+)/);\n return match ? parseInt(match[1], 10) : 1;\n}\n\n/**\n * Check if we can show determinate progress based on headers\n */\nexport function canShowDeterminateProgress(linkHeader: string | null): boolean {\n if (!linkHeader) return false;\n const info = parseLinkHeader(linkHeader);\n return info.totalPages !== undefined && info.totalPages > 0;\n}\n"]}
package/info.plist CHANGED
@@ -59,7 +59,7 @@
59
59
  <array>
60
60
  <dict>
61
61
  <key>destinationuid</key>
62
- <string>B2329A6F-0D3F-4D1D-BB55-4BDFDC312C47</string>
62
+ <string>6915B5C7-3989-4E53-88BD-75D9F8ADF010</string>
63
63
  <key>modifiers</key>
64
64
  <integer>0</integer>
65
65
  <key>modifiersubtext</key>
@@ -71,7 +71,7 @@
71
71
  </dict>
72
72
  <dict>
73
73
  <key>destinationuid</key>
74
- <string>720903FA-DE68-4819-B753-505F8392B54A</string>
74
+ <string>6915B5C7-3989-4E53-88BD-75D9F8ADF010</string>
75
75
  <key>modifiers</key>
76
76
  <integer>0</integer>
77
77
  <key>modifiersubtext</key>
@@ -115,65 +115,11 @@
115
115
  <false/>
116
116
  </dict>
117
117
  </array>
118
- <key>720903FA-DE68-4819-B753-505F8392B54A</key>
119
- <array>
120
- <dict>
121
- <key>destinationuid</key>
122
- <string>E7CED95B-DC0B-4A2E-ADBF-329A6389F597</string>
123
- <key>modifiers</key>
124
- <integer>0</integer>
125
- <key>modifiersubtext</key>
126
- <string></string>
127
- <key>vitoclose</key>
128
- <false/>
129
- </dict>
130
- </array>
131
- <key>7D93BD50-1A05-4990-ABE6-14FA8A7645B3</key>
132
- <array>
133
- <dict>
134
- <key>destinationuid</key>
135
- <string>2BF360A3-5D18-4185-9CF0-97B1D2B2F6BA</string>
136
- <key>modifiers</key>
137
- <integer>0</integer>
138
- <key>modifiersubtext</key>
139
- <string></string>
140
- <key>sourceoutputuid</key>
141
- <string>_button1</string>
142
- <key>vitoclose</key>
143
- <false/>
144
- </dict>
145
- </array>
146
- <key>B2329A6F-0D3F-4D1D-BB55-4BDFDC312C47</key>
147
- <array>
148
- <dict>
149
- <key>destinationuid</key>
150
- <string>C75A726B-1639-42C3-A91A-D8BDB79AF3B4</string>
151
- <key>modifiers</key>
152
- <integer>0</integer>
153
- <key>modifiersubtext</key>
154
- <string></string>
155
- <key>vitoclose</key>
156
- <false/>
157
- </dict>
158
- </array>
159
- <key>E7CED95B-DC0B-4A2E-ADBF-329A6389F597</key>
160
- <array>
161
- <dict>
162
- <key>destinationuid</key>
163
- <string>7D93BD50-1A05-4990-ABE6-14FA8A7645B3</string>
164
- <key>modifiers</key>
165
- <integer>0</integer>
166
- <key>modifiersubtext</key>
167
- <string></string>
168
- <key>vitoclose</key>
169
- <false/>
170
- </dict>
171
- </array>
172
118
  </dict>
173
119
  <key>createdby</key>
174
120
  <string></string>
175
121
  <key>description</key>
176
- <string></string>
122
+ <string>Streamline your Buildkite CI/CD workflows directly from Alfred</string>
177
123
  <key>disabled</key>
178
124
  <false/>
179
125
  <key>name</key>
@@ -377,69 +323,23 @@
377
323
  <dict>
378
324
  <key>config</key>
379
325
  <dict>
380
- <key>concurrently</key>
381
- <false/>
382
- <key>escaping</key>
383
- <integer>102</integer>
384
- <key>script</key>
385
- <string>bin/alfred-entrypoint token --reset</string>
386
- <key>scriptargtype</key>
387
- <integer>1</integer>
388
- <key>scriptfile</key>
389
- <string></string>
390
- <key>type</key>
391
- <integer>11</integer>
392
- </dict>
393
- <key>type</key>
394
- <string>alfred.workflow.action.script</string>
395
- <key>uid</key>
396
- <string>C75A726B-1639-42C3-A91A-D8BDB79AF3B4</string>
397
- <key>version</key>
398
- <integer>2</integer>
399
- </dict>
400
- <dict>
401
- <key>config</key>
402
- <dict>
403
- <key>argumenttype</key>
404
- <integer>0</integer>
405
- <key>keyword</key>
406
- <string>bktr</string>
407
- <key>subtext</key>
326
+ <key>browser</key>
408
327
  <string></string>
409
- <key>text</key>
410
- <string>Reset Buildkite Token</string>
411
- <key>withspace</key>
328
+ <key>skipqueryencode</key>
412
329
  <true/>
413
- </dict>
414
- <key>type</key>
415
- <string>alfred.workflow.input.keyword</string>
416
- <key>uid</key>
417
- <string>B2329A6F-0D3F-4D1D-BB55-4BDFDC312C47</string>
418
- <key>version</key>
419
- <integer>1</integer>
420
- </dict>
421
- <dict>
422
- <key>config</key>
423
- <dict>
424
- <key>concurrently</key>
425
- <false/>
426
- <key>escaping</key>
427
- <integer>102</integer>
428
- <key>script</key>
429
- <string>bin/alfred-entrypoint token --store --token "{var:token}"</string>
430
- <key>scriptargtype</key>
431
- <integer>1</integer>
432
- <key>scriptfile</key>
330
+ <key>skipvarencode</key>
331
+ <true/>
332
+ <key>spaces</key>
433
333
  <string></string>
434
- <key>type</key>
435
- <integer>0</integer>
334
+ <key>url</key>
335
+ <string>alfred:open-config</string>
436
336
  </dict>
437
337
  <key>type</key>
438
- <string>alfred.workflow.action.script</string>
338
+ <string>alfred.workflow.action.openurl</string>
439
339
  <key>uid</key>
440
- <string>2BF360A3-5D18-4185-9CF0-97B1D2B2F6BA</string>
340
+ <string>6915B5C7-3989-4E53-88BD-75D9F8ADF010</string>
441
341
  <key>version</key>
442
- <integer>2</integer>
342
+ <integer>1</integer>
443
343
  </dict>
444
344
  <dict>
445
345
  <key>config</key>
@@ -536,71 +436,18 @@
536
436
  <key>version</key>
537
437
  <integer>1</integer>
538
438
  </dict>
539
- <dict>
540
- <key>config</key>
541
- <dict>
542
- <key>argumenttype</key>
543
- <integer>0</integer>
544
- <key>keyword</key>
545
- <string>bkts</string>
546
- <key>subtext</key>
547
- <string></string>
548
- <key>text</key>
549
- <string>Update Buildkite Token</string>
550
- <key>withspace</key>
551
- <true/>
552
- </dict>
553
- <key>type</key>
554
- <string>alfred.workflow.input.keyword</string>
555
- <key>uid</key>
556
- <string>720903FA-DE68-4819-B753-505F8392B54A</string>
557
- <key>version</key>
558
- <integer>1</integer>
559
- </dict>
560
- <dict>
561
- <key>config</key>
562
- <dict>
563
- <key>argument</key>
564
- <string></string>
565
- <key>passthroughargument</key>
566
- <false/>
567
- <key>variables</key>
568
- <dict>
569
- <key>token</key>
570
- <string>{query}</string>
571
- </dict>
572
- </dict>
573
- <key>type</key>
574
- <string>alfred.workflow.utility.argument</string>
575
- <key>uid</key>
576
- <string>E7CED95B-DC0B-4A2E-ADBF-329A6389F597</string>
577
- <key>version</key>
578
- <integer>1</integer>
579
- </dict>
580
- <dict>
581
- <key>config</key>
582
- <dict>
583
- <key>button1</key>
584
- <string>Ok</string>
585
- <key>button2</key>
586
- <string>Cancel</string>
587
- <key>button3</key>
588
- <string></string>
589
- <key>description</key>
590
- <string>This will take a moment to validate. Use `bkt` to check its status</string>
591
- <key>title</key>
592
- <string>Storing Token...</string>
593
- </dict>
594
- <key>type</key>
595
- <string>alfred.workflow.utility.dialog</string>
596
- <key>uid</key>
597
- <string>7D93BD50-1A05-4990-ABE6-14FA8A7645B3</string>
598
- <key>version</key>
599
- <integer>1</integer>
600
- </dict>
601
439
  </array>
602
440
  <key>readme</key>
603
- <string></string>
441
+ <string>Access your Buildkite CI/CD workflows instantly from Alfred. View builds, pipelines, and organizations without leaving your keyboard.
442
+
443
+ Features:
444
+ • Quick access to recent builds with status indicators
445
+ • Search and filter pipelines across organizations
446
+ • View build annotations and details
447
+ • Secure token storage in system keychain
448
+ • Multiple output formats (plain, JSON, Alfred)
449
+
450
+ Requires Node.js 18+ and a Buildkite API token.</string>
604
451
  <key>uidata</key>
605
452
  <dict>
606
453
  <key>0D03084F-A535-4B27-9590-958ACE71058D</key>
@@ -631,13 +478,6 @@
631
478
  <key>ypos</key>
632
479
  <real>330</real>
633
480
  </dict>
634
- <key>2BF360A3-5D18-4185-9CF0-97B1D2B2F6BA</key>
635
- <dict>
636
- <key>xpos</key>
637
- <real>1030</real>
638
- <key>ypos</key>
639
- <real>840</real>
640
- </dict>
641
481
  <key>4BC44B5B-F643-42F8-8F64-DA29D018C1EF</key>
642
482
  <dict>
643
483
  <key>xpos</key>
@@ -652,26 +492,19 @@
652
492
  <key>ypos</key>
653
493
  <real>900</real>
654
494
  </dict>
655
- <key>6CEA3061-E41E-4D9C-99CF-435E7A85AED6</key>
656
- <dict>
657
- <key>xpos</key>
658
- <real>230</real>
659
- <key>ypos</key>
660
- <real>155</real>
661
- </dict>
662
- <key>720903FA-DE68-4819-B753-505F8392B54A</key>
495
+ <key>6915B5C7-3989-4E53-88BD-75D9F8ADF010</key>
663
496
  <dict>
664
497
  <key>xpos</key>
665
- <real>620</real>
498
+ <real>640</real>
666
499
  <key>ypos</key>
667
- <real>900</real>
500
+ <real>885</real>
668
501
  </dict>
669
- <key>7D93BD50-1A05-4990-ABE6-14FA8A7645B3</key>
502
+ <key>6CEA3061-E41E-4D9C-99CF-435E7A85AED6</key>
670
503
  <dict>
671
504
  <key>xpos</key>
672
- <real>915</real>
505
+ <real>230</real>
673
506
  <key>ypos</key>
674
- <real>935</real>
507
+ <real>155</real>
675
508
  </dict>
676
509
  <key>8B07A6D4-833B-48DB-828E-DFCD2F8BD095</key>
677
510
  <dict>
@@ -680,27 +513,6 @@
680
513
  <key>ypos</key>
681
514
  <real>55</real>
682
515
  </dict>
683
- <key>B2329A6F-0D3F-4D1D-BB55-4BDFDC312C47</key>
684
- <dict>
685
- <key>xpos</key>
686
- <real>610</real>
687
- <key>ypos</key>
688
- <real>730</real>
689
- </dict>
690
- <key>C75A726B-1639-42C3-A91A-D8BDB79AF3B4</key>
691
- <dict>
692
- <key>xpos</key>
693
- <real>820</real>
694
- <key>ypos</key>
695
- <real>720</real>
696
- </dict>
697
- <key>E7CED95B-DC0B-4A2E-ADBF-329A6389F597</key>
698
- <dict>
699
- <key>xpos</key>
700
- <real>810</real>
701
- <key>ypos</key>
702
- <real>930</real>
703
- </dict>
704
516
  </dict>
705
517
  <key>userconfigurationconfig</key>
706
518
  <array>
@@ -719,12 +531,33 @@
719
531
  <key>description</key>
720
532
  <string>Node binary to use to run. Can be an absolute path to the binary, or something that can be found on the PATH</string>
721
533
  <key>label</key>
722
- <string></string>
534
+ <string>Path to node binary</string>
723
535
  <key>type</key>
724
536
  <string>textfield</string>
725
537
  <key>variable</key>
726
538
  <string>NODE_BIN</string>
727
539
  </dict>
540
+ <dict>
541
+ <key>config</key>
542
+ <dict>
543
+ <key>default</key>
544
+ <string></string>
545
+ <key>placeholder</key>
546
+ <string></string>
547
+ <key>required</key>
548
+ <false/>
549
+ <key>trim</key>
550
+ <true/>
551
+ </dict>
552
+ <key>description</key>
553
+ <string></string>
554
+ <key>label</key>
555
+ <string>Buildkite API Token</string>
556
+ <key>type</key>
557
+ <string>textfield</string>
558
+ <key>variable</key>
559
+ <string>BUILDKITE_API_TOKEN</string>
560
+ </dict>
728
561
  </array>
729
562
  <key>version</key>
730
563
  <string></string>
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "bktide",
3
- "version": "1.0.1755266193",
4
- "description": "Buildkite CLI tool",
3
+ "version": "1.0.1755547716",
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",
7
7
  "bin": {
@@ -25,11 +25,27 @@
25
25
  "release:major": "node scripts/release.js --version major --auto-push",
26
26
  "validate:native": "node scripts/validate-native-deps.js",
27
27
  "validate:dev": "node scripts/validate-native-deps.js --dev-only",
28
- "validate:package": "node scripts/validate-native-deps.js --package-only"
28
+ "validate:package": "node scripts/validate-native-deps.js --package-only",
29
+ "completions:install": "npm run build && node dist/index.js completions fish > ~/.config/fish/completions/bktide.fish && echo 'Fish completions installed to ~/.config/fish/completions/bktide.fish'",
30
+ "completions:install:bash": "npm run build && echo 'Add this to your ~/.bashrc: source <(bktide completions bash)'",
31
+ "completions:install:zsh": "npm run build && echo 'Add this to your ~/.zshrc: source <(bktide completions zsh)'",
32
+ "completions:generate": "npm run build && node dist/index.js completions"
29
33
  },
30
34
  "keywords": [
31
35
  "cli",
32
- "buildkite"
36
+ "buildkite",
37
+ "ci-cd",
38
+ "workflows",
39
+ "shell-completions",
40
+ "fish",
41
+ "bash",
42
+ "zsh",
43
+ "alfred",
44
+ "alfred-workflow",
45
+ "macos",
46
+ "productivity",
47
+ "devops",
48
+ "build-automation"
33
49
  ],
34
50
  "author": "Josh Nichols <josh@technicalpickles.com>",
35
51
  "license": "ISC",
@@ -47,6 +63,7 @@
47
63
  "files": [
48
64
  "dist",
49
65
  "icons",
66
+ "completions",
50
67
  "README.md",
51
68
  "LICENSE",
52
69
  "bin/alfred-entrypoint",
@@ -70,8 +87,8 @@
70
87
  "graphql": "^16.10.0",
71
88
  "graphql-request": "^7.2.0",
72
89
  "html-to-text": "^9.0.5",
73
- "node-persist": "^4.0.4",
74
90
  "node-fetch": "^3.3.2",
91
+ "node-persist": "^4.0.4",
75
92
  "pino": "^8.17.0",
76
93
  "pino-pretty": "^10.3.0",
77
94
  "prompts": "^2.4.2",
@@ -92,6 +109,7 @@
92
109
  "@types/node-persist": "^3.1.8",
93
110
  "@types/prompts": "^2.4.9",
94
111
  "@types/source-map-support": "^0.5.10",
112
+ "alfred-link": "^0.3.1",
95
113
  "plist": "^3.1.0",
96
114
  "tsc-files": "^1.1.4"
97
115
  }