atlas-pipeline-mcp 1.0.19 → 1.0.21
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/dist/mcp.js +191 -0
- package/dist/mcp.js.map +1 -1
- package/dist/tools/context.d.ts +33 -7
- package/dist/tools/context.d.ts.map +1 -1
- package/dist/tools/context.js +167 -82
- package/dist/tools/context.js.map +1 -1
- package/dist/tools/dashboard.d.ts +107 -0
- package/dist/tools/dashboard.d.ts.map +1 -0
- package/dist/tools/dashboard.js +544 -0
- package/dist/tools/dashboard.js.map +1 -0
- package/dist/tools/dependencies.d.ts +105 -0
- package/dist/tools/dependencies.d.ts.map +1 -0
- package/dist/tools/dependencies.js +410 -0
- package/dist/tools/dependencies.js.map +1 -0
- package/dist/tools/git.d.ts +27 -4
- package/dist/tools/git.d.ts.map +1 -1
- package/dist/tools/git.js +156 -59
- package/dist/tools/git.js.map +1 -1
- package/dist/tools/profiler.d.ts +83 -0
- package/dist/tools/profiler.d.ts.map +1 -0
- package/dist/tools/profiler.js +385 -0
- package/dist/tools/profiler.js.map +1 -0
- package/dist/tools/refactor.d.ts +63 -0
- package/dist/tools/refactor.d.ts.map +1 -0
- package/dist/tools/refactor.js +308 -0
- package/dist/tools/refactor.js.map +1 -0
- package/dist/tools/resource-manager.d.ts +167 -0
- package/dist/tools/resource-manager.d.ts.map +1 -0
- package/dist/tools/resource-manager.js +352 -0
- package/dist/tools/resource-manager.js.map +1 -0
- package/dist/tools/review.d.ts +98 -0
- package/dist/tools/review.d.ts.map +1 -0
- package/dist/tools/review.js +428 -0
- package/dist/tools/review.js.map +1 -0
- package/dist/tools/test-utils.d.ts +170 -0
- package/dist/tools/test-utils.d.ts.map +1 -0
- package/dist/tools/test-utils.js +490 -0
- package/dist/tools/test-utils.js.map +1 -0
- package/dist/tools/validation.d.ts +237 -0
- package/dist/tools/validation.d.ts.map +1 -0
- package/dist/tools/validation.js +323 -0
- package/dist/tools/validation.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,544 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Atlas Server - Live Code Metrics Dashboard Generator
|
|
3
|
+
*
|
|
4
|
+
* Generate beautiful, real-time HTML dashboards for code metrics:
|
|
5
|
+
* - Interactive visualizations
|
|
6
|
+
* - Complexity trends over time
|
|
7
|
+
* - Dependency graphs
|
|
8
|
+
* - Test coverage maps
|
|
9
|
+
* - Performance hotspots
|
|
10
|
+
* - Security audit results
|
|
11
|
+
* - Team velocity metrics
|
|
12
|
+
* - Technical debt tracking
|
|
13
|
+
*
|
|
14
|
+
* @module dashboard
|
|
15
|
+
* @author Nishant Unavane
|
|
16
|
+
* @version 1.0.0
|
|
17
|
+
*/
|
|
18
|
+
import { promises as fs } from 'fs';
|
|
19
|
+
import { join } from 'path';
|
|
20
|
+
import { logger, createTimer } from '../utils.js';
|
|
21
|
+
// ============================================================================
|
|
22
|
+
// HTML Template Generation
|
|
23
|
+
// ============================================================================
|
|
24
|
+
/**
|
|
25
|
+
* Generate complete HTML dashboard
|
|
26
|
+
*/
|
|
27
|
+
function generateDashboardHTML(options, metrics) {
|
|
28
|
+
const { title = 'Atlas Code Metrics Dashboard', theme = 'dark' } = options;
|
|
29
|
+
return `<!DOCTYPE html>
|
|
30
|
+
<html lang="en" data-theme="${theme}">
|
|
31
|
+
<head>
|
|
32
|
+
<meta charset="UTF-8">
|
|
33
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
34
|
+
<title>${title}</title>
|
|
35
|
+
<style>
|
|
36
|
+
:root {
|
|
37
|
+
--bg-primary: #1a1a2e;
|
|
38
|
+
--bg-secondary: #16213e;
|
|
39
|
+
--bg-card: #0f3460;
|
|
40
|
+
--text-primary: #e6e6e6;
|
|
41
|
+
--text-secondary: #a0a0a0;
|
|
42
|
+
--accent: #00d4ff;
|
|
43
|
+
--success: #00ff88;
|
|
44
|
+
--warning: #ffaa00;
|
|
45
|
+
--danger: #ff4757;
|
|
46
|
+
--border: #2a2a3e;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
[data-theme="light"] {
|
|
50
|
+
--bg-primary: #f5f5f5;
|
|
51
|
+
--bg-secondary: #ffffff;
|
|
52
|
+
--bg-card: #ffffff;
|
|
53
|
+
--text-primary: #1a1a1a;
|
|
54
|
+
--text-secondary: #666666;
|
|
55
|
+
--accent: #0066cc;
|
|
56
|
+
--success: #00aa44;
|
|
57
|
+
--warning: #ff8800;
|
|
58
|
+
--danger: #cc0000;
|
|
59
|
+
--border: #e0e0e0;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
* {
|
|
63
|
+
margin: 0;
|
|
64
|
+
padding: 0;
|
|
65
|
+
box-sizing: border-box;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
body {
|
|
69
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
70
|
+
background: var(--bg-primary);
|
|
71
|
+
color: var(--text-primary);
|
|
72
|
+
padding: 2rem;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.header {
|
|
76
|
+
text-align: center;
|
|
77
|
+
margin-bottom: 3rem;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.header h1 {
|
|
81
|
+
font-size: 2.5rem;
|
|
82
|
+
background: linear-gradient(135deg, var(--accent), var(--success));
|
|
83
|
+
-webkit-background-clip: text;
|
|
84
|
+
-webkit-text-fill-color: transparent;
|
|
85
|
+
margin-bottom: 0.5rem;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.header .timestamp {
|
|
89
|
+
color: var(--text-secondary);
|
|
90
|
+
font-size: 0.9rem;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.dashboard {
|
|
94
|
+
max-width: 1400px;
|
|
95
|
+
margin: 0 auto;
|
|
96
|
+
display: grid;
|
|
97
|
+
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
|
|
98
|
+
gap: 1.5rem;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.card {
|
|
102
|
+
background: var(--bg-card);
|
|
103
|
+
border: 1px solid var(--border);
|
|
104
|
+
border-radius: 12px;
|
|
105
|
+
padding: 1.5rem;
|
|
106
|
+
transition: transform 0.2s, box-shadow 0.2s;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.card:hover {
|
|
110
|
+
transform: translateY(-4px);
|
|
111
|
+
box-shadow: 0 8px 24px rgba(0,212,255,0.15);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.card-header {
|
|
115
|
+
display: flex;
|
|
116
|
+
align-items: center;
|
|
117
|
+
justify-content: space-between;
|
|
118
|
+
margin-bottom: 1rem;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.card-title {
|
|
122
|
+
font-size: 1.2rem;
|
|
123
|
+
font-weight: 600;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.card-icon {
|
|
127
|
+
font-size: 1.5rem;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
.metric-large {
|
|
131
|
+
font-size: 3rem;
|
|
132
|
+
font-weight: 700;
|
|
133
|
+
margin: 1rem 0;
|
|
134
|
+
background: linear-gradient(135deg, var(--accent), var(--success));
|
|
135
|
+
-webkit-background-clip: text;
|
|
136
|
+
-webkit-text-fill-color: transparent;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.metric-row {
|
|
140
|
+
display: flex;
|
|
141
|
+
justify-content: space-between;
|
|
142
|
+
padding: 0.75rem 0;
|
|
143
|
+
border-bottom: 1px solid var(--border);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
.metric-row:last-child {
|
|
147
|
+
border-bottom: none;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
.metric-label {
|
|
151
|
+
color: var(--text-secondary);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.metric-value {
|
|
155
|
+
font-weight: 600;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
.progress-bar {
|
|
159
|
+
width: 100%;
|
|
160
|
+
height: 8px;
|
|
161
|
+
background: var(--bg-secondary);
|
|
162
|
+
border-radius: 4px;
|
|
163
|
+
overflow: hidden;
|
|
164
|
+
margin: 0.5rem 0;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
.progress-fill {
|
|
168
|
+
height: 100%;
|
|
169
|
+
background: linear-gradient(90deg, var(--accent), var(--success));
|
|
170
|
+
transition: width 0.3s ease;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.badge {
|
|
174
|
+
display: inline-block;
|
|
175
|
+
padding: 0.25rem 0.75rem;
|
|
176
|
+
border-radius: 12px;
|
|
177
|
+
font-size: 0.85rem;
|
|
178
|
+
font-weight: 600;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
.badge-success { background: var(--success); color: #000; }
|
|
182
|
+
.badge-warning { background: var(--warning); color: #000; }
|
|
183
|
+
.badge-danger { background: var(--danger); color: #fff; }
|
|
184
|
+
|
|
185
|
+
.security-grid {
|
|
186
|
+
display: grid;
|
|
187
|
+
grid-template-columns: repeat(2, 1fr);
|
|
188
|
+
gap: 1rem;
|
|
189
|
+
margin-top: 1rem;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
.security-item {
|
|
193
|
+
text-align: center;
|
|
194
|
+
padding: 1rem;
|
|
195
|
+
background: var(--bg-secondary);
|
|
196
|
+
border-radius: 8px;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
.security-count {
|
|
200
|
+
font-size: 2rem;
|
|
201
|
+
font-weight: 700;
|
|
202
|
+
margin-bottom: 0.25rem;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
.critical { color: var(--danger); }
|
|
206
|
+
.high { color: var(--warning); }
|
|
207
|
+
.medium { color: var(--accent); }
|
|
208
|
+
.low { color: var(--text-secondary); }
|
|
209
|
+
|
|
210
|
+
.chart-container {
|
|
211
|
+
position: relative;
|
|
212
|
+
height: 200px;
|
|
213
|
+
margin-top: 1rem;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
@keyframes fadeIn {
|
|
217
|
+
from { opacity: 0; transform: translateY(20px); }
|
|
218
|
+
to { opacity: 1; transform: translateY(0); }
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
.card {
|
|
222
|
+
animation: fadeIn 0.5s ease;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
.score-circle {
|
|
226
|
+
width: 150px;
|
|
227
|
+
height: 150px;
|
|
228
|
+
border-radius: 50%;
|
|
229
|
+
display: flex;
|
|
230
|
+
align-items: center;
|
|
231
|
+
justify-content: center;
|
|
232
|
+
margin: 1rem auto;
|
|
233
|
+
background: conic-gradient(
|
|
234
|
+
var(--success) 0deg,
|
|
235
|
+
var(--success) calc(var(--score) * 3.6deg),
|
|
236
|
+
var(--bg-secondary) calc(var(--score) * 3.6deg),
|
|
237
|
+
var(--bg-secondary) 360deg
|
|
238
|
+
);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
.score-inner {
|
|
242
|
+
width: 120px;
|
|
243
|
+
height: 120px;
|
|
244
|
+
border-radius: 50%;
|
|
245
|
+
background: var(--bg-card);
|
|
246
|
+
display: flex;
|
|
247
|
+
align-items: center;
|
|
248
|
+
justify-content: center;
|
|
249
|
+
flex-direction: column;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
.score-value {
|
|
253
|
+
font-size: 2.5rem;
|
|
254
|
+
font-weight: 700;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
.score-label {
|
|
258
|
+
font-size: 0.9rem;
|
|
259
|
+
color: var(--text-secondary);
|
|
260
|
+
}
|
|
261
|
+
</style>
|
|
262
|
+
</head>
|
|
263
|
+
<body>
|
|
264
|
+
<div class="header">
|
|
265
|
+
<h1>${title}</h1>
|
|
266
|
+
<div class="timestamp">Generated on ${metrics.timestamp}</div>
|
|
267
|
+
</div>
|
|
268
|
+
|
|
269
|
+
<div class="dashboard">
|
|
270
|
+
<!-- Complexity Card -->
|
|
271
|
+
<div class="card">
|
|
272
|
+
<div class="card-header">
|
|
273
|
+
<div class="card-title">Complexity</div>
|
|
274
|
+
<div class="card-icon">📊</div>
|
|
275
|
+
</div>
|
|
276
|
+
<div class="metric-large">${metrics.complexity.averageCyclomaticComplexity.toFixed(1)}</div>
|
|
277
|
+
<div class="metric-row">
|
|
278
|
+
<span class="metric-label">Max Complexity</span>
|
|
279
|
+
<span class="metric-value ${metrics.complexity.maxComplexity > 15 ? 'critical' : ''}">${metrics.complexity.maxComplexity}</span>
|
|
280
|
+
</div>
|
|
281
|
+
<div class="metric-row">
|
|
282
|
+
<span class="metric-label">Files Above Threshold</span>
|
|
283
|
+
<span class="metric-value">${metrics.complexity.filesAboveThreshold}</span>
|
|
284
|
+
</div>
|
|
285
|
+
<div class="metric-row">
|
|
286
|
+
<span class="metric-label">Maintainability</span>
|
|
287
|
+
<span class="metric-value">${metrics.complexity.maintainabilityIndex}/100</span>
|
|
288
|
+
</div>
|
|
289
|
+
<div class="progress-bar">
|
|
290
|
+
<div class="progress-fill" style="width: ${metrics.complexity.maintainabilityIndex}%"></div>
|
|
291
|
+
</div>
|
|
292
|
+
</div>
|
|
293
|
+
|
|
294
|
+
<!-- Coverage Card -->
|
|
295
|
+
<div class="card">
|
|
296
|
+
<div class="card-header">
|
|
297
|
+
<div class="card-title">Test Coverage</div>
|
|
298
|
+
<div class="card-icon">✅</div>
|
|
299
|
+
</div>
|
|
300
|
+
<div class="score-circle" style="--score: ${metrics.coverage.lineCoverage}">
|
|
301
|
+
<div class="score-inner">
|
|
302
|
+
<div class="score-value">${metrics.coverage.lineCoverage}%</div>
|
|
303
|
+
<div class="score-label">Line Coverage</div>
|
|
304
|
+
</div>
|
|
305
|
+
</div>
|
|
306
|
+
<div class="metric-row">
|
|
307
|
+
<span class="metric-label">Branch Coverage</span>
|
|
308
|
+
<span class="metric-value">${metrics.coverage.branchCoverage}%</span>
|
|
309
|
+
</div>
|
|
310
|
+
<div class="metric-row">
|
|
311
|
+
<span class="metric-label">Function Coverage</span>
|
|
312
|
+
<span class="metric-value">${metrics.coverage.functionCoverage}%</span>
|
|
313
|
+
</div>
|
|
314
|
+
</div>
|
|
315
|
+
|
|
316
|
+
<!-- Dependencies Card -->
|
|
317
|
+
<div class="card">
|
|
318
|
+
<div class="card-header">
|
|
319
|
+
<div class="card-title">Dependencies</div>
|
|
320
|
+
<div class="card-icon">📦</div>
|
|
321
|
+
</div>
|
|
322
|
+
<div class="metric-large">${metrics.dependencies.total}</div>
|
|
323
|
+
<div class="metric-row">
|
|
324
|
+
<span class="metric-label">Direct</span>
|
|
325
|
+
<span class="metric-value">${metrics.dependencies.direct}</span>
|
|
326
|
+
</div>
|
|
327
|
+
<div class="metric-row">
|
|
328
|
+
<span class="metric-label">Transitive</span>
|
|
329
|
+
<span class="metric-value">${metrics.dependencies.transitive}</span>
|
|
330
|
+
</div>
|
|
331
|
+
<div class="metric-row">
|
|
332
|
+
<span class="metric-label">Outdated</span>
|
|
333
|
+
<span class="metric-value ${metrics.dependencies.outdated > 0 ? 'critical' : ''}">${metrics.dependencies.outdated}</span>
|
|
334
|
+
</div>
|
|
335
|
+
<div class="metric-row">
|
|
336
|
+
<span class="metric-label">Vulnerable</span>
|
|
337
|
+
<span class="metric-value ${metrics.dependencies.vulnerable > 0 ? 'critical' : ''}">${metrics.dependencies.vulnerable}</span>
|
|
338
|
+
</div>
|
|
339
|
+
<div class="metric-row">
|
|
340
|
+
<span class="metric-label">Total Size</span>
|
|
341
|
+
<span class="metric-value">${formatBytes(metrics.dependencies.totalSize)}</span>
|
|
342
|
+
</div>
|
|
343
|
+
</div>
|
|
344
|
+
|
|
345
|
+
<!-- Security Card -->
|
|
346
|
+
<div class="card">
|
|
347
|
+
<div class="card-header">
|
|
348
|
+
<div class="card-title">Security</div>
|
|
349
|
+
<div class="card-icon">🔒</div>
|
|
350
|
+
</div>
|
|
351
|
+
<div class="score-circle" style="--score: ${metrics.security.score}">
|
|
352
|
+
<div class="score-inner">
|
|
353
|
+
<div class="score-value">${metrics.security.score}</div>
|
|
354
|
+
<div class="score-label">Security Score</div>
|
|
355
|
+
</div>
|
|
356
|
+
</div>
|
|
357
|
+
<div class="security-grid">
|
|
358
|
+
<div class="security-item">
|
|
359
|
+
<div class="security-count critical">${metrics.security.vulnerabilities.critical}</div>
|
|
360
|
+
<div class="metric-label">Critical</div>
|
|
361
|
+
</div>
|
|
362
|
+
<div class="security-item">
|
|
363
|
+
<div class="security-count high">${metrics.security.vulnerabilities.high}</div>
|
|
364
|
+
<div class="metric-label">High</div>
|
|
365
|
+
</div>
|
|
366
|
+
<div class="security-item">
|
|
367
|
+
<div class="security-count medium">${metrics.security.vulnerabilities.medium}</div>
|
|
368
|
+
<div class="metric-label">Medium</div>
|
|
369
|
+
</div>
|
|
370
|
+
<div class="security-item">
|
|
371
|
+
<div class="security-count low">${metrics.security.vulnerabilities.low}</div>
|
|
372
|
+
<div class="metric-label">Low</div>
|
|
373
|
+
</div>
|
|
374
|
+
</div>
|
|
375
|
+
</div>
|
|
376
|
+
|
|
377
|
+
<!-- Performance Card -->
|
|
378
|
+
<div class="card">
|
|
379
|
+
<div class="card-header">
|
|
380
|
+
<div class="card-title">Performance</div>
|
|
381
|
+
<div class="card-icon">⚡</div>
|
|
382
|
+
</div>
|
|
383
|
+
<div class="metric-row">
|
|
384
|
+
<span class="metric-label">Build Time</span>
|
|
385
|
+
<span class="metric-value">${metrics.performance.buildTime.toFixed(2)}s</span>
|
|
386
|
+
</div>
|
|
387
|
+
<div class="metric-row">
|
|
388
|
+
<span class="metric-label">Bundle Size</span>
|
|
389
|
+
<span class="metric-value">${formatBytes(metrics.performance.bundleSize)}</span>
|
|
390
|
+
</div>
|
|
391
|
+
<div class="metric-row">
|
|
392
|
+
<span class="metric-label">Load Time</span>
|
|
393
|
+
<span class="metric-value">${metrics.performance.loadTime.toFixed(2)}s</span>
|
|
394
|
+
</div>
|
|
395
|
+
<div class="metric-row">
|
|
396
|
+
<span class="metric-label">Memory Usage</span>
|
|
397
|
+
<span class="metric-value">${metrics.performance.memoryUsage.toFixed(1)} MB</span>
|
|
398
|
+
</div>
|
|
399
|
+
</div>
|
|
400
|
+
|
|
401
|
+
<!-- Git Stats Card -->
|
|
402
|
+
<div class="card">
|
|
403
|
+
<div class="card-header">
|
|
404
|
+
<div class="card-title">Git Activity</div>
|
|
405
|
+
<div class="card-icon">📈</div>
|
|
406
|
+
</div>
|
|
407
|
+
<div class="metric-large">${metrics.git.totalCommits}</div>
|
|
408
|
+
<div class="metric-row">
|
|
409
|
+
<span class="metric-label">Contributors</span>
|
|
410
|
+
<span class="metric-value">${metrics.git.contributors}</span>
|
|
411
|
+
</div>
|
|
412
|
+
<div class="metric-row">
|
|
413
|
+
<span class="metric-label">Files Changed</span>
|
|
414
|
+
<span class="metric-value">${metrics.git.filesChanged}</span>
|
|
415
|
+
</div>
|
|
416
|
+
<div class="metric-row">
|
|
417
|
+
<span class="metric-label">Lines Added</span>
|
|
418
|
+
<span class="metric-value" style="color: var(--success)">+${metrics.git.linesAdded}</span>
|
|
419
|
+
</div>
|
|
420
|
+
<div class="metric-row">
|
|
421
|
+
<span class="metric-label">Lines Deleted</span>
|
|
422
|
+
<span class="metric-value" style="color: var(--danger)">-${metrics.git.linesDeleted}</span>
|
|
423
|
+
</div>
|
|
424
|
+
<div class="metric-row">
|
|
425
|
+
<span class="metric-label">Branches</span>
|
|
426
|
+
<span class="metric-value">${metrics.git.branchCount}</span>
|
|
427
|
+
</div>
|
|
428
|
+
</div>
|
|
429
|
+
</div>
|
|
430
|
+
|
|
431
|
+
<script>
|
|
432
|
+
function formatBytes(bytes) {
|
|
433
|
+
if (bytes === 0) return '0 B';
|
|
434
|
+
const k = 1024;
|
|
435
|
+
const sizes = ['B', 'KB', 'MB', 'GB'];
|
|
436
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
437
|
+
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
|
|
438
|
+
}
|
|
439
|
+
</script>
|
|
440
|
+
</body>
|
|
441
|
+
</html>`;
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Format bytes to human-readable string
|
|
445
|
+
*/
|
|
446
|
+
function formatBytes(bytes) {
|
|
447
|
+
if (bytes === 0)
|
|
448
|
+
return '0 B';
|
|
449
|
+
const k = 1024;
|
|
450
|
+
const sizes = ['B', 'KB', 'MB', 'GB'];
|
|
451
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
452
|
+
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;
|
|
453
|
+
}
|
|
454
|
+
// ============================================================================
|
|
455
|
+
// Mock Metrics Generation
|
|
456
|
+
// ============================================================================
|
|
457
|
+
/**
|
|
458
|
+
* Generate sample metrics for demonstration
|
|
459
|
+
*/
|
|
460
|
+
function generateSampleMetrics() {
|
|
461
|
+
return {
|
|
462
|
+
timestamp: new Date().toISOString(),
|
|
463
|
+
complexity: {
|
|
464
|
+
averageCyclomaticComplexity: 5.3,
|
|
465
|
+
maxComplexity: 18,
|
|
466
|
+
filesAboveThreshold: 3,
|
|
467
|
+
maintainabilityIndex: 75,
|
|
468
|
+
technicalDebt: {
|
|
469
|
+
hours: 12.5,
|
|
470
|
+
cost: '$2,500',
|
|
471
|
+
},
|
|
472
|
+
},
|
|
473
|
+
coverage: {
|
|
474
|
+
lineCoverage: 82,
|
|
475
|
+
branchCoverage: 75,
|
|
476
|
+
functionCoverage: 88,
|
|
477
|
+
uncoveredFiles: 5,
|
|
478
|
+
totalStatements: 1240,
|
|
479
|
+
coveredStatements: 1017,
|
|
480
|
+
},
|
|
481
|
+
dependencies: {
|
|
482
|
+
total: 347,
|
|
483
|
+
direct: 23,
|
|
484
|
+
transitive: 324,
|
|
485
|
+
outdated: 7,
|
|
486
|
+
vulnerable: 2,
|
|
487
|
+
totalSize: 52428800, // 50 MB
|
|
488
|
+
},
|
|
489
|
+
security: {
|
|
490
|
+
vulnerabilities: {
|
|
491
|
+
critical: 0,
|
|
492
|
+
high: 2,
|
|
493
|
+
medium: 5,
|
|
494
|
+
low: 8,
|
|
495
|
+
},
|
|
496
|
+
score: 73,
|
|
497
|
+
lastScanDate: new Date().toISOString(),
|
|
498
|
+
},
|
|
499
|
+
performance: {
|
|
500
|
+
buildTime: 12.3,
|
|
501
|
+
bundleSize: 524288, // 512 KB
|
|
502
|
+
loadTime: 1.8,
|
|
503
|
+
memoryUsage: 145.2,
|
|
504
|
+
},
|
|
505
|
+
git: {
|
|
506
|
+
totalCommits: 342,
|
|
507
|
+
contributors: 8,
|
|
508
|
+
filesChanged: 127,
|
|
509
|
+
linesAdded: 5240,
|
|
510
|
+
linesDeleted: 2130,
|
|
511
|
+
branchCount: 12,
|
|
512
|
+
},
|
|
513
|
+
};
|
|
514
|
+
}
|
|
515
|
+
// ============================================================================
|
|
516
|
+
// Main Dashboard Generation Function
|
|
517
|
+
// ============================================================================
|
|
518
|
+
/**
|
|
519
|
+
* Generate interactive HTML dashboard
|
|
520
|
+
*/
|
|
521
|
+
export async function generateDashboard(options) {
|
|
522
|
+
const timer = createTimer();
|
|
523
|
+
const { projectPath, outputPath = join(projectPath, 'atlas-dashboard.html'), metricsData, } = options;
|
|
524
|
+
logger.info({ projectPath, outputPath }, 'Generating dashboard');
|
|
525
|
+
// Use provided metrics or generate sample metrics
|
|
526
|
+
const metrics = metricsData || generateSampleMetrics();
|
|
527
|
+
// Generate HTML
|
|
528
|
+
const htmlContent = generateDashboardHTML(options, metrics);
|
|
529
|
+
// Write to file
|
|
530
|
+
await fs.writeFile(outputPath, htmlContent, 'utf-8');
|
|
531
|
+
const executionTimeMs = timer.elapsed();
|
|
532
|
+
logger.info({ outputPath, executionTimeMs }, 'Dashboard generated successfully');
|
|
533
|
+
return {
|
|
534
|
+
htmlPath: outputPath,
|
|
535
|
+
htmlContent,
|
|
536
|
+
metrics,
|
|
537
|
+
executionTimeMs,
|
|
538
|
+
};
|
|
539
|
+
}
|
|
540
|
+
// ============================================================================
|
|
541
|
+
// Export
|
|
542
|
+
// ============================================================================
|
|
543
|
+
export default generateDashboard;
|
|
544
|
+
//# sourceMappingURL=dashboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/tools/dashboard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Atlas Server - Dependency Analysis and Management Tool
|
|
3
|
+
*
|
|
4
|
+
* Comprehensive dependency management and analysis:
|
|
5
|
+
* - Dependency graph visualization
|
|
6
|
+
* - Circular dependency detection
|
|
7
|
+
* - Unused dependency identification
|
|
8
|
+
* - Security vulnerability scanning
|
|
9
|
+
* - Version compatibility checking
|
|
10
|
+
* - License compliance verification
|
|
11
|
+
* - Bundle size impact analysis
|
|
12
|
+
* - Upgrade path recommendations
|
|
13
|
+
*
|
|
14
|
+
* @module dependencies
|
|
15
|
+
* @author Nishant Unavane
|
|
16
|
+
* @version 1.0.0
|
|
17
|
+
*/
|
|
18
|
+
export interface DependencyAnalysisOptions {
|
|
19
|
+
projectPath: string;
|
|
20
|
+
checkSecurity?: boolean;
|
|
21
|
+
checkLicenses?: boolean;
|
|
22
|
+
findUnused?: boolean;
|
|
23
|
+
analyzeBundleSize?: boolean;
|
|
24
|
+
suggestUpgrades?: boolean;
|
|
25
|
+
}
|
|
26
|
+
export interface DependencyAnalysisResult {
|
|
27
|
+
projectPath: string;
|
|
28
|
+
dependencies: DependencyInfo[];
|
|
29
|
+
devDependencies: DependencyInfo[];
|
|
30
|
+
graph: DependencyGraph;
|
|
31
|
+
issues: DependencyIssue[];
|
|
32
|
+
recommendations: Recommendation[];
|
|
33
|
+
statistics: DependencyStatistics;
|
|
34
|
+
executionTimeMs: number;
|
|
35
|
+
warnings: string[];
|
|
36
|
+
}
|
|
37
|
+
export interface DependencyInfo {
|
|
38
|
+
name: string;
|
|
39
|
+
currentVersion: string;
|
|
40
|
+
latestVersion?: string;
|
|
41
|
+
type: 'dependency' | 'devDependency' | 'peerDependency';
|
|
42
|
+
size?: number;
|
|
43
|
+
license?: string;
|
|
44
|
+
isUsed: boolean;
|
|
45
|
+
directDependents: string[];
|
|
46
|
+
transitiveCount: number;
|
|
47
|
+
vulnerabilities?: Vulnerability[];
|
|
48
|
+
updateAvailable?: boolean;
|
|
49
|
+
majorVersionBehind?: number;
|
|
50
|
+
}
|
|
51
|
+
export interface Vulnerability {
|
|
52
|
+
severity: 'critical' | 'high' | 'medium' | 'low';
|
|
53
|
+
title: string;
|
|
54
|
+
description: string;
|
|
55
|
+
fixedIn?: string;
|
|
56
|
+
cve?: string;
|
|
57
|
+
}
|
|
58
|
+
export interface DependencyGraph {
|
|
59
|
+
nodes: DependencyNode[];
|
|
60
|
+
edges: DependencyEdge[];
|
|
61
|
+
circularDependencies: string[][];
|
|
62
|
+
maxDepth: number;
|
|
63
|
+
totalNodes: number;
|
|
64
|
+
}
|
|
65
|
+
export interface DependencyNode {
|
|
66
|
+
id: string;
|
|
67
|
+
name: string;
|
|
68
|
+
version: string;
|
|
69
|
+
depth: number;
|
|
70
|
+
}
|
|
71
|
+
export interface DependencyEdge {
|
|
72
|
+
from: string;
|
|
73
|
+
to: string;
|
|
74
|
+
}
|
|
75
|
+
export interface DependencyIssue {
|
|
76
|
+
type: IssueType;
|
|
77
|
+
severity: 'critical' | 'high' | 'medium' | 'low';
|
|
78
|
+
dependency: string;
|
|
79
|
+
description: string;
|
|
80
|
+
solution?: string;
|
|
81
|
+
}
|
|
82
|
+
export type IssueType = 'circular-dependency' | 'unused-dependency' | 'security-vulnerability' | 'license-incompatible' | 'version-conflict' | 'outdated-major' | 'deprecated-package' | 'large-bundle-impact';
|
|
83
|
+
export interface Recommendation {
|
|
84
|
+
priority: number;
|
|
85
|
+
category: 'security' | 'performance' | 'maintenance' | 'cost';
|
|
86
|
+
action: string;
|
|
87
|
+
reason: string;
|
|
88
|
+
estimatedImpact: string;
|
|
89
|
+
}
|
|
90
|
+
export interface DependencyStatistics {
|
|
91
|
+
totalDependencies: number;
|
|
92
|
+
directDependencies: number;
|
|
93
|
+
transitiveDependencies: number;
|
|
94
|
+
unusedCount: number;
|
|
95
|
+
outdatedCount: number;
|
|
96
|
+
vulnerableCount: number;
|
|
97
|
+
totalBundleSize: number;
|
|
98
|
+
licenseBreakdown: Record<string, number>;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Comprehensive dependency analysis
|
|
102
|
+
*/
|
|
103
|
+
export declare function analyzeDependencies(options: DependencyAnalysisOptions): Promise<DependencyAnalysisResult>;
|
|
104
|
+
export default analyzeDependencies;
|
|
105
|
+
//# sourceMappingURL=dependencies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../../src/tools/dependencies.ts"],"names":[],"mappings":"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"}
|