@pipeline-builder/pipeline-manager 4.1.15 → 4.1.16
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/config.yml +16 -37
- package/dist/boilerplate.js +10 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +97 -79
- package/dist/commands/audit-stacks.js +3 -3
- package/dist/commands/create-pat.d.ts +2 -3
- package/dist/commands/create-pat.d.ts.map +1 -1
- package/dist/commands/create-pat.js +3 -4
- package/dist/commands/create-pipeline.d.ts.map +1 -1
- package/dist/commands/create-pipeline.js +198 -190
- package/dist/commands/list-pipelines.js +2 -2
- package/dist/commands/list-plugins.js +2 -2
- package/dist/commands/login.d.ts +2 -2
- package/dist/commands/login.js +3 -3
- package/dist/commands/new-plugin.d.ts +48 -5
- package/dist/commands/new-plugin.d.ts.map +1 -1
- package/dist/commands/new-plugin.js +261 -95
- package/dist/commands/plugin-lifecycle.d.ts +29 -0
- package/dist/commands/plugin-lifecycle.d.ts.map +1 -0
- package/dist/commands/plugin-lifecycle.js +147 -0
- package/dist/commands/provision.d.ts +42 -2
- package/dist/commands/provision.d.ts.map +1 -1
- package/dist/commands/provision.js +184 -147
- package/dist/commands/publish-plugin.d.ts +62 -0
- package/dist/commands/publish-plugin.d.ts.map +1 -0
- package/dist/commands/publish-plugin.js +224 -0
- package/dist/commands/redrive-events.d.ts +1 -1
- package/dist/commands/redrive-events.js +2 -2
- package/dist/commands/store-token.d.ts +46 -1
- package/dist/commands/store-token.d.ts.map +1 -1
- package/dist/commands/store-token.js +127 -102
- package/dist/commands/test-plugin.d.ts +72 -0
- package/dist/commands/test-plugin.d.ts.map +1 -0
- package/dist/commands/test-plugin.js +285 -0
- package/dist/commands/upload-plugin.d.ts +6 -7
- package/dist/commands/upload-plugin.d.ts.map +1 -1
- package/dist/commands/upload-plugin.js +127 -189
- package/dist/commands/validate-plugin.d.ts +37 -4
- package/dist/commands/validate-plugin.d.ts.map +1 -1
- package/dist/commands/validate-plugin.js +129 -144
- package/dist/commands/validate-templates.d.ts.map +1 -1
- package/dist/commands/validate-templates.js +8 -9
- package/dist/config/plugin-catalog-assets.d.ts +13 -0
- package/dist/config/plugin-catalog-assets.d.ts.map +1 -0
- package/dist/config/plugin-catalog-assets.js +21 -0
- package/dist/config.yml +16 -37
- package/dist/lambda/token-renew-handler.d.ts.map +1 -1
- package/dist/lambda/token-renew-handler.js +109 -154
- package/dist/types/config.d.ts +2 -6
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +1 -1
- package/dist/types/plugin.d.ts +21 -0
- package/dist/types/plugin.d.ts.map +1 -1
- package/dist/types/plugin.js +1 -1
- package/dist/utils/aws-env.d.ts +1 -2
- package/dist/utils/aws-env.d.ts.map +1 -1
- package/dist/utils/aws-env.js +2 -3
- package/dist/utils/catalog-prompt.d.ts +26 -0
- package/dist/utils/catalog-prompt.d.ts.map +1 -0
- package/dist/utils/catalog-prompt.js +113 -0
- package/dist/utils/command-utils.d.ts.map +1 -1
- package/dist/utils/command-utils.js +14 -3
- package/dist/utils/config-loader.d.ts.map +1 -1
- package/dist/utils/config-loader.js +4 -6
- package/dist/utils/credential-store.d.ts +16 -0
- package/dist/utils/credential-store.d.ts.map +1 -1
- package/dist/utils/credential-store.js +57 -2
- package/dist/utils/deploy-runner.d.ts.map +1 -1
- package/dist/utils/deploy-runner.js +7 -2
- package/dist/utils/pipeline-config.d.ts +1 -2
- package/dist/utils/pipeline-config.d.ts.map +1 -1
- package/dist/utils/pipeline-config.js +1 -1
- package/dist/utils/plugin-docker.d.ts +44 -0
- package/dist/utils/plugin-docker.d.ts.map +1 -0
- package/dist/utils/plugin-docker.js +71 -0
- package/dist/utils/plugin-package.d.ts +40 -0
- package/dist/utils/plugin-package.d.ts.map +1 -0
- package/dist/utils/plugin-package.js +159 -0
- package/dist/utils/plugin-resolver.d.ts.map +1 -1
- package/dist/utils/plugin-resolver.js +43 -29
- package/dist/utils/plugin-scan.d.ts +22 -0
- package/dist/utils/plugin-scan.d.ts.map +1 -0
- package/dist/utils/plugin-scan.js +52 -0
- package/dist/utils/plugin-zip.d.ts +15 -0
- package/dist/utils/plugin-zip.d.ts.map +1 -0
- package/dist/utils/plugin-zip.js +96 -0
- package/dist/utils/registry.d.ts +15 -0
- package/dist/utils/registry.d.ts.map +1 -1
- package/dist/utils/registry.js +17 -2
- package/dist/utils/service-account.d.ts.map +1 -1
- package/dist/utils/service-account.js +9 -10
- package/package.json +45 -8
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { Command } from 'commander';
|
|
4
|
+
import pico from 'picocolors';
|
|
5
|
+
import {} from '../config/cli.constants.js';
|
|
6
|
+
import {} from '../types/index.js';
|
|
7
|
+
import { createAuthenticatedClient, printCommandHeader, printExecutionSummary, printSslWarning, validateEntityId, withSslOptions, } from '../utils/command-utils.js';
|
|
8
|
+
import { ERROR_CODES, handleError, ValidationError } from '../utils/error-handler.js';
|
|
9
|
+
import { outputData, printInfo, printKeyValue, printSection, printSuccess } from '../utils/output-utils.js';
|
|
10
|
+
import { extractSingleResponse, unwrapEnvelope } from '../utils/response-utils.js';
|
|
11
|
+
const { bold, green, yellow, red } = pico;
|
|
12
|
+
/** Server cap on a deprecation message / yank reason. */
|
|
13
|
+
export const LIFECYCLE_TEXT_MAX = 500;
|
|
14
|
+
/**
|
|
15
|
+
* `POST /api/plugins/:id/<action>`, on the plugins API base (`pluginUrl`): the
|
|
16
|
+
* API gateway routes `/api/plugins/*` to the plugin service.
|
|
17
|
+
*/
|
|
18
|
+
function lifecycleUrl(client, id, action) {
|
|
19
|
+
return `${client.getConfig().api.pluginUrl}/${encodeURIComponent(id)}/${action}`;
|
|
20
|
+
}
|
|
21
|
+
function checkText(value, flag, required) {
|
|
22
|
+
const trimmed = value?.trim();
|
|
23
|
+
if (!trimmed) {
|
|
24
|
+
if (required)
|
|
25
|
+
throw new ValidationError(`--${flag} is required`, flag);
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
if (trimmed.length > LIFECYCLE_TEXT_MAX) {
|
|
29
|
+
throw new ValidationError(`--${flag} must be at most ${LIFECYCLE_TEXT_MAX} characters`, flag, `${trimmed.length} characters`);
|
|
30
|
+
}
|
|
31
|
+
return trimmed;
|
|
32
|
+
}
|
|
33
|
+
function finish(executionId, startTime, plugin, options) {
|
|
34
|
+
printExecutionSummary(executionId, Date.now() - startTime);
|
|
35
|
+
outputData(plugin, { format: options.format, file: options.output, silent: false });
|
|
36
|
+
if (options.output)
|
|
37
|
+
printSuccess('Plugin data saved', { path: options.output });
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Registers `plugin deprecate`: mark a version deprecated (or clear it with
|
|
41
|
+
* `--undo`). A deprecated version keeps resolving, but synth prints a warning,
|
|
42
|
+
* AI selection stops offering it, and the org approvers of every org whose
|
|
43
|
+
* pipelines use it are notified.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```bash
|
|
47
|
+
* pipeline-manager plugin deprecate --id <plugin-id> --message "Use 2.x"
|
|
48
|
+
* pipeline-manager plugin deprecate --id <plugin-id> --undo
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export function deprecatePlugin(program) {
|
|
52
|
+
withSslOptions(program
|
|
53
|
+
.command('deprecate')
|
|
54
|
+
.description('Deprecate a plugin version (it keeps resolving, with a warning)')
|
|
55
|
+
.requiredOption('-i, --id <id>', 'Plugin ID (one version)')
|
|
56
|
+
.option('-m, --message <text>', `Message shown to users of the version (max ${LIFECYCLE_TEXT_MAX})`)
|
|
57
|
+
.option('--undo', 'Clear the deprecation instead', false)
|
|
58
|
+
.option('-f, --format <format>', 'Output format (json, yaml, table)', 'json')
|
|
59
|
+
.option('-o, --output <file>', 'Save the updated plugin to file'))
|
|
60
|
+
.action(async (options) => {
|
|
61
|
+
const executionId = printCommandHeader(options.undo ? 'Clear Plugin Deprecation' : 'Deprecate Plugin');
|
|
62
|
+
try {
|
|
63
|
+
printSslWarning(options.verifySsl);
|
|
64
|
+
if (options.undo && options.message) {
|
|
65
|
+
throw new ValidationError('--message cannot be combined with --undo', 'message');
|
|
66
|
+
}
|
|
67
|
+
const id = validateEntityId(options.id, 'Plugin');
|
|
68
|
+
const message = checkText(options.message, 'message', false);
|
|
69
|
+
printInfo('Request parameters', { id, deprecated: !options.undo, message: message ?? '(none)' });
|
|
70
|
+
const client = createAuthenticatedClient(options);
|
|
71
|
+
const startTime = Date.now();
|
|
72
|
+
const body = options.undo ? { deprecated: false } : { deprecated: true, ...(message ? { message } : {}) };
|
|
73
|
+
const response = await client.post(lifecycleUrl(client, id, 'deprecate'), body);
|
|
74
|
+
const plugin = extractSingleResponse(response, 'plugin', 'id');
|
|
75
|
+
if (!plugin)
|
|
76
|
+
throw new Error(`No plugin returned for ID: ${id}`);
|
|
77
|
+
console.log('');
|
|
78
|
+
printSection(options.undo ? 'Deprecation Cleared' : 'Plugin Version Deprecated');
|
|
79
|
+
printKeyValue({
|
|
80
|
+
Plugin: green(bold(`${plugin.name}@${plugin.version}`)),
|
|
81
|
+
Deprecated: plugin.deprecatedAt ? yellow(`yes (${plugin.deprecatedAt})`) : 'no',
|
|
82
|
+
...(plugin.deprecationMessage ? { Message: plugin.deprecationMessage } : {}),
|
|
83
|
+
});
|
|
84
|
+
finish(executionId, startTime, plugin, options);
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
handleError(error, ERROR_CODES.API_REQUEST, {
|
|
88
|
+
debug: program.opts().debug,
|
|
89
|
+
exit: true,
|
|
90
|
+
context: { command: 'plugin-deprecate', executionId, pluginId: options.id },
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Registers `plugin yank`: stop a version resolving for new synths. Ranges,
|
|
97
|
+
* `latest` and the default skip it; an exact pin still resolves, with a warning
|
|
98
|
+
* carrying the reason. Yanking the default promotes the next version. A version
|
|
99
|
+
* published to the ecosystem is refused (409) — request the yank there.
|
|
100
|
+
*
|
|
101
|
+
* @example
|
|
102
|
+
* ```bash
|
|
103
|
+
* pipeline-manager plugin yank --id <plugin-id> --reason "Leaks tokens in logs; use 1.2.1"
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
export function yankPlugin(program) {
|
|
107
|
+
withSslOptions(program
|
|
108
|
+
.command('yank')
|
|
109
|
+
.description('Yank a plugin version (stops resolving for ranges, latest and the default)')
|
|
110
|
+
.requiredOption('-i, --id <id>', 'Plugin ID (one version)')
|
|
111
|
+
.requiredOption('-r, --reason <text>', `Why it was yanked, shown to exact pins (max ${LIFECYCLE_TEXT_MAX})`)
|
|
112
|
+
.option('-f, --format <format>', 'Output format (json, yaml, table)', 'json')
|
|
113
|
+
.option('-o, --output <file>', 'Save the updated plugin to file'))
|
|
114
|
+
.action(async (options) => {
|
|
115
|
+
const executionId = printCommandHeader('Yank Plugin');
|
|
116
|
+
try {
|
|
117
|
+
printSslWarning(options.verifySsl);
|
|
118
|
+
const id = validateEntityId(options.id, 'Plugin');
|
|
119
|
+
const reason = checkText(options.reason, 'reason', true);
|
|
120
|
+
printInfo('Request parameters', { id, reason });
|
|
121
|
+
const client = createAuthenticatedClient(options);
|
|
122
|
+
const startTime = Date.now();
|
|
123
|
+
const response = await client.post(lifecycleUrl(client, id, 'yank'), { reason });
|
|
124
|
+
const plugin = extractSingleResponse(response, 'plugin', 'id');
|
|
125
|
+
if (!plugin)
|
|
126
|
+
throw new Error(`No plugin returned for ID: ${id}`);
|
|
127
|
+
const promoted = unwrapEnvelope(response).promotedDefault;
|
|
128
|
+
console.log('');
|
|
129
|
+
printSection('Plugin Version Yanked');
|
|
130
|
+
printKeyValue({
|
|
131
|
+
Plugin: green(bold(`${plugin.name}@${plugin.version}`)),
|
|
132
|
+
Yanked: red(plugin.yankedAt ?? 'yes'),
|
|
133
|
+
Reason: plugin.yankReason ?? reason,
|
|
134
|
+
...(promoted ? { 'New default': `${plugin.name}@${promoted.version}` } : {}),
|
|
135
|
+
});
|
|
136
|
+
finish(executionId, startTime, plugin, options);
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
handleError(error, ERROR_CODES.API_REQUEST, {
|
|
140
|
+
debug: program.opts().debug,
|
|
141
|
+
exit: true,
|
|
142
|
+
context: { command: 'plugin-yank', executionId, pluginId: options.id },
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWxpZmVjeWNsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9wbHVnaW4tbGlmZWN5Y2xlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLElBQUksTUFBTSxZQUFZLENBQUM7QUFDOUIsT0FBTyxFQUFxQixNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBd0MsTUFBTSxtQkFBbUIsQ0FBQztBQUN6RSxPQUFPLEVBQ0wseUJBQXlCLEVBQUUsa0JBQWtCLEVBQUUscUJBQXFCLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLGNBQWMsR0FDeEgsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN0RixPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzVHLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVuRixNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBRTFDLHlEQUF5RDtBQUN6RCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLENBQUM7QUFTdEM7OztHQUdHO0FBQ0gsU0FBUyxZQUFZLENBQUMsTUFBb0QsRUFBRSxFQUFVLEVBQUUsTUFBNEI7SUFDbEgsT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsU0FBUyxJQUFJLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDO0FBQ25GLENB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SUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQzdFLENBQUMsQ0FBQztZQUNILE1BQU0sQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLFdBQVcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLFdBQVcsRUFBRTtnQkFDMUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLO2dCQUMzQixJQUFJLEVBQUUsSUFBSTtnQkFDVixPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRTthQUN2RSxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHBpY28gZnJvbSAncGljb2NvbG9ycyc7XG5pbXBvcnQgeyB0eXBlIE91dHB1dEZvcm1hdCB9IGZyb20gJy4uL2NvbmZpZy9jbGkuY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IHR5cGUgUGx1Z2luLCB0eXBlIFBsdWdpbllhbmtSZXNwb25zZSB9IGZyb20gJy4uL3R5cGVzL2luZGV4LmpzJztcbmltcG9ydCB7XG4gIGNyZWF0ZUF1dGhlbnRpY2F0ZWRDbGllbnQsIHByaW50Q29tbWFuZEhlYWRlciwgcHJpbnRFeGVjdXRpb25TdW1tYXJ5LCBwcmludFNzbFdhcm5pbmcsIHZhbGlkYXRlRW50aXR5SWQsIHdpdGhTc2xPcHRpb25zLFxufSBmcm9tICcuLi91dGlscy9jb21tYW5kLXV0aWxzLmpzJztcbmltcG9ydCB7IEVSUk9SX0NPREVTLCBoYW5kbGVFcnJvciwgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZXJyb3ItaGFuZGxlci5qcyc7XG5pbXBvcnQgeyBvdXRwdXREYXRhLCBwcmludEluZm8sIHByaW50S2V5VmFsdWUsIHByaW50U2VjdGlvbiwgcHJpbnRTdWNjZXNzIH0gZnJvbSAnLi4vdXRpbHMvb3V0cHV0LXV0aWxzLmpzJztcbmltcG9ydCB7IGV4dHJhY3RTaW5nbGVSZXNwb25zZSwgdW53cmFwRW52ZWxvcGUgfSBmcm9tICcuLi91dGlscy9yZXNwb25zZS11dGlscy5qcyc7XG5cbmNvbnN0IHsgYm9sZCwgZ3JlZW4sIHllbGxvdywgcmVkIH0gPSBwaWNvO1xuXG4vKiogU2VydmVyIGNhcCBvbiBhIGRlcHJlY2F0aW9uIG1lc3NhZ2UgLyB5YW5rIHJlYXNvbi4gKi9cbmV4cG9ydCBjb25zdCBMSUZFQ1lDTEVfVEVYVF9NQVggPSA1MDA7XG5cbmludGVyZmFjZSBMaWZlY3ljbGVPcHRpb25zIHtcbiAgaWQ6IHN0cmluZztcbiAgZm9ybWF0OiBPdXRwdXRGb3JtYXQ7XG4gIG91dHB1dD86IHN0cmluZztcbiAgdmVyaWZ5U3NsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBgUE9TVCAvYXBpL3BsdWdpbnMvOmlkLzxhY3Rpb24+YCwgb24gdGhlIHBsdWdpbnMgQVBJIGJhc2UgKGBwbHVnaW5VcmxgKTogdGhlXG4gKiBBUEkgZ2F0ZXdheSByb3V0ZXMgYC9hcGkvcGx1Z2lucy8qYCB0byB0aGUgcGx1Z2luIHNlcnZpY2UuXG4gKi9cbmZ1bmN0aW9uIGxpZmVjeWNsZVVybChjbGllbnQ6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUF1dGhlbnRpY2F0ZWRDbGllbnQ+LCBpZDogc3RyaW5nLCBhY3Rpb246ICdkZXByZWNhdGUnIHwgJ3lhbmsnKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2NsaWVudC5nZXRDb25maWcoKS5hcGkucGx1Z2luVXJsfS8ke2VuY29kZVVSSUNvbXBvbmVudChpZCl9LyR7YWN0aW9ufWA7XG59XG5cbmZ1bmN0aW9uIGNoZWNrVGV4dCh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBmbGFnOiBzdHJpbmcsIHJlcXVpcmVkOiBib29sZWFuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdHJpbW1lZCA9IHZhbHVlPy50cmltKCk7XG4gIGlmICghdHJpbW1lZCkge1xuICAgIGlmIChyZXF1aXJlZCkgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgLS0ke2ZsYWd9IGlzIHJlcXVpcmVkYCwgZmxhZyk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAodHJpbW1lZC5sZW5ndGggPiBMSUZFQ1lDTEVfVEVYVF9NQVgpIHtcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGAtLSR7ZmxhZ30gbXVzdCBiZSBhdCBtb3N0ICR7TElGRUNZQ0xFX1RFWFRfTUFYfSBjaGFyYWN0ZXJzYCwgZmxhZywgYCR7dHJpbW1lZC5sZW5ndGh9IGNoYXJhY3RlcnNgKTtcbiAgfVxuICByZXR1cm4gdHJpbW1lZDtcbn1cblxuZnVuY3Rpb24gZmluaXNoKGV4ZWN1dGlvbklkOiBzdHJpbmcsIHN0YXJ0VGltZTogbnVtYmVyLCBwbHVnaW46IFBsdWdpbiwgb3B0aW9uczogTGlmZWN5Y2xlT3B0aW9ucyk6IHZvaWQge1xuICBwcmludEV4ZWN1dGlvblN1bW1hcnkoZXhlY3V0aW9uSWQsIERhdGUubm93KCkgLSBzdGFydFRpbWUpO1xuICBvdXRwdXREYXRhKHBsdWdpbiwgeyBmb3JtYXQ6IG9wdGlvbnMuZm9ybWF0LCBmaWxlOiBvcHRpb25zLm91dHB1dCwgc2lsZW50OiBmYWxzZSB9KTtcbiAgaWYgKG9wdGlvbnMub3V0cHV0KSBwcmludFN1Y2Nlc3MoJ1BsdWdpbiBkYXRhIHNhdmVkJywgeyBwYXRoOiBvcHRpb25zLm91dHB1dCB9KTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYHBsdWdpbiBkZXByZWNhdGVgOiBtYXJrIGEgdmVyc2lvbiBkZXByZWNhdGVkIChvciBjbGVhciBpdCB3aXRoXG4gKiBgLS11bmRvYCkuIEEgZGVwcmVjYXRlZCB2ZXJzaW9uIGtlZXBzIHJlc29sdmluZywgYnV0IHN5bnRoIHByaW50cyBhIHdhcm5pbmcsXG4gKiBBSSBzZWxlY3Rpb24gc3RvcHMgb2ZmZXJpbmcgaXQsIGFuZCB0aGUgb3JnIGFwcHJvdmVycyBvZiBldmVyeSBvcmcgd2hvc2VcbiAqIHBpcGVsaW5lcyB1c2UgaXQgYXJlIG5vdGlmaWVkLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBiYXNoXG4gKiBwaXBlbGluZS1tYW5hZ2VyIHBsdWdpbiBkZXByZWNhdGUgLS1pZCA8cGx1Z2luLWlkPiAtLW1lc3NhZ2UgXCJVc2UgMi54XCJcbiAqIHBpcGVsaW5lLW1hbmFnZXIgcGx1Z2luIGRlcHJlY2F0ZSAtLWlkIDxwbHVnaW4taWQ+IC0tdW5kb1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXByZWNhdGVQbHVnaW4ocHJvZ3JhbTogQ29tbWFuZCk6IHZvaWQge1xuICB3aXRoU3NsT3B0aW9ucyhcbiAgICBwcm9ncmFtXG4gICAgICAuY29tbWFuZCgnZGVwcmVjYXRlJylcbiAgICAgIC5kZXNjcmlwdGlvbignRGVwcmVjYXRlIGEgcGx1Z2luIHZlcnNpb24gKGl0IGtlZXBzIHJlc29sdmluZywgd2l0aCBhIHdhcm5pbmcpJylcbiAgICAgIC5yZXF1aXJlZE9wdGlvbignLWksIC0taWQgPGlkPicsICdQbHVnaW4gSUQgKG9uZSB2ZXJzaW9uKScpXG4gICAgICAub3B0aW9uKCctbSwgLS1tZXNzYWdlIDx0ZXh0PicsIGBNZXNzYWdlIHNob3duIHRvIHVzZXJzIG9mIHRoZSB2ZXJzaW9uIChtYXggJHtMSUZFQ1lDTEVfVEVYVF9NQVh9KWApXG4gICAgICAub3B0aW9uKCctLXVuZG8nLCAnQ2xlYXIgdGhlIGRlcHJlY2F0aW9uIGluc3RlYWQnLCBmYWxzZSlcbiAgICAgIC5vcHRpb24oJy1mLCAtLWZvcm1hdCA8Zm9ybWF0PicsICdPdXRwdXQgZm9ybWF0IChqc29uLCB5YW1sLCB0YWJsZSknLCAnanNvbicpXG4gICAgICAub3B0aW9uKCctbywgLS1vdXRwdXQgPGZpbGU+JywgJ1NhdmUgdGhlIHVwZGF0ZWQgcGx1Z2luIHRvIGZpbGUnKSxcbiAgKVxuICAgIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnM6IExpZmVjeWNsZU9wdGlvbnMgJiB7IG1lc3NhZ2U/OiBzdHJpbmc7IHVuZG86IGJvb2xlYW4gfSkgPT4ge1xuICAgICAgY29uc3QgZXhlY3V0aW9uSWQgPSBwcmludENvbW1hbmRIZWFkZXIob3B0aW9ucy51bmRvID8gJ0NsZWFyIFBsdWdpbiBEZXByZWNhdGlvbicgOiAnRGVwcmVjYXRlIFBsdWdpbicpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcHJpbnRTc2xXYXJuaW5nKG9wdGlvbnMudmVyaWZ5U3NsKTtcbiAgICAgICAgaWYgKG9wdGlvbnMudW5kbyAmJiBvcHRpb25zLm1lc3NhZ2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCctLW1lc3NhZ2UgY2Fubm90IGJlIGNvbWJpbmVkIHdpdGggLS11bmRvJywgJ21lc3NhZ2UnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpZCA9IHZhbGlkYXRlRW50aXR5SWQob3B0aW9ucy5pZCwgJ1BsdWdpbicpO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gY2hlY2tUZXh0KG9wdGlvbnMubWVzc2FnZSwgJ21lc3NhZ2UnLCBmYWxzZSk7XG4gICAgICAgIHByaW50SW5mbygnUmVxdWVzdCBwYXJhbWV0ZXJzJywgeyBpZCwgZGVwcmVjYXRlZDogIW9wdGlvbnMudW5kbywgbWVzc2FnZTogbWVzc2FnZSA/PyAnKG5vbmUpJyB9KTtcblxuICAgICAgICBjb25zdCBjbGllbnQgPSBjcmVhdGVBdXRoZW50aWNhdGVkQ2xpZW50KG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICBjb25zdCBib2R5ID0gb3B0aW9ucy51bmRvID8geyBkZXByZWNhdGVkOiBmYWxzZSB9IDogeyBkZXByZWNhdGVkOiB0cnVlLCAuLi4obWVzc2FnZSA/IHsgbWVzc2FnZSB9IDoge30pIH07XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnBvc3QobGlmZWN5Y2xlVXJsKGNsaWVudCwgaWQsICdkZXByZWNhdGUnKSwgYm9keSk7XG4gICAgICAgIGNvbnN0IHBsdWdpbiA9IGV4dHJhY3RTaW5nbGVSZXNwb25zZTxQbHVnaW4+KHJlc3BvbnNlLCAncGx1Z2luJywgJ2lkJyk7XG4gICAgICAgIGlmICghcGx1Z2luKSB0aHJvdyBuZXcgRXJyb3IoYE5vIHBsdWdpbiByZXR1cm5lZCBmb3IgSUQ6ICR7aWR9YCk7XG5cbiAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICBwcmludFNlY3Rpb24ob3B0aW9ucy51bmRvID8gJ0RlcHJlY2F0aW9uIENsZWFyZWQnIDogJ1BsdWdpbiBWZXJzaW9uIERlcHJlY2F0ZWQnKTtcbiAgICAgICAgcHJpbnRLZXlWYWx1ZSh7XG4gICAgICAgICAgUGx1Z2luOiBncmVlbihib2xkKGAke3BsdWdpbi5uYW1lfUAke3BsdWdpbi52ZXJzaW9ufWApKSxcbiAgICAgICAgICBEZXByZWNhdGVkOiBwbHVnaW4uZGVwcmVjYXRlZEF0ID8geWVsbG93KGB5ZXMgKCR7cGx1Z2luLmRlcHJlY2F0ZWRBdH0pYCkgOiAnbm8nLFxuICAgICAgICAgIC4uLihwbHVnaW4uZGVwcmVjYXRpb25NZXNzYWdlID8geyBNZXNzYWdlOiBwbHVnaW4uZGVwcmVjYXRpb25NZXNzYWdlIH0gOiB7fSksXG4gICAgICAgIH0pO1xuICAgICAgICBmaW5pc2goZXhlY3V0aW9uSWQsIHN0YXJ0VGltZSwgcGx1Z2luLCBvcHRpb25zKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGhhbmRsZUVycm9yKGVycm9yLCBFUlJPUl9DT0RFUy5BUElfUkVRVUVTVCwge1xuICAgICAgICAgIGRlYnVnOiBwcm9ncmFtLm9wdHMoKS5kZWJ1ZyxcbiAgICAgICAgICBleGl0OiB0cnVlLFxuICAgICAgICAgIGNvbnRleHQ6IHsgY29tbWFuZDogJ3BsdWdpbi1kZXByZWNhdGUnLCBleGVjdXRpb25JZCwgcGx1Z2luSWQ6IG9wdGlvbnMuaWQgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGBwbHVnaW4geWFua2A6IHN0b3AgYSB2ZXJzaW9uIHJlc29sdmluZyBmb3IgbmV3IHN5bnRocy4gUmFuZ2VzLFxuICogYGxhdGVzdGAgYW5kIHRoZSBkZWZhdWx0IHNraXAgaXQ7IGFuIGV4YWN0IHBpbiBzdGlsbCByZXNvbHZlcywgd2l0aCBhIHdhcm5pbmdcbiAqIGNhcnJ5aW5nIHRoZSByZWFzb24uIFlhbmtpbmcgdGhlIGRlZmF1bHQgcHJvbW90ZXMgdGhlIG5leHQgdmVyc2lvbi4gQSB2ZXJzaW9uXG4gKiBwdWJsaXNoZWQgdG8gdGhlIGVjb3N5c3RlbSBpcyByZWZ1c2VkICg0MDkpIOKAlCByZXF1ZXN0IHRoZSB5YW5rIHRoZXJlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBiYXNoXG4gKiBwaXBlbGluZS1tYW5hZ2VyIHBsdWdpbiB5YW5rIC0taWQgPHBsdWdpbi1pZD4gLS1yZWFzb24gXCJMZWFrcyB0b2tlbnMgaW4gbG9nczsgdXNlIDEuMi4xXCJcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24geWFua1BsdWdpbihwcm9ncmFtOiBDb21tYW5kKTogdm9pZCB7XG4gIHdpdGhTc2xPcHRpb25zKFxuICAgIHByb2dyYW1cbiAgICAgIC5jb21tYW5kKCd5YW5rJylcbiAgICAgIC5kZXNjcmlwdGlvbignWWFuayBhIHBsdWdpbiB2ZXJzaW9uIChzdG9wcyByZXNvbHZpbmcgZm9yIHJhbmdlcywgbGF0ZXN0IGFuZCB0aGUgZGVmYXVsdCknKVxuICAgICAgLnJlcXVpcmVkT3B0aW9uKCctaSwgLS1pZCA8aWQ+JywgJ1BsdWdpbiBJRCAob25lIHZlcnNpb24pJylcbiAgICAgIC5yZXF1aXJlZE9wdGlvbignLXIsIC0tcmVhc29uIDx0ZXh0PicsIGBXaHkgaXQgd2FzIHlhbmtlZCwgc2hvd24gdG8gZXhhY3QgcGlucyAobWF4ICR7TElGRUNZQ0xFX1RFWFRfTUFYfSlgKVxuICAgICAgLm9wdGlvbignLWYsIC0tZm9ybWF0IDxmb3JtYXQ+JywgJ091dHB1dCBmb3JtYXQgKGpzb24sIHlhbWwsIHRhYmxlKScsICdqc29uJylcbiAgICAgIC5vcHRpb24oJy1vLCAtLW91dHB1dCA8ZmlsZT4nLCAnU2F2ZSB0aGUgdXBkYXRlZCBwbHVnaW4gdG8gZmlsZScpLFxuICApXG4gICAgLmFjdGlvbihhc3luYyAob3B0aW9uczogTGlmZWN5Y2xlT3B0aW9ucyAmIHsgcmVhc29uOiBzdHJpbmcgfSkgPT4ge1xuICAgICAgY29uc3QgZXhlY3V0aW9uSWQgPSBwcmludENvbW1hbmRIZWFkZXIoJ1lhbmsgUGx1Z2luJyk7XG4gICAgICB0cnkge1xuICAgICAgICBwcmludFNzbFdhcm5pbmcob3B0aW9ucy52ZXJpZnlTc2wpO1xuICAgICAgICBjb25zdCBpZCA9IHZhbGlkYXRlRW50aXR5SWQob3B0aW9ucy5pZCwgJ1BsdWdpbicpO1xuICAgICAgICBjb25zdCByZWFzb24gPSBjaGVja1RleHQob3B0aW9ucy5yZWFzb24sICdyZWFzb24nLCB0cnVlKSE7XG4gICAgICAgIHByaW50SW5mbygnUmVxdWVzdCBwYXJhbWV0ZXJzJywgeyBpZCwgcmVhc29uIH0pO1xuXG4gICAgICAgIGNvbnN0IGNsaWVudCA9IGNyZWF0ZUF1dGhlbnRpY2F0ZWRDbGllbnQob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnBvc3QobGlmZWN5Y2xlVXJsKGNsaWVudCwgaWQsICd5YW5rJyksIHsgcmVhc29uIH0pO1xuICAgICAgICBjb25zdCBwbHVnaW4gPSBleHRyYWN0U2luZ2xlUmVzcG9uc2U8UGx1Z2luPihyZXNwb25zZSwgJ3BsdWdpbicsICdpZCcpO1xuICAgICAgICBpZiAoIXBsdWdpbikgdGhyb3cgbmV3IEVycm9yKGBObyBwbHVnaW4gcmV0dXJuZWQgZm9yIElEOiAke2lkfWApO1xuICAgICAgICBjb25zdCBwcm9tb3RlZCA9ICh1bndyYXBFbnZlbG9wZShyZXNwb25zZSkgYXMgUGFydGlhbDxQbHVnaW5ZYW5rUmVzcG9uc2U+KS5wcm9tb3RlZERlZmF1bHQ7XG5cbiAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICBwcmludFNlY3Rpb24oJ1BsdWdpbiBWZXJzaW9uIFlhbmtlZCcpO1xuICAgICAgICBwcmludEtleVZhbHVlKHtcbiAgICAgICAgICBQbHVnaW46IGdyZWVuKGJvbGQoYCR7cGx1Z2luLm5hbWV9QCR7cGx1Z2luLnZlcnNpb259YCkpLFxuICAgICAgICAgIFlhbmtlZDogcmVkKHBsdWdpbi55YW5rZWRBdCA/PyAneWVzJyksXG4gICAgICAgICAgUmVhc29uOiBwbHVnaW4ueWFua1JlYXNvbiA/PyByZWFzb24sXG4gICAgICAgICAgLi4uKHByb21vdGVkID8geyAnTmV3IGRlZmF1bHQnOiBgJHtwbHVnaW4ubmFtZX1AJHtwcm9tb3RlZC52ZXJzaW9ufWAgfSA6IHt9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIGZpbmlzaChleGVjdXRpb25JZCwgc3RhcnRUaW1lLCBwbHVnaW4sIG9wdGlvbnMpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaGFuZGxlRXJyb3IoZXJyb3IsIEVSUk9SX0NPREVTLkFQSV9SRVFVRVNULCB7XG4gICAgICAgICAgZGVidWc6IHByb2dyYW0ub3B0cygpLmRlYnVnLFxuICAgICAgICAgIGV4aXQ6IHRydWUsXG4gICAgICAgICAgY29udGV4dDogeyBjb21tYW5kOiAncGx1Z2luLXlhbmsnLCBleGVjdXRpb25JZCwgcGx1Z2luSWQ6IG9wdGlvbnMuaWQgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG59XG4iXX0=
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
+
import { type AiOptions } from '../agent/ai.js';
|
|
2
3
|
import { type BootstrapSpec } from '../agent/bootstrap.js';
|
|
3
4
|
import { type PostStep, type SkippedStep } from '../agent/post-steps.js';
|
|
4
|
-
import { type
|
|
5
|
+
import { type PrereqCheck } from '../agent/prereqs.js';
|
|
6
|
+
import { type AssembleResult, type TargetId, type TargetSpec } from '../agent/targets.js';
|
|
5
7
|
/**
|
|
6
8
|
* Post-deploy initialization mode (the single `--init <mode>` flag):
|
|
7
9
|
* - `auto` — init-platform runs once the platform is up (register admin + load plugins/
|
|
@@ -76,7 +78,7 @@ export declare function runPostSteps(postSteps: PostStep[], skippedSteps: Skippe
|
|
|
76
78
|
* Sparse-clone the platform repo (when --repo, or accepted via the interactive
|
|
77
79
|
* offer), repoint cwd into it, and verify the deploy entrypoint exists. Owns the
|
|
78
80
|
* cwd/bootstrapped state. Sets exitCode on a hard failure (clone error / missing
|
|
79
|
-
* entrypoint)
|
|
81
|
+
* entrypoint); a plain decline leaves exitCode
|
|
80
82
|
* untouched. Returns ok:false when the caller must abort.
|
|
81
83
|
*/
|
|
82
84
|
export declare function bootstrapAndLocate(spec: TargetSpec, bootstrap: BootstrapSpec, bootstrapCmd: string | null, sparsePaths: readonly string[], startCwd: string, opts: {
|
|
@@ -104,6 +106,44 @@ export declare function resolveLoadsInteractively(target: TargetId, url: string
|
|
|
104
106
|
steps: PostStep[];
|
|
105
107
|
skipped: SkippedStep[];
|
|
106
108
|
}>;
|
|
109
|
+
/**
|
|
110
|
+
* Assemble deploy params from explicit flags (flags always win over the NL
|
|
111
|
+
* parse, which only fills gaps).
|
|
112
|
+
*/
|
|
113
|
+
export declare function buildParams(options: Record<string, unknown>, selfInit: boolean): Record<string, unknown>;
|
|
114
|
+
/**
|
|
115
|
+
* `--diagnose <file>`: explain a deploy failure with the configured model. A
|
|
116
|
+
* read-only inspection mode — the caller returns afterwards whether or not a
|
|
117
|
+
* target was given, so it never falls through into a (possibly --yes) deploy.
|
|
118
|
+
*/
|
|
119
|
+
export declare function runDiagnose(file: string, json: boolean, aiOpts: AiOptions, executionId: string): Promise<void>;
|
|
120
|
+
/** Print the provision plan (shown before the gated execution). */
|
|
121
|
+
export declare function printPlan(p: {
|
|
122
|
+
spec: TargetSpec;
|
|
123
|
+
target: TargetId;
|
|
124
|
+
prereqs: PrereqCheck[];
|
|
125
|
+
missing: AssembleResult['missing'];
|
|
126
|
+
bootstrap: BootstrapSpec;
|
|
127
|
+
bootstrapCmd: string | null;
|
|
128
|
+
sparsePaths: string[];
|
|
129
|
+
command: string;
|
|
130
|
+
postSteps: PostStep[];
|
|
131
|
+
skippedSteps: SkippedStep[];
|
|
132
|
+
}): void;
|
|
133
|
+
/**
|
|
134
|
+
* local/minikube's setup.sh REQUIRES a `.env` and aborts without it — create
|
|
135
|
+
* it from .env.example with generated secrets so the deploy is non-interactive.
|
|
136
|
+
* ec2 and eks don't need a local `.env`: ec2 bootstraps its secrets on the
|
|
137
|
+
* instance, and eks's setup.sh creates the k8s secrets itself.
|
|
138
|
+
*/
|
|
139
|
+
export declare function ensureLocalEnvFile(target: TargetId, spec: TargetSpec, cwd: string, yes: boolean): Promise<void>;
|
|
140
|
+
/**
|
|
141
|
+
* Any missing required prereq that's a single static binary (e.g. yq) can be
|
|
142
|
+
* fetched into the tools cache instead of a system install — no brew/apt.
|
|
143
|
+
* Offer it, then re-check (the cache dir is already on PATH). Returns the
|
|
144
|
+
* (possibly refreshed) prereq list.
|
|
145
|
+
*/
|
|
146
|
+
export declare function offerToolFetch(prereqs: PrereqCheck[], yes: boolean, recheck: () => PrereqCheck[]): Promise<PrereqCheck[]>;
|
|
107
147
|
/**
|
|
108
148
|
* Registers the `provision` command — an AI-assisted installer for the Pipeline
|
|
109
149
|
* Builder PLATFORM (local/minikube/EC2/EKS). It prints the assembled plan
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provision.d.ts","sourceRoot":"","sources":["../../src/commands/provision.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"provision.d.ts","sourceRoot":"","sources":["../../src/commands/provision.ts"],"names":[],"mappings":"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"}
|