bktide 1.0.1765203819 → 1.0.1768353932

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 (41) hide show
  1. package/README.md +38 -0
  2. package/dist/commands/SmartShow.js +250 -0
  3. package/dist/commands/SmartShow.js.map +1 -0
  4. package/dist/commands/index.js +1 -0
  5. package/dist/commands/index.js.map +1 -1
  6. package/dist/formatters/pipeline-detail/AlfredFormatter.js +57 -0
  7. package/dist/formatters/pipeline-detail/AlfredFormatter.js.map +1 -0
  8. package/dist/formatters/pipeline-detail/Formatter.js +7 -0
  9. package/dist/formatters/pipeline-detail/Formatter.js.map +1 -0
  10. package/dist/formatters/pipeline-detail/JsonFormatter.js +11 -0
  11. package/dist/formatters/pipeline-detail/JsonFormatter.js.map +1 -0
  12. package/dist/formatters/pipeline-detail/PlainFormatter.js +55 -0
  13. package/dist/formatters/pipeline-detail/PlainFormatter.js.map +1 -0
  14. package/dist/formatters/pipeline-detail/index.js +5 -0
  15. package/dist/formatters/pipeline-detail/index.js.map +1 -0
  16. package/dist/formatters/step-logs/AlfredFormatter.js +72 -0
  17. package/dist/formatters/step-logs/AlfredFormatter.js.map +1 -0
  18. package/dist/formatters/step-logs/Formatter.js +7 -0
  19. package/dist/formatters/step-logs/Formatter.js.map +1 -0
  20. package/dist/formatters/step-logs/JsonFormatter.js +11 -0
  21. package/dist/formatters/step-logs/JsonFormatter.js.map +1 -0
  22. package/dist/formatters/step-logs/PlainFormatter.js +47 -0
  23. package/dist/formatters/step-logs/PlainFormatter.js.map +1 -0
  24. package/dist/formatters/step-logs/index.js +5 -0
  25. package/dist/formatters/step-logs/index.js.map +1 -0
  26. package/dist/graphql/queries.js +22 -0
  27. package/dist/graphql/queries.js.map +1 -1
  28. package/dist/index.js +45 -4
  29. package/dist/index.js.map +1 -1
  30. package/dist/services/BuildkiteClient.js +18 -1
  31. package/dist/services/BuildkiteClient.js.map +1 -1
  32. package/dist/services/BuildkiteRestClient.js +73 -0
  33. package/dist/services/BuildkiteRestClient.js.map +1 -1
  34. package/dist/types/buildkite.js.map +1 -1
  35. package/dist/utils/formatUtils.js +91 -0
  36. package/dist/utils/formatUtils.js.map +1 -0
  37. package/dist/utils/parseBuildRef.js +12 -1
  38. package/dist/utils/parseBuildRef.js.map +1 -1
  39. package/dist/utils/parseBuildkiteReference.js +93 -0
  40. package/dist/utils/parseBuildkiteReference.js.map +1 -0
  41. package/package.json +1 -1
