@qodalis/cli-server-plugin-aws 0.0.0-stage → 1.0.0-beta.13

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 (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +155 -2
  3. package/dist/aws-command-processor.d.ts +19 -0
  4. package/dist/aws-command-processor.d.ts.map +1 -0
  5. package/dist/aws-command-processor.js +265 -0
  6. package/dist/aws-command-processor.js.map +1 -0
  7. package/dist/index.d.ts +12 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +23 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/processors/cloudwatch-processor.d.ts +12 -0
  12. package/dist/processors/cloudwatch-processor.d.ts.map +1 -0
  13. package/dist/processors/cloudwatch-processor.js +168 -0
  14. package/dist/processors/cloudwatch-processor.js.map +1 -0
  15. package/dist/processors/dynamodb-processor.d.ts +12 -0
  16. package/dist/processors/dynamodb-processor.d.ts.map +1 -0
  17. package/dist/processors/dynamodb-processor.js +201 -0
  18. package/dist/processors/dynamodb-processor.js.map +1 -0
  19. package/dist/processors/ec2-processor.d.ts +12 -0
  20. package/dist/processors/ec2-processor.d.ts.map +1 -0
  21. package/dist/processors/ec2-processor.js +305 -0
  22. package/dist/processors/ec2-processor.js.map +1 -0
  23. package/dist/processors/ecs-processor.d.ts +12 -0
  24. package/dist/processors/ecs-processor.d.ts.map +1 -0
  25. package/dist/processors/ecs-processor.js +169 -0
  26. package/dist/processors/ecs-processor.js.map +1 -0
  27. package/dist/processors/iam-processor.d.ts +12 -0
  28. package/dist/processors/iam-processor.d.ts.map +1 -0
  29. package/dist/processors/iam-processor.js +151 -0
  30. package/dist/processors/iam-processor.js.map +1 -0
  31. package/dist/processors/lambda-processor.d.ts +12 -0
  32. package/dist/processors/lambda-processor.d.ts.map +1 -0
  33. package/dist/processors/lambda-processor.js +187 -0
  34. package/dist/processors/lambda-processor.js.map +1 -0
  35. package/dist/processors/s3-processor.d.ts +27 -0
  36. package/dist/processors/s3-processor.d.ts.map +1 -0
  37. package/dist/processors/s3-processor.js +345 -0
  38. package/dist/processors/s3-processor.js.map +1 -0
  39. package/dist/processors/sns-processor.d.ts +12 -0
  40. package/dist/processors/sns-processor.d.ts.map +1 -0
  41. package/dist/processors/sns-processor.js +157 -0
  42. package/dist/processors/sns-processor.js.map +1 -0
  43. package/dist/processors/sqs-processor.d.ts +12 -0
  44. package/dist/processors/sqs-processor.d.ts.map +1 -0
  45. package/dist/processors/sqs-processor.js +191 -0
  46. package/dist/processors/sqs-processor.js.map +1 -0
  47. package/dist/services/aws-config-service.d.ts +50 -0
  48. package/dist/services/aws-config-service.d.ts.map +1 -0
  49. package/dist/services/aws-config-service.js +61 -0
  50. package/dist/services/aws-config-service.js.map +1 -0
  51. package/dist/services/aws-credential-manager.d.ts +29 -0
  52. package/dist/services/aws-credential-manager.d.ts.map +1 -0
  53. package/dist/services/aws-credential-manager.js +50 -0
  54. package/dist/services/aws-credential-manager.js.map +1 -0
  55. package/dist/utils/output-helpers.d.ts +68 -0
  56. package/dist/utils/output-helpers.d.ts.map +1 -0
  57. package/dist/utils/output-helpers.js +107 -0
  58. package/dist/utils/output-helpers.js.map +1 -0
  59. package/dist/utils/pagination.d.ts +9 -0
  60. package/dist/utils/pagination.d.ts.map +1 -0
  61. package/dist/utils/pagination.js +21 -0
  62. package/dist/utils/pagination.js.map +1 -0
  63. package/package.json +51 -5
@@ -0,0 +1,305 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AwsEc2Processor = void 0;
4
+ const cli_server_abstractions_1 = require("@qodalis/cli-server-abstractions");
5
+ const client_ec2_1 = require("@aws-sdk/client-ec2");
6
+ const output_helpers_1 = require("../utils/output-helpers");
7
+ /** Sub-processor that lists all EC2 instances. */
8
+ class Ec2ListProcessor extends cli_server_abstractions_1.CliCommandProcessor {
9
+ credentialManager;
10
+ command = 'list';
11
+ description = 'List all EC2 instances';
12
+ parameters = [
13
+ new cli_server_abstractions_1.CliCommandParameterDescriptor('region', 'AWS region override', false, 'string', ['-r']),
14
+ new cli_server_abstractions_1.CliCommandParameterDescriptor('output', 'Output format (table|json|text)', false, 'string', ['-o'], 'table'),
15
+ ];
16
+ constructor(credentialManager) {
17
+ super();
18
+ this.credentialManager = credentialManager;
19
+ }
20
+ /** @inheritdoc */
21
+ async handleAsync() {
22
+ return '';
23
+ }
24
+ /** @inheritdoc */
25
+ async handleStructuredAsync(command) {
26
+ const client = this.credentialManager.getClient(client_ec2_1.EC2Client, {
27
+ region: command.args?.region ? String(command.args.region) : undefined,
28
+ });
29
+ try {
30
+ const response = await client.send(new client_ec2_1.DescribeInstancesCommand({}));
31
+ const instances = (response.Reservations ?? []).flatMap((r) => r.Instances ?? []);
32
+ if (instances.length === 0) {
33
+ return (0, output_helpers_1.buildResponse)([{ type: 'text', value: 'No instances found.', style: 'warning' }]);
34
+ }
35
+ const rows = instances.map((inst) => {
36
+ const nameTag = inst.Tags?.find((t) => t.Key === 'Name');
37
+ return [
38
+ inst.InstanceId ?? '(unknown)',
39
+ nameTag?.Value ?? '(none)',
40
+ inst.State?.Name ?? '(unknown)',
41
+ inst.InstanceType ?? '(unknown)',
42
+ inst.PublicIpAddress ?? '(none)',
43
+ ];
44
+ });
45
+ const tableOutput = (0, output_helpers_1.formatAsTable)(['Instance ID', 'Name', 'State', 'Type', 'Public IP'], rows);
46
+ return (0, output_helpers_1.buildResponse)([(0, output_helpers_1.applyOutputFormat)(command, tableOutput, instances)]);
47
+ }
48
+ catch (err) {
49
+ return (0, output_helpers_1.buildErrorResponse)(`Failed to list instances: ${err.message ?? err}`);
50
+ }
51
+ }
52
+ }
53
+ /** Sub-processor that describes a single EC2 instance in detail. */
54
+ class Ec2DescribeProcessor extends cli_server_abstractions_1.CliCommandProcessor {
55
+ credentialManager;
56
+ command = 'describe';
57
+ description = 'Describe an EC2 instance';
58
+ valueRequired = true;
59
+ parameters = [
60
+ new cli_server_abstractions_1.CliCommandParameterDescriptor('region', 'AWS region override', false, 'string', ['-r']),
61
+ ];
62
+ constructor(credentialManager) {
63
+ super();
64
+ this.credentialManager = credentialManager;
65
+ }
66
+ /** @inheritdoc */
67
+ async handleAsync() {
68
+ return '';
69
+ }
70
+ /** @inheritdoc */
71
+ async handleStructuredAsync(command) {
72
+ const instanceId = (0, cli_server_abstractions_1.getPositionalText)(command);
73
+ if (!instanceId) {
74
+ return (0, output_helpers_1.buildErrorResponse)('Instance ID is required. Usage: ec2 describe <instance-id>');
75
+ }
76
+ const client = this.credentialManager.getClient(client_ec2_1.EC2Client, {
77
+ region: command.args?.region ? String(command.args.region) : undefined,
78
+ });
79
+ try {
80
+ const response = await client.send(new client_ec2_1.DescribeInstancesCommand({ InstanceIds: [instanceId] }));
81
+ const instances = (response.Reservations ?? []).flatMap((r) => r.Instances ?? []);
82
+ if (instances.length === 0) {
83
+ return (0, output_helpers_1.buildErrorResponse)(`Instance "${instanceId}" not found.`);
84
+ }
85
+ const inst = instances[0];
86
+ const nameTag = inst.Tags?.find((t) => t.Key === 'Name');
87
+ const sgList = (inst.SecurityGroups ?? [])
88
+ .map((sg) => `${sg.GroupId} (${sg.GroupName})`)
89
+ .join(', ') || '(none)';
90
+ const entries = {
91
+ 'Instance ID': inst.InstanceId ?? '(unknown)',
92
+ 'Name': nameTag?.Value ?? '(none)',
93
+ 'State': inst.State?.Name ?? '(unknown)',
94
+ 'Type': inst.InstanceType ?? '(unknown)',
95
+ 'Availability Zone': inst.Placement?.AvailabilityZone ?? '(unknown)',
96
+ 'Public IP': inst.PublicIpAddress ?? '(none)',
97
+ 'Private IP': inst.PrivateIpAddress ?? '(none)',
98
+ 'Launch Time': inst.LaunchTime ? inst.LaunchTime.toISOString() : '(unknown)',
99
+ 'Security Groups': sgList,
100
+ };
101
+ return (0, output_helpers_1.buildResponse)([(0, output_helpers_1.formatAsKeyValue)(entries)]);
102
+ }
103
+ catch (err) {
104
+ return (0, output_helpers_1.buildErrorResponse)(`Failed to describe instance: ${err.message ?? err}`);
105
+ }
106
+ }
107
+ }
108
+ /** Sub-processor that starts an EC2 instance. */
109
+ class Ec2StartProcessor extends cli_server_abstractions_1.CliCommandProcessor {
110
+ credentialManager;
111
+ command = 'start';
112
+ description = 'Start an EC2 instance';
113
+ valueRequired = true;
114
+ parameters = [
115
+ new cli_server_abstractions_1.CliCommandParameterDescriptor('region', 'AWS region override', false, 'string', ['-r']),
116
+ ];
117
+ constructor(credentialManager) {
118
+ super();
119
+ this.credentialManager = credentialManager;
120
+ }
121
+ /** @inheritdoc */
122
+ async handleAsync() {
123
+ return '';
124
+ }
125
+ /** @inheritdoc */
126
+ async handleStructuredAsync(command) {
127
+ const instanceId = (0, cli_server_abstractions_1.getPositionalText)(command);
128
+ if (!instanceId) {
129
+ return (0, output_helpers_1.buildErrorResponse)('Instance ID is required. Usage: ec2 start <instance-id>');
130
+ }
131
+ const client = this.credentialManager.getClient(client_ec2_1.EC2Client, {
132
+ region: command.args?.region ? String(command.args.region) : undefined,
133
+ });
134
+ try {
135
+ await client.send(new client_ec2_1.StartInstancesCommand({ InstanceIds: [instanceId] }));
136
+ return (0, output_helpers_1.buildSuccessResponse)(`Starting instance ${instanceId}... done`);
137
+ }
138
+ catch (err) {
139
+ return (0, output_helpers_1.buildErrorResponse)(`Failed to start instance: ${err.message ?? err}`);
140
+ }
141
+ }
142
+ }
143
+ /** Sub-processor that stops an EC2 instance, with optional dry-run support. */
144
+ class Ec2StopProcessor extends cli_server_abstractions_1.CliCommandProcessor {
145
+ credentialManager;
146
+ command = 'stop';
147
+ description = 'Stop an EC2 instance';
148
+ valueRequired = true;
149
+ parameters = [
150
+ new cli_server_abstractions_1.CliCommandParameterDescriptor('dry-run', 'Preview without stopping', false, 'boolean'),
151
+ new cli_server_abstractions_1.CliCommandParameterDescriptor('region', 'AWS region override', false, 'string', ['-r']),
152
+ ];
153
+ constructor(credentialManager) {
154
+ super();
155
+ this.credentialManager = credentialManager;
156
+ }
157
+ /** @inheritdoc */
158
+ async handleAsync() {
159
+ return '';
160
+ }
161
+ /** @inheritdoc */
162
+ async handleStructuredAsync(command) {
163
+ const instanceId = (0, cli_server_abstractions_1.getPositionalText)(command);
164
+ if (!instanceId) {
165
+ return (0, output_helpers_1.buildErrorResponse)('Instance ID is required. Usage: ec2 stop <instance-id>');
166
+ }
167
+ if ((0, output_helpers_1.isDryRun)(command)) {
168
+ return (0, output_helpers_1.buildResponse)([
169
+ { type: 'text', value: `[DRY RUN] Would stop instance ${instanceId}`, style: 'warning' },
170
+ ]);
171
+ }
172
+ const client = this.credentialManager.getClient(client_ec2_1.EC2Client, {
173
+ region: command.args?.region ? String(command.args.region) : undefined,
174
+ });
175
+ try {
176
+ await client.send(new client_ec2_1.StopInstancesCommand({ InstanceIds: [instanceId] }));
177
+ return (0, output_helpers_1.buildSuccessResponse)(`Stopping instance ${instanceId}... done`);
178
+ }
179
+ catch (err) {
180
+ return (0, output_helpers_1.buildErrorResponse)(`Failed to stop instance: ${err.message ?? err}`);
181
+ }
182
+ }
183
+ }
184
+ /** Sub-processor that reboots an EC2 instance, with optional dry-run support. */
185
+ class Ec2RebootProcessor extends cli_server_abstractions_1.CliCommandProcessor {
186
+ credentialManager;
187
+ command = 'reboot';
188
+ description = 'Reboot an EC2 instance';
189
+ valueRequired = true;
190
+ parameters = [
191
+ new cli_server_abstractions_1.CliCommandParameterDescriptor('dry-run', 'Preview without rebooting', false, 'boolean'),
192
+ new cli_server_abstractions_1.CliCommandParameterDescriptor('region', 'AWS region override', false, 'string', ['-r']),
193
+ ];
194
+ constructor(credentialManager) {
195
+ super();
196
+ this.credentialManager = credentialManager;
197
+ }
198
+ /** @inheritdoc */
199
+ async handleAsync() {
200
+ return '';
201
+ }
202
+ /** @inheritdoc */
203
+ async handleStructuredAsync(command) {
204
+ const instanceId = (0, cli_server_abstractions_1.getPositionalText)(command);
205
+ if (!instanceId) {
206
+ return (0, output_helpers_1.buildErrorResponse)('Instance ID is required. Usage: ec2 reboot <instance-id>');
207
+ }
208
+ if ((0, output_helpers_1.isDryRun)(command)) {
209
+ return (0, output_helpers_1.buildResponse)([
210
+ { type: 'text', value: `[DRY RUN] Would reboot instance ${instanceId}`, style: 'warning' },
211
+ ]);
212
+ }
213
+ const client = this.credentialManager.getClient(client_ec2_1.EC2Client, {
214
+ region: command.args?.region ? String(command.args.region) : undefined,
215
+ });
216
+ try {
217
+ await client.send(new client_ec2_1.RebootInstancesCommand({ InstanceIds: [instanceId] }));
218
+ return (0, output_helpers_1.buildSuccessResponse)(`Rebooting instance ${instanceId}... done`);
219
+ }
220
+ catch (err) {
221
+ return (0, output_helpers_1.buildErrorResponse)(`Failed to reboot instance: ${err.message ?? err}`);
222
+ }
223
+ }
224
+ }
225
+ /** Sub-processor that lists all EC2 security groups. */
226
+ class Ec2SgListProcessor extends cli_server_abstractions_1.CliCommandProcessor {
227
+ credentialManager;
228
+ command = 'list';
229
+ description = 'List all security groups';
230
+ parameters = [
231
+ new cli_server_abstractions_1.CliCommandParameterDescriptor('region', 'AWS region override', false, 'string', ['-r']),
232
+ new cli_server_abstractions_1.CliCommandParameterDescriptor('output', 'Output format (table|json|text)', false, 'string', ['-o'], 'table'),
233
+ ];
234
+ constructor(credentialManager) {
235
+ super();
236
+ this.credentialManager = credentialManager;
237
+ }
238
+ /** @inheritdoc */
239
+ async handleAsync() {
240
+ return '';
241
+ }
242
+ /** @inheritdoc */
243
+ async handleStructuredAsync(command) {
244
+ const client = this.credentialManager.getClient(client_ec2_1.EC2Client, {
245
+ region: command.args?.region ? String(command.args.region) : undefined,
246
+ });
247
+ try {
248
+ const response = await client.send(new client_ec2_1.DescribeSecurityGroupsCommand({}));
249
+ const groups = response.SecurityGroups ?? [];
250
+ if (groups.length === 0) {
251
+ return (0, output_helpers_1.buildResponse)([{ type: 'text', value: 'No security groups found.', style: 'warning' }]);
252
+ }
253
+ const rows = groups.map((sg) => [
254
+ sg.GroupId ?? '(unknown)',
255
+ sg.GroupName ?? '(unknown)',
256
+ sg.VpcId ?? '(none)',
257
+ sg.Description ?? '(none)',
258
+ ]);
259
+ const tableOutput = (0, output_helpers_1.formatAsTable)(['Group ID', 'Group Name', 'VPC ID', 'Description'], rows);
260
+ return (0, output_helpers_1.buildResponse)([(0, output_helpers_1.applyOutputFormat)(command, tableOutput, groups)]);
261
+ }
262
+ catch (err) {
263
+ return (0, output_helpers_1.buildErrorResponse)(`Failed to list security groups: ${err.message ?? err}`);
264
+ }
265
+ }
266
+ }
267
+ /** Parent processor for EC2 security group sub-commands. */
268
+ class Ec2SgProcessor extends cli_server_abstractions_1.CliCommandProcessor {
269
+ command = 'sg';
270
+ description = 'EC2 security group operations';
271
+ processors;
272
+ constructor(credentialManager) {
273
+ super();
274
+ this.processors = [
275
+ new Ec2SgListProcessor(credentialManager),
276
+ ];
277
+ }
278
+ /** @inheritdoc */
279
+ async handleAsync() {
280
+ return '';
281
+ }
282
+ }
283
+ /** Parent processor for all EC2 sub-commands (list, describe, start, stop, reboot, sg). */
284
+ class AwsEc2Processor extends cli_server_abstractions_1.CliCommandProcessor {
285
+ command = 'ec2';
286
+ description = 'Amazon EC2 operations — manage instances and security groups';
287
+ processors;
288
+ constructor(credentialManager) {
289
+ super();
290
+ this.processors = [
291
+ new Ec2ListProcessor(credentialManager),
292
+ new Ec2DescribeProcessor(credentialManager),
293
+ new Ec2StartProcessor(credentialManager),
294
+ new Ec2StopProcessor(credentialManager),
295
+ new Ec2RebootProcessor(credentialManager),
296
+ new Ec2SgProcessor(credentialManager),
297
+ ];
298
+ }
299
+ /** @inheritdoc */
300
+ async handleAsync() {
301
+ return '';
302
+ }
303
+ }
304
+ exports.AwsEc2Processor = AwsEc2Processor;
305
+ //# sourceMappingURL=ec2-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ec2-processor.js","sourceRoot":"","sources":["../../src/processors/ec2-processor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { CliCommandProcessor, ICliCommandProcessor } from '@qodalis/cli-server-abstractions';
2
+ import { AwsCredentialManager } from '../services/aws-credential-manager';
3
+ /** Parent processor for ECS sub-commands (clusters, services, tasks). */
4
+ export declare class AwsEcsProcessor extends CliCommandProcessor {
5
+ command: string;
6
+ description: string;
7
+ processors: ICliCommandProcessor[];
8
+ constructor(credentialManager: AwsCredentialManager);
9
+ /** @inheritdoc */
10
+ handleAsync(): Promise<string>;
11
+ }
12
+ //# sourceMappingURL=ecs-processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ecs-processor.d.ts","sourceRoot":"","sources":["../../src/processors/ecs-processor.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,mBAAmB,EAInB,oBAAoB,EAEvB,MAAM,kCAAkC,CAAC;AAU1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAoL1E,yEAAyE;AACzE,qBAAa,eAAgB,SAAQ,mBAAmB;IACpD,OAAO,SAAS;IAChB,WAAW,SAAoD;IAC/D,UAAU,EAAE,oBAAoB,EAAE,CAAC;gBAEvB,iBAAiB,EAAE,oBAAoB;IASnD,kBAAkB;IACZ,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;CAGvC"}
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AwsEcsProcessor = void 0;
4
+ const cli_server_abstractions_1 = require("@qodalis/cli-server-abstractions");
5
+ const client_ecs_1 = require("@aws-sdk/client-ecs");
6
+ const output_helpers_1 = require("../utils/output-helpers");
7
+ /** Sub-processor that lists ECS clusters with their status and task counts. */
8
+ class EcsClustersProcessor extends cli_server_abstractions_1.CliCommandProcessor {
9
+ credentialManager;
10
+ command = 'clusters';
11
+ description = 'List ECS clusters';
12
+ parameters = [
13
+ new cli_server_abstractions_1.CliCommandParameterDescriptor('region', 'AWS region override', false, 'string', ['-r']),
14
+ new cli_server_abstractions_1.CliCommandParameterDescriptor('output', 'Output format (table|json|text)', false, 'string', ['-o'], 'table'),
15
+ ];
16
+ constructor(credentialManager) {
17
+ super();
18
+ this.credentialManager = credentialManager;
19
+ }
20
+ /** @inheritdoc */
21
+ async handleAsync() {
22
+ return '';
23
+ }
24
+ /** @inheritdoc */
25
+ async handleStructuredAsync(command) {
26
+ const client = this.credentialManager.getClient(client_ecs_1.ECSClient, {
27
+ region: command.args?.region ? String(command.args.region) : undefined,
28
+ });
29
+ try {
30
+ const listResponse = await client.send(new client_ecs_1.ListClustersCommand({}));
31
+ const clusterArns = listResponse.clusterArns ?? [];
32
+ if (clusterArns.length === 0) {
33
+ return (0, output_helpers_1.buildResponse)([{ type: 'text', value: 'No ECS clusters found.', style: 'warning' }]);
34
+ }
35
+ const describeResponse = await client.send(new client_ecs_1.DescribeClustersCommand({ clusters: clusterArns }));
36
+ const clusters = describeResponse.clusters ?? [];
37
+ const rows = clusters.map((cluster) => [
38
+ cluster.clusterName ?? '(unknown)',
39
+ cluster.status ?? '(unknown)',
40
+ String(cluster.runningTasksCount ?? 0),
41
+ String(cluster.pendingTasksCount ?? 0),
42
+ ]);
43
+ const tableOutput = (0, output_helpers_1.formatAsTable)(['Cluster Name', 'Status', 'Running Tasks', 'Pending Tasks'], rows);
44
+ return (0, output_helpers_1.buildResponse)([(0, output_helpers_1.applyOutputFormat)(command, tableOutput, clusters)]);
45
+ }
46
+ catch (err) {
47
+ return (0, output_helpers_1.buildErrorResponse)(`Failed to list ECS clusters: ${err.message ?? err}`);
48
+ }
49
+ }
50
+ }
51
+ /** Sub-processor that lists ECS services within a specified cluster. */
52
+ class EcsServicesProcessor extends cli_server_abstractions_1.CliCommandProcessor {
53
+ credentialManager;
54
+ command = 'services';
55
+ description = 'List ECS services in a cluster';
56
+ valueRequired = true;
57
+ parameters = [
58
+ new cli_server_abstractions_1.CliCommandParameterDescriptor('region', 'AWS region override', false, 'string', ['-r']),
59
+ new cli_server_abstractions_1.CliCommandParameterDescriptor('output', 'Output format (table|json|text)', false, 'string', ['-o'], 'table'),
60
+ ];
61
+ constructor(credentialManager) {
62
+ super();
63
+ this.credentialManager = credentialManager;
64
+ }
65
+ /** @inheritdoc */
66
+ async handleAsync() {
67
+ return '';
68
+ }
69
+ /** @inheritdoc */
70
+ async handleStructuredAsync(command) {
71
+ const cluster = (0, cli_server_abstractions_1.getPositionalText)(command);
72
+ if (!cluster) {
73
+ return (0, output_helpers_1.buildErrorResponse)('Cluster name or ARN is required. Usage: ecs services <cluster>');
74
+ }
75
+ const client = this.credentialManager.getClient(client_ecs_1.ECSClient, {
76
+ region: command.args?.region ? String(command.args.region) : undefined,
77
+ });
78
+ try {
79
+ const listResponse = await client.send(new client_ecs_1.ListServicesCommand({ cluster }));
80
+ const serviceArns = listResponse.serviceArns ?? [];
81
+ if (serviceArns.length === 0) {
82
+ return (0, output_helpers_1.buildResponse)([{ type: 'text', value: `No ECS services found in cluster "${cluster}".`, style: 'warning' }]);
83
+ }
84
+ const describeResponse = await client.send(new client_ecs_1.DescribeServicesCommand({ cluster, services: serviceArns }));
85
+ const services = describeResponse.services ?? [];
86
+ const rows = services.map((service) => [
87
+ service.serviceName ?? '(unknown)',
88
+ service.status ?? '(unknown)',
89
+ String(service.desiredCount ?? 0),
90
+ String(service.runningCount ?? 0),
91
+ String(service.pendingCount ?? 0),
92
+ ]);
93
+ const tableOutput = (0, output_helpers_1.formatAsTable)(['Service Name', 'Status', 'Desired', 'Running', 'Pending'], rows);
94
+ return (0, output_helpers_1.buildResponse)([(0, output_helpers_1.applyOutputFormat)(command, tableOutput, services)]);
95
+ }
96
+ catch (err) {
97
+ return (0, output_helpers_1.buildErrorResponse)(`Failed to list ECS services: ${err.message ?? err}`);
98
+ }
99
+ }
100
+ }
101
+ /** Sub-processor that lists ECS tasks within a specified cluster. */
102
+ class EcsTasksProcessor extends cli_server_abstractions_1.CliCommandProcessor {
103
+ credentialManager;
104
+ command = 'tasks';
105
+ description = 'List ECS tasks in a cluster';
106
+ valueRequired = true;
107
+ parameters = [
108
+ new cli_server_abstractions_1.CliCommandParameterDescriptor('region', 'AWS region override', false, 'string', ['-r']),
109
+ new cli_server_abstractions_1.CliCommandParameterDescriptor('output', 'Output format (table|json|text)', false, 'string', ['-o'], 'table'),
110
+ ];
111
+ constructor(credentialManager) {
112
+ super();
113
+ this.credentialManager = credentialManager;
114
+ }
115
+ /** @inheritdoc */
116
+ async handleAsync() {
117
+ return '';
118
+ }
119
+ /** @inheritdoc */
120
+ async handleStructuredAsync(command) {
121
+ const cluster = (0, cli_server_abstractions_1.getPositionalText)(command);
122
+ if (!cluster) {
123
+ return (0, output_helpers_1.buildErrorResponse)('Cluster name or ARN is required. Usage: ecs tasks <cluster>');
124
+ }
125
+ const client = this.credentialManager.getClient(client_ecs_1.ECSClient, {
126
+ region: command.args?.region ? String(command.args.region) : undefined,
127
+ });
128
+ try {
129
+ const listResponse = await client.send(new client_ecs_1.ListTasksCommand({ cluster }));
130
+ const taskArns = listResponse.taskArns ?? [];
131
+ if (taskArns.length === 0) {
132
+ return (0, output_helpers_1.buildResponse)([{ type: 'text', value: `No ECS tasks found in cluster "${cluster}".`, style: 'warning' }]);
133
+ }
134
+ const describeResponse = await client.send(new client_ecs_1.DescribeTasksCommand({ cluster, tasks: taskArns }));
135
+ const tasks = describeResponse.tasks ?? [];
136
+ const rows = tasks.map((task) => [
137
+ task.taskArn?.split('/').pop() ?? '(unknown)',
138
+ task.lastStatus ?? '(unknown)',
139
+ task.taskDefinitionArn?.split('/').pop() ?? '(unknown)',
140
+ task.startedAt ? task.startedAt.toISOString().slice(0, 19).replace('T', ' ') : '(not started)',
141
+ ]);
142
+ const tableOutput = (0, output_helpers_1.formatAsTable)(['Task ID', 'Status', 'Definition', 'Started'], rows);
143
+ return (0, output_helpers_1.buildResponse)([(0, output_helpers_1.applyOutputFormat)(command, tableOutput, tasks)]);
144
+ }
145
+ catch (err) {
146
+ return (0, output_helpers_1.buildErrorResponse)(`Failed to list ECS tasks: ${err.message ?? err}`);
147
+ }
148
+ }
149
+ }
150
+ /** Parent processor for ECS sub-commands (clusters, services, tasks). */
151
+ class AwsEcsProcessor extends cli_server_abstractions_1.CliCommandProcessor {
152
+ command = 'ecs';
153
+ description = 'AWS ECS operations — clusters, services, tasks';
154
+ processors;
155
+ constructor(credentialManager) {
156
+ super();
157
+ this.processors = [
158
+ new EcsClustersProcessor(credentialManager),
159
+ new EcsServicesProcessor(credentialManager),
160
+ new EcsTasksProcessor(credentialManager),
161
+ ];
162
+ }
163
+ /** @inheritdoc */
164
+ async handleAsync() {
165
+ return '';
166
+ }
167
+ }
168
+ exports.AwsEcsProcessor = AwsEcsProcessor;
169
+ //# sourceMappingURL=ecs-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ecs-processor.js","sourceRoot":"","sources":["../../src/processors/ecs-processor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { CliCommandProcessor, ICliCommandProcessor } from '@qodalis/cli-server-abstractions';
2
+ import { AwsCredentialManager } from '../services/aws-credential-manager';
3
+ /** Parent processor for IAM sub-commands (users, roles, policies). */
4
+ export declare class AwsIamProcessor extends CliCommandProcessor {
5
+ command: string;
6
+ description: string;
7
+ processors: ICliCommandProcessor[];
8
+ constructor(credentialManager: AwsCredentialManager);
9
+ /** @inheritdoc */
10
+ handleAsync(): Promise<string>;
11
+ }
12
+ //# sourceMappingURL=iam-processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iam-processor.d.ts","sourceRoot":"","sources":["../../src/processors/iam-processor.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,mBAAmB,EAGnB,oBAAoB,EAEvB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AA6J1E,sEAAsE;AACtE,qBAAa,eAAgB,SAAQ,mBAAmB;IACpD,OAAO,SAAS;IAChB,WAAW,SAAiD;IAC5D,UAAU,EAAE,oBAAoB,EAAE,CAAC;gBAEvB,iBAAiB,EAAE,oBAAoB;IASnD,kBAAkB;IACZ,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;CAGvC"}