@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.
- package/README.md +168 -0
- package/dist/commands/backup.d.ts +11 -0
- package/dist/commands/backup.d.ts.map +1 -0
- package/dist/commands/backup.js +112 -0
- package/dist/commands/backup.js.map +1 -0
- package/dist/commands/config.d.ts +10 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +41 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/deploy.d.ts +16 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +219 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/destroy.d.ts +12 -0
- package/dist/commands/destroy.d.ts.map +1 -0
- package/dist/commands/destroy.js +62 -0
- package/dist/commands/destroy.js.map +1 -0
- package/dist/commands/env.d.ts +7 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/env.js +42 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/init-ai.d.ts +7 -0
- package/dist/commands/init-ai.d.ts.map +1 -0
- package/dist/commands/init-ai.js +257 -0
- package/dist/commands/init-ai.js.map +1 -0
- package/dist/commands/init.d.ts +8 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +228 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/link.d.ts +10 -0
- package/dist/commands/link.d.ts.map +1 -0
- package/dist/commands/link.js +193 -0
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/login.d.ts +8 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +164 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logs.d.ts +16 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +362 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/preflight.d.ts +8 -0
- package/dist/commands/preflight.d.ts.map +1 -0
- package/dist/commands/preflight.js +188 -0
- package/dist/commands/preflight.js.map +1 -0
- package/dist/commands/program.d.ts +7 -0
- package/dist/commands/program.d.ts.map +1 -0
- package/dist/commands/program.js +59 -0
- package/dist/commands/program.js.map +1 -0
- package/dist/commands/push.d.ts +12 -0
- package/dist/commands/push.d.ts.map +1 -0
- package/dist/commands/push.js +171 -0
- package/dist/commands/push.js.map +1 -0
- package/dist/commands/register.d.ts +7 -0
- package/dist/commands/register.d.ts.map +1 -0
- package/dist/commands/register.js +124 -0
- package/dist/commands/register.js.map +1 -0
- package/dist/commands/rollback.d.ts +11 -0
- package/dist/commands/rollback.d.ts.map +1 -0
- package/dist/commands/rollback.js +172 -0
- package/dist/commands/rollback.js.map +1 -0
- package/dist/commands/sample.d.ts +11 -0
- package/dist/commands/sample.d.ts.map +1 -0
- package/dist/commands/sample.js +114 -0
- package/dist/commands/sample.js.map +1 -0
- package/dist/commands/services.d.ts +13 -0
- package/dist/commands/services.d.ts.map +1 -0
- package/dist/commands/services.js +95 -0
- package/dist/commands/services.js.map +1 -0
- package/dist/commands/status.d.ts +9 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +170 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/troubleshoot.d.ts +19 -0
- package/dist/commands/troubleshoot.d.ts.map +1 -0
- package/dist/commands/troubleshoot.js +465 -0
- package/dist/commands/troubleshoot.js.map +1 -0
- package/dist/commands/versions.d.ts +16 -0
- package/dist/commands/versions.d.ts.map +1 -0
- package/dist/commands/versions.js +162 -0
- package/dist/commands/versions.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +294 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/ai/client.d.ts +36 -0
- package/dist/lib/ai/client.d.ts.map +1 -0
- package/dist/lib/ai/client.js +140 -0
- package/dist/lib/ai/client.js.map +1 -0
- package/dist/lib/ai/generator.d.ts +17 -0
- package/dist/lib/ai/generator.d.ts.map +1 -0
- package/dist/lib/ai/generator.js +338 -0
- package/dist/lib/ai/generator.js.map +1 -0
- package/dist/lib/ai/prompts.d.ts +47 -0
- package/dist/lib/ai/prompts.d.ts.map +1 -0
- package/dist/lib/ai/prompts.js +247 -0
- package/dist/lib/ai/prompts.js.map +1 -0
- package/dist/lib/ai/scanner.d.ts +50 -0
- package/dist/lib/ai/scanner.d.ts.map +1 -0
- package/dist/lib/ai/scanner.js +237 -0
- package/dist/lib/ai/scanner.js.map +1 -0
- package/dist/lib/api.d.ts +18 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +67 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/builder.d.ts +34 -0
- package/dist/lib/builder.d.ts.map +1 -0
- package/dist/lib/builder.js +132 -0
- package/dist/lib/builder.js.map +1 -0
- package/dist/lib/config.d.ts +20 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +124 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/output.d.ts +12 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +39 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/scaffold.d.ts +29 -0
- package/dist/lib/scaffold.d.ts.map +1 -0
- package/dist/lib/scaffold.js +166 -0
- package/dist/lib/scaffold.js.map +1 -0
- package/dist/lib/troubleshoot/analyzer.d.ts +14 -0
- package/dist/lib/troubleshoot/analyzer.d.ts.map +1 -0
- package/dist/lib/troubleshoot/analyzer.js +541 -0
- package/dist/lib/troubleshoot/analyzer.js.map +1 -0
- package/dist/lib/troubleshoot/auto-fix.d.ts +29 -0
- package/dist/lib/troubleshoot/auto-fix.d.ts.map +1 -0
- package/dist/lib/troubleshoot/auto-fix.js +373 -0
- package/dist/lib/troubleshoot/auto-fix.js.map +1 -0
- package/dist/lib/troubleshoot/index.d.ts +5 -0
- package/dist/lib/troubleshoot/index.d.ts.map +1 -0
- package/dist/lib/troubleshoot/index.js +6 -0
- package/dist/lib/troubleshoot/index.js.map +1 -0
- package/dist/lib/troubleshoot/log-fetcher.d.ts +43 -0
- package/dist/lib/troubleshoot/log-fetcher.d.ts.map +1 -0
- package/dist/lib/troubleshoot/log-fetcher.js +431 -0
- package/dist/lib/troubleshoot/log-fetcher.js.map +1 -0
- package/dist/lib/troubleshoot/redactor.d.ts +35 -0
- package/dist/lib/troubleshoot/redactor.d.ts.map +1 -0
- package/dist/lib/troubleshoot/redactor.js +208 -0
- package/dist/lib/troubleshoot/redactor.js.map +1 -0
- package/dist/lib/validators/catalog-validator.d.ts +3 -0
- package/dist/lib/validators/catalog-validator.d.ts.map +1 -0
- package/dist/lib/validators/catalog-validator.js +205 -0
- package/dist/lib/validators/catalog-validator.js.map +1 -0
- package/dist/lib/validators/dockerfile-validator.d.ts +4 -0
- package/dist/lib/validators/dockerfile-validator.d.ts.map +1 -0
- package/dist/lib/validators/dockerfile-validator.js +262 -0
- package/dist/lib/validators/dockerfile-validator.js.map +1 -0
- package/dist/lib/validators/env-validator.d.ts +3 -0
- package/dist/lib/validators/env-validator.d.ts.map +1 -0
- package/dist/lib/validators/env-validator.js +268 -0
- package/dist/lib/validators/env-validator.js.map +1 -0
- package/dist/lib/validators/git-validator.d.ts +3 -0
- package/dist/lib/validators/git-validator.d.ts.map +1 -0
- package/dist/lib/validators/git-validator.js +236 -0
- package/dist/lib/validators/git-validator.js.map +1 -0
- package/dist/lib/validators/health-detector.d.ts +4 -0
- package/dist/lib/validators/health-detector.d.ts.map +1 -0
- package/dist/lib/validators/health-detector.js +159 -0
- package/dist/lib/validators/health-detector.js.map +1 -0
- package/dist/lib/validators/index.d.ts +7 -0
- package/dist/lib/validators/index.d.ts.map +1 -0
- package/dist/lib/validators/index.js +7 -0
- package/dist/lib/validators/index.js.map +1 -0
- package/dist/lib/validators/route-validator.d.ts +3 -0
- package/dist/lib/validators/route-validator.d.ts.map +1 -0
- package/dist/lib/validators/route-validator.js +238 -0
- package/dist/lib/validators/route-validator.js.map +1 -0
- package/dist/types/index.d.ts +455 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +37 -0
- package/dist/types/index.js.map +1 -0
- 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
|