@@ -0,0 +1,93 @@
1
+ export function parseBuildkiteReference(input) {
2
+ if (!input || input.trim() === '') {
3
+ throw new Error('Invalid Buildkite reference: input cannot be empty');
4
+ }
5
+ const trimmed = input.trim();
6
+ // Try URL format first
7
+ if (trimmed.startsWith('http://') || trimmed.startsWith('https://')) {
8
+ return parseUrl(trimmed);
9
+ }
10
+ // Try hash format: org/pipeline#number
11
+ if (trimmed.includes('#')) {
12
+ return parseHashFormat(trimmed);
13
+ }
14
+ // Try slash format: org/pipeline or org/pipeline/number
15
+ if (trimmed.includes('/')) {
16
+ return parseSlashFormat(trimmed);
17
+ }
18
+ throw new Error(`Invalid Buildkite reference format: ${input}. Expected formats: org/pipeline, org/pipeline/number, org/pipeline#number, or https://buildkite.com/...`);
19
+ }
20
+ function parseUrl(input) {
21
+ try {
22
+ const url = new URL(input);
23
+ if (url.hostname !== 'buildkite.com') {
24
+ throw new Error(`Invalid Buildkite URL: expected buildkite.com, got ${url.hostname}`);
25
+ }
26
+ // Extract step ID from query parameter if present
27
+ const stepId = url.searchParams.get('sid');
28
+ // Parse path: /org/pipeline/builds/number or /org/pipeline/builds/number/steps/...
29
+ const pathRegex = /^\/([^\/]+)\/([^\/]+)\/builds\/(\d+)/;
30
+ const match = url.pathname.match(pathRegex);
31
+ if (!match) {
32
+ // Try pipeline URL: /org/pipeline
33
+ const pipelineRegex = /^\/([^\/]+)\/([^\/]+)\/?$/;
34
+ const pipelineMatch = url.pathname.match(pipelineRegex);
35
+ if (pipelineMatch) {
36
+ const [, org, pipeline] = pipelineMatch;
37
+ return { type: 'pipeline', org, pipeline };
38
+ }
39
+ throw new Error(`Invalid Buildkite URL path: ${url.pathname}`);
40
+ }
41
+ const [, org, pipeline, buildNumberStr] = match;
42
+ const buildNumber = parseInt(buildNumberStr, 10);
43
+ if (isNaN(buildNumber)) {
44
+ throw new Error(`Invalid build number: ${buildNumberStr}`);
45
+ }
46
+ if (stepId) {
47
+ return { type: 'build-with-step', org, pipeline, buildNumber, stepId };
48
+ }
49
+ return { type: 'build', org, pipeline, buildNumber };
50
+ }
51
+ catch (error) {
52
+ if (error instanceof Error) {
53
+ throw error;
54
+ }
55
+ throw new Error(`Failed to parse Buildkite URL: ${input}`);
56
+ }
57
+ }
58
+ function parseHashFormat(input) {
59
+ const parts = input.split('#');
60
+ if (parts.length !== 2) {
61
+ throw new Error(`Invalid hash format: ${input}. Expected org/pipeline#number`);
62
+ }
63
+ const [pathPart, buildNumberStr] = parts;
64
+ const pathSegments = pathPart.split('/').filter(s => s.length > 0);
65
+ if (pathSegments.length !== 2) {
66
+ throw new Error(`Invalid hash format: ${input}. Expected org/pipeline#number`);
67
+ }
68
+ const [org, pipeline] = pathSegments;
69
+ const buildNumber = parseInt(buildNumberStr, 10);
70
+ if (isNaN(buildNumber)) {
71
+ throw new Error(`Invalid build number: ${buildNumberStr}`);
72
+ }
73
+ return { type: 'build', org, pipeline, buildNumber };
74
+ }
75
+ function parseSlashFormat(input) {
76
+ // Remove trailing slash if present
77
+ const normalized = input.endsWith('/') ? input.slice(0, -1) : input;
78
+ const segments = normalized.split('/').filter(s => s.length > 0);
79
+ if (segments.length === 2) {
80
+ const [org, pipeline] = segments;
81
+ return { type: 'pipeline', org, pipeline };
82
+ }
83
+ if (segments.length === 3) {
84
+ const [org, pipeline, buildNumberStr] = segments;
85
+ const buildNumber = parseInt(buildNumberStr, 10);
86
+ if (isNaN(buildNumber)) {
87
+ throw new Error(`Invalid build number: ${buildNumberStr}`);
88
+ }
89
+ return { type: 'build', org, pipeline, buildNumber };
90
+ }
91
+ throw new Error(`Invalid slash format: ${input}. Expected org/pipeline or org/pipeline/number`);
92
+ }
93
+ //# sourceMappingURL=parseBuildkiteReference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseBuildkiteReference.js","sourceRoot":"/","sources":["utils/parseBuildkiteReference.ts"],"names":[],"mappings":"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","sourcesContent":["export type BuildkiteReference =\n | { type: 'pipeline'; org: string; pipeline: string }\n | { type: 'build'; org: string; pipeline: string; buildNumber: number }\n | { type: 'build-with-step'; org: string; pipeline: string; buildNumber: number; stepId: string };\n\nexport function parseBuildkiteReference(input: string): BuildkiteReference {\n if (!input || input.trim() === '') {\n throw new Error('Invalid Buildkite reference: input cannot be empty');\n }\n\n const trimmed = input.trim();\n\n // Try URL format first\n if (trimmed.startsWith('http://') || trimmed.startsWith('https://')) {\n return parseUrl(trimmed);\n }\n\n // Try hash format: org/pipeline#number\n if (trimmed.includes('#')) {\n return parseHashFormat(trimmed);\n }\n\n // Try slash format: org/pipeline or org/pipeline/number\n if (trimmed.includes('/')) {\n return parseSlashFormat(trimmed);\n }\n\n throw new Error(`Invalid Buildkite reference format: ${input}. Expected formats: org/pipeline, org/pipeline/number, org/pipeline#number, or https://buildkite.com/...`);\n}\n\nfunction parseUrl(input: string): BuildkiteReference {\n try {\n const url = new URL(input);\n \n if (url.hostname !== 'buildkite.com') {\n throw new Error(`Invalid Buildkite URL: expected buildkite.com, got ${url.hostname}`);\n }\n\n // Extract step ID from query parameter if present\n const stepId = url.searchParams.get('sid');\n\n // Parse path: /org/pipeline/builds/number or /org/pipeline/builds/number/steps/...\n const pathRegex = /^\\/([^\\/]+)\\/([^\\/]+)\\/builds\\/(\\d+)/;\n const match = url.pathname.match(pathRegex);\n\n if (!match) {\n // Try pipeline URL: /org/pipeline\n const pipelineRegex = /^\\/([^\\/]+)\\/([^\\/]+)\\/?$/;\n const pipelineMatch = url.pathname.match(pipelineRegex);\n \n if (pipelineMatch) {\n const [, org, pipeline] = pipelineMatch;\n return { type: 'pipeline', org, pipeline };\n }\n\n throw new Error(`Invalid Buildkite URL path: ${url.pathname}`);\n }\n\n const [, org, pipeline, buildNumberStr] = match;\n const buildNumber = parseInt(buildNumberStr, 10);\n\n if (isNaN(buildNumber)) {\n throw new Error(`Invalid build number: ${buildNumberStr}`);\n }\n\n if (stepId) {\n return { type: 'build-with-step', org, pipeline, buildNumber, stepId };\n }\n\n return { type: 'build', org, pipeline, buildNumber };\n } catch (error) {\n if (error instanceof Error) {\n throw error;\n }\n throw new Error(`Failed to parse Buildkite URL: ${input}`);\n }\n}\n\nfunction parseHashFormat(input: string): BuildkiteReference {\n const parts = input.split('#');\n \n if (parts.length !== 2) {\n throw new Error(`Invalid hash format: ${input}. Expected org/pipeline#number`);\n }\n\n const [pathPart, buildNumberStr] = parts;\n const pathSegments = pathPart.split('/').filter(s => s.length > 0);\n\n if (pathSegments.length !== 2) {\n throw new Error(`Invalid hash format: ${input}. Expected org/pipeline#number`);\n }\n\n const [org, pipeline] = pathSegments;\n const buildNumber = parseInt(buildNumberStr, 10);\n\n if (isNaN(buildNumber)) {\n throw new Error(`Invalid build number: ${buildNumberStr}`);\n }\n\n return { type: 'build', org, pipeline, buildNumber };\n}\n\nfunction parseSlashFormat(input: string): BuildkiteReference {\n // Remove trailing slash if present\n const normalized = input.endsWith('/') ? input.slice(0, -1) : input;\n const segments = normalized.split('/').filter(s => s.length > 0);\n\n if (segments.length === 2) {\n const [org, pipeline] = segments;\n return { type: 'pipeline', org, pipeline };\n }\n\n if (segments.length === 3) {\n const [org, pipeline, buildNumberStr] = segments;\n const buildNumber = parseInt(buildNumberStr, 10);\n\n if (isNaN(buildNumber)) {\n throw new Error(`Invalid build number: ${buildNumberStr}`);\n }\n\n return { type: 'build', org, pipeline, buildNumber };\n }\n\n throw new Error(`Invalid slash format: ${input}. Expected org/pipeline or org/pipeline/number`);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bktide",
3
- "version": "1.0.1765203819",
3
+ "version": "1.0.1768353932",
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",