@pipeline-builder/pipeline-manager 3.1.0

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 (110) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +74 -0
  3. package/cdk.json +91 -0
  4. package/config.yml +94 -0
  5. package/dist/boilerplate.d.ts +3 -0
  6. package/dist/boilerplate.d.ts.map +1 -0
  7. package/dist/boilerplate.js +58 -0
  8. package/dist/cdk.json +91 -0
  9. package/dist/cli.d.ts +62 -0
  10. package/dist/cli.d.ts.map +1 -0
  11. package/dist/cli.js +372 -0
  12. package/dist/commands/bootstrap.d.ts +11 -0
  13. package/dist/commands/bootstrap.d.ts.map +1 -0
  14. package/dist/commands/bootstrap.js +159 -0
  15. package/dist/commands/create-pipeline.d.ts +12 -0
  16. package/dist/commands/create-pipeline.d.ts.map +1 -0
  17. package/dist/commands/create-pipeline.js +291 -0
  18. package/dist/commands/deploy.d.ts +15 -0
  19. package/dist/commands/deploy.d.ts.map +1 -0
  20. package/dist/commands/deploy.js +167 -0
  21. package/dist/commands/get-pipeline.d.ts +13 -0
  22. package/dist/commands/get-pipeline.d.ts.map +1 -0
  23. package/dist/commands/get-pipeline.js +97 -0
  24. package/dist/commands/get-plugin.d.ts +13 -0
  25. package/dist/commands/get-plugin.d.ts.map +1 -0
  26. package/dist/commands/get-plugin.js +98 -0
  27. package/dist/commands/list-pipelines.d.ts +20 -0
  28. package/dist/commands/list-pipelines.d.ts.map +1 -0
  29. package/dist/commands/list-pipelines.js +172 -0
  30. package/dist/commands/list-plugins.d.ts +20 -0
  31. package/dist/commands/list-plugins.d.ts.map +1 -0
  32. package/dist/commands/list-plugins.js +167 -0
  33. package/dist/commands/login.d.ts +21 -0
  34. package/dist/commands/login.d.ts.map +1 -0
  35. package/dist/commands/login.js +179 -0
  36. package/dist/commands/setup-events.d.ts +15 -0
  37. package/dist/commands/setup-events.d.ts.map +1 -0
  38. package/dist/commands/setup-events.js +177 -0
  39. package/dist/commands/status.d.ts +11 -0
  40. package/dist/commands/status.d.ts.map +1 -0
  41. package/dist/commands/status.js +89 -0
  42. package/dist/commands/store-token.d.ts +20 -0
  43. package/dist/commands/store-token.d.ts.map +1 -0
  44. package/dist/commands/store-token.js +233 -0
  45. package/dist/commands/synth.d.ts +21 -0
  46. package/dist/commands/synth.d.ts.map +1 -0
  47. package/dist/commands/synth.js +143 -0
  48. package/dist/commands/upload-plugin.d.ts +21 -0
  49. package/dist/commands/upload-plugin.d.ts.map +1 -0
  50. package/dist/commands/upload-plugin.js +311 -0
  51. package/dist/commands/version.d.ts +12 -0
  52. package/dist/commands/version.d.ts.map +1 -0
  53. package/dist/commands/version.js +223 -0
  54. package/dist/config/cli.constants.d.ts +101 -0
  55. package/dist/config/cli.constants.d.ts.map +1 -0
  56. package/dist/config/cli.constants.js +165 -0
  57. package/dist/config.yml +94 -0
  58. package/dist/templates/events-stack.json +141 -0
  59. package/dist/types/config.d.ts +44 -0
  60. package/dist/types/config.d.ts.map +1 -0
  61. package/dist/types/config.js +5 -0
  62. package/dist/types/error.d.ts +61 -0
  63. package/dist/types/error.d.ts.map +1 -0
  64. package/dist/types/error.js +39 -0
  65. package/dist/types/index.d.ts +8 -0
  66. package/dist/types/index.d.ts.map +1 -0
  67. package/dist/types/index.js +26 -0
  68. package/dist/types/pipeline.d.ts +144 -0
  69. package/dist/types/pipeline.d.ts.map +1 -0
  70. package/dist/types/pipeline.js +5 -0
  71. package/dist/types/plugin.d.ts +160 -0
  72. package/dist/types/plugin.d.ts.map +1 -0
  73. package/dist/types/plugin.js +5 -0
  74. package/dist/utils/api-client.d.ts +26 -0
  75. package/dist/utils/api-client.d.ts.map +1 -0
  76. package/dist/utils/api-client.js +160 -0
  77. package/dist/utils/audit-log.d.ts +8 -0
  78. package/dist/utils/audit-log.d.ts.map +1 -0
  79. package/dist/utils/audit-log.js +53 -0
  80. package/dist/utils/auth-guard.d.ts +16 -0
  81. package/dist/utils/auth-guard.d.ts.map +1 -0
  82. package/dist/utils/auth-guard.js +25 -0
  83. package/dist/utils/aws-secrets.d.ts +21 -0
  84. package/dist/utils/aws-secrets.d.ts.map +1 -0
  85. package/dist/utils/aws-secrets.js +74 -0
  86. package/dist/utils/banner.d.ts +19 -0
  87. package/dist/utils/banner.d.ts.map +1 -0
  88. package/dist/utils/banner.js +59 -0
  89. package/dist/utils/cdk-utils.d.ts +51 -0
  90. package/dist/utils/cdk-utils.d.ts.map +1 -0
  91. package/dist/utils/cdk-utils.js +101 -0
  92. package/dist/utils/command-utils.d.ts +56 -0
  93. package/dist/utils/command-utils.d.ts.map +1 -0
  94. package/dist/utils/command-utils.js +138 -0
  95. package/dist/utils/config-loader.d.ts +27 -0
  96. package/dist/utils/config-loader.d.ts.map +1 -0
  97. package/dist/utils/config-loader.js +166 -0
  98. package/dist/utils/error-handler.d.ts +29 -0
  99. package/dist/utils/error-handler.d.ts.map +1 -0
  100. package/dist/utils/error-handler.js +255 -0
  101. package/dist/utils/list-command-utils.d.ts +23 -0
  102. package/dist/utils/list-command-utils.d.ts.map +1 -0
  103. package/dist/utils/list-command-utils.js +60 -0
  104. package/dist/utils/output-utils.d.ts +60 -0
  105. package/dist/utils/output-utils.d.ts.map +1 -0
  106. package/dist/utils/output-utils.js +320 -0
  107. package/dist/utils/rate-limiter.d.ts +14 -0
  108. package/dist/utils/rate-limiter.d.ts.map +1 -0
  109. package/dist/utils/rate-limiter.js +73 -0
  110. package/package.json +144 -0
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Application metadata
3
+ */
4
+ export declare const APP_NAME = "pipeline-manager";
5
+ export declare const APP_VERSION: string;
6
+ export declare const APP_DESCRIPTION = "A CLI tool to manage pipelines and plugins";
7
+ /**
8
+ * Banner configuration for CLI startup
9
+ */
10
+ export declare const BANNER_OPTIONS: {
11
+ readonly font: "Doom";
12
+ readonly horizontalLayout: "fitted";
13
+ readonly getWidth: () => number;
14
+ };
15
+ /**
16
+ * Output format types
17
+ */
18
+ export type OutputFormat = 'table' | 'json' | 'yaml' | 'csv';
19
+ /**
20
+ * Valid CDK commands
21
+ */
22
+ export type CdkCommand = 'synth' | 'deploy' | 'bootstrap';
23
+ /**
24
+ * Default timeouts (in milliseconds)
25
+ */
26
+ export declare const TIMEOUTS: {
27
+ readonly HTTP_REQUEST: 30000;
28
+ readonly CDK_COMMAND: 0;
29
+ readonly HEALTH_CHECK: 5000;
30
+ readonly UPLOAD: 300000;
31
+ };
32
+ /**
33
+ * File size limits (in bytes)
34
+ */
35
+ export declare const FILE_SIZE_LIMITS: {
36
+ readonly PLUGIN: number;
37
+ readonly PIPELINE_PROPS: number;
38
+ };
39
+ /**
40
+ * Environment variable names
41
+ */
42
+ export declare const ENV_VARS: {
43
+ readonly PLATFORM_TOKEN: "PLATFORM_TOKEN";
44
+ readonly PLATFORM_BASE_URL: "PLATFORM_BASE_URL";
45
+ readonly CLI_CONFIG_PATH: "CLI_CONFIG_PATH";
46
+ readonly TLS_REJECT_UNAUTHORIZED: "TLS_REJECT_UNAUTHORIZED";
47
+ readonly AWS_PROFILE: "AWS_PROFILE";
48
+ readonly AWS_REGION: "AWS_REGION";
49
+ readonly DEBUG: "DEBUG";
50
+ };
51
+ /**
52
+ * Check if debug mode is enabled
53
+ */
54
+ export declare function isDebugMode(options?: {
55
+ debug?: boolean;
56
+ }): boolean;
57
+ /**
58
+ * Format file size for display
59
+ */
60
+ export declare function formatFileSize(bytes: number): string;
61
+ /**
62
+ * Format duration for display
63
+ */
64
+ export declare function formatDuration(ms: number): string;
65
+ /**
66
+ * Generate cryptographically random execution ID for request tracing.
67
+ */
68
+ export declare function generateExecutionId(): string;
69
+ /**
70
+ * Table display options (box-drawing characters)
71
+ */
72
+ export declare const TABLE_OPTIONS: {
73
+ readonly border: {
74
+ readonly topBody: "─";
75
+ readonly topJoin: "┬";
76
+ readonly topLeft: "┌";
77
+ readonly topRight: "┐";
78
+ readonly bottomBody: "─";
79
+ readonly bottomJoin: "┴";
80
+ readonly bottomLeft: "└";
81
+ readonly bottomRight: "┘";
82
+ readonly bodyLeft: "│";
83
+ readonly bodyRight: "│";
84
+ readonly bodyJoin: "│";
85
+ readonly joinBody: "─";
86
+ readonly joinLeft: "├";
87
+ readonly joinRight: "┤";
88
+ readonly joinJoin: "┼";
89
+ };
90
+ };
91
+ /**
92
+ * Validate boolean string from CLI input
93
+ */
94
+ export declare function validateBoolean(value: string, fieldName: string): boolean;
95
+ /**
96
+ * Validate and parse a numeric CLI parameter within optional bounds.
97
+ */
98
+ export declare function validateNumber(value: string | number, fieldName: string, min?: number, max?: number): number;
99
+ export declare function validateSort(value: string | undefined): string | undefined;
100
+ export declare function assertShellSafe(value: string, fieldName: string): void;
101
+ //# sourceMappingURL=cli.constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.constants.d.ts","sourceRoot":"","sources":["../../src/config/cli.constants.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,eAAO,MAAM,QAAQ,qBAAqB,CAAC;AAC3C,eAAO,MAAM,WAAW,QAAU,CAAC;AACnC,eAAO,MAAM,eAAe,+CAA+C,CAAC;AAE5E;;GAEG;AACH,eAAO,MAAM,cAAc;;;;CAIjB,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAE7D;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE1D;;GAEG;AACH,eAAO,MAAM,QAAQ;;;;;CAKX,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;CAGnB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,QAAQ;;;;;;;;CAQX,CAAC;AAEX;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAElE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAMjD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;CAkBhB,CAAC;AAEX;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAKzE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAY5G;AAQD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAM1E;AAQD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAItE"}
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ // Copyright 2026 Pipeline Builder Contributors
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.TABLE_OPTIONS = exports.ENV_VARS = exports.FILE_SIZE_LIMITS = exports.TIMEOUTS = exports.BANNER_OPTIONS = exports.APP_DESCRIPTION = exports.APP_VERSION = exports.APP_NAME = void 0;
6
+ exports.isDebugMode = isDebugMode;
7
+ exports.formatFileSize = formatFileSize;
8
+ exports.formatDuration = formatDuration;
9
+ exports.generateExecutionId = generateExecutionId;
10
+ exports.validateBoolean = validateBoolean;
11
+ exports.validateNumber = validateNumber;
12
+ exports.validateSort = validateSort;
13
+ exports.assertShellSafe = assertShellSafe;
14
+ const crypto_1 = require("crypto");
15
+ const package_json_1 = require("../../package.json");
16
+ /**
17
+ * Application metadata
18
+ */
19
+ exports.APP_NAME = 'pipeline-manager';
20
+ exports.APP_VERSION = package_json_1.version;
21
+ exports.APP_DESCRIPTION = 'A CLI tool to manage pipelines and plugins';
22
+ /**
23
+ * Banner configuration for CLI startup
24
+ */
25
+ exports.BANNER_OPTIONS = {
26
+ font: 'Doom',
27
+ horizontalLayout: 'fitted',
28
+ getWidth: () => process.stdout.columns ?? 80,
29
+ };
30
+ /**
31
+ * Default timeouts (in milliseconds)
32
+ */
33
+ exports.TIMEOUTS = {
34
+ HTTP_REQUEST: 30000,
35
+ CDK_COMMAND: 0,
36
+ HEALTH_CHECK: 5000,
37
+ UPLOAD: 300000,
38
+ };
39
+ /**
40
+ * File size limits (in bytes)
41
+ */
42
+ exports.FILE_SIZE_LIMITS = {
43
+ PLUGIN: 4 * 1024 * 1024 * 1024, // 4GB
44
+ PIPELINE_PROPS: 10 * 1024 * 1024, // 10MB
45
+ };
46
+ /**
47
+ * Environment variable names
48
+ */
49
+ exports.ENV_VARS = {
50
+ PLATFORM_TOKEN: 'PLATFORM_TOKEN',
51
+ PLATFORM_BASE_URL: 'PLATFORM_BASE_URL',
52
+ CLI_CONFIG_PATH: 'CLI_CONFIG_PATH',
53
+ TLS_REJECT_UNAUTHORIZED: 'TLS_REJECT_UNAUTHORIZED',
54
+ AWS_PROFILE: 'AWS_PROFILE',
55
+ AWS_REGION: 'AWS_REGION',
56
+ DEBUG: 'DEBUG',
57
+ };
58
+ /**
59
+ * Check if debug mode is enabled
60
+ */
61
+ function isDebugMode(options) {
62
+ return options?.debug ?? process.env.DEBUG === 'true';
63
+ }
64
+ /**
65
+ * Format file size for display
66
+ */
67
+ function formatFileSize(bytes) {
68
+ if (bytes === 0)
69
+ return '0 B';
70
+ const units = ['B', 'KB', 'MB', 'GB', 'TB'];
71
+ const k = 1024;
72
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
73
+ return `${(bytes / Math.pow(k, i)).toFixed(2)} ${units[i]}`;
74
+ }
75
+ /**
76
+ * Format duration for display
77
+ */
78
+ function formatDuration(ms) {
79
+ if (ms < 1000)
80
+ return `${ms}ms`;
81
+ if (ms < 60000)
82
+ return `${(ms / 1000).toFixed(2)}s`;
83
+ const minutes = Math.floor(ms / 60000);
84
+ const remainingSeconds = ((ms % 60000) / 1000).toFixed(0);
85
+ return `${minutes}m ${remainingSeconds}s`;
86
+ }
87
+ /**
88
+ * Generate cryptographically random execution ID for request tracing.
89
+ */
90
+ function generateExecutionId() {
91
+ return (0, crypto_1.randomBytes)(4).toString('hex').toUpperCase();
92
+ }
93
+ /**
94
+ * Table display options (box-drawing characters)
95
+ */
96
+ exports.TABLE_OPTIONS = {
97
+ border: {
98
+ topBody: '─',
99
+ topJoin: '┬',
100
+ topLeft: '┌',
101
+ topRight: '┐',
102
+ bottomBody: '─',
103
+ bottomJoin: '┴',
104
+ bottomLeft: '└',
105
+ bottomRight: '┘',
106
+ bodyLeft: '│',
107
+ bodyRight: '│',
108
+ bodyJoin: '│',
109
+ joinBody: '─',
110
+ joinLeft: '├',
111
+ joinRight: '┤',
112
+ joinJoin: '┼',
113
+ },
114
+ };
115
+ /**
116
+ * Validate boolean string from CLI input
117
+ */
118
+ function validateBoolean(value, fieldName) {
119
+ const normalized = value.toLowerCase().trim();
120
+ if (['true', '1', 'yes', 'y'].includes(normalized))
121
+ return true;
122
+ if (['false', '0', 'no', 'n'].includes(normalized))
123
+ return false;
124
+ throw new Error(`Invalid boolean value for ${fieldName}: "${value}". Use true/false, yes/no, or 1/0.`);
125
+ }
126
+ /**
127
+ * Validate and parse a numeric CLI parameter within optional bounds.
128
+ */
129
+ function validateNumber(value, fieldName, min, max) {
130
+ const num = typeof value === 'number' ? value : parseInt(value, 10);
131
+ if (isNaN(num)) {
132
+ throw new Error(`Invalid ${fieldName}: must be a number`);
133
+ }
134
+ if (min !== undefined && num < min) {
135
+ throw new Error(`Invalid ${fieldName}: must be >= ${min}`);
136
+ }
137
+ if (max !== undefined && num > max) {
138
+ throw new Error(`Invalid ${fieldName}: must be <= ${max}`);
139
+ }
140
+ return num;
141
+ }
142
+ /**
143
+ * Validate sort parameter format (e.g., "createdAt:desc").
144
+ * Returns the validated sort string, or the default if invalid.
145
+ */
146
+ const SORT_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*:(asc|desc)$/;
147
+ function validateSort(value) {
148
+ if (!value)
149
+ return undefined;
150
+ if (!SORT_PATTERN.test(value)) {
151
+ throw new Error(`Invalid sort format: "${value}". Expected "field:asc" or "field:desc".`);
152
+ }
153
+ return value;
154
+ }
155
+ /**
156
+ * Reject strings containing shell metacharacters.
157
+ * Used to sanitize CLI inputs before passing to shell commands.
158
+ */
159
+ const SHELL_UNSAFE = /[;&|`$(){}[\]<>!#~*?\\\n\r]/;
160
+ function assertShellSafe(value, fieldName) {
161
+ if (SHELL_UNSAFE.test(value)) {
162
+ throw new Error(`${fieldName} contains unsafe characters: "${value}"`);
163
+ }
164
+ }
165
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmNvbnN0YW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWcvY2xpLmNvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0NBQStDO0FBQy9DLHNDQUFzQzs7O0FBaUV0QyxrQ0FFQztBQUtELHdDQU1DO0FBS0Qsd0NBTUM7QUFLRCxrREFFQztBQTRCRCwwQ0FLQztBQUtELHdDQVlDO0FBUUQsb0NBTUM7QUFRRCwwQ0FJQztBQTFLRCxtQ0FBcUM7QUFDckMscURBQTZDO0FBRTdDOztHQUVHO0FBQ1UsUUFBQSxRQUFRLEdBQUcsa0JBQWtCLENBQUM7QUFDOUIsUUFBQSxXQUFXLEdBQUcsc0JBQU8sQ0FBQztBQUN0QixRQUFBLGVBQWUsR0FBRyw0Q0FBNEMsQ0FBQztBQUU1RTs7R0FFRztBQUNVLFFBQUEsY0FBYyxHQUFHO0lBQzVCLElBQUksRUFBRSxNQUFlO0lBQ3JCLGdCQUFnQixFQUFFLFFBQWlCO0lBQ25DLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxFQUFFO0NBQ3BDLENBQUM7QUFZWDs7R0FFRztBQUNVLFFBQUEsUUFBUSxHQUFHO0lBQ3RCLFlBQVksRUFBRSxLQUFLO0lBQ25CLFdBQVcsRUFBRSxDQUFDO0lBQ2QsWUFBWSxFQUFFLElBQUk7SUFDbEIsTUFBTSxFQUFFLE1BQU07Q0FDTixDQUFDO0FBRVg7O0dBRUc7QUFDVSxRQUFBLGdCQUFnQixHQUFHO0lBQzlCLE1BQU0sRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEVBQUUsTUFBTTtJQUN0QyxjQUFjLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLEVBQUUsT0FBTztDQUNqQyxDQUFDO0FBRVg7O0dBRUc7QUFDVSxRQUFBLFFBQVEsR0FBRztJQUN0QixjQUFjLEVBQUUsZ0JBQWdCO0lBQ2hDLGlCQUFpQixFQUFFLG1CQUFtQjtJQUN0Qyxl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LENBQUMsRUFBRSxDQUFDO1FBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLEtBQUssMENBQTBDLENBQUMsQ0FBQztJQUM1RixDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxZQUFZLEdBQUcsNkJBQTZCLENBQUM7QUFFbkQsU0FBZ0IsZUFBZSxDQUFDLEtBQWEsRUFBRSxTQUFpQjtJQUM5RCxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsU0FBUyxpQ0FBaUMsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUN6RSxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi4vLi4vcGFja2FnZS5qc29uJztcblxuLyoqXG4gKiBBcHBsaWNhdGlvbiBtZXRhZGF0YVxuICovXG5leHBvcnQgY29uc3QgQVBQX05BTUUgPSAncGlwZWxpbmUtbWFuYWdlcic7XG5leHBvcnQgY29uc3QgQVBQX1ZFUlNJT04gPSB2ZXJzaW9uO1xuZXhwb3J0IGNvbnN0IEFQUF9ERVNDUklQVElPTiA9ICdBIENMSSB0b29sIHRvIG1hbmFnZSBwaXBlbGluZXMgYW5kIHBsdWdpbnMnO1xuXG4vKipcbiAqIEJhbm5lciBjb25maWd1cmF0aW9uIGZvciBDTEkgc3RhcnR1cFxuICovXG5leHBvcnQgY29uc3QgQkFOTkVSX09QVElPTlMgPSB7XG4gIGZvbnQ6ICdEb29tJyBhcyBjb25zdCxcbiAgaG9yaXpvbnRhbExheW91dDogJ2ZpdHRlZCcgYXMgY29uc3QsXG4gIGdldFdpZHRoOiAoKSA9PiBwcm9jZXNzLnN0ZG91dC5jb2x1bW5zID8/IDgwLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBPdXRwdXQgZm9ybWF0IHR5cGVzXG4gKi9cbmV4cG9ydCB0eXBlIE91dHB1dEZvcm1hdCA9ICd0YWJsZScgfCAnanNvbicgfCAneWFtbCcgfCAnY3N2JztcblxuLyoqXG4gKiBWYWxpZCBDREsgY29tbWFuZHNcbiAqL1xuZXhwb3J0IHR5cGUgQ2RrQ29tbWFuZCA9ICdzeW50aCcgfCAnZGVwbG95JyB8ICdib290c3RyYXAnO1xuXG4vKipcbiAqIERlZmF1bHQgdGltZW91dHMgKGluIG1pbGxpc2Vjb25kcylcbiAqL1xuZXhwb3J0IGNvbnN0IFRJTUVPVVRTID0ge1xuICBIVFRQX1JFUVVFU1Q6IDMwMDAwLFxuICBDREtfQ09NTUFORDogMCxcbiAgSEVBTFRIX0NIRUNLOiA1MDAwLFxuICBVUExPQUQ6IDMwMDAwMCxcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogRmlsZSBzaXplIGxpbWl0cyAoaW4gYnl0ZXMpXG4gKi9cbmV4cG9ydCBjb25zdCBGSUxFX1NJWkVfTElNSVRTID0ge1xuICBQTFVHSU46IDQgKiAxMDI0ICogMTAyNCAqIDEwMjQsIC8vIDRHQlxuICBQSVBFTElORV9QUk9QUzogMTAgKiAxMDI0ICogMTAyNCwgLy8gMTBNQlxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBFbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lc1xuICovXG5leHBvcnQgY29uc3QgRU5WX1ZBUlMgPSB7XG4gIFBMQVRGT1JNX1RPS0VOOiAnUExBVEZPUk1fVE9LRU4nLFxuICBQTEFURk9STV9CQVNFX1VSTDogJ1BMQVRGT1JNX0JBU0VfVVJMJyxcbiAgQ0xJX0NPTkZJR19QQVRIOiAnQ0xJX0NPTkZJR19QQVRIJyxcbiAgVExTX1JFSkVDVF9VTkFVVEhPUklaRUQ6ICdUTFNfUkVKRUNUX1VOQVVUSE9SSVpFRCcsXG4gIEFXU19QUk9GSUxFOiAnQVdTX1BST0ZJTEUnLFxuICBBV1NfUkVHSU9OOiAnQVdTX1JFR0lPTicsXG4gIERFQlVHOiAnREVCVUcnLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBDaGVjayBpZiBkZWJ1ZyBtb2RlIGlzIGVuYWJsZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGVidWdNb2RlKG9wdGlvbnM/OiB7IGRlYnVnPzogYm9vbGVhbiB9KTogYm9vbGVhbiB7XG4gIHJldHVybiBvcHRpb25zPy5kZWJ1ZyA/PyBwcm9jZXNzLmVudi5ERUJVRyA9PT0gJ3RydWUnO1xufVxuXG4vKipcbiAqIEZvcm1hdCBmaWxlIHNpemUgZm9yIGRpc3BsYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEZpbGVTaXplKGJ5dGVzOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoYnl0ZXMgPT09IDApIHJldHVybiAnMCBCJztcbiAgY29uc3QgdW5pdHMgPSBbJ0InLCAnS0InLCAnTUInLCAnR0InLCAnVEInXTtcbiAgY29uc3QgayA9IDEwMjQ7XG4gIGNvbnN0IGkgPSBNYXRoLmZsb29yKE1hdGgubG9nKGJ5dGVzKSAvIE1hdGgubG9nKGspKTtcbiAgcmV0dXJuIGAkeyhieXRlcyAvIE1hdGgucG93KGssIGkpKS50b0ZpeGVkKDIpfSAke3VuaXRzW2ldfWA7XG59XG5cbi8qKlxuICogRm9ybWF0IGR1cmF0aW9uIGZvciBkaXNwbGF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXREdXJhdGlvbihtczogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKG1zIDwgMTAwMCkgcmV0dXJuIGAke21zfW1zYDtcbiAgaWYgKG1zIDwgNjAwMDApIHJldHVybiBgJHsobXMgLyAxMDAwKS50b0ZpeGVkKDIpfXNgO1xuICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcihtcyAvIDYwMDAwKTtcbiAgY29uc3QgcmVtYWluaW5nU2Vjb25kcyA9ICgobXMgJSA2MDAwMCkgLyAxMDAwKS50b0ZpeGVkKDApO1xuICByZXR1cm4gYCR7bWludXRlc31tICR7cmVtYWluaW5nU2Vjb25kc31zYDtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBjcnlwdG9ncmFwaGljYWxseSByYW5kb20gZXhlY3V0aW9uIElEIGZvciByZXF1ZXN0IHRyYWNpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUV4ZWN1dGlvbklkKCk6IHN0cmluZyB7XG4gIHJldHVybiByYW5kb21CeXRlcyg0KS50b1N0cmluZygnaGV4JykudG9VcHBlckNhc2UoKTtcbn1cblxuLyoqXG4gKiBUYWJsZSBkaXNwbGF5IG9wdGlvbnMgKGJveC1kcmF3aW5nIGNoYXJhY3RlcnMpXG4gKi9cbmV4cG9ydCBjb25zdCBUQUJMRV9PUFRJT05TID0ge1xuICBib3JkZXI6IHtcbiAgICB0b3BCb2R5OiAn4pSAJyxcbiAgICB0b3BKb2luOiAn4pSsJyxcbiAgICB0b3BMZWZ0OiAn4pSMJyxcbiAgICB0b3BSaWdodDogJ+KUkCcsXG4gICAgYm90dG9tQm9keTogJ+KUgCcsXG4gICAgYm90dG9tSm9pbjogJ+KUtCcsXG4gICAgYm90dG9tTGVmdDogJ+KUlCcsXG4gICAgYm90dG9tUmlnaHQ6ICfilJgnLFxuICAgIGJvZHlMZWZ0OiAn4pSCJyxcbiAgICBib2R5UmlnaHQ6ICfilIInLFxuICAgIGJvZHlKb2luOiAn4pSCJyxcbiAgICBqb2luQm9keTogJ+KUgCcsXG4gICAgam9pbkxlZnQ6ICfilJwnLFxuICAgIGpvaW5SaWdodDogJ+KUpCcsXG4gICAgam9pbkpvaW46ICfilLwnLFxuICB9LFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBWYWxpZGF0ZSBib29sZWFuIHN0cmluZyBmcm9tIENMSSBpbnB1dFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVCb29sZWFuKHZhbHVlOiBzdHJpbmcsIGZpZWxkTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgaWYgKFsndHJ1ZScsICcxJywgJ3llcycsICd5J10uaW5jbHVkZXMobm9ybWFsaXplZCkpIHJldHVybiB0cnVlO1xuICBpZiAoWydmYWxzZScsICcwJywgJ25vJywgJ24nXS5pbmNsdWRlcyhub3JtYWxpemVkKSkgcmV0dXJuIGZhbHNlO1xuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYm9vbGVhbiB2YWx1ZSBmb3IgJHtmaWVsZE5hbWV9OiBcIiR7dmFsdWV9XCIuIFVzZSB0cnVlL2ZhbHNlLCB5ZXMvbm8sIG9yIDEvMC5gKTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhbmQgcGFyc2UgYSBudW1lcmljIENMSSBwYXJhbWV0ZXIgd2l0aGluIG9wdGlvbmFsIGJvdW5kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTnVtYmVyKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIsIGZpZWxkTmFtZTogc3RyaW5nLCBtaW4/OiBudW1iZXIsIG1heD86IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IG51bSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgPyB2YWx1ZSA6IHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gIGlmIChpc05hTihudW0pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkICR7ZmllbGROYW1lfTogbXVzdCBiZSBhIG51bWJlcmApO1xuICB9XG4gIGlmIChtaW4gIT09IHVuZGVmaW5lZCAmJiBudW0gPCBtaW4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgJHtmaWVsZE5hbWV9OiBtdXN0IGJlID49ICR7bWlufWApO1xuICB9XG4gIGlmIChtYXggIT09IHVuZGVmaW5lZCAmJiBudW0gPiBtYXgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgJHtmaWVsZE5hbWV9OiBtdXN0IGJlIDw9ICR7bWF4fWApO1xuICB9XG4gIHJldHVybiBudW07XG59XG5cbi8qKlxuICogVmFsaWRhdGUgc29ydCBwYXJhbWV0ZXIgZm9ybWF0IChlLmcuLCBcImNyZWF0ZWRBdDpkZXNjXCIpLlxuICogUmV0dXJucyB0aGUgdmFsaWRhdGVkIHNvcnQgc3RyaW5nLCBvciB0aGUgZGVmYXVsdCBpZiBpbnZhbGlkLlxuICovXG5jb25zdCBTT1JUX1BBVFRFUk4gPSAvXlthLXpBLVpfXVthLXpBLVowLTlfXSo6KGFzY3xkZXNjKSQvO1xuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVTb3J0KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoIVNPUlRfUEFUVEVSTi50ZXN0KHZhbHVlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzb3J0IGZvcm1hdDogXCIke3ZhbHVlfVwiLiBFeHBlY3RlZCBcImZpZWxkOmFzY1wiIG9yIFwiZmllbGQ6ZGVzY1wiLmApO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBSZWplY3Qgc3RyaW5ncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLlxuICogVXNlZCB0byBzYW5pdGl6ZSBDTEkgaW5wdXRzIGJlZm9yZSBwYXNzaW5nIHRvIHNoZWxsIGNvbW1hbmRzLlxuICovXG5jb25zdCBTSEVMTF9VTlNBRkUgPSAvWzsmfGAkKCl7fVtcXF08PiEjfio/XFxcXFxcblxccl0vO1xuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0U2hlbGxTYWZlKHZhbHVlOiBzdHJpbmcsIGZpZWxkTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChTSEVMTF9VTlNBRkUudGVzdCh2YWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZmllbGROYW1lfSBjb250YWlucyB1bnNhZmUgY2hhcmFjdGVyczogXCIke3ZhbHVlfVwiYCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,94 @@
1
+ # CLI Configuration File
2
+ # Save this as config.yml in your project root or specify with CLI_CONFIG_PATH
3
+
4
+ # ============================================================================
5
+ # API Configuration
6
+ # ============================================================================
7
+ api:
8
+ # Base URL for the API
9
+ # Can be overridden with PLATFORM_URL environment variable
10
+ baseUrl: https://localhost:8443
11
+
12
+ # Request timeout in milliseconds
13
+ timeout: 30000
14
+
15
+ # SSL/TLS Certificate Validation
16
+ # Set to false to disable certificate validation (DEVELOPMENT ONLY)
17
+ # Default: true (secure)
18
+ #
19
+ # WARNING: Setting this to false disables certificate validation and makes
20
+ # your application vulnerable to man-in-the-middle attacks. Only use this
21
+ # in development environments with self-signed certificates.
22
+ rejectUnauthorized: true
23
+
24
+ # API Endpoints
25
+ #
26
+ # Pipeline Endpoints:
27
+ # pipelineUrl - Single pipeline operations (GET by ID, POST)
28
+ # Used by: get-pipeline, create-pipeline
29
+ # Format: /api/pipeline/{id} or /api/pipeline
30
+ #
31
+ # pipelineListUrl - List/query multiple pipelines with filters
32
+ # Used by: list-pipelines
33
+ # Format: /api/pipelines?filter1=value1&filter2=value2
34
+ # Supports filters: id, accessModifier, isDefault, isActive,
35
+ # project, projectPattern, organizationPattern,
36
+ # limit, offset, sort
37
+ #
38
+ # Plugin Endpoints:
39
+ # pluginUrl - Single plugin operations (GET by ID)
40
+ # Used by: get-plugin
41
+ # Format: /api/plugin/{id}
42
+ #
43
+ # pluginListUrl - List/query multiple plugins with filters
44
+ # Used by: list-plugins
45
+ # Format: /api/plugins?filter1=value1&filter2=value2
46
+ # Supports filters: id, accessModifier, isDefault, isActive,
47
+ # name, namePattern, version, versionRange,
48
+ # imageTag, limit, offset, sort
49
+ #
50
+ # pluginUploadUrl - Plugin upload endpoint
51
+ # Used by: upload-plugin
52
+ # Format: /api/plugin/upload
53
+ #
54
+ # Note: Singular vs Plural URLs
55
+ # - Singular (/api/plugin, /api/pipeline) - Single resource operations
56
+ # - Plural (/api/plugins, /api/pipelines) - List/query operations
57
+ pipelineUrl: /api/pipeline
58
+ pipelineListUrl: /api/pipelines
59
+ pluginUrl: /api/plugin
60
+ pluginListUrl: /api/plugins
61
+ pluginUploadUrl: /api/plugin/upload
62
+
63
+ # ============================================================================
64
+ # AUTHENTICATION
65
+ # ============================================================================
66
+ # Authentication is handled via environment variable ONLY.
67
+ # DO NOT include auth configuration in this file.
68
+ #
69
+ # Set your token with:
70
+ # export PLATFORM_TOKEN='your-token-here'
71
+ #
72
+ # The token should NEVER be committed to version control.
73
+ # ============================================================================
74
+
75
+ # ============================================================================
76
+ # ENVIRONMENT VARIABLES
77
+ # ============================================================================
78
+ # The following environment variables are used by the CLI:
79
+ #
80
+ # REQUIRED:
81
+ # PLATFORM_TOKEN - Authentication token for API access
82
+ # Example: export PLATFORM_TOKEN='eyJhbG...'
83
+ #
84
+ # OPTIONAL:
85
+ # PLATFORM_URL - Override api.baseUrl
86
+ # Example: export PLATFORM_URL='https://api.example.com'
87
+ #
88
+ # CLI_CONFIG_PATH - Path to this config file
89
+ # Example: export CLI_CONFIG_PATH='/path/to/config.yml'
90
+ #
91
+ # TLS_REJECT_UNAUTHORIZED - Set to '0' to disable cert validation
92
+ # Example: export TLS_REJECT_UNAUTHORIZED='0'
93
+ #
94
+ # ============================================================================
@@ -0,0 +1,141 @@
1
+ {
2
+ "AWSTemplateFormatVersion": "2010-09-09",
3
+ "Description": "Pipeline Builder event ingestion — EventBridge rule, SQS queue, and Lambda that forwards CodePipeline/CodeBuild events to the reporting service API. Lambda code is deployed separately via pipeline-manager setup-events.",
4
+ "Parameters": {
5
+ "PlatformBaseUrl": {
6
+ "Type": "String",
7
+ "Description": "Base URL of the platform (e.g. https://app.example.com)"
8
+ },
9
+ "PlatformSecretName": {
10
+ "Type": "String",
11
+ "Description": "Secrets Manager secret name containing the platform JWT token (e.g. pipeline-builder/{orgId}/platform)"
12
+ }
13
+ },
14
+ "Resources": {
15
+ "EventQueue": {
16
+ "Type": "AWS::SQS::Queue",
17
+ "Properties": {
18
+ "QueueName": "pipeline-builder-events",
19
+ "VisibilityTimeout": 300,
20
+ "MessageRetentionPeriod": 1209600,
21
+ "RedrivePolicy": {
22
+ "deadLetterTargetArn": { "Fn::GetAtt": ["DeadLetterQueue", "Arn"] },
23
+ "maxReceiveCount": 3
24
+ }
25
+ }
26
+ },
27
+ "DeadLetterQueue": {
28
+ "Type": "AWS::SQS::Queue",
29
+ "Properties": {
30
+ "QueueName": "pipeline-builder-events-dlq",
31
+ "MessageRetentionPeriod": 1209600
32
+ }
33
+ },
34
+ "EventQueuePolicy": {
35
+ "Type": "AWS::SQS::QueuePolicy",
36
+ "Properties": {
37
+ "Queues": [{ "Ref": "EventQueue" }],
38
+ "PolicyDocument": {
39
+ "Statement": [{
40
+ "Effect": "Allow",
41
+ "Principal": { "Service": "events.amazonaws.com" },
42
+ "Action": "sqs:SendMessage",
43
+ "Resource": { "Fn::GetAtt": ["EventQueue", "Arn"] }
44
+ }]
45
+ }
46
+ }
47
+ },
48
+ "EventRule": {
49
+ "Type": "AWS::Events::Rule",
50
+ "Properties": {
51
+ "Name": "pipeline-builder-codepipeline-events",
52
+ "Description": "Capture CodePipeline and CodeBuild state changes for reporting",
53
+ "State": "ENABLED",
54
+ "EventPattern": {
55
+ "source": ["aws.codepipeline", "aws.codebuild"],
56
+ "detail-type": [
57
+ "CodePipeline Pipeline Execution State Change",
58
+ "CodePipeline Stage Execution State Change",
59
+ "CodePipeline Action Execution State Change",
60
+ "CodeBuild Build State Change"
61
+ ]
62
+ },
63
+ "Targets": [{
64
+ "Id": "pipeline-events-queue",
65
+ "Arn": { "Fn::GetAtt": ["EventQueue", "Arn"] }
66
+ }]
67
+ }
68
+ },
69
+ "LambdaRole": {
70
+ "Type": "AWS::IAM::Role",
71
+ "Properties": {
72
+ "RoleName": "pipeline-builder-event-ingestion",
73
+ "AssumeRolePolicyDocument": {
74
+ "Version": "2012-10-17",
75
+ "Statement": [{
76
+ "Effect": "Allow",
77
+ "Principal": { "Service": "lambda.amazonaws.com" },
78
+ "Action": "sts:AssumeRole"
79
+ }]
80
+ },
81
+ "ManagedPolicyArns": [
82
+ "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
83
+ ],
84
+ "Policies": [{
85
+ "PolicyName": "event-ingestion",
86
+ "PolicyDocument": {
87
+ "Statement": [
88
+ {
89
+ "Effect": "Allow",
90
+ "Action": ["sqs:ReceiveMessage", "sqs:DeleteMessage", "sqs:GetQueueAttributes"],
91
+ "Resource": { "Fn::GetAtt": ["EventQueue", "Arn"] }
92
+ },
93
+ {
94
+ "Effect": "Allow",
95
+ "Action": "secretsmanager:GetSecretValue",
96
+ "Resource": { "Fn::Sub": "arn:aws:secretsmanager:${AWS::Region}:${AWS::AccountId}:secret:pipeline-builder/*/platform-*" }
97
+ }
98
+ ]
99
+ }
100
+ }]
101
+ }
102
+ },
103
+ "EventHandler": {
104
+ "Type": "AWS::Lambda::Function",
105
+ "Properties": {
106
+ "FunctionName": "pipeline-builder-event-ingestion",
107
+ "Runtime": "nodejs24.x",
108
+ "Handler": "index.handler",
109
+ "Code": {
110
+ "ZipFile": "exports.handler=async(event)=>{console.log('Placeholder handler — run pipeline-manager setup-events to deploy real code');return{statusCode:200,body:JSON.stringify({message:'hello',records:event.Records?.length||0})}}"
111
+ },
112
+ "Role": { "Fn::GetAtt": ["LambdaRole", "Arn"] },
113
+ "Timeout": 60,
114
+ "MemorySize": 256,
115
+ "Environment": {
116
+ "Variables": {
117
+ "PLATFORM_BASE_URL": { "Ref": "PlatformBaseUrl" },
118
+ "PLATFORM_SECRET_NAME": { "Ref": "PlatformSecretName" }
119
+ }
120
+ }
121
+ }
122
+ },
123
+ "EventSourceMapping": {
124
+ "Type": "AWS::Lambda::EventSourceMapping",
125
+ "Properties": {
126
+ "EventSourceArn": { "Fn::GetAtt": ["EventQueue", "Arn"] },
127
+ "FunctionName": { "Ref": "EventHandler" },
128
+ "BatchSize": 10,
129
+ "MaximumBatchingWindowInSeconds": 5,
130
+ "Enabled": true
131
+ }
132
+ }
133
+ },
134
+ "Outputs": {
135
+ "EventQueueArn": { "Value": { "Fn::GetAtt": ["EventQueue", "Arn"] } },
136
+ "EventQueueUrl": { "Value": { "Ref": "EventQueue" } },
137
+ "DeadLetterQueueUrl": { "Value": { "Ref": "DeadLetterQueue" } },
138
+ "LambdaFunctionArn": { "Value": { "Fn::GetAtt": ["EventHandler", "Arn"] } },
139
+ "EventRuleName": { "Value": { "Ref": "EventRule" } }
140
+ }
141
+ }
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Platform API connection settings.
3
+ */
4
+ export interface ApiConfig {
5
+ /** Base URL of the platform API (e.g., `https://api.example.com`). */
6
+ baseUrl: string;
7
+ /** Default request timeout in milliseconds. */
8
+ timeout?: number;
9
+ /** Extended timeout for plugin upload requests (large files). */
10
+ uploadTimeout?: number;
11
+ /** URL path for single-pipeline CRUD operations. */
12
+ pipelineUrl: string;
13
+ /** URL path for pipeline list/query operations. */
14
+ pipelineListUrl: string;
15
+ /** URL path for single-plugin CRUD operations. */
16
+ pluginUrl: string;
17
+ /** URL path for plugin list/query operations. */
18
+ pluginListUrl: string;
19
+ /** URL path for plugin upload (multipart POST). */
20
+ pluginUploadUrl: string;
21
+ /** When `false`, disables TLS certificate verification. */
22
+ rejectUnauthorized?: boolean;
23
+ }
24
+ /**
25
+ * Authentication credentials for platform API access.
26
+ */
27
+ export interface AuthConfig {
28
+ /** JWT bearer token obtained from the platform. */
29
+ token: string;
30
+ }
31
+ /**
32
+ * Complete CLI application configuration combining API and auth settings.
33
+ */
34
+ export interface Config {
35
+ /** Platform API connection settings. */
36
+ api: ApiConfig;
37
+ /** Authentication credentials. */
38
+ auth: AuthConfig;
39
+ /** Default AWS region (from user config or environment). */
40
+ region?: string;
41
+ /** Default AWS CLI profile (from user config or environment). */
42
+ profile?: string;
43
+ }
44
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,eAAe,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,aAAa,EAAE,MAAM,CAAC;IACtB,mDAAmD;IACnD,eAAe,EAAE,MAAM,CAAC;IACxB,2DAA2D;IAC3D,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,wCAAwC;IACxC,GAAG,EAAE,SAAS,CAAC;IACf,kCAAkC;IAClC,IAAI,EAAE,UAAU,CAAC;IACjB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ // Copyright 2026 Pipeline Builder Contributors
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R5cGVzL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0NBQStDO0FBQy9DLHNDQUFzQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFBsYXRmb3JtIEFQSSBjb25uZWN0aW9uIHNldHRpbmdzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUNvbmZpZyB7XG4gIC8qKiBCYXNlIFVSTCBvZiB0aGUgcGxhdGZvcm0gQVBJIChlLmcuLCBgaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb21gKS4gKi9cbiAgYmFzZVVybDogc3RyaW5nO1xuICAvKiogRGVmYXVsdCByZXF1ZXN0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLiAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICAvKiogRXh0ZW5kZWQgdGltZW91dCBmb3IgcGx1Z2luIHVwbG9hZCByZXF1ZXN0cyAobGFyZ2UgZmlsZXMpLiAqL1xuICB1cGxvYWRUaW1lb3V0PzogbnVtYmVyO1xuICAvKiogVVJMIHBhdGggZm9yIHNpbmdsZS1waXBlbGluZSBDUlVEIG9wZXJhdGlvbnMuICovXG4gIHBpcGVsaW5lVXJsOiBzdHJpbmc7XG4gIC8qKiBVUkwgcGF0aCBmb3IgcGlwZWxpbmUgbGlzdC9xdWVyeSBvcGVyYXRpb25zLiAqL1xuICBwaXBlbGluZUxpc3RVcmw6IHN0cmluZztcbiAgLyoqIFVSTCBwYXRoIGZvciBzaW5nbGUtcGx1Z2luIENSVUQgb3BlcmF0aW9ucy4gKi9cbiAgcGx1Z2luVXJsOiBzdHJpbmc7XG4gIC8qKiBVUkwgcGF0aCBmb3IgcGx1Z2luIGxpc3QvcXVlcnkgb3BlcmF0aW9ucy4gKi9cbiAgcGx1Z2luTGlzdFVybDogc3RyaW5nO1xuICAvKiogVVJMIHBhdGggZm9yIHBsdWdpbiB1cGxvYWQgKG11bHRpcGFydCBQT1NUKS4gKi9cbiAgcGx1Z2luVXBsb2FkVXJsOiBzdHJpbmc7XG4gIC8qKiBXaGVuIGBmYWxzZWAsIGRpc2FibGVzIFRMUyBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24uICovXG4gIHJlamVjdFVuYXV0aG9yaXplZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQXV0aGVudGljYXRpb24gY3JlZGVudGlhbHMgZm9yIHBsYXRmb3JtIEFQSSBhY2Nlc3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aENvbmZpZyB7XG4gIC8qKiBKV1QgYmVhcmVyIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIHBsYXRmb3JtLiAqL1xuICB0b2tlbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbXBsZXRlIENMSSBhcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uIGNvbWJpbmluZyBBUEkgYW5kIGF1dGggc2V0dGluZ3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnIHtcbiAgLyoqIFBsYXRmb3JtIEFQSSBjb25uZWN0aW9uIHNldHRpbmdzLiAqL1xuICBhcGk6IEFwaUNvbmZpZztcbiAgLyoqIEF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzLiAqL1xuICBhdXRoOiBBdXRoQ29uZmlnO1xuICAvKiogRGVmYXVsdCBBV1MgcmVnaW9uIChmcm9tIHVzZXIgY29uZmlnIG9yIGVudmlyb25tZW50KS4gKi9cbiAgcmVnaW9uPzogc3RyaW5nO1xuICAvKiogRGVmYXVsdCBBV1MgQ0xJIHByb2ZpbGUgKGZyb20gdXNlciBjb25maWcgb3IgZW52aXJvbm1lbnQpLiAqL1xuICBwcm9maWxlPzogc3RyaW5nO1xufVxuIl19
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Numeric exit-code constants mapped to error categories.
3
+ * Used by {@link handleError} to set the process exit code.
4
+ */
5
+ export declare const ERROR_CODES: {
6
+ readonly GENERAL: 1;
7
+ readonly VALIDATION: 2;
8
+ readonly API_REQUEST: 3;
9
+ readonly AUTHENTICATION: 4;
10
+ readonly AUTHORIZATION: 5;
11
+ readonly NOT_FOUND: 6;
12
+ readonly NETWORK: 7;
13
+ readonly CONFIGURATION: 8;
14
+ readonly FILE_SYSTEM: 9;
15
+ readonly TIMEOUT: 10;
16
+ };
17
+ /** Union of all valid error code values. */
18
+ export type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];
19
+ /**
20
+ * Options controlling how {@link handleError} processes and reports an error.
21
+ */
22
+ export interface ErrorHandlerOptions {
23
+ /** When `true`, prints full stack traces and internal details. */
24
+ debug?: boolean;
25
+ /** When `true`, calls `process.exit()` with the error code. */
26
+ exit?: boolean;
27
+ /** When `true`, logs the error to the console (defaults to `true`). */
28
+ logToConsole?: boolean;
29
+ /** Arbitrary key-value context attached to the error output for debugging. */
30
+ context?: Record<string, unknown>;
31
+ /** Request/execution correlation ID for log tracing. */
32
+ correlationId?: string;
33
+ }
34
+ /**
35
+ * Minimal Axios-compatible error shape used for duck-typing in error handlers.
36
+ */
37
+ export interface AxiosErrorLike {
38
+ response?: {
39
+ status?: number;
40
+ statusText?: string;
41
+ data?: unknown;
42
+ };
43
+ config?: {
44
+ url?: string;
45
+ method?: string;
46
+ timeout?: number;
47
+ };
48
+ request?: unknown;
49
+ isAxiosError: true;
50
+ }
51
+ /**
52
+ * Typed API error with status, response, and Axios compatibility flag.
53
+ * Replaces `as any` casts in api-client.ts error handling.
54
+ */
55
+ export declare class ApiError extends Error implements AxiosErrorLike {
56
+ status: number;
57
+ response: AxiosErrorLike['response'];
58
+ readonly isAxiosError: true;
59
+ constructor(message: string, status: number, response: AxiosErrorLike['response']);
60
+ }
61
+ //# sourceMappingURL=error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../src/types/error.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;CAWd,CAAC;AAEX,4CAA4C;AAC5C,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,OAAO,WAAW,CAAC,CAAC;AAEvE;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,kEAAkE;IAClE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,+DAA+D;IAC/D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,uEAAuE;IACvE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,8EAA8E;IAC9E,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,wDAAwD;IACxD,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE;QACT,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,IAAI,CAAC,EAAE,OAAO,CAAC;KAChB,CAAC;IACF,MAAM,CAAC,EAAE;QACP,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,IAAI,CAAC;CACpB;AAED;;;GAGG;AACH,qBAAa,QAAS,SAAQ,KAAM,YAAW,cAAc;IAKlD,MAAM,EAAE,MAAM;IACd,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC;IAL7C,SAAgB,YAAY,EAAG,IAAI,CAAU;gBAG3C,OAAO,EAAE,MAAM,EACR,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC;CAM9C"}