@insureco/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/README.md +168 -0
  2. package/dist/commands/backup.d.ts +11 -0
  3. package/dist/commands/backup.d.ts.map +1 -0
  4. package/dist/commands/backup.js +112 -0
  5. package/dist/commands/backup.js.map +1 -0
  6. package/dist/commands/config.d.ts +10 -0
  7. package/dist/commands/config.d.ts.map +1 -0
  8. package/dist/commands/config.js +41 -0
  9. package/dist/commands/config.js.map +1 -0
  10. package/dist/commands/deploy.d.ts +16 -0
  11. package/dist/commands/deploy.d.ts.map +1 -0
  12. package/dist/commands/deploy.js +219 -0
  13. package/dist/commands/deploy.js.map +1 -0
  14. package/dist/commands/destroy.d.ts +12 -0
  15. package/dist/commands/destroy.d.ts.map +1 -0
  16. package/dist/commands/destroy.js +62 -0
  17. package/dist/commands/destroy.js.map +1 -0
  18. package/dist/commands/env.d.ts +7 -0
  19. package/dist/commands/env.d.ts.map +1 -0
  20. package/dist/commands/env.js +42 -0
  21. package/dist/commands/env.js.map +1 -0
  22. package/dist/commands/init-ai.d.ts +7 -0
  23. package/dist/commands/init-ai.d.ts.map +1 -0
  24. package/dist/commands/init-ai.js +257 -0
  25. package/dist/commands/init-ai.js.map +1 -0
  26. package/dist/commands/init.d.ts +8 -0
  27. package/dist/commands/init.d.ts.map +1 -0
  28. package/dist/commands/init.js +228 -0
  29. package/dist/commands/init.js.map +1 -0
  30. package/dist/commands/link.d.ts +10 -0
  31. package/dist/commands/link.d.ts.map +1 -0
  32. package/dist/commands/link.js +193 -0
  33. package/dist/commands/link.js.map +1 -0
  34. package/dist/commands/login.d.ts +8 -0
  35. package/dist/commands/login.d.ts.map +1 -0
  36. package/dist/commands/login.js +164 -0
  37. package/dist/commands/login.js.map +1 -0
  38. package/dist/commands/logs.d.ts +16 -0
  39. package/dist/commands/logs.d.ts.map +1 -0
  40. package/dist/commands/logs.js +362 -0
  41. package/dist/commands/logs.js.map +1 -0
  42. package/dist/commands/preflight.d.ts +8 -0
  43. package/dist/commands/preflight.d.ts.map +1 -0
  44. package/dist/commands/preflight.js +188 -0
  45. package/dist/commands/preflight.js.map +1 -0
  46. package/dist/commands/program.d.ts +7 -0
  47. package/dist/commands/program.d.ts.map +1 -0
  48. package/dist/commands/program.js +59 -0
  49. package/dist/commands/program.js.map +1 -0
  50. package/dist/commands/push.d.ts +12 -0
  51. package/dist/commands/push.d.ts.map +1 -0
  52. package/dist/commands/push.js +171 -0
  53. package/dist/commands/push.js.map +1 -0
  54. package/dist/commands/register.d.ts +7 -0
  55. package/dist/commands/register.d.ts.map +1 -0
  56. package/dist/commands/register.js +124 -0
  57. package/dist/commands/register.js.map +1 -0
  58. package/dist/commands/rollback.d.ts +11 -0
  59. package/dist/commands/rollback.d.ts.map +1 -0
  60. package/dist/commands/rollback.js +172 -0
  61. package/dist/commands/rollback.js.map +1 -0
  62. package/dist/commands/sample.d.ts +11 -0
  63. package/dist/commands/sample.d.ts.map +1 -0
  64. package/dist/commands/sample.js +114 -0
  65. package/dist/commands/sample.js.map +1 -0
  66. package/dist/commands/services.d.ts +13 -0
  67. package/dist/commands/services.d.ts.map +1 -0
  68. package/dist/commands/services.js +95 -0
  69. package/dist/commands/services.js.map +1 -0
  70. package/dist/commands/status.d.ts +9 -0
  71. package/dist/commands/status.d.ts.map +1 -0
  72. package/dist/commands/status.js +170 -0
  73. package/dist/commands/status.js.map +1 -0
  74. package/dist/commands/troubleshoot.d.ts +19 -0
  75. package/dist/commands/troubleshoot.d.ts.map +1 -0
  76. package/dist/commands/troubleshoot.js +465 -0
  77. package/dist/commands/troubleshoot.js.map +1 -0
  78. package/dist/commands/versions.d.ts +16 -0
  79. package/dist/commands/versions.d.ts.map +1 -0
  80. package/dist/commands/versions.js +162 -0
  81. package/dist/commands/versions.js.map +1 -0
  82. package/dist/index.d.ts +3 -0
  83. package/dist/index.d.ts.map +1 -0
  84. package/dist/index.js +294 -0
  85. package/dist/index.js.map +1 -0
  86. package/dist/lib/ai/client.d.ts +36 -0
  87. package/dist/lib/ai/client.d.ts.map +1 -0
  88. package/dist/lib/ai/client.js +140 -0
  89. package/dist/lib/ai/client.js.map +1 -0
  90. package/dist/lib/ai/generator.d.ts +17 -0
  91. package/dist/lib/ai/generator.d.ts.map +1 -0
  92. package/dist/lib/ai/generator.js +338 -0
  93. package/dist/lib/ai/generator.js.map +1 -0
  94. package/dist/lib/ai/prompts.d.ts +47 -0
  95. package/dist/lib/ai/prompts.d.ts.map +1 -0
  96. package/dist/lib/ai/prompts.js +247 -0
  97. package/dist/lib/ai/prompts.js.map +1 -0
  98. package/dist/lib/ai/scanner.d.ts +50 -0
  99. package/dist/lib/ai/scanner.d.ts.map +1 -0
  100. package/dist/lib/ai/scanner.js +237 -0
  101. package/dist/lib/ai/scanner.js.map +1 -0
  102. package/dist/lib/api.d.ts +18 -0
  103. package/dist/lib/api.d.ts.map +1 -0
  104. package/dist/lib/api.js +67 -0
  105. package/dist/lib/api.js.map +1 -0
  106. package/dist/lib/builder.d.ts +34 -0
  107. package/dist/lib/builder.d.ts.map +1 -0
  108. package/dist/lib/builder.js +132 -0
  109. package/dist/lib/builder.js.map +1 -0
  110. package/dist/lib/config.d.ts +20 -0
  111. package/dist/lib/config.d.ts.map +1 -0
  112. package/dist/lib/config.js +124 -0
  113. package/dist/lib/config.js.map +1 -0
  114. package/dist/lib/output.d.ts +12 -0
  115. package/dist/lib/output.d.ts.map +1 -0
  116. package/dist/lib/output.js +39 -0
  117. package/dist/lib/output.js.map +1 -0
  118. package/dist/lib/scaffold.d.ts +29 -0
  119. package/dist/lib/scaffold.d.ts.map +1 -0
  120. package/dist/lib/scaffold.js +166 -0
  121. package/dist/lib/scaffold.js.map +1 -0
  122. package/dist/lib/troubleshoot/analyzer.d.ts +14 -0
  123. package/dist/lib/troubleshoot/analyzer.d.ts.map +1 -0
  124. package/dist/lib/troubleshoot/analyzer.js +541 -0
  125. package/dist/lib/troubleshoot/analyzer.js.map +1 -0
  126. package/dist/lib/troubleshoot/auto-fix.d.ts +29 -0
  127. package/dist/lib/troubleshoot/auto-fix.d.ts.map +1 -0
  128. package/dist/lib/troubleshoot/auto-fix.js +373 -0
  129. package/dist/lib/troubleshoot/auto-fix.js.map +1 -0
  130. package/dist/lib/troubleshoot/index.d.ts +5 -0
  131. package/dist/lib/troubleshoot/index.d.ts.map +1 -0
  132. package/dist/lib/troubleshoot/index.js +6 -0
  133. package/dist/lib/troubleshoot/index.js.map +1 -0
  134. package/dist/lib/troubleshoot/log-fetcher.d.ts +43 -0
  135. package/dist/lib/troubleshoot/log-fetcher.d.ts.map +1 -0
  136. package/dist/lib/troubleshoot/log-fetcher.js +431 -0
  137. package/dist/lib/troubleshoot/log-fetcher.js.map +1 -0
  138. package/dist/lib/troubleshoot/redactor.d.ts +35 -0
  139. package/dist/lib/troubleshoot/redactor.d.ts.map +1 -0
  140. package/dist/lib/troubleshoot/redactor.js +208 -0
  141. package/dist/lib/troubleshoot/redactor.js.map +1 -0
  142. package/dist/lib/validators/catalog-validator.d.ts +3 -0
  143. package/dist/lib/validators/catalog-validator.d.ts.map +1 -0
  144. package/dist/lib/validators/catalog-validator.js +205 -0
  145. package/dist/lib/validators/catalog-validator.js.map +1 -0
  146. package/dist/lib/validators/dockerfile-validator.d.ts +4 -0
  147. package/dist/lib/validators/dockerfile-validator.d.ts.map +1 -0
  148. package/dist/lib/validators/dockerfile-validator.js +262 -0
  149. package/dist/lib/validators/dockerfile-validator.js.map +1 -0
  150. package/dist/lib/validators/env-validator.d.ts +3 -0
  151. package/dist/lib/validators/env-validator.d.ts.map +1 -0
  152. package/dist/lib/validators/env-validator.js +268 -0
  153. package/dist/lib/validators/env-validator.js.map +1 -0
  154. package/dist/lib/validators/git-validator.d.ts +3 -0
  155. package/dist/lib/validators/git-validator.d.ts.map +1 -0
  156. package/dist/lib/validators/git-validator.js +236 -0
  157. package/dist/lib/validators/git-validator.js.map +1 -0
  158. package/dist/lib/validators/health-detector.d.ts +4 -0
  159. package/dist/lib/validators/health-detector.d.ts.map +1 -0
  160. package/dist/lib/validators/health-detector.js +159 -0
  161. package/dist/lib/validators/health-detector.js.map +1 -0
  162. package/dist/lib/validators/index.d.ts +7 -0
  163. package/dist/lib/validators/index.d.ts.map +1 -0
  164. package/dist/lib/validators/index.js +7 -0
  165. package/dist/lib/validators/index.js.map +1 -0
  166. package/dist/lib/validators/route-validator.d.ts +3 -0
  167. package/dist/lib/validators/route-validator.d.ts.map +1 -0
  168. package/dist/lib/validators/route-validator.js +238 -0
  169. package/dist/lib/validators/route-validator.js.map +1 -0
  170. package/dist/types/index.d.ts +455 -0
  171. package/dist/types/index.d.ts.map +1 -0
  172. package/dist/types/index.js +37 -0
  173. package/dist/types/index.js.map +1 -0
  174. package/package.json +58 -0
