@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.
- package/LICENSE +202 -0
- package/README.md +74 -0
- package/cdk.json +91 -0
- package/config.yml +94 -0
- package/dist/boilerplate.d.ts +3 -0
- package/dist/boilerplate.d.ts.map +1 -0
- package/dist/boilerplate.js +58 -0
- package/dist/cdk.json +91 -0
- package/dist/cli.d.ts +62 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +372 -0
- package/dist/commands/bootstrap.d.ts +11 -0
- package/dist/commands/bootstrap.d.ts.map +1 -0
- package/dist/commands/bootstrap.js +159 -0
- package/dist/commands/create-pipeline.d.ts +12 -0
- package/dist/commands/create-pipeline.d.ts.map +1 -0
- package/dist/commands/create-pipeline.js +291 -0
- package/dist/commands/deploy.d.ts +15 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +167 -0
- package/dist/commands/get-pipeline.d.ts +13 -0
- package/dist/commands/get-pipeline.d.ts.map +1 -0
- package/dist/commands/get-pipeline.js +97 -0
- package/dist/commands/get-plugin.d.ts +13 -0
- package/dist/commands/get-plugin.d.ts.map +1 -0
- package/dist/commands/get-plugin.js +98 -0
- package/dist/commands/list-pipelines.d.ts +20 -0
- package/dist/commands/list-pipelines.d.ts.map +1 -0
- package/dist/commands/list-pipelines.js +172 -0
- package/dist/commands/list-plugins.d.ts +20 -0
- package/dist/commands/list-plugins.d.ts.map +1 -0
- package/dist/commands/list-plugins.js +167 -0
- package/dist/commands/login.d.ts +21 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +179 -0
- package/dist/commands/setup-events.d.ts +15 -0
- package/dist/commands/setup-events.d.ts.map +1 -0
- package/dist/commands/setup-events.js +177 -0
- package/dist/commands/status.d.ts +11 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +89 -0
- package/dist/commands/store-token.d.ts +20 -0
- package/dist/commands/store-token.d.ts.map +1 -0
- package/dist/commands/store-token.js +233 -0
- package/dist/commands/synth.d.ts +21 -0
- package/dist/commands/synth.d.ts.map +1 -0
- package/dist/commands/synth.js +143 -0
- package/dist/commands/upload-plugin.d.ts +21 -0
- package/dist/commands/upload-plugin.d.ts.map +1 -0
- package/dist/commands/upload-plugin.js +311 -0
- package/dist/commands/version.d.ts +12 -0
- package/dist/commands/version.d.ts.map +1 -0
- package/dist/commands/version.js +223 -0
- package/dist/config/cli.constants.d.ts +101 -0
- package/dist/config/cli.constants.d.ts.map +1 -0
- package/dist/config/cli.constants.js +165 -0
- package/dist/config.yml +94 -0
- package/dist/templates/events-stack.json +141 -0
- package/dist/types/config.d.ts +44 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +5 -0
- package/dist/types/error.d.ts +61 -0
- package/dist/types/error.d.ts.map +1 -0
- package/dist/types/error.js +39 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +26 -0
- package/dist/types/pipeline.d.ts +144 -0
- package/dist/types/pipeline.d.ts.map +1 -0
- package/dist/types/pipeline.js +5 -0
- package/dist/types/plugin.d.ts +160 -0
- package/dist/types/plugin.d.ts.map +1 -0
- package/dist/types/plugin.js +5 -0
- package/dist/utils/api-client.d.ts +26 -0
- package/dist/utils/api-client.d.ts.map +1 -0
- package/dist/utils/api-client.js +160 -0
- package/dist/utils/audit-log.d.ts +8 -0
- package/dist/utils/audit-log.d.ts.map +1 -0
- package/dist/utils/audit-log.js +53 -0
- package/dist/utils/auth-guard.d.ts +16 -0
- package/dist/utils/auth-guard.d.ts.map +1 -0
- package/dist/utils/auth-guard.js +25 -0
- package/dist/utils/aws-secrets.d.ts +21 -0
- package/dist/utils/aws-secrets.d.ts.map +1 -0
- package/dist/utils/aws-secrets.js +74 -0
- package/dist/utils/banner.d.ts +19 -0
- package/dist/utils/banner.d.ts.map +1 -0
- package/dist/utils/banner.js +59 -0
- package/dist/utils/cdk-utils.d.ts +51 -0
- package/dist/utils/cdk-utils.d.ts.map +1 -0
- package/dist/utils/cdk-utils.js +101 -0
- package/dist/utils/command-utils.d.ts +56 -0
- package/dist/utils/command-utils.d.ts.map +1 -0
- package/dist/utils/command-utils.js +138 -0
- package/dist/utils/config-loader.d.ts +27 -0
- package/dist/utils/config-loader.d.ts.map +1 -0
- package/dist/utils/config-loader.js +166 -0
- package/dist/utils/error-handler.d.ts +29 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +255 -0
- package/dist/utils/list-command-utils.d.ts +23 -0
- package/dist/utils/list-command-utils.d.ts.map +1 -0
- package/dist/utils/list-command-utils.js +60 -0
- package/dist/utils/output-utils.d.ts +60 -0
- package/dist/utils/output-utils.d.ts.map +1 -0
- package/dist/utils/output-utils.js +320 -0
- package/dist/utils/rate-limiter.d.ts +14 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +73 -0
- 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==
|
package/dist/config.yml
ADDED
|
@@ -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"}
|