@hyperdrive.bot/cli 1.0.2

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 (127) hide show
  1. package/README.md +1598 -0
  2. package/bin/dev.cmd +3 -0
  3. package/bin/dev.js +3 -0
  4. package/bin/run.cmd +3 -0
  5. package/bin/run.js +5 -0
  6. package/dist/commands/account/add.d.ts +16 -0
  7. package/dist/commands/account/add.js +185 -0
  8. package/dist/commands/account/list.d.ts +6 -0
  9. package/dist/commands/account/list.js +37 -0
  10. package/dist/commands/account/remove.d.ts +11 -0
  11. package/dist/commands/account/remove.js +57 -0
  12. package/dist/commands/auth/login.d.ts +16 -0
  13. package/dist/commands/auth/login.js +178 -0
  14. package/dist/commands/auth/logout.d.ts +6 -0
  15. package/dist/commands/auth/logout.js +39 -0
  16. package/dist/commands/auth/refresh.d.ts +6 -0
  17. package/dist/commands/auth/refresh.js +66 -0
  18. package/dist/commands/auth/status.d.ts +6 -0
  19. package/dist/commands/auth/status.js +63 -0
  20. package/dist/commands/ci/account/create.d.ts +16 -0
  21. package/dist/commands/ci/account/create.js +158 -0
  22. package/dist/commands/ci/account/delete.d.ts +14 -0
  23. package/dist/commands/ci/account/delete.js +88 -0
  24. package/dist/commands/ci/account/list.d.ts +10 -0
  25. package/dist/commands/ci/account/list.js +65 -0
  26. package/dist/commands/config/get.d.ts +9 -0
  27. package/dist/commands/config/get.js +37 -0
  28. package/dist/commands/config/set.d.ts +10 -0
  29. package/dist/commands/config/set.js +48 -0
  30. package/dist/commands/config/show.d.ts +6 -0
  31. package/dist/commands/config/show.js +10 -0
  32. package/dist/commands/deployment/create.d.ts +30 -0
  33. package/dist/commands/deployment/create.js +188 -0
  34. package/dist/commands/deployment/get.d.ts +13 -0
  35. package/dist/commands/deployment/get.js +101 -0
  36. package/dist/commands/deployment/launch.d.ts +15 -0
  37. package/dist/commands/deployment/launch.js +105 -0
  38. package/dist/commands/deployment/list.d.ts +11 -0
  39. package/dist/commands/deployment/list.js +91 -0
  40. package/dist/commands/domain/current.d.ts +6 -0
  41. package/dist/commands/domain/current.js +18 -0
  42. package/dist/commands/domain/list.d.ts +6 -0
  43. package/dist/commands/domain/list.js +42 -0
  44. package/dist/commands/domain/switch.d.ts +9 -0
  45. package/dist/commands/domain/switch.js +40 -0
  46. package/dist/commands/example.d.ts +13 -0
  47. package/dist/commands/example.js +24 -0
  48. package/dist/commands/git/connect.d.ts +10 -0
  49. package/dist/commands/git/connect.js +56 -0
  50. package/dist/commands/git/disconnect.d.ts +11 -0
  51. package/dist/commands/git/disconnect.js +93 -0
  52. package/dist/commands/git/list.d.ts +10 -0
  53. package/dist/commands/git/list.js +53 -0
  54. package/dist/commands/git/sync.d.ts +18 -0
  55. package/dist/commands/git/sync.js +235 -0
  56. package/dist/commands/init.d.ts +188 -0
  57. package/dist/commands/init.js +817 -0
  58. package/dist/commands/jira/connect.d.ts +9 -0
  59. package/dist/commands/jira/connect.js +141 -0
  60. package/dist/commands/jira/status.d.ts +9 -0
  61. package/dist/commands/jira/status.js +118 -0
  62. package/dist/commands/module/analyze.d.ts +29 -0
  63. package/dist/commands/module/analyze.js +201 -0
  64. package/dist/commands/module/create.d.ts +42 -0
  65. package/dist/commands/module/create.js +498 -0
  66. package/dist/commands/module/destroy.d.ts +11 -0
  67. package/dist/commands/module/destroy.js +77 -0
  68. package/dist/commands/module/get.d.ts +10 -0
  69. package/dist/commands/module/get.js +43 -0
  70. package/dist/commands/module/link.d.ts +15 -0
  71. package/dist/commands/module/link.js +175 -0
  72. package/dist/commands/module/list.d.ts +9 -0
  73. package/dist/commands/module/list.js +51 -0
  74. package/dist/commands/module/reanalyze.d.ts +30 -0
  75. package/dist/commands/module/reanalyze.js +206 -0
  76. package/dist/commands/module/update.d.ts +27 -0
  77. package/dist/commands/module/update.js +102 -0
  78. package/dist/commands/parameter/add.d.ts +15 -0
  79. package/dist/commands/parameter/add.js +99 -0
  80. package/dist/commands/parameter/backfill.d.ts +12 -0
  81. package/dist/commands/parameter/backfill.js +113 -0
  82. package/dist/commands/parameter/clear.d.ts +14 -0
  83. package/dist/commands/parameter/clear.js +95 -0
  84. package/dist/commands/parameter/list.d.ts +14 -0
  85. package/dist/commands/parameter/list.js +92 -0
  86. package/dist/commands/parameter/pull.d.ts +14 -0
  87. package/dist/commands/parameter/pull.js +124 -0
  88. package/dist/commands/parameter/remove.d.ts +15 -0
  89. package/dist/commands/parameter/remove.js +90 -0
  90. package/dist/commands/parameter/sync.d.ts +14 -0
  91. package/dist/commands/parameter/sync.js +153 -0
  92. package/dist/commands/parameter/update.d.ts +15 -0
  93. package/dist/commands/parameter/update.js +100 -0
  94. package/dist/commands/stage/create.d.ts +28 -0
  95. package/dist/commands/stage/create.js +312 -0
  96. package/dist/commands/stage/list.d.ts +9 -0
  97. package/dist/commands/stage/list.js +63 -0
  98. package/dist/commands/test-api.d.ts +9 -0
  99. package/dist/commands/test-api.js +40 -0
  100. package/dist/index.d.ts +1 -0
  101. package/dist/index.js +1 -0
  102. package/dist/services/auth-service.d.ts +84 -0
  103. package/dist/services/auth-service.js +240 -0
  104. package/dist/services/git.d.ts +46 -0
  105. package/dist/services/git.js +409 -0
  106. package/dist/services/hyperdrive-sigv4.d.ts +449 -0
  107. package/dist/services/hyperdrive-sigv4.js +375 -0
  108. package/dist/services/hyperdrive.d.ts +87 -0
  109. package/dist/services/hyperdrive.js +108 -0
  110. package/dist/services/log-tailer.d.ts +95 -0
  111. package/dist/services/log-tailer.js +242 -0
  112. package/dist/services/tenant-service.d.ts +106 -0
  113. package/dist/services/tenant-service.js +332 -0
  114. package/dist/utils/account-flow.d.ts +74 -0
  115. package/dist/utils/account-flow.js +228 -0
  116. package/dist/utils/auth-flow.d.ts +146 -0
  117. package/dist/utils/auth-flow.js +477 -0
  118. package/dist/utils/git-flow.d.ts +72 -0
  119. package/dist/utils/git-flow.js +232 -0
  120. package/dist/utils/jira-flow.d.ts +71 -0
  121. package/dist/utils/jira-flow.js +120 -0
  122. package/dist/utils/summary-display.d.ts +59 -0
  123. package/dist/utils/summary-display.js +140 -0
  124. package/dist/utils/validation.d.ts +15 -0
  125. package/dist/utils/validation.js +32 -0
  126. package/oclif.manifest.json +2819 -0
  127. package/package.json +112 -0