@@ -0,0 +1,465 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { parse } from 'yaml';
4
+ import { createInterface } from 'node:readline';
5
+ import chalk from 'chalk';
6
+ import { loadLinkedService } from '../lib/config.js';
7
+ import { BuilderClient } from '../lib/builder.js';
8
+ import { KokoClient } from '../lib/api.js';
9
+ import { log, spinner } from '../lib/output.js';
10
+ import { fetchLogs, getPodStatus, getRecentEvents, } from '../lib/troubleshoot/log-fetcher.js';
11
+ import { analyzeLogs, quickAnalysis, } from '../lib/troubleshoot/analyzer.js';
12
+ import { previewFix, applyFix, formatPreview, getAutoFixableRecommendations, explainFix, } from '../lib/troubleshoot/auto-fix.js';
13
+ /**
14
+ * Main troubleshoot command
15
+ */
16
+ export async function troubleshootCommand(options) {
17
+ const environment = resolveEnvironment(options);
18
+ const tailLines = parseInt(options.lines || '500', 10);
19
+ // Get service name
20
+ let serviceName;
21
+ try {
22
+ serviceName = await getServiceName(options);
23
+ }
24
+ catch (error) {
25
+ log.error(error.message);
26
+ process.exit(1);
27
+ }
28
+ console.log('');
29
+ log.info(`${chalk.bold('Troubleshooting')} ${chalk.cyan(serviceName)} ${chalk.dim(`(${environment})`)}`);
30
+ console.log('');
31
+ // Gather context
32
+ const contextSpinner = spinner('Gathering service context');
33
+ let context;
34
+ try {
35
+ context = await gatherContext(serviceName, environment);
36
+ contextSpinner.stop(true);
37
+ }
38
+ catch (error) {
39
+ contextSpinner.stop(false);
40
+ log.error(`Failed to gather context: ${error.message}`);
41
+ process.exit(1);
42
+ }
43
+ // Display context summary
44
+ displayContextSummary(context);
45
+ // Fetch logs
46
+ const logsSpinner = spinner('Fetching logs from services');
47
+ try {
48
+ const timeline = await fetchLogs({
49
+ serviceName,
50
+ namespace: `${serviceName}-${environment}`,
51
+ environment,
52
+ tailLines,
53
+ since: options.since,
54
+ includeJanus: true,
55
+ includeDependencies: true,
56
+ });
57
+ logsSpinner.stop(true);
58
+ log.dim(` Collected ${timeline.entries.length} log entries from ${timeline.services.length} services`);
59
+ console.log('');
60
+ // Analyze logs
61
+ let result;
62
+ if (options.quick) {
63
+ // Quick pattern-matching analysis
64
+ log.info('Running quick analysis...');
65
+ const issues = quickAnalysis(timeline, context);
66
+ result = {
67
+ timestamp: new Date().toISOString(),
68
+ service: serviceName,
69
+ environment,
70
+ status: determineStatus(issues),
71
+ issues,
72
+ recommendations: generateQuickRecommendations(issues),
73
+ context,
74
+ };
75
+ }
76
+ else {
77
+ // Full AI analysis
78
+ const analysisSpinner = spinner('Analyzing with AI');
79
+ try {
80
+ result = await analyzeLogs(timeline, context, environment);
81
+ analysisSpinner.stop(true);
82
+ }
83
+ catch (error) {
84
+ analysisSpinner.stop(false);
85
+ log.warning('AI analysis failed, falling back to quick analysis');
86
+ const issues = quickAnalysis(timeline, context);
87
+ result = {
88
+ timestamp: new Date().toISOString(),
89
+ service: serviceName,
90
+ environment,
91
+ status: determineStatus(issues),
92
+ issues,
93
+ recommendations: generateQuickRecommendations(issues),
94
+ context,
95
+ };
96
+ }
97
+ }
98
+ // Output results
99
+ if (options.json) {
100
+ console.log(JSON.stringify(result, null, 2));
101
+ return;
102
+ }
103
+ displayResults(result);
104
+ // Offer auto-fix if requested
105
+ if (options.fix && result.recommendations.length > 0) {
106
+ await handleAutoFix(result.recommendations);
107
+ }
108
+ else if (result.recommendations.some((r) => r.autoFixAvailable)) {
109
+ console.log('');
110
+ log.dim('Run with --fix to apply recommended fixes automatically');
111
+ }
112
+ }
113
+ catch (error) {
114
+ logsSpinner.stop(false);
115
+ log.error(`Failed to fetch logs: ${error.message}`);
116
+ process.exit(1);
117
+ }
118
+ }
119
+ /**
120
+ * Resolve environment from options
121
+ */
122
+ function resolveEnvironment(options) {
123
+ if (options.prod)
124
+ return 'prod';
125
+ if (options.uat)
126
+ return 'uat';
127
+ if (options.env)
128
+ return options.env;
129
+ return 'sandbox';
130
+ }
131
+ /**
132
+ * Get service name from options or project config
133
+ */
134
+ async function getServiceName(options) {
135
+ if (options.service) {
136
+ return options.service;
137
+ }
138
+ // Try linked service
139
+ const linkedService = await loadLinkedService();
140
+ if (linkedService) {
141
+ return linkedService.serviceName;
142
+ }
143
+ // Try catalog-info.yaml
144
+ try {
145
+ const catalogPath = join(process.cwd(), 'catalog-info.yaml');
146
+ const content = await readFile(catalogPath, 'utf-8');
147
+ const catalogInfo = parse(content);
148
+ return catalogInfo.metadata.name;
149
+ }
150
+ catch {
151
+ throw new Error('Could not determine service name. Use --service <name> or run from a service directory.');
152
+ }
153
+ }
154
+ /**
155
+ * Gather context about the service
156
+ */
157
+ async function gatherContext(serviceName, environment) {
158
+ const context = {
159
+ service: {
160
+ name: serviceName,
161
+ },
162
+ recentBuilds: [],
163
+ dependencies: [],
164
+ };
165
+ // Get service info from Koko
166
+ try {
167
+ const koko = await KokoClient.create();
168
+ const serviceResult = await koko.getService(serviceName);
169
+ if (serviceResult.success && serviceResult.data) {
170
+ context.service.id = serviceResult.data.id;
171
+ context.service.upstream = serviceResult.data.upstream;
172
+ context.service.routes = serviceResult.data.routes;
173
+ }
174
+ }
175
+ catch {
176
+ // Continue without Koko data
177
+ }
178
+ // Get recent builds
179
+ try {
180
+ const builder = await BuilderClient.create();
181
+ const buildsResult = await builder.listBuilds(serviceName);
182
+ if (buildsResult.success && buildsResult.data) {
183
+ context.recentBuilds = buildsResult.data.slice(0, 5).map((b) => ({
184
+ id: b.id.substring(0, 8),
185
+ status: b.status,
186
+ createdAt: b.createdAt,
187
+ }));
188
+ }
189
+ }
190
+ catch {
191
+ // Continue without build data
192
+ }
193
+ // Get pod status
194
+ try {
195
+ context.podStatus = await getPodStatus(serviceName, environment);
196
+ }
197
+ catch {
198
+ // Continue without pod status
199
+ }
200
+ // Get recent events
201
+ try {
202
+ context.recentEvents = await getRecentEvents(serviceName, environment);
203
+ }
204
+ catch {
205
+ // Continue without events
206
+ }
207
+ return context;
208
+ }
209
+ /**
210
+ * Display context summary
211
+ */
212
+ function displayContextSummary(context) {
213
+ log.dim('Context:');
214
+ if (context.service.upstream) {
215
+ log.dim(` Upstream: ${context.service.upstream}`);
216
+ }
217
+ if (context.recentBuilds.length > 0) {
218
+ const latestBuild = context.recentBuilds[0];
219
+ log.dim(` Latest build: ${latestBuild.id} (${latestBuild.status})`);
220
+ }
221
+ if (context.podStatus && context.podStatus.length > 0) {
222
+ const runningPods = context.podStatus.filter((p) => p.status === 'Running').length;
223
+ const totalRestarts = context.podStatus.reduce((sum, p) => sum + p.restarts, 0);
224
+ log.dim(` Pods: ${runningPods}/${context.podStatus.length} running, ${totalRestarts} total restarts`);
225
+ }
226
+ console.log('');
227
+ }
228
+ /**
229
+ * Determine overall status from issues
230
+ */
231
+ function determineStatus(issues) {
232
+ if (issues.length === 0)
233
+ return 'healthy';
234
+ if (issues.some((i) => i.severity === 'critical'))
235
+ return 'unhealthy';
236
+ if (issues.some((i) => i.severity === 'high'))
237
+ return 'degraded';
238
+ return 'degraded';
239
+ }
240
+ /**
241
+ * Generate recommendations from quick analysis issues
242
+ */
243
+ function generateQuickRecommendations(issues) {
244
+ const recommendations = [];
245
+ let priority = 1;
246
+ for (const issue of issues) {
247
+ switch (issue.type) {
248
+ case 'missing_scope':
249
+ recommendations.push({
250
+ id: `rec-${priority}`,
251
+ priority: priority++,
252
+ title: 'Add required OAuth scope',
253
+ description: 'Add the missing scope to catalog-info.yaml and re-register the service.',
254
+ action: {
255
+ type: 'add_scope',
256
+ scope: 'read:unknown', // Would need to parse from evidence
257
+ service: issue.affectedService,
258
+ },
259
+ autoFixAvailable: false, // Need scope name from logs
260
+ estimatedImpact: 'Enables cross-service API calls',
261
+ });
262
+ break;
263
+ case 'oom_killed':
264
+ recommendations.push({
265
+ id: `rec-${priority}`,
266
+ priority: priority++,
267
+ title: 'Increase memory limit',
268
+ description: 'The container is running out of memory. Increase the memory limit in Helm values.',
269
+ action: {
270
+ type: 'increase_memory',
271
+ currentLimit: '256Mi',
272
+ suggestedLimit: '512Mi',
273
+ },
274
+ autoFixAvailable: true,
275
+ estimatedImpact: 'Prevents OOMKilled crashes',
276
+ });
277
+ break;
278
+ case 'crash_loop':
279
+ recommendations.push({
280
+ id: `rec-${priority}`,
281
+ priority: priority++,
282
+ title: 'Check application startup',
283
+ description: 'Review application logs for startup errors and fix the root cause.',
284
+ action: {
285
+ type: 'manual',
286
+ instructions: 'Check logs with "iec logs" and fix any startup errors.',
287
+ },
288
+ autoFixAvailable: false,
289
+ estimatedImpact: 'Stabilizes pod lifecycle',
290
+ });
291
+ break;
292
+ case 'health_check_failure':
293
+ recommendations.push({
294
+ id: `rec-${priority}`,
295
+ priority: priority++,
296
+ title: 'Fix health endpoint',
297
+ description: 'The /health endpoint is not responding correctly.',
298
+ action: {
299
+ type: 'fix_health_endpoint',
300
+ path: '/health',
301
+ },
302
+ autoFixAvailable: false,
303
+ estimatedImpact: 'Prevents unnecessary pod restarts',
304
+ });
305
+ break;
306
+ case 'connection_refused':
307
+ recommendations.push({
308
+ id: `rec-${priority}`,
309
+ priority: priority++,
310
+ title: 'Check upstream service',
311
+ description: 'The upstream service is not reachable. Verify it is deployed and running.',
312
+ action: {
313
+ type: 'check_upstream',
314
+ upstream: 'unknown',
315
+ },
316
+ autoFixAvailable: false,
317
+ estimatedImpact: 'Restores service connectivity',
318
+ });
319
+ break;
320
+ case 'rate_limited':
321
+ recommendations.push({
322
+ id: `rec-${priority}`,
323
+ priority: priority++,
324
+ title: 'Implement request backoff',
325
+ description: 'Add exponential backoff to requests that are being rate limited.',
326
+ action: {
327
+ type: 'manual',
328
+ instructions: 'Implement retry logic with exponential backoff in your API client.',
329
+ },
330
+ autoFixAvailable: false,
331
+ estimatedImpact: 'Prevents cascading failures',
332
+ });
333
+ break;
334
+ }
335
+ }
336
+ return recommendations;
337
+ }
338
+ /**
339
+ * Display analysis results
340
+ */
341
+ function displayResults(result) {
342
+ // Status header
343
+ const statusColor = {
344
+ healthy: chalk.green,
345
+ degraded: chalk.yellow,
346
+ unhealthy: chalk.red,
347
+ };
348
+ const statusIcon = {
349
+ healthy: '[OK]',
350
+ degraded: '[!]',
351
+ unhealthy: '[X]',
352
+ };
353
+ console.log(statusColor[result.status](`${statusIcon[result.status]} Status: ${result.status.toUpperCase()}`));
354
+ console.log('');
355
+ // Issues
356
+ if (result.issues.length === 0) {
357
+ log.success('No issues detected');
358
+ }
359
+ else {
360
+ log.info(`Found ${result.issues.length} issue(s):`);
361
+ console.log('');
362
+ for (const issue of result.issues) {
363
+ const severityColor = {
364
+ critical: chalk.red,
365
+ high: chalk.yellow,
366
+ medium: chalk.cyan,
367
+ low: chalk.dim,
368
+ };
369
+ console.log(` ${severityColor[issue.severity](`[${issue.severity.toUpperCase()}]`)} ${chalk.bold(issue.title)}`);
370
+ console.log(` ${issue.description}`);
371
+ if (issue.evidence.length > 0) {
372
+ console.log(chalk.dim(' Evidence:'));
373
+ for (const ev of issue.evidence.slice(0, 3)) {
374
+ console.log(chalk.dim(` - ${ev.substring(0, 100)}${ev.length > 100 ? '...' : ''}`));
375
+ }
376
+ }
377
+ console.log('');
378
+ }
379
+ }
380
+ // Recommendations
381
+ if (result.recommendations.length > 0) {
382
+ console.log(chalk.cyan.bold('Recommendations:'));
383
+ console.log('');
384
+ for (const rec of result.recommendations) {
385
+ const autoFixBadge = rec.autoFixAvailable
386
+ ? chalk.green(' [auto-fix]')
387
+ : '';
388
+ console.log(` ${chalk.bold(`${rec.priority}.`)} ${rec.title}${autoFixBadge}`);
389
+ console.log(` ${rec.description}`);
390
+ console.log(chalk.dim(` Impact: ${rec.estimatedImpact}`));
391
+ console.log('');
392
+ }
393
+ }
394
+ }
395
+ /**
396
+ * Handle auto-fix flow
397
+ */
398
+ async function handleAutoFix(recommendations) {
399
+ const autoFixable = getAutoFixableRecommendations(recommendations);
400
+ if (autoFixable.length === 0) {
401
+ log.warning('No auto-fixable recommendations available');
402
+ return;
403
+ }
404
+ console.log('');
405
+ log.info(`${autoFixable.length} fix(es) can be applied automatically:`);
406
+ console.log('');
407
+ for (const rec of autoFixable) {
408
+ console.log(` ${rec.priority}. ${rec.title}`);
409
+ console.log(` ${explainFix(rec.action)}`);
410
+ }
411
+ console.log('');
412
+ // Prompt for confirmation
413
+ const rl = createInterface({
414
+ input: process.stdin,
415
+ output: process.stdout,
416
+ });
417
+ const answer = await new Promise((resolve) => {
418
+ rl.question(chalk.yellow('Apply these fixes? [y/N/number to select]: '), (ans) => {
419
+ rl.close();
420
+ resolve(ans.trim().toLowerCase());
421
+ });
422
+ });
423
+ if (answer === '' || answer === 'n' || answer === 'no') {
424
+ log.dim('No fixes applied');
425
+ return;
426
+ }
427
+ const toApply = [];
428
+ if (answer === 'y' || answer === 'yes') {
429
+ toApply.push(...autoFixable);
430
+ }
431
+ else {
432
+ const num = parseInt(answer, 10);
433
+ if (!isNaN(num)) {
434
+ const selected = autoFixable.find((r) => r.priority === num);
435
+ if (selected) {
436
+ toApply.push(selected);
437
+ }
438
+ }
439
+ }
440
+ if (toApply.length === 0) {
441
+ log.dim('No fixes selected');
442
+ return;
443
+ }
444
+ // Apply fixes
445
+ for (const rec of toApply) {
446
+ console.log('');
447
+ log.info(`Applying: ${rec.title}`);
448
+ try {
449
+ const preview = await previewFix(rec);
450
+ console.log(formatPreview(preview));
451
+ console.log('');
452
+ const applyResult = await applyFix(preview);
453
+ if (applyResult.success) {
454
+ log.success('Fix applied successfully');
455
+ }
456
+ else {
457
+ log.error(`Failed: ${applyResult.error}`);
458
+ }
459
+ }
460
+ catch (error) {
461
+ log.error(`Failed to apply fix: ${error.message}`);
462
+ }
463
+ }
464
+ }
465
+ //# sourceMappingURL=troubleshoot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"troubleshoot.js","sourceRoot":"","sources":["../../src/commands/troubleshoot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ interface VersionsOptions {
2
+ service?: string;
3
+ limit?: number;
4
+ json?: boolean;
5
+ }
6
+ interface DeployOptions {
7
+ env?: string;
8
+ prod?: boolean;
9
+ sandbox?: boolean;
10
+ uat?: boolean;
11
+ watch?: boolean;
12
+ }
13
+ export declare function versionsCommand(options: VersionsOptions): Promise<void>;
14
+ export declare function deployVersionCommand(versionId: string, options: DeployOptions): Promise<void>;
15
+ export {};
16
+ //# sourceMappingURL=versions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versions.d.ts","sourceRoot":"","sources":["../../src/commands/versions.ts"],"names":[],"mappings":"AAKA,UAAU,eAAe;IACvB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAED,UAAU,aAAa;IACrB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAiD7E;AAED,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,IAAI,CAAC,CA0Cf"}
@@ -0,0 +1,162 @@
1
+ import { loadLinkedService } from '../lib/config.js';
2
+ import { BuilderClient } from '../lib/builder.js';
3
+ import { log, spinner, formatTable } from '../lib/output.js';
4
+ export async function versionsCommand(options) {
5
+ const builder = await BuilderClient.create();
6
+ let serviceId = options.service;
7
+ // Try to get service from linked config
8
+ if (!serviceId) {
9
+ const linkedService = await loadLinkedService();
10
+ if (linkedService) {
11
+ serviceId = linkedService.serviceId;
12
+ }
13
+ }
14
+ if (!serviceId) {
15
+ log.error('No service specified. Run "iec link" or use --service flag.');
16
+ process.exit(1);
17
+ }
18
+ const sp = spinner('Fetching versions');
19
+ const result = await builder.listVersions(serviceId);
20
+ sp.stop(true);
21
+ if (!result.success || !result.data) {
22
+ log.error(`Failed to list versions: ${result.error?.message || 'Unknown error'}`);
23
+ process.exit(1);
24
+ }
25
+ const versions = result.data.slice(0, options.limit || 10);
26
+ if (versions.length === 0) {
27
+ log.warning('No versions found');
28
+ log.dim('Push code with: iec push');
29
+ return;
30
+ }
31
+ if (options.json) {
32
+ console.log(JSON.stringify(versions, null, 2));
33
+ return;
34
+ }
35
+ const rows = versions.map((v) => [
36
+ v.id.substring(0, 8),
37
+ v.message.substring(0, 40) + (v.message.length > 40 ? '...' : ''),
38
+ formatBytes(v.size),
39
+ formatTime(v.createdAt),
40
+ v.deployedTo?.join(', ') || '-',
41
+ ]);
42
+ console.log(formatTable(['VERSION', 'MESSAGE', 'SIZE', 'CREATED', 'DEPLOYED'], rows));
43
+ }
44
+ export async function deployVersionCommand(versionId, options) {
45
+ const builder = await BuilderClient.create();
46
+ // Resolve environment
47
+ let environment = 'sandbox';
48
+ if (options.prod) {
49
+ environment = 'prod';
50
+ }
51
+ else if (options.uat) {
52
+ environment = 'uat';
53
+ }
54
+ else if (options.sandbox) {
55
+ environment = 'sandbox';
56
+ }
57
+ else if (options.env) {
58
+ environment = options.env;
59
+ }
60
+ log.info(`Deploying version ${versionId} to ${environment}`);
61
+ const sp = spinner('Triggering deployment');
62
+ const result = await builder.deployVersion(versionId, environment);
63
+ if (!result.success || !result.data) {
64
+ sp.stop(false);
65
+ log.error(`Deploy failed: ${result.error?.message || 'Unknown error'}`);
66
+ process.exit(1);
67
+ }
68
+ sp.stop(true);
69
+ log.success(`Deployment triggered: ${result.data.buildId.substring(0, 8)}`);
70
+ if (options.watch) {
71
+ log.info('');
72
+ log.info('Watching build progress...');
73
+ log.dim('Press Ctrl+C to stop watching');
74
+ await watchBuild(builder, result.data.buildId);
75
+ }
76
+ else {
77
+ log.info('');
78
+ log.info('To watch progress:');
79
+ log.dim(` iec status --build ${result.data.buildId}`);
80
+ log.info('');
81
+ log.info('To view logs:');
82
+ log.dim(` iec logs --build ${result.data.buildId}`);
83
+ }
84
+ }
85
+ async function watchBuild(builder, buildId) {
86
+ const terminalStates = ['completed', 'failed', 'cancelled'];
87
+ let lastStatus = '';
88
+ while (true) {
89
+ const result = await builder.getBuild(buildId);
90
+ if (!result.success || !result.data) {
91
+ log.error('Failed to get build status');
92
+ process.exit(1);
93
+ }
94
+ const build = result.data;
95
+ if (build.status !== lastStatus) {
96
+ lastStatus = build.status;
97
+ printBuildStatus(build.status);
98
+ }
99
+ if (terminalStates.includes(build.status)) {
100
+ log.info('');
101
+ if (build.status === 'completed') {
102
+ log.success('Deployment completed successfully!');
103
+ if (build.imageTag) {
104
+ log.dim(` Image: ${build.imageTag}`);
105
+ }
106
+ }
107
+ else if (build.status === 'cancelled') {
108
+ log.warning('Deployment was cancelled');
109
+ }
110
+ else {
111
+ log.error('Deployment failed');
112
+ if (build.error) {
113
+ log.dim(` Error: ${build.error}`);
114
+ }
115
+ log.info('');
116
+ log.info('View full logs:');
117
+ log.dim(` iec logs --build ${buildId}`);
118
+ process.exit(1);
119
+ }
120
+ break;
121
+ }
122
+ // Poll every 2 seconds
123
+ await new Promise((resolve) => setTimeout(resolve, 2000));
124
+ }
125
+ }
126
+ function printBuildStatus(status) {
127
+ const statusIcons = {
128
+ queued: '[QUEUED]',
129
+ extracting: '[EXTRACTING]',
130
+ building: '[BUILDING]',
131
+ pushing: '[PUSHING]',
132
+ deploying: '[DEPLOYING]',
133
+ completed: '[COMPLETED]',
134
+ failed: '[FAILED]',
135
+ cancelled: '[CANCELLED]',
136
+ };
137
+ const icon = statusIcons[status] || `[${status.toUpperCase()}]`;
138
+ log.info(`${icon} ${status}`);
139
+ }
140
+ function formatBytes(bytes) {
141
+ if (bytes < 1024)
142
+ return `${bytes} B`;
143
+ if (bytes < 1024 * 1024)
144
+ return `${(bytes / 1024).toFixed(1)} KB`;
145
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
146
+ }
147
+ function formatTime(isoString) {
148
+ const date = new Date(isoString);
149
+ const now = new Date();
150
+ const diffMs = now.getTime() - date.getTime();
151
+ const diffMins = Math.floor(diffMs / 60000);
152
+ if (diffMins < 1)
153
+ return 'just now';
154
+ if (diffMins < 60)
155
+ return `${diffMins}m ago`;
156
+ const diffHours = Math.floor(diffMins / 60);
157
+ if (diffHours < 24)
158
+ return `${diffHours}h ago`;
159
+ const diffDays = Math.floor(diffHours / 24);
160
+ return `${diffDays}d ago`;
161
+ }
162
+ //# sourceMappingURL=versions.js.map