@pipeline-builder/pipeline-manager 4.1.14 → 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.
Files changed (92) hide show
  1. package/config.yml +16 -37
  2. package/dist/boilerplate.js +10 -2
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +97 -79
  5. package/dist/commands/audit-stacks.js +3 -3
  6. package/dist/commands/create-pat.d.ts +2 -3
  7. package/dist/commands/create-pat.d.ts.map +1 -1
  8. package/dist/commands/create-pat.js +3 -4
  9. package/dist/commands/create-pipeline.d.ts.map +1 -1
  10. package/dist/commands/create-pipeline.js +198 -190
  11. package/dist/commands/list-pipelines.js +2 -2
  12. package/dist/commands/list-plugins.js +2 -2
  13. package/dist/commands/login.d.ts +2 -2
  14. package/dist/commands/login.js +3 -3
  15. package/dist/commands/new-plugin.d.ts +48 -5
  16. package/dist/commands/new-plugin.d.ts.map +1 -1
  17. package/dist/commands/new-plugin.js +261 -95
  18. package/dist/commands/plugin-lifecycle.d.ts +29 -0
  19. package/dist/commands/plugin-lifecycle.d.ts.map +1 -0
  20. package/dist/commands/plugin-lifecycle.js +147 -0
  21. package/dist/commands/provision.d.ts +42 -2
  22. package/dist/commands/provision.d.ts.map +1 -1
  23. package/dist/commands/provision.js +184 -147
  24. package/dist/commands/publish-plugin.d.ts +62 -0
  25. package/dist/commands/publish-plugin.d.ts.map +1 -0
  26. package/dist/commands/publish-plugin.js +224 -0
  27. package/dist/commands/redrive-events.d.ts +1 -1
  28. package/dist/commands/redrive-events.js +2 -2
  29. package/dist/commands/store-token.d.ts +46 -1
  30. package/dist/commands/store-token.d.ts.map +1 -1
  31. package/dist/commands/store-token.js +127 -102
  32. package/dist/commands/test-plugin.d.ts +72 -0
  33. package/dist/commands/test-plugin.d.ts.map +1 -0
  34. package/dist/commands/test-plugin.js +285 -0
  35. package/dist/commands/upload-plugin.d.ts +6 -7
  36. package/dist/commands/upload-plugin.d.ts.map +1 -1
  37. package/dist/commands/upload-plugin.js +127 -189
  38. package/dist/commands/validate-plugin.d.ts +37 -4
  39. package/dist/commands/validate-plugin.d.ts.map +1 -1
  40. package/dist/commands/validate-plugin.js +129 -144
  41. package/dist/commands/validate-templates.d.ts.map +1 -1
  42. package/dist/commands/validate-templates.js +8 -9
  43. package/dist/config/plugin-catalog-assets.d.ts +13 -0
  44. package/dist/config/plugin-catalog-assets.d.ts.map +1 -0
  45. package/dist/config/plugin-catalog-assets.js +21 -0
  46. package/dist/config.yml +16 -37
  47. package/dist/lambda/token-renew-handler.d.ts.map +1 -1
  48. package/dist/lambda/token-renew-handler.js +109 -154
  49. package/dist/types/config.d.ts +2 -6
  50. package/dist/types/config.d.ts.map +1 -1
  51. package/dist/types/config.js +1 -1
  52. package/dist/types/plugin.d.ts +21 -0
  53. package/dist/types/plugin.d.ts.map +1 -1
  54. package/dist/types/plugin.js +1 -1
  55. package/dist/utils/aws-env.d.ts +1 -2
  56. package/dist/utils/aws-env.d.ts.map +1 -1
  57. package/dist/utils/aws-env.js +2 -3
  58. package/dist/utils/catalog-prompt.d.ts +26 -0
  59. package/dist/utils/catalog-prompt.d.ts.map +1 -0
  60. package/dist/utils/catalog-prompt.js +113 -0
  61. package/dist/utils/command-utils.d.ts.map +1 -1
  62. package/dist/utils/command-utils.js +14 -3
  63. package/dist/utils/config-loader.d.ts.map +1 -1
  64. package/dist/utils/config-loader.js +4 -6
  65. package/dist/utils/credential-store.d.ts +16 -0
  66. package/dist/utils/credential-store.d.ts.map +1 -1
  67. package/dist/utils/credential-store.js +57 -2
  68. package/dist/utils/deploy-runner.d.ts.map +1 -1
  69. package/dist/utils/deploy-runner.js +7 -2
  70. package/dist/utils/pipeline-config.d.ts +1 -2
  71. package/dist/utils/pipeline-config.d.ts.map +1 -1
  72. package/dist/utils/pipeline-config.js +1 -1
  73. package/dist/utils/plugin-docker.d.ts +44 -0
  74. package/dist/utils/plugin-docker.d.ts.map +1 -0
  75. package/dist/utils/plugin-docker.js +71 -0
  76. package/dist/utils/plugin-package.d.ts +40 -0
  77. package/dist/utils/plugin-package.d.ts.map +1 -0
  78. package/dist/utils/plugin-package.js +159 -0
  79. package/dist/utils/plugin-resolver.d.ts.map +1 -1
  80. package/dist/utils/plugin-resolver.js +43 -29
  81. package/dist/utils/plugin-scan.d.ts +22 -0
  82. package/dist/utils/plugin-scan.d.ts.map +1 -0
  83. package/dist/utils/plugin-scan.js +52 -0
  84. package/dist/utils/plugin-zip.d.ts +15 -0
  85. package/dist/utils/plugin-zip.d.ts.map +1 -0
  86. package/dist/utils/plugin-zip.js +96 -0
  87. package/dist/utils/registry.d.ts +15 -0
  88. package/dist/utils/registry.d.ts.map +1 -1
  89. package/dist/utils/registry.js +17 -2
  90. package/dist/utils/service-account.d.ts.map +1 -1
  91. package/dist/utils/service-account.js +9 -10
  92. 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 TargetId, type TargetSpec } from '../agent/targets.js';
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), matching the old inline behavior; a plain decline leaves exitCode
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":"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"}
1
+ {"version":3,"file":"provision.d.ts","sourceRoot":"","sources":["../../src/commands/provision.ts"],"names":[],"mappings":"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"}