tech-debt-visualizer 0.2.5 → 0.2.7
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/reports/assets/report.css +186 -101
- package/dist/reports/assets/report.js +23 -3
- package/dist/reports/html.js +43 -38
- package/package.json +1 -1
|
@@ -57,7 +57,7 @@ body.dashboard-page {
|
|
|
57
57
|
flex-direction: column;
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
-
/* ——— Dashboard header (Grafana
|
|
60
|
+
/* ——— Dashboard header (Grafana: bar with accent) ——— */
|
|
61
61
|
.dashboard-header {
|
|
62
62
|
display: flex;
|
|
63
63
|
align-items: center;
|
|
@@ -67,6 +67,7 @@ body.dashboard-page {
|
|
|
67
67
|
padding: 0.75rem 1.5rem;
|
|
68
68
|
background: var(--bg-elevated);
|
|
69
69
|
border-bottom: 1px solid var(--border);
|
|
70
|
+
border-left: 3px solid var(--link);
|
|
70
71
|
position: sticky;
|
|
71
72
|
top: 0;
|
|
72
73
|
z-index: 10;
|
|
@@ -118,11 +119,11 @@ body.dashboard-page {
|
|
|
118
119
|
.dashboard-score-of { font-size: 0.85rem; font-weight: 500; color: var(--text-muted); }
|
|
119
120
|
.dashboard-score-label { font-size: 11px; font-weight: 500; text-transform: uppercase; letter-spacing: 0.04em; margin-left: 0.35rem; opacity: 0.95; }
|
|
120
121
|
|
|
121
|
-
.dashboard-score.tier-1 { background: rgba(229, 57, 53, 0.
|
|
122
|
-
.dashboard-score.tier-2 { background: rgba(245, 124, 0, 0.
|
|
123
|
-
.dashboard-score.tier-3 { background: rgba(249, 168, 37, 0.
|
|
124
|
-
.dashboard-score.tier-4 { background: rgba(41, 182, 246, 0.
|
|
125
|
-
.dashboard-score.tier-5 { background: rgba(67, 160, 71, 0.
|
|
122
|
+
.dashboard-score.tier-1 { background: rgba(229, 57, 53, 0.2); color: #ff8a80; font-weight: 700; }
|
|
123
|
+
.dashboard-score.tier-2 { background: rgba(245, 124, 0, 0.2); color: #ffb74d; font-weight: 700; }
|
|
124
|
+
.dashboard-score.tier-3 { background: rgba(249, 168, 37, 0.2); color: #ffd54f; font-weight: 700; }
|
|
125
|
+
.dashboard-score.tier-4 { background: rgba(41, 182, 246, 0.2); color: #82b1ff; font-weight: 700; }
|
|
126
|
+
.dashboard-score.tier-5 { background: rgba(67, 160, 71, 0.2); color: #81c784; font-weight: 700; }
|
|
126
127
|
|
|
127
128
|
.dashboard-date {
|
|
128
129
|
font-size: 12px;
|
|
@@ -138,15 +139,17 @@ body.dashboard-page {
|
|
|
138
139
|
padding: 0.75rem 1rem;
|
|
139
140
|
width: 100%;
|
|
140
141
|
overflow: hidden;
|
|
142
|
+
display: flex;
|
|
143
|
+
flex-direction: column;
|
|
141
144
|
}
|
|
142
145
|
|
|
143
146
|
.dashboard-grid-2x2 {
|
|
147
|
+
flex: 1;
|
|
148
|
+
min-height: 0;
|
|
144
149
|
display: grid;
|
|
145
150
|
grid-template-columns: 1fr 1fr;
|
|
146
151
|
grid-template-rows: auto 1fr;
|
|
147
152
|
gap: 0.75rem;
|
|
148
|
-
height: 100%;
|
|
149
|
-
min-height: 0;
|
|
150
153
|
align-items: stretch;
|
|
151
154
|
}
|
|
152
155
|
|
|
@@ -170,7 +173,7 @@ body.dashboard-page {
|
|
|
170
173
|
-webkit-overflow-scrolling: touch;
|
|
171
174
|
}
|
|
172
175
|
|
|
173
|
-
.dashboard-cell-score .panel-body-score { flex:
|
|
176
|
+
.dashboard-cell-score .panel-body-score { flex: 1 1 auto; min-height: 0; }
|
|
174
177
|
|
|
175
178
|
.dashboard-cell-heatmap .panel-body-heatmap,
|
|
176
179
|
.dashboard-cell-list .panel-body {
|
|
@@ -193,6 +196,113 @@ body.dashboard-page {
|
|
|
193
196
|
.dashboard-main { padding: 0.5rem 0.75rem; }
|
|
194
197
|
}
|
|
195
198
|
|
|
199
|
+
/* ——— Footer: AI prompts button (Grafana-style, fits dashboard) ——— */
|
|
200
|
+
.dashboard-footer {
|
|
201
|
+
flex-shrink: 0;
|
|
202
|
+
padding: 0.6rem 0 0;
|
|
203
|
+
border-top: 1px solid var(--border);
|
|
204
|
+
margin-top: 0.5rem;
|
|
205
|
+
display: flex;
|
|
206
|
+
align-items: center;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
.btn-ai-prompts {
|
|
210
|
+
font: inherit;
|
|
211
|
+
font-size: 12px;
|
|
212
|
+
font-weight: 600;
|
|
213
|
+
letter-spacing: 0.02em;
|
|
214
|
+
padding: 0.45rem 0.9rem;
|
|
215
|
+
background: var(--surface);
|
|
216
|
+
color: var(--link);
|
|
217
|
+
border: 1px solid var(--border);
|
|
218
|
+
border-radius: var(--radius);
|
|
219
|
+
cursor: pointer;
|
|
220
|
+
transition: background 0.15s ease, border-color 0.15s ease;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
.btn-ai-prompts:hover {
|
|
224
|
+
background: rgba(87, 148, 242, 0.08);
|
|
225
|
+
border-color: var(--link);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/* ——— AI prompts overlay (blank screen) ——— */
|
|
229
|
+
.overlay {
|
|
230
|
+
position: fixed;
|
|
231
|
+
inset: 0;
|
|
232
|
+
z-index: 200;
|
|
233
|
+
display: none;
|
|
234
|
+
align-items: center;
|
|
235
|
+
justify-content: center;
|
|
236
|
+
padding: 1rem;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
.overlay.show {
|
|
240
|
+
display: flex;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
.overlay-backdrop {
|
|
244
|
+
position: absolute;
|
|
245
|
+
inset: 0;
|
|
246
|
+
background: rgba(0, 0, 0, 0.5);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
.overlay-panel {
|
|
250
|
+
position: relative;
|
|
251
|
+
background: var(--surface);
|
|
252
|
+
border: 1px solid var(--border);
|
|
253
|
+
border-radius: var(--radius);
|
|
254
|
+
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);
|
|
255
|
+
max-width: 560px;
|
|
256
|
+
width: 100%;
|
|
257
|
+
max-height: 85vh;
|
|
258
|
+
display: flex;
|
|
259
|
+
flex-direction: column;
|
|
260
|
+
overflow: hidden;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
.overlay-header {
|
|
264
|
+
display: flex;
|
|
265
|
+
align-items: center;
|
|
266
|
+
justify-content: space-between;
|
|
267
|
+
padding: 0.75rem 1rem;
|
|
268
|
+
border-bottom: 1px solid var(--border-subtle);
|
|
269
|
+
flex-shrink: 0;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
.overlay-title {
|
|
273
|
+
margin: 0;
|
|
274
|
+
font-size: 1rem;
|
|
275
|
+
font-weight: 600;
|
|
276
|
+
color: var(--text);
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
.overlay-close {
|
|
280
|
+
font-size: 1.5rem;
|
|
281
|
+
line-height: 1;
|
|
282
|
+
padding: 0.25rem;
|
|
283
|
+
background: none;
|
|
284
|
+
border: none;
|
|
285
|
+
color: var(--text-muted);
|
|
286
|
+
cursor: pointer;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
.overlay-close:hover {
|
|
290
|
+
color: var(--text);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
.overlay-body {
|
|
294
|
+
padding: 1rem;
|
|
295
|
+
overflow: auto;
|
|
296
|
+
flex: 1;
|
|
297
|
+
min-height: 0;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
.overlay-placeholder {
|
|
301
|
+
margin: 0;
|
|
302
|
+
font-size: 13px;
|
|
303
|
+
color: var(--text-muted);
|
|
304
|
+
}
|
|
305
|
+
|
|
196
306
|
/* ——— Panels: borders, colored accents ——— */
|
|
197
307
|
.panel {
|
|
198
308
|
background: var(--surface);
|
|
@@ -205,29 +315,22 @@ body.dashboard-page {
|
|
|
205
315
|
.panel-header {
|
|
206
316
|
padding: 0.6rem 0.85rem;
|
|
207
317
|
border-bottom: 1px solid var(--border-subtle);
|
|
208
|
-
background: rgba(0, 0, 0, 0.
|
|
318
|
+
background: rgba(0, 0, 0, 0.05);
|
|
209
319
|
flex-shrink: 0;
|
|
210
320
|
}
|
|
211
321
|
|
|
212
|
-
.panel-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
.panel-score-tier-1 .panel-header-accent { border-left-color: var(--tier-1); }
|
|
217
|
-
.panel-score-tier-2 .panel-header-accent { border-left-color: var(--tier-2); }
|
|
218
|
-
.panel-score-tier-3 .panel-header-accent { border-left-color: var(--tier-3); }
|
|
219
|
-
.panel-score-tier-4 .panel-header-accent { border-left-color: var(--tier-4); }
|
|
220
|
-
.panel-score-tier-5 .panel-header-accent { border-left-color: var(--tier-5); }
|
|
322
|
+
.panel-title {
|
|
323
|
+
color: var(--text);
|
|
324
|
+
}
|
|
221
325
|
|
|
222
326
|
[data-theme="light"] .panel-header {
|
|
223
|
-
background: rgba(0, 0, 0, 0.
|
|
327
|
+
background: rgba(0, 0, 0, 0.03);
|
|
224
328
|
}
|
|
225
329
|
|
|
226
330
|
.panel-title {
|
|
227
331
|
margin: 0;
|
|
228
332
|
font-size: 12px;
|
|
229
333
|
font-weight: 700;
|
|
230
|
-
color: var(--text);
|
|
231
334
|
letter-spacing: 0.02em;
|
|
232
335
|
text-transform: uppercase;
|
|
233
336
|
}
|
|
@@ -247,77 +350,39 @@ body.dashboard-page {
|
|
|
247
350
|
text-align: center;
|
|
248
351
|
}
|
|
249
352
|
|
|
250
|
-
/* ——— Score panel:
|
|
353
|
+
/* ——— Score panel (top-left): numeric score, tier accent ——— */
|
|
251
354
|
.panel-score {
|
|
252
|
-
border-
|
|
355
|
+
border-left: 3px solid var(--link);
|
|
253
356
|
}
|
|
254
|
-
.panel-score-tier
|
|
255
|
-
.panel-score-tier
|
|
256
|
-
.panel-score-tier
|
|
257
|
-
.panel-score-tier
|
|
258
|
-
.panel-score-tier
|
|
357
|
+
.panel-score[data-tier="1"] { border-left-color: var(--tier-1); }
|
|
358
|
+
.panel-score[data-tier="2"] { border-left-color: var(--tier-2); }
|
|
359
|
+
.panel-score[data-tier="3"] { border-left-color: var(--tier-3); }
|
|
360
|
+
.panel-score[data-tier="4"] { border-left-color: var(--tier-4); }
|
|
361
|
+
.panel-score[data-tier="5"] { border-left-color: var(--tier-5); }
|
|
259
362
|
|
|
260
363
|
.panel-score .panel-body-score {
|
|
261
364
|
text-align: center;
|
|
262
365
|
padding: 1rem 0.85rem;
|
|
263
366
|
}
|
|
264
367
|
|
|
265
|
-
.score-display {
|
|
266
|
-
display: flex;
|
|
267
|
-
align-items: center;
|
|
268
|
-
justify-content: center;
|
|
269
|
-
gap: 1rem;
|
|
270
|
-
margin-bottom: 0.6rem;
|
|
271
|
-
flex-wrap: wrap;
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
.score-shield-wrap {
|
|
275
|
-
line-height: 0;
|
|
276
|
-
flex-shrink: 0;
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
.panel-score .score-badge-svg {
|
|
280
|
-
display: block;
|
|
281
|
-
width: 72px;
|
|
282
|
-
height: auto;
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
.panel-score .score-badge-svg .score-badge-num {
|
|
286
|
-
font-size: 28px;
|
|
287
|
-
font-weight: 900;
|
|
288
|
-
letter-spacing: -0.03em;
|
|
289
|
-
fill: #fff;
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
.panel-score .score-badge-svg .score-badge-of {
|
|
293
|
-
font-size: 10px;
|
|
294
|
-
font-weight: 700;
|
|
295
|
-
letter-spacing: 0.1em;
|
|
296
|
-
text-transform: uppercase;
|
|
297
|
-
fill: rgba(255,255,255,0.95);
|
|
298
|
-
}
|
|
299
|
-
|
|
300
368
|
.score-numeric {
|
|
301
369
|
display: flex;
|
|
302
370
|
align-items: baseline;
|
|
303
|
-
|
|
371
|
+
justify-content: center;
|
|
372
|
+
gap: 0.25rem;
|
|
373
|
+
margin-bottom: 0.5rem;
|
|
304
374
|
}
|
|
305
375
|
|
|
306
376
|
.score-num {
|
|
307
|
-
font-size:
|
|
377
|
+
font-size: 2rem;
|
|
308
378
|
font-weight: 800;
|
|
309
379
|
line-height: 1;
|
|
310
380
|
letter-spacing: -0.04em;
|
|
381
|
+
color: var(--text);
|
|
311
382
|
}
|
|
312
383
|
|
|
313
|
-
.panel-score-tier-1 .score-num { color: var(--tier-1); }
|
|
314
|
-
.panel-score-tier-2 .score-num { color: var(--tier-2); }
|
|
315
|
-
.panel-score-tier-3 .score-num { color: var(--tier-3); }
|
|
316
|
-
.panel-score-tier-4 .score-num { color: var(--tier-4); }
|
|
317
|
-
.panel-score-tier-5 .score-num { color: var(--tier-5); }
|
|
318
|
-
|
|
319
384
|
.score-of {
|
|
320
|
-
font-size: 0.
|
|
385
|
+
font-size: 0.9rem;
|
|
321
386
|
font-weight: 600;
|
|
322
387
|
color: var(--text-muted);
|
|
323
388
|
}
|
|
@@ -326,14 +391,9 @@ body.dashboard-page {
|
|
|
326
391
|
margin: 0 0 0.2rem;
|
|
327
392
|
font-size: 0.95rem;
|
|
328
393
|
font-weight: 700;
|
|
394
|
+
color: var(--text);
|
|
329
395
|
}
|
|
330
396
|
|
|
331
|
-
.panel-score-tier-1 .score-label { color: var(--tier-1); }
|
|
332
|
-
.panel-score-tier-2 .score-label { color: var(--tier-2); }
|
|
333
|
-
.panel-score-tier-3 .score-label { color: var(--tier-3); }
|
|
334
|
-
.panel-score-tier-4 .score-label { color: var(--tier-4); }
|
|
335
|
-
.panel-score-tier-5 .score-label { color: var(--tier-5); }
|
|
336
|
-
|
|
337
397
|
.panel-score .score-desc {
|
|
338
398
|
margin: 0 0 0.4rem;
|
|
339
399
|
font-size: 12px;
|
|
@@ -376,7 +436,7 @@ body.dashboard-page {
|
|
|
376
436
|
font-weight: 700;
|
|
377
437
|
text-transform: uppercase;
|
|
378
438
|
letter-spacing: 0.05em;
|
|
379
|
-
color: var(--
|
|
439
|
+
color: var(--text-muted);
|
|
380
440
|
}
|
|
381
441
|
|
|
382
442
|
.priority-inline .priority-list { margin: 0; }
|
|
@@ -393,9 +453,16 @@ body.dashboard-page {
|
|
|
393
453
|
gap: 0.75rem 1.25rem;
|
|
394
454
|
}
|
|
395
455
|
|
|
456
|
+
.panel-heatmap .panel-header-heatmap {
|
|
457
|
+
border-left: 2px solid var(--tier-3);
|
|
458
|
+
}
|
|
396
459
|
.panel-heatmap .panel-title { margin-right: 0.5rem; }
|
|
397
460
|
.panel-heatmap .panel-desc { margin: 0.15rem 0 0; flex-basis: 100%; }
|
|
398
461
|
|
|
462
|
+
.panel-list .panel-header {
|
|
463
|
+
border-left: 2px solid var(--link);
|
|
464
|
+
}
|
|
465
|
+
|
|
399
466
|
.legend-inline {
|
|
400
467
|
margin: 0;
|
|
401
468
|
margin-left: auto;
|
|
@@ -410,11 +477,6 @@ body.dashboard-page {
|
|
|
410
477
|
border-radius: var(--radius);
|
|
411
478
|
}
|
|
412
479
|
|
|
413
|
-
/* Problems panel: blue accent */
|
|
414
|
-
.panel-llm {
|
|
415
|
-
border-left: 3px solid var(--link);
|
|
416
|
-
}
|
|
417
|
-
.panel-llm .panel-header { border-left: none; }
|
|
418
480
|
|
|
419
481
|
/* ——— Banner ——— */
|
|
420
482
|
.no-llm-banner {
|
|
@@ -432,39 +494,62 @@ body.dashboard-page {
|
|
|
432
494
|
margin: 0;
|
|
433
495
|
}
|
|
434
496
|
|
|
435
|
-
/* ——— Treemap ——— */
|
|
497
|
+
/* ——— Treemap: colored block + file name visible ——— */
|
|
436
498
|
#treemap {
|
|
437
499
|
display: flex;
|
|
438
500
|
flex-wrap: wrap;
|
|
439
|
-
gap:
|
|
440
|
-
min-height:
|
|
501
|
+
gap: 10px 12px;
|
|
502
|
+
min-height: 120px;
|
|
441
503
|
padding: 0.25rem 0;
|
|
442
504
|
}
|
|
443
505
|
|
|
444
506
|
.treemap-cell {
|
|
507
|
+
width: 92px;
|
|
508
|
+
flex: none;
|
|
445
509
|
display: flex;
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
font-size: 11px;
|
|
510
|
+
flex-direction: column;
|
|
511
|
+
align-items: center;
|
|
512
|
+
gap: 4px;
|
|
450
513
|
cursor: pointer;
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
514
|
+
padding: 0;
|
|
515
|
+
border: none;
|
|
516
|
+
background: none;
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
.treemap-cell-block {
|
|
520
|
+
width: 40px;
|
|
521
|
+
height: 40px;
|
|
522
|
+
flex-shrink: 0;
|
|
523
|
+
border-radius: 4px;
|
|
454
524
|
border: 1px solid rgba(0, 0, 0, 0.15);
|
|
455
|
-
border-radius: 2px;
|
|
456
525
|
}
|
|
457
526
|
|
|
458
|
-
.treemap-cell
|
|
527
|
+
.treemap-cell-name {
|
|
528
|
+
font-size: 10px;
|
|
529
|
+
line-height: 1.3;
|
|
530
|
+
color: var(--text);
|
|
531
|
+
text-align: center;
|
|
532
|
+
max-width: 100%;
|
|
533
|
+
overflow: hidden;
|
|
534
|
+
display: -webkit-box;
|
|
535
|
+
-webkit-line-clamp: 2;
|
|
536
|
+
-webkit-box-orient: vertical;
|
|
537
|
+
word-break: break-all;
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
.treemap-cell:hover .treemap-cell-block {
|
|
459
541
|
outline: 2px solid var(--link);
|
|
460
542
|
outline-offset: 1px;
|
|
461
543
|
}
|
|
544
|
+
.treemap-cell:hover .treemap-cell-name {
|
|
545
|
+
color: var(--link);
|
|
546
|
+
}
|
|
462
547
|
|
|
463
|
-
.treemap-cell[data-severity="critical"] { background: var(--tier-1);
|
|
464
|
-
.treemap-cell[data-severity="high"] { background: var(--tier-2);
|
|
465
|
-
.treemap-cell[data-severity="medium"] { background: var(--tier-3);
|
|
466
|
-
.treemap-cell[data-severity="low"] { background: var(--tier-5);
|
|
467
|
-
.treemap-cell[data-severity="none"] { background: var(--border);
|
|
548
|
+
.treemap-cell[data-severity="critical"] .treemap-cell-block { background: var(--tier-1); border-color: rgba(0,0,0,0.2); }
|
|
549
|
+
.treemap-cell[data-severity="high"] .treemap-cell-block { background: var(--tier-2); border-color: rgba(0,0,0,0.15); }
|
|
550
|
+
.treemap-cell[data-severity="medium"] .treemap-cell-block { background: var(--tier-3); border-color: rgba(0,0,0,0.1); }
|
|
551
|
+
.treemap-cell[data-severity="low"] .treemap-cell-block { background: var(--tier-5); border-color: rgba(0,0,0,0.1); }
|
|
552
|
+
.treemap-cell[data-severity="none"] .treemap-cell-block { background: var(--border); border-color: var(--border-subtle); }
|
|
468
553
|
|
|
469
554
|
.legend {
|
|
470
555
|
display: flex;
|
|
@@ -142,13 +142,14 @@ fileScores.forEach(function (_ref) {
|
|
|
142
142
|
var llmScore =
|
|
143
143
|
fileM && fileM.llmFileScore != null ? " (LLM debt: " + fileM.llmFileScore + "/100)" : "";
|
|
144
144
|
var severity = (fileM && fileM.llmSeverity) ? fileM.llmSeverity : worstSeverity(items);
|
|
145
|
+
var basename = file.split("/").pop() || file;
|
|
145
146
|
var cell = document.createElement("div");
|
|
146
147
|
cell.className = "treemap-cell";
|
|
147
148
|
cell.dataset.severity = severity;
|
|
148
|
-
cell.style.flex = String((score / maxScore) * 100) + " 1 80px";
|
|
149
|
-
cell.style.minWidth = "72px";
|
|
150
149
|
cell.title = file + llmScore;
|
|
151
|
-
cell.
|
|
150
|
+
cell.innerHTML =
|
|
151
|
+
'<span class="treemap-cell-block" aria-hidden="true"></span>' +
|
|
152
|
+
'<span class="treemap-cell-name">' + escapeHtml(basename) + "</span>";
|
|
152
153
|
cell.addEventListener("click", function () { showDetail(file, items); });
|
|
153
154
|
treemapEl.appendChild(cell);
|
|
154
155
|
});
|
|
@@ -319,3 +320,22 @@ function showDetail(file, items) {
|
|
|
319
320
|
if (e.target === panel) panel.classList.remove("show");
|
|
320
321
|
};
|
|
321
322
|
}
|
|
323
|
+
|
|
324
|
+
(function () {
|
|
325
|
+
var btn = document.getElementById("btnAiPrompts");
|
|
326
|
+
var overlay = document.getElementById("aiPromptsOverlay");
|
|
327
|
+
var closeBtn = document.getElementById("closeAiPrompts");
|
|
328
|
+
var backdrop = overlay && overlay.querySelector(".overlay-backdrop");
|
|
329
|
+
if (!btn || !overlay) return;
|
|
330
|
+
function open() {
|
|
331
|
+
overlay.classList.add("show");
|
|
332
|
+
overlay.setAttribute("aria-hidden", "false");
|
|
333
|
+
}
|
|
334
|
+
function close() {
|
|
335
|
+
overlay.classList.remove("show");
|
|
336
|
+
overlay.setAttribute("aria-hidden", "true");
|
|
337
|
+
}
|
|
338
|
+
btn.addEventListener("click", open);
|
|
339
|
+
if (closeBtn) closeBtn.addEventListener("click", close);
|
|
340
|
+
if (backdrop) backdrop.addEventListener("click", close);
|
|
341
|
+
})();
|
package/dist/reports/html.js
CHANGED
|
@@ -69,15 +69,6 @@ function buildHtml(run, title, darkMode, css, script) {
|
|
|
69
69
|
});
|
|
70
70
|
const highCriticalCount = run.debtItems.filter((d) => d.severity === "high" || d.severity === "critical").length;
|
|
71
71
|
const hotspotCount = run.fileMetrics.filter((m) => (m.hotspotScore ?? 0) > 0.3).length;
|
|
72
|
-
const tierColors = {
|
|
73
|
-
1: "#c00",
|
|
74
|
-
2: "#e85d00",
|
|
75
|
-
3: "#b8860b",
|
|
76
|
-
4: "#069",
|
|
77
|
-
5: "#0a6b0a",
|
|
78
|
-
};
|
|
79
|
-
const tierColor = tierColors[cleanliness.tier] ?? "#666";
|
|
80
|
-
const scoreBadgeSvg = buildScoreBadgeSvg(cleanliness.tier, tierColor);
|
|
81
72
|
const statsLine = `${run.fileMetrics.length} files · ${run.debtItems.length} items · ${highCriticalCount} high/crit · ${hotspotCount} hotspots`;
|
|
82
73
|
return `<!DOCTYPE html>
|
|
83
74
|
<html lang="en" data-theme="${theme}">
|
|
@@ -113,17 +104,14 @@ function buildHtml(run, title, darkMode, css, script) {
|
|
|
113
104
|
<main class="dashboard-main">
|
|
114
105
|
<div class="dashboard-grid-2x2">
|
|
115
106
|
<div class="dashboard-cell dashboard-cell-score">
|
|
116
|
-
<div class="panel panel-score
|
|
117
|
-
<div class="panel-header
|
|
107
|
+
<div class="panel panel-score" data-tier="${cleanliness.tier}">
|
|
108
|
+
<div class="panel-header">
|
|
118
109
|
<h2 class="panel-title">Technical Debt Cleanliness Score</h2>
|
|
119
110
|
</div>
|
|
120
111
|
<div class="panel-body panel-body-score">
|
|
121
|
-
<div class="score-
|
|
122
|
-
<
|
|
123
|
-
<
|
|
124
|
-
<span class="score-num">${cleanliness.tier}</span>
|
|
125
|
-
<span class="score-of">of 5</span>
|
|
126
|
-
</div>
|
|
112
|
+
<div class="score-numeric">
|
|
113
|
+
<span class="score-num">${cleanliness.tier}</span>
|
|
114
|
+
<span class="score-of">of 5</span>
|
|
127
115
|
</div>
|
|
128
116
|
<p class="score-label">${escapeHtml(cleanliness.label)}</p>
|
|
129
117
|
<p class="score-desc">${escapeHtml(cleanliness.description)}</p>
|
|
@@ -132,8 +120,27 @@ function buildHtml(run, title, darkMode, css, script) {
|
|
|
132
120
|
</div>
|
|
133
121
|
</div>
|
|
134
122
|
|
|
123
|
+
<div class="dashboard-cell dashboard-cell-heatmap">
|
|
124
|
+
<div class="panel panel-heatmap">
|
|
125
|
+
<div class="panel-header panel-header-heatmap">
|
|
126
|
+
<h2 class="panel-title">Files by debt</h2>
|
|
127
|
+
<p class="panel-desc">Size = complexity + churn. Color = severity. Click for details.</p>
|
|
128
|
+
<div class="legend legend-inline">
|
|
129
|
+
<span><span class="swatch swatch-crit"></span> Critical</span>
|
|
130
|
+
<span><span class="swatch swatch-high"></span> High</span>
|
|
131
|
+
<span><span class="swatch swatch-med"></span> Medium</span>
|
|
132
|
+
<span><span class="swatch swatch-low"></span> Low</span>
|
|
133
|
+
<span><span class="swatch swatch-none"></span> None</span>
|
|
134
|
+
</div>
|
|
135
|
+
</div>
|
|
136
|
+
<div class="panel-body panel-body-heatmap">
|
|
137
|
+
<div id="treemap"></div>
|
|
138
|
+
</div>
|
|
139
|
+
</div>
|
|
140
|
+
</div>
|
|
141
|
+
|
|
135
142
|
<div class="dashboard-cell dashboard-cell-problems">
|
|
136
|
-
<div class="panel
|
|
143
|
+
<div class="panel">
|
|
137
144
|
<div class="panel-header">
|
|
138
145
|
<h2 class="panel-title">Description of problems</h2>
|
|
139
146
|
</div>
|
|
@@ -159,27 +166,8 @@ function buildHtml(run, title, darkMode, css, script) {
|
|
|
159
166
|
</div>
|
|
160
167
|
</div>
|
|
161
168
|
|
|
162
|
-
<div class="dashboard-cell dashboard-cell-heatmap">
|
|
163
|
-
<div class="panel panel-heatmap panel-header-accent-orange">
|
|
164
|
-
<div class="panel-header panel-header-heatmap">
|
|
165
|
-
<h2 class="panel-title">Files by debt</h2>
|
|
166
|
-
<p class="panel-desc">Size = complexity + churn. Color = severity. Click for details.</p>
|
|
167
|
-
<div class="legend legend-inline">
|
|
168
|
-
<span><span class="swatch swatch-crit"></span> Critical</span>
|
|
169
|
-
<span><span class="swatch swatch-high"></span> High</span>
|
|
170
|
-
<span><span class="swatch swatch-med"></span> Medium</span>
|
|
171
|
-
<span><span class="swatch swatch-low"></span> Low</span>
|
|
172
|
-
<span><span class="swatch swatch-none"></span> None</span>
|
|
173
|
-
</div>
|
|
174
|
-
</div>
|
|
175
|
-
<div class="panel-body panel-body-heatmap">
|
|
176
|
-
<div id="treemap"></div>
|
|
177
|
-
</div>
|
|
178
|
-
</div>
|
|
179
|
-
</div>
|
|
180
|
-
|
|
181
169
|
<div class="dashboard-cell dashboard-cell-list">
|
|
182
|
-
<div class="panel panel-
|
|
170
|
+
<div class="panel panel-list">
|
|
183
171
|
<div class="panel-header">
|
|
184
172
|
<h2 class="panel-title">Ratings & files</h2>
|
|
185
173
|
<p class="panel-desc">Files rated above none by static or LLM. Click for full details.</p>
|
|
@@ -190,8 +178,25 @@ function buildHtml(run, title, darkMode, css, script) {
|
|
|
190
178
|
</div>
|
|
191
179
|
</div>
|
|
192
180
|
</div>
|
|
181
|
+
|
|
182
|
+
<div class="dashboard-footer">
|
|
183
|
+
<button type="button" class="btn-ai-prompts" id="btnAiPrompts">AI cleanup prompts</button>
|
|
184
|
+
</div>
|
|
193
185
|
</main>
|
|
194
186
|
|
|
187
|
+
<div id="aiPromptsOverlay" class="overlay" aria-hidden="true">
|
|
188
|
+
<div class="overlay-backdrop"></div>
|
|
189
|
+
<div class="overlay-panel">
|
|
190
|
+
<div class="overlay-header">
|
|
191
|
+
<h2 class="overlay-title">AI cleanup prompts</h2>
|
|
192
|
+
<button type="button" class="overlay-close" id="closeAiPrompts" aria-label="Close">×</button>
|
|
193
|
+
</div>
|
|
194
|
+
<div class="overlay-body">
|
|
195
|
+
<p class="overlay-placeholder">Prompts to pass into AI for cleaning up the codebase will appear here.</p>
|
|
196
|
+
</div>
|
|
197
|
+
</div>
|
|
198
|
+
</div>
|
|
199
|
+
|
|
195
200
|
<div id="detail">
|
|
196
201
|
<div class="panel">
|
|
197
202
|
<h3 id="detailTitle"></h3>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tech-debt-visualizer",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.7",
|
|
4
4
|
"description": "Language-agnostic CLI that analyzes repos and generates interactive technical debt visualizations with AI-powered insights",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|