@@ -0,0 +1,90 @@
1
+ import { Command, Flags } from '@oclif/core';
2
+ import chalk from 'chalk';
3
+ import inquirer from 'inquirer';
4
+ import { existsSync, readFileSync } from 'node:fs';
5
+ import { HyperdriveSigV4Service } from '../../services/hyperdrive-sigv4.js';
6
+ export default class ParameterRemove extends Command {
7
+ static description = 'Remove a parameter from SSM Parameter Store';
8
+ static examples = [
9
+ '<%= config.bin %> <%= command.id %> --key="API_URL" --stage="dev"',
10
+ '<%= config.bin %> <%= command.id %> --key="DB_HOST" --specific --stage="prod"',
11
+ '<%= config.bin %> <%= command.id %> --key="PORT" --force',
12
+ ];
13
+ static flags = {
14
+ accountId: Flags.string({
15
+ description: 'AWS Account ID',
16
+ env: 'AWS_ACCOUNT_ID',
17
+ required: true,
18
+ }),
19
+ domain: Flags.string({
20
+ char: 'd',
21
+ description: 'Tenant domain (for multi-domain setups)',
22
+ }),
23
+ force: Flags.boolean({
24
+ char: 'f',
25
+ default: false,
26
+ description: 'Skip confirmation prompt',
27
+ }),
28
+ key: Flags.string({
29
+ char: 'k',
30
+ description: 'Parameter key/name to remove',
31
+ required: true,
32
+ }),
33
+ moduleSlug: Flags.string({
34
+ char: 'm',
35
+ default() {
36
+ if (existsSync('.hyperdrive.json')) {
37
+ const hyperdriveConfig = JSON.parse(readFileSync('.hyperdrive.json', 'utf8'));
38
+ return hyperdriveConfig.slug;
39
+ }
40
+ return '';
41
+ },
42
+ description: 'Module slug',
43
+ required: true,
44
+ }),
45
+ specific: Flags.boolean({
46
+ default: false,
47
+ description: 'Remove from project-specific parameters (default: global)',
48
+ }),
49
+ stage: Flags.string({
50
+ char: 's',
51
+ default: 'all',
52
+ description: 'Stage for the parameter (default: all stages)',
53
+ }),
54
+ };
55
+ async run() {
56
+ const { flags } = await this.parse(ParameterRemove);
57
+ if (!flags.force) {
58
+ const confirmation = await inquirer.prompt([
59
+ {
60
+ default: false,
61
+ message: chalk.red(`Are you sure you want to remove parameter ${chalk.cyan(flags.key)} from ${flags.specific ? 'project-specific' : 'global'} parameters for stage ${chalk.cyan(flags.stage)}?`),
62
+ name: 'confirm',
63
+ type: 'confirm',
64
+ },
65
+ ]);
66
+ if (!confirmation.confirm) {
67
+ this.log(chalk.yellow('Operation cancelled.'));
68
+ return;
69
+ }
70
+ }
71
+ try {
72
+ const service = new HyperdriveSigV4Service(flags.domain);
73
+ await service.parameterRemove({
74
+ accountId: flags.accountId,
75
+ key: flags.key,
76
+ projectSlug: flags.moduleSlug, // API still expects projectSlug
77
+ specific: flags.specific,
78
+ stage: flags.stage,
79
+ });
80
+ this.log(chalk.green('✅ Parameter removed successfully!'));
81
+ this.log(chalk.gray(` Key: ${flags.key}`));
82
+ this.log(chalk.gray(` Scope: ${flags.specific ? 'Project-specific' : 'Global'}`));
83
+ this.log(chalk.gray(` Stage: ${flags.stage}`));
84
+ }
85
+ catch (error) {
86
+ console.error('Error:', error);
87
+ this.error('An error occurred while removing the parameter');
88
+ }
89
+ }
90
+ }
@@ -0,0 +1,14 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class ParameterSync extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ accountId: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
7
+ domain: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
8
+ file: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
9
+ moduleSlug: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
10
+ specific: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
11
+ stage: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
12
+ };
13
+ run(): Promise<void>;
14
+ }
@@ -0,0 +1,153 @@
1
+ import { Command, Flags } from '@oclif/core';
2
+ import chalk from 'chalk';
3
+ import { existsSync, readFileSync } from 'node:fs';
4
+ import path from 'node:path';
5
+ import { HyperdriveSigV4Service } from '../../services/hyperdrive-sigv4.js';
6
+ const POLL_INTERVAL_MS = 2000;
7
+ const MAX_POLL_TIME_MS = 15 * 60 * 1000; // 15 minutes
8
+ export default class ParameterSync extends Command {
9
+ static description = 'Synchronize environment variables from a .env file to Hyperdrive';
10
+ static examples = [
11
+ '<%= config.bin %> <%= command.id %> --stage="dev"',
12
+ '<%= config.bin %> <%= command.id %> --file=".env.production" --stage="prod"',
13
+ '<%= config.bin %> <%= command.id %> --no-specific --stage="all"',
14
+ ];
15
+ static flags = {
16
+ accountId: Flags.string({
17
+ description: 'AWS Account ID',
18
+ env: 'AWS_ACCOUNT_ID',
19
+ required: true,
20
+ }),
21
+ domain: Flags.string({
22
+ char: 'd',
23
+ description: 'Tenant domain (for multi-domain setups)',
24
+ }),
25
+ file: Flags.string({
26
+ char: 'f',
27
+ default: '.env',
28
+ description: 'Path to the .env file',
29
+ }),
30
+ moduleSlug: Flags.string({
31
+ char: 'm',
32
+ default() {
33
+ if (existsSync('.hyperdrive.json')) {
34
+ const hyperdriveConfig = JSON.parse(readFileSync('.hyperdrive.json', 'utf8'));
35
+ return hyperdriveConfig.slug;
36
+ }
37
+ return '';
38
+ },
39
+ description: 'Module slug',
40
+ required: true,
41
+ }),
42
+ specific: Flags.boolean({
43
+ allowNo: true,
44
+ char: 's',
45
+ default: true,
46
+ description: 'Whether the env vars are project-specific (default: true)',
47
+ }),
48
+ stage: Flags.string({
49
+ char: 't',
50
+ default: 'all',
51
+ description: 'Stage for the env vars (default: all stages)',
52
+ }),
53
+ };
54
+ async run() {
55
+ const { flags } = await this.parse(ParameterSync);
56
+ const { accountId, domain, file, moduleSlug, specific, stage } = flags;
57
+ const envPath = path.resolve(process.cwd(), file);
58
+ if (!existsSync(envPath)) {
59
+ this.error(`The file "${file}" does not exist.`);
60
+ return;
61
+ }
62
+ const content = readFileSync(envPath, 'utf8');
63
+ // Check file size
64
+ const byteLength = Buffer.byteLength(content, 'utf8');
65
+ if (byteLength > 3750) {
66
+ this.warn(chalk.yellow(`⚠️ The .env file size is approaching the 4KB limit (${byteLength} bytes). Consider optimizing your environment variables.`));
67
+ }
68
+ // Convert content to base64
69
+ const encodedContent = Buffer.from(content).toString('base64');
70
+ // Regex to find potential secrets
71
+ const secretPattern = /secret|private_key|password|token|api_key/gi;
72
+ const secretsFound = content.match(secretPattern);
73
+ if (secretsFound) {
74
+ this.warn(chalk.yellow('⚠️ Potentially sensitive keys found. Please ensure you are handling secrets securely.'));
75
+ this.warn(chalk.gray(` Keys: ${[...new Set(secretsFound)].join(', ')}`));
76
+ }
77
+ try {
78
+ const service = new HyperdriveSigV4Service(domain);
79
+ this.log(chalk.blue('🔄 Initiating parameter sync...'));
80
+ this.log(chalk.gray(` File: ${file}`));
81
+ this.log(chalk.gray(` Module: ${moduleSlug}`));
82
+ this.log(chalk.gray(` Stage: ${stage}`));
83
+ this.log(chalk.gray(` Scope: ${specific ? 'Project-specific' : 'Global'}`));
84
+ // Initiate async sync
85
+ const initResult = await service.parameterSync({
86
+ accountId,
87
+ encodedContent,
88
+ projectSlug: moduleSlug,
89
+ specific,
90
+ stage,
91
+ });
92
+ const { taskId, totalParameters } = initResult;
93
+ this.log(chalk.gray(` Task ID: ${taskId}`));
94
+ this.log(chalk.gray(` Parameters: ${totalParameters}`));
95
+ // Poll for completion
96
+ const ora = (await import('ora')).default;
97
+ const spinner = ora('Synchronizing parameters...').start();
98
+ let lastProgress = 0;
99
+ const startTime = Date.now();
100
+ while (true) {
101
+ // Check for timeout
102
+ if (Date.now() - startTime > MAX_POLL_TIME_MS) {
103
+ spinner.fail('Parameter sync timed out');
104
+ this.error('Parameter sync took too long. Check the task status manually.');
105
+ return;
106
+ }
107
+ const status = await service.parameterSyncStatus({ taskId });
108
+ // Update spinner with progress
109
+ if (status.progress && status.progress.percentage !== lastProgress) {
110
+ spinner.text = `Synchronizing parameters... ${status.progress.percentage}% (${status.progress.processed}/${status.progress.total})`;
111
+ lastProgress = status.progress.percentage;
112
+ }
113
+ if (status.status === 'completed') {
114
+ spinner.succeed('Parameters synchronized successfully!');
115
+ if (status.errors && status.errors.length > 0) {
116
+ // Filter out non-fatal errors (commented/empty keys)
117
+ const fatalErrors = status.errors.filter(e => !e.error.includes('was ignored'));
118
+ const warnings = status.errors.filter(e => e.error.includes('was ignored'));
119
+ if (warnings.length > 0) {
120
+ this.log(chalk.yellow(`\n⚠️ ${warnings.length} parameters were skipped:`));
121
+ for (const warning of warnings) {
122
+ this.log(chalk.gray(` - ${warning.key}: ${warning.error}`));
123
+ }
124
+ }
125
+ if (fatalErrors.length > 0) {
126
+ this.log(chalk.red(`\n❌ ${fatalErrors.length} parameters failed:`));
127
+ for (const error of fatalErrors) {
128
+ this.log(chalk.red(` - ${error.key}: ${error.error}`));
129
+ }
130
+ }
131
+ }
132
+ break;
133
+ }
134
+ if (status.status === 'failed') {
135
+ spinner.fail('Parameter sync failed');
136
+ if (status.errors && status.errors.length > 0) {
137
+ this.log(chalk.red('\n❌ Errors:'));
138
+ for (const error of status.errors) {
139
+ this.log(chalk.red(` - ${error.key}: ${error.error}`));
140
+ }
141
+ }
142
+ this.exit(1);
143
+ }
144
+ // Wait before next poll
145
+ await new Promise(resolve => setTimeout(resolve, POLL_INTERVAL_MS));
146
+ }
147
+ }
148
+ catch (error) {
149
+ console.error('Error:', error);
150
+ this.error('An error occurred while synchronizing parameters');
151
+ }
152
+ }
153
+ }
@@ -0,0 +1,15 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class ParameterUpdate extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ accountId: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
7
+ domain: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
8
+ key: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
9
+ moduleSlug: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
10
+ specific: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
11
+ stage: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
12
+ value: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
13
+ };
14
+ run(): Promise<void>;
15
+ }
@@ -0,0 +1,100 @@
1
+ import { Command, Flags } from '@oclif/core';
2
+ import chalk from 'chalk';
3
+ import inquirer from 'inquirer';
4
+ import { existsSync, readFileSync } from 'node:fs';
5
+ import { HyperdriveSigV4Service } from '../../services/hyperdrive-sigv4.js';
6
+ export default class ParameterUpdate extends Command {
7
+ static description = 'Update an existing parameter in SSM Parameter Store';
8
+ static examples = [
9
+ '<%= config.bin %> <%= command.id %> --key="API_URL" --value="https://new-api.example.com" --stage="dev"',
10
+ '<%= config.bin %> <%= command.id %> --key="DB_HOST" --value="new-host" --specific',
11
+ ];
12
+ static flags = {
13
+ accountId: Flags.string({
14
+ description: 'AWS Account ID',
15
+ env: 'AWS_ACCOUNT_ID',
16
+ required: true,
17
+ }),
18
+ domain: Flags.string({
19
+ char: 'd',
20
+ description: 'Tenant domain (for multi-domain setups)',
21
+ }),
22
+ key: Flags.string({
23
+ char: 'k',
24
+ description: 'Parameter key/name to update',
25
+ required: true,
26
+ }),
27
+ moduleSlug: Flags.string({
28
+ char: 'm',
29
+ default() {
30
+ if (existsSync('.hyperdrive.json')) {
31
+ const hyperdriveConfig = JSON.parse(readFileSync('.hyperdrive.json', 'utf8'));
32
+ return hyperdriveConfig.slug;
33
+ }
34
+ return '';
35
+ },
36
+ description: 'Module slug',
37
+ required: true,
38
+ }),
39
+ specific: Flags.boolean({
40
+ default: false,
41
+ description: 'Update project-specific parameter (default: global)',
42
+ }),
43
+ stage: Flags.string({
44
+ char: 's',
45
+ default: 'all',
46
+ description: 'Stage for the parameter (default: all stages)',
47
+ }),
48
+ value: Flags.string({
49
+ char: 'v',
50
+ description: 'New parameter value',
51
+ required: true,
52
+ }),
53
+ };
54
+ async run() {
55
+ const { flags } = await this.parse(ParameterUpdate);
56
+ const confirmation = await inquirer.prompt([
57
+ {
58
+ default: true,
59
+ message: chalk.yellow(`Update parameter ${chalk.cyan(flags.key)} to ${chalk.green(flags.value)} in ${flags.specific ? 'project-specific' : 'global'} parameters for stage ${chalk.cyan(flags.stage)}?`),
60
+ name: 'confirm',
61
+ type: 'confirm',
62
+ },
63
+ ]);
64
+ if (!confirmation.confirm) {
65
+ this.log(chalk.red('Operation cancelled.'));
66
+ return;
67
+ }
68
+ try {
69
+ const service = new HyperdriveSigV4Service(flags.domain);
70
+ // Encode single parameter in key=value format (update uses same sync mechanism)
71
+ const paramContent = `${flags.key}=${flags.value}`;
72
+ const encodedContent = Buffer.from(paramContent).toString('base64');
73
+ const result = await service.parameterUpdate({
74
+ accountId: flags.accountId,
75
+ encodedContent,
76
+ key: flags.key,
77
+ projectSlug: flags.moduleSlug, // API still expects projectSlug
78
+ specific: flags.specific,
79
+ stage: flags.stage,
80
+ });
81
+ if (result.errors && Array.isArray(result.errors) && result.errors.length > 0) {
82
+ this.log(chalk.red('❌ Failed to update parameter:'));
83
+ for (const error of result.errors) {
84
+ this.log(chalk.red(` - ${error.key}: ${error.error}`));
85
+ }
86
+ }
87
+ else {
88
+ this.log(chalk.green('✅ Parameter updated successfully!'));
89
+ this.log(chalk.gray(` Key: ${flags.key}`));
90
+ this.log(chalk.gray(` New Value: ${flags.value.substring(0, 50)}${flags.value.length > 50 ? '...' : ''}`));
91
+ this.log(chalk.gray(` Scope: ${flags.specific ? 'Project-specific' : 'Global'}`));
92
+ this.log(chalk.gray(` Stage: ${flags.stage}`));
93
+ }
94
+ }
95
+ catch (error) {
96
+ console.error('Error:', error);
97
+ this.error('An error occurred while updating the parameter');
98
+ }
99
+ }
100
+ }
@@ -0,0 +1,28 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class StageCreate extends Command {
3
+ static description: string;
4
+ static flags: {
5
+ accountId: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
6
+ autoLaunch: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
7
+ branchName: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
8
+ defaultStage: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
9
+ deletionProtection: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
10
+ domain: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
11
+ name: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
12
+ production: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
13
+ project: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string[] | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
14
+ provider: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
15
+ region: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string[] | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
16
+ };
17
+ run(): Promise<void>;
18
+ /**
19
+ * Build CloudWatch console URL
20
+ */
21
+ private buildConsoleUrl;
22
+ private getGitBranch;
23
+ private promptUser;
24
+ /**
25
+ * Stream mission logs in real-time
26
+ */
27
+ private streamMissionLogs;
28
+ }