@vertaaux/cli 0.2.3 → 0.3.1

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 (66) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +58 -2
  3. package/dist/auth/device-flow.js +6 -8
  4. package/dist/commands/audit.d.ts +2 -0
  5. package/dist/commands/audit.d.ts.map +1 -1
  6. package/dist/commands/audit.js +165 -6
  7. package/dist/commands/compare.d.ts +20 -0
  8. package/dist/commands/compare.d.ts.map +1 -0
  9. package/dist/commands/compare.js +335 -0
  10. package/dist/commands/doc.d.ts +18 -0
  11. package/dist/commands/doc.d.ts.map +1 -0
  12. package/dist/commands/doc.js +161 -0
  13. package/dist/commands/download.d.ts.map +1 -1
  14. package/dist/commands/download.js +9 -8
  15. package/dist/commands/explain.d.ts +14 -33
  16. package/dist/commands/explain.d.ts.map +1 -1
  17. package/dist/commands/explain.js +277 -179
  18. package/dist/commands/fix-plan.d.ts +15 -0
  19. package/dist/commands/fix-plan.d.ts.map +1 -0
  20. package/dist/commands/fix-plan.js +182 -0
  21. package/dist/commands/patch-review.d.ts +14 -0
  22. package/dist/commands/patch-review.d.ts.map +1 -0
  23. package/dist/commands/patch-review.js +200 -0
  24. package/dist/commands/release-notes.d.ts +17 -0
  25. package/dist/commands/release-notes.d.ts.map +1 -0
  26. package/dist/commands/release-notes.js +145 -0
  27. package/dist/commands/suggest.d.ts +18 -0
  28. package/dist/commands/suggest.d.ts.map +1 -0
  29. package/dist/commands/suggest.js +152 -0
  30. package/dist/commands/triage.d.ts +17 -0
  31. package/dist/commands/triage.d.ts.map +1 -0
  32. package/dist/commands/triage.js +205 -0
  33. package/dist/commands/upload.d.ts.map +1 -1
  34. package/dist/commands/upload.js +8 -7
  35. package/dist/index.js +62 -25
  36. package/dist/output/formats.d.ts.map +1 -1
  37. package/dist/output/formats.js +14 -0
  38. package/dist/output/human.d.ts +1 -10
  39. package/dist/output/human.d.ts.map +1 -1
  40. package/dist/output/human.js +26 -98
  41. package/dist/prompts/command-catalog.d.ts +46 -0
  42. package/dist/prompts/command-catalog.d.ts.map +1 -0
  43. package/dist/prompts/command-catalog.js +187 -0
  44. package/dist/ui/spinner.d.ts +10 -35
  45. package/dist/ui/spinner.d.ts.map +1 -1
  46. package/dist/ui/spinner.js +11 -58
  47. package/dist/ui/table.d.ts +1 -18
  48. package/dist/ui/table.d.ts.map +1 -1
  49. package/dist/ui/table.js +56 -163
  50. package/dist/utils/ai-error.d.ts +48 -0
  51. package/dist/utils/ai-error.d.ts.map +1 -0
  52. package/dist/utils/ai-error.js +190 -0
  53. package/dist/utils/detect-env.d.ts +6 -8
  54. package/dist/utils/detect-env.d.ts.map +1 -1
  55. package/dist/utils/detect-env.js +6 -25
  56. package/dist/utils/stdin.d.ts +50 -0
  57. package/dist/utils/stdin.d.ts.map +1 -0
  58. package/dist/utils/stdin.js +93 -0
  59. package/node_modules/@vertaaux/tui/dist/index.cjs +1157 -0
  60. package/node_modules/@vertaaux/tui/dist/index.cjs.map +1 -0
  61. package/node_modules/@vertaaux/tui/dist/index.d.cts +609 -0
  62. package/node_modules/@vertaaux/tui/dist/index.d.ts +609 -0
  63. package/node_modules/@vertaaux/tui/dist/index.js +1100 -0
  64. package/node_modules/@vertaaux/tui/dist/index.js.map +1 -0
  65. package/node_modules/@vertaaux/tui/package.json +64 -0
  66. package/package.json +12 -5
@@ -0,0 +1,1157 @@
1
+ 'use strict';
2
+
3
+ var chalk = require('chalk');
4
+ var events = require('events');
5
+
6
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
7
+
8
+ var chalk__default = /*#__PURE__*/_interopDefault(chalk);
9
+
10
+ var __defProp = Object.defineProperty;
11
+ var __export = (target, all) => {
12
+ for (var name in all)
13
+ __defProp(target, name, { get: all[name], enumerable: true });
14
+ };
15
+
16
+ // src/ansi.ts
17
+ var ESC = "\x1B";
18
+ var CSI = `${ESC}[`;
19
+ var cursor = {
20
+ /** Move cursor to row, col (1-indexed) */
21
+ to: (row, col) => `${CSI}${row};${col}H`,
22
+ /** Move cursor to top-left */
23
+ home: `${CSI}H`,
24
+ /** Move cursor up N lines */
25
+ up: (n = 1) => `${CSI}${n}A`,
26
+ /** Move cursor down N lines */
27
+ down: (n = 1) => `${CSI}${n}B`,
28
+ /** Move cursor to column N (1-indexed) */
29
+ column: (n) => `${CSI}${n}G`,
30
+ /** Hide cursor */
31
+ hide: `${CSI}?25l`,
32
+ /** Show cursor */
33
+ show: `${CSI}?25h`,
34
+ /** Save cursor position */
35
+ save: `${ESC}7`,
36
+ /** Restore cursor position */
37
+ restore: `${ESC}8`
38
+ };
39
+ var screen = {
40
+ /** Clear entire screen */
41
+ clear: `${CSI}2J`,
42
+ /** Clear from cursor to end of screen */
43
+ clearDown: `${CSI}J`,
44
+ /** Clear from cursor to end of line */
45
+ clearLine: `${CSI}K`,
46
+ /** Clear entire line */
47
+ clearFullLine: `${CSI}2K`,
48
+ /** Enter alternate screen buffer (preserves scrollback) */
49
+ altEnter: `${CSI}?1049h`,
50
+ /** Exit alternate screen buffer */
51
+ altExit: `${CSI}?1049l`
52
+ };
53
+ var style = {
54
+ /** Reset all attributes */
55
+ reset: `${CSI}0m`
56
+ };
57
+ var borders = {
58
+ single: {
59
+ topLeft: "\u250C",
60
+ // ┌
61
+ topRight: "\u2510",
62
+ // ┐
63
+ bottomLeft: "\u2514",
64
+ // └
65
+ bottomRight: "\u2518",
66
+ // ┘
67
+ horizontal: "\u2500",
68
+ // ─
69
+ vertical: "\u2502"
70
+ // │
71
+ },
72
+ double: {
73
+ topLeft: "\u2554",
74
+ // ╔
75
+ topRight: "\u2557",
76
+ // ╗
77
+ bottomLeft: "\u255A",
78
+ // ╚
79
+ bottomRight: "\u255D",
80
+ // ╝
81
+ horizontal: "\u2550",
82
+ // ═
83
+ vertical: "\u2551"
84
+ // ║
85
+ },
86
+ rounded: {
87
+ topLeft: "\u256D",
88
+ // ╭
89
+ topRight: "\u256E",
90
+ // ╮
91
+ bottomLeft: "\u2570",
92
+ // ╰
93
+ bottomRight: "\u256F",
94
+ // ╯
95
+ horizontal: "\u2500",
96
+ // ─
97
+ vertical: "\u2502"
98
+ // │
99
+ },
100
+ heavy: {
101
+ topLeft: "\u250F",
102
+ // ┏
103
+ topRight: "\u2513",
104
+ // ┓
105
+ bottomLeft: "\u2517",
106
+ // ┗
107
+ bottomRight: "\u251B",
108
+ // ┛
109
+ horizontal: "\u2501",
110
+ // ━
111
+ vertical: "\u2503"
112
+ // ┃
113
+ }
114
+ };
115
+ function stripAnsi(str) {
116
+ return str.replace(/\x1b\[[0-9;]*[A-Za-z]|\x1b[78]/g, "");
117
+ }
118
+ function visibleLength(str) {
119
+ return stripAnsi(str).length;
120
+ }
121
+ function padEnd(str, width) {
122
+ const visible = visibleLength(str);
123
+ if (visible >= width) return str;
124
+ return str + " ".repeat(width - visible);
125
+ }
126
+ function padStart(str, width) {
127
+ const visible = visibleLength(str);
128
+ if (visible >= width) return str;
129
+ return " ".repeat(width - visible) + str;
130
+ }
131
+ function center(str, width) {
132
+ const visible = visibleLength(str);
133
+ if (visible >= width) return str;
134
+ const left = Math.floor((width - visible) / 2);
135
+ const right = width - visible - left;
136
+ return " ".repeat(left) + str + " ".repeat(right);
137
+ }
138
+ function truncate(str, maxWidth) {
139
+ if (maxWidth <= 0) return "";
140
+ const stripped = stripAnsi(str);
141
+ if (stripped.length <= maxWidth) return str;
142
+ if (maxWidth <= 3) return stripped.slice(0, maxWidth);
143
+ return stripped.slice(0, maxWidth - 1) + "\u2026";
144
+ }
145
+ var brand = {
146
+ lime: "#78FFB4",
147
+ tealLight: "#6BEEBD",
148
+ teal: "#5EDDC6",
149
+ cyan: "#51CCCE",
150
+ dark: "#0A0F1A"
151
+ };
152
+ var gradient = [brand.lime, brand.tealLight, brand.teal, brand.cyan];
153
+ var severity = {
154
+ critical: "#FF6B6B",
155
+ error: "#FF6B6B",
156
+ serious: "#FFD93D",
157
+ warning: "#FFD93D",
158
+ moderate: "#6BCEFF",
159
+ minor: "#6BCEFF",
160
+ info: "#888888"
161
+ };
162
+ var severityLabels = {
163
+ critical: "CRITICAL",
164
+ error: "ERROR",
165
+ serious: "SERIOUS",
166
+ warning: "WARNING",
167
+ moderate: "MODERATE",
168
+ minor: "MINOR",
169
+ info: "INFO"
170
+ };
171
+ var severityOrder = {
172
+ critical: 0,
173
+ error: 1,
174
+ serious: 2,
175
+ warning: 3,
176
+ minor: 4,
177
+ moderate: 5,
178
+ info: 6
179
+ };
180
+ var SCORE_THRESHOLDS = [
181
+ { min: 90, color: "#4ADE80" },
182
+ // Green — excellent
183
+ { min: 70, color: "#FACC15" },
184
+ // Yellow — needs work
185
+ { min: 0, color: "#F87171" }
186
+ // Red — poor
187
+ ];
188
+ function scoreColor(score) {
189
+ for (const { min, color } of SCORE_THRESHOLDS) {
190
+ if (score >= min) return color;
191
+ }
192
+ return SCORE_THRESHOLDS[SCORE_THRESHOLDS.length - 1].color;
193
+ }
194
+ var tokens = {
195
+ success: "#4ADE80",
196
+ error: "#F87171",
197
+ warning: "#FACC15",
198
+ info: "#6BCEFF",
199
+ muted: "#6B7280",
200
+ accent: brand.lime
201
+ };
202
+ var _colorEnabled = true;
203
+ function setColorEnabled(enabled) {
204
+ _colorEnabled = enabled;
205
+ }
206
+ function isColorEnabled() {
207
+ return _colorEnabled;
208
+ }
209
+ function colorize(text, hex) {
210
+ if (!_colorEnabled) return text;
211
+ return chalk__default.default.hex(hex)(text);
212
+ }
213
+ function boldColor(text, hex) {
214
+ if (!_colorEnabled) return text;
215
+ return chalk__default.default.hex(hex).bold(text);
216
+ }
217
+ function dim(text) {
218
+ if (!_colorEnabled) return text;
219
+ return chalk__default.default.dim(text);
220
+ }
221
+ function bold(text) {
222
+ if (!_colorEnabled) return text;
223
+ return chalk__default.default.bold(text);
224
+ }
225
+ function applyGradient(text, colors = gradient) {
226
+ if (!_colorEnabled) return text;
227
+ const colorCount = colors.length;
228
+ let result = "";
229
+ let idx = 0;
230
+ for (const char of text) {
231
+ if (char !== " " && char !== "\n") {
232
+ result += chalk__default.default.hex(colors[idx % colorCount])(char);
233
+ idx++;
234
+ } else {
235
+ result += char;
236
+ }
237
+ }
238
+ return result;
239
+ }
240
+
241
+ // src/detect.ts
242
+ function isCI() {
243
+ return Boolean(
244
+ process.env.CI || process.env.CONTINUOUS_INTEGRATION || process.env.BUILD_NUMBER || process.env.GITHUB_ACTIONS || process.env.GITLAB_CI || process.env.CIRCLECI || process.env.JENKINS_URL || process.env.TRAVIS || process.env.BUILDKITE
245
+ );
246
+ }
247
+ function isTTY() {
248
+ return Boolean(process.stderr.isTTY);
249
+ }
250
+ function isStdoutTTY() {
251
+ return Boolean(process.stdout.isTTY);
252
+ }
253
+ function isStdinTTY() {
254
+ return Boolean(process.stdin.isTTY);
255
+ }
256
+ function shouldUseColor() {
257
+ if (process.env.NO_COLOR !== void 0) return false;
258
+ if (process.env.FORCE_COLOR !== void 0) return true;
259
+ if (isCI()) return false;
260
+ return isTTY();
261
+ }
262
+ function getTerminalWidth() {
263
+ return process.stderr.columns || 80;
264
+ }
265
+ function getTerminalHeight() {
266
+ return process.stderr.rows || 24;
267
+ }
268
+ function supportsUnicode() {
269
+ if (process.env.TERM === "dumb") return false;
270
+ if (process.platform === "win32") {
271
+ return Boolean(process.env.WT_SESSION || process.env.TERM_PROGRAM);
272
+ }
273
+ return true;
274
+ }
275
+
276
+ // src/primitives/text.ts
277
+ var text_exports = {};
278
+ __export(text_exports, {
279
+ bold: () => bold2,
280
+ dim: () => dim2,
281
+ error: () => error,
282
+ heading: () => heading,
283
+ hr: () => hr,
284
+ info: () => info,
285
+ keyValue: () => keyValue,
286
+ label: () => label,
287
+ link: () => link,
288
+ scoreBadge: () => scoreBadge,
289
+ severityBadge: () => severityBadge,
290
+ statusDot: () => statusDot,
291
+ subheading: () => subheading,
292
+ success: () => success,
293
+ warning: () => warning
294
+ });
295
+ function heading(text) {
296
+ return boldColor(text, brand.lime);
297
+ }
298
+ function subheading(text) {
299
+ return boldColor(text, brand.teal);
300
+ }
301
+ function label(text) {
302
+ return bold(text);
303
+ }
304
+ function dim2(text) {
305
+ return dim(text);
306
+ }
307
+ function bold2(text) {
308
+ return bold(text);
309
+ }
310
+ function link(text) {
311
+ if (!isColorEnabled()) return text;
312
+ return colorize(`\x1B[4m${text}\x1B[24m`, tokens.info);
313
+ }
314
+ function severityBadge(level) {
315
+ const normalized = level.toLowerCase();
316
+ const displayLabel = severityLabels[normalized] || level.toUpperCase();
317
+ const hex = severity[normalized] || tokens.muted;
318
+ return boldColor(displayLabel, hex);
319
+ }
320
+ function scoreBadge(score) {
321
+ const hex = scoreColor(score);
322
+ return boldColor(String(score), hex);
323
+ }
324
+ function success(text) {
325
+ return colorize(text, tokens.success);
326
+ }
327
+ function error(text) {
328
+ return colorize(text, tokens.error);
329
+ }
330
+ function warning(text) {
331
+ return colorize(text, tokens.warning);
332
+ }
333
+ function info(text) {
334
+ return colorize(text, tokens.info);
335
+ }
336
+ function keyValue(key, value) {
337
+ return `${bold(key)}: ${value}`;
338
+ }
339
+ function hr(width, char = "\u2500") {
340
+ const line = char.repeat(width);
341
+ return dim(line);
342
+ }
343
+ function statusDot(status) {
344
+ const map = {
345
+ pass: { symbol: "\u25CF", hex: tokens.success },
346
+ // ●
347
+ fail: { symbol: "\u25CF", hex: tokens.error },
348
+ // ●
349
+ warn: { symbol: "\u25CF", hex: tokens.warning },
350
+ // ●
351
+ skip: { symbol: "\u25CB", hex: tokens.muted },
352
+ // ○
353
+ active: { symbol: "\u25CF", hex: brand.lime }
354
+ // ●
355
+ };
356
+ const { symbol, hex } = map[status] || map.skip;
357
+ return colorize(symbol, hex);
358
+ }
359
+
360
+ // src/primitives/box.ts
361
+ function box(content, opts = {}) {
362
+ const {
363
+ border = "rounded",
364
+ padding = 1,
365
+ paddingY = 0,
366
+ title,
367
+ subtitle,
368
+ width: fixedWidth,
369
+ borderColor = brand.teal,
370
+ titleColor = brand.lime
371
+ } = opts;
372
+ if (border === "none") {
373
+ return renderNoBorder(content, padding);
374
+ }
375
+ const chars = borders[border];
376
+ const termWidth = fixedWidth || Math.min(getTerminalWidth(), 100);
377
+ const innerWidth = termWidth - 2 - padding * 2;
378
+ const bc = (ch) => colorize(ch, borderColor);
379
+ const lines = wrapLines(content, innerWidth);
380
+ const pad = " ".repeat(padding);
381
+ const result = [];
382
+ result.push(renderTopBorder(chars, termWidth, title, titleColor, borderColor));
383
+ for (let i = 0; i < paddingY; i++) {
384
+ result.push(bc(chars.vertical) + " ".repeat(termWidth - 2) + bc(chars.vertical));
385
+ }
386
+ for (const line of lines) {
387
+ const padded = pad + padEnd(line, innerWidth) + pad;
388
+ result.push(bc(chars.vertical) + padded + bc(chars.vertical));
389
+ }
390
+ for (let i = 0; i < paddingY; i++) {
391
+ result.push(bc(chars.vertical) + " ".repeat(termWidth - 2) + bc(chars.vertical));
392
+ }
393
+ result.push(renderBottomBorder(chars, termWidth, subtitle, borderColor));
394
+ return result.join("\n");
395
+ }
396
+ function renderNoBorder(content, padding) {
397
+ const pad = " ".repeat(padding);
398
+ return content.split("\n").map((line) => pad + line + pad).join("\n");
399
+ }
400
+ function renderTopBorder(chars, width, title, titleColor, borderColor) {
401
+ const bc = (ch) => colorize(ch, borderColor);
402
+ const hLen = width - 2;
403
+ if (title) {
404
+ const titleStr = isColorEnabled() ? ` ${colorize(title, titleColor)} ` : ` ${title} `;
405
+ const titleVisible = visibleLength(titleStr);
406
+ const leftDash = 1;
407
+ const rightDash = Math.max(0, hLen - leftDash - titleVisible);
408
+ return bc(chars.topLeft) + bc(chars.horizontal.repeat(leftDash)) + titleStr + bc(chars.horizontal.repeat(rightDash)) + bc(chars.topRight);
409
+ }
410
+ return bc(chars.topLeft) + bc(chars.horizontal.repeat(hLen)) + bc(chars.topRight);
411
+ }
412
+ function renderBottomBorder(chars, width, subtitle, borderColor) {
413
+ const bc = (ch) => colorize(ch, borderColor);
414
+ const hLen = width - 2;
415
+ if (subtitle) {
416
+ const subStr = ` ${dim(subtitle)} `;
417
+ const subVisible = visibleLength(subStr);
418
+ const rightDash = 1;
419
+ const leftDash = Math.max(0, hLen - rightDash - subVisible);
420
+ return bc(chars.bottomLeft) + bc(chars.horizontal.repeat(leftDash)) + subStr + bc(chars.horizontal.repeat(rightDash)) + bc(chars.bottomRight);
421
+ }
422
+ return bc(chars.bottomLeft) + bc(chars.horizontal.repeat(hLen)) + bc(chars.bottomRight);
423
+ }
424
+ function wrapLines(text, maxWidth) {
425
+ const result = [];
426
+ for (const rawLine of text.split("\n")) {
427
+ if (rawLine.length <= maxWidth) {
428
+ result.push(rawLine);
429
+ continue;
430
+ }
431
+ const words = rawLine.split(" ");
432
+ let current = "";
433
+ for (const word of words) {
434
+ if (current.length === 0) {
435
+ current = word;
436
+ } else if (current.length + 1 + word.length <= maxWidth) {
437
+ current += " " + word;
438
+ } else {
439
+ result.push(current);
440
+ current = word;
441
+ }
442
+ }
443
+ if (current.length > 0) {
444
+ result.push(current);
445
+ }
446
+ }
447
+ return result;
448
+ }
449
+
450
+ // src/primitives/table.ts
451
+ function renderTable(rows, columns, opts = {}) {
452
+ if (rows.length === 0) return "";
453
+ const maxWidth = opts.maxWidth || getTerminalWidth();
454
+ const colWidths = calculateColumnWidths(rows, columns, maxWidth);
455
+ const lines = [];
456
+ if (opts.groupLabel) {
457
+ lines.push(dim(`\u2500\u2500 ${opts.groupLabel} ${"\u2500".repeat(Math.max(0, maxWidth - opts.groupLabel.length - 4))}`));
458
+ }
459
+ lines.push(renderHeaderRow(columns, colWidths));
460
+ lines.push(renderSeparator(colWidths));
461
+ for (const row of rows) {
462
+ lines.push(renderDataRow(row, columns, colWidths));
463
+ if (opts.rowBorders) {
464
+ lines.push(renderSeparator(colWidths));
465
+ }
466
+ }
467
+ return lines.join("\n");
468
+ }
469
+ function calculateColumnWidths(rows, columns, maxWidth) {
470
+ const GAP = 2;
471
+ const widths = [];
472
+ let fixedTotal = 0;
473
+ let autoCount = 0;
474
+ for (const col of columns) {
475
+ if (col.width) {
476
+ widths.push(col.width);
477
+ fixedTotal += col.width;
478
+ } else {
479
+ const headerLen = col.label.length;
480
+ const maxContent = rows.reduce((max, row) => {
481
+ const val = row[col.key] || "";
482
+ return Math.max(max, val.length);
483
+ }, headerLen);
484
+ widths.push(maxContent);
485
+ autoCount++;
486
+ }
487
+ }
488
+ const gaps = (columns.length - 1) * GAP;
489
+ const totalNeeded = widths.reduce((s, w) => s + w, 0) + gaps;
490
+ if (totalNeeded > maxWidth && autoCount > 0) {
491
+ const available = maxWidth - fixedTotal - gaps;
492
+ const autoWidths = widths.filter((_, i) => !columns[i].width);
493
+ const autoTotal = autoWidths.reduce((s, w) => s + w, 0);
494
+ for (let i = 0; i < widths.length; i++) {
495
+ if (!columns[i].width) {
496
+ widths[i] = Math.max(8, Math.floor(widths[i] / autoTotal * available));
497
+ }
498
+ }
499
+ }
500
+ return widths;
501
+ }
502
+ function renderHeaderRow(columns, widths) {
503
+ const cells = columns.map(
504
+ (col, i) => bold(alignCell(col.label, widths[i], col.align || "left"))
505
+ );
506
+ return cells.join(" ");
507
+ }
508
+ function renderSeparator(widths) {
509
+ return dim(widths.map((w) => "\u2500".repeat(w)).join("\u2500\u2500"));
510
+ }
511
+ function renderDataRow(row, columns, widths) {
512
+ const cells = columns.map((col, i) => {
513
+ const raw = row[col.key] || "";
514
+ const truncated = truncate(raw, widths[i]);
515
+ const aligned = alignCell(truncated, widths[i], col.align || "left");
516
+ return col.color ? col.color(aligned) : aligned;
517
+ });
518
+ return cells.join(" ");
519
+ }
520
+ function alignCell(text, width, align) {
521
+ switch (align) {
522
+ case "right":
523
+ return padStart(text, width);
524
+ case "center": {
525
+ const visible = visibleLength(text);
526
+ if (visible >= width) return text;
527
+ const left = Math.floor((width - visible) / 2);
528
+ const right = width - visible - left;
529
+ return " ".repeat(left) + text + " ".repeat(right);
530
+ }
531
+ default:
532
+ return padEnd(text, width);
533
+ }
534
+ }
535
+
536
+ // src/primitives/spinner.ts
537
+ var BRAILLE_FRAMES = ["\u287F", "\u28DF", "\u28EF", "\u28F7", "\u28FE", "\u28FD", "\u28FB", "\u28BF"];
538
+ var FRAME_INTERVAL = 80;
539
+ function createSpinner(text, output = process.stderr) {
540
+ let frameIndex = 0;
541
+ let currentText = text;
542
+ let currentPhase = "";
543
+ let timer = null;
544
+ let running = false;
545
+ const enabled = isTTY();
546
+ function render() {
547
+ if (!enabled) return;
548
+ const frame = isColorEnabled() ? colorize(BRAILLE_FRAMES[frameIndex], brand.lime) : BRAILLE_FRAMES[frameIndex];
549
+ const phaseStr = currentPhase ? dim(` [${currentPhase}]`) : "";
550
+ const line = `${frame} ${currentText}${phaseStr}`;
551
+ output.write(screen.clearLine + "\r" + line);
552
+ frameIndex = (frameIndex + 1) % BRAILLE_FRAMES.length;
553
+ }
554
+ function clearLine() {
555
+ if (!enabled) return;
556
+ output.write(screen.clearLine + "\r");
557
+ }
558
+ function writeFinalLine(symbol, text2) {
559
+ clearLine();
560
+ output.write(`${symbol} ${text2}
561
+ `);
562
+ }
563
+ const instance = {
564
+ get isRunning() {
565
+ return running;
566
+ },
567
+ start() {
568
+ if (running) return;
569
+ running = true;
570
+ frameIndex = 0;
571
+ if (enabled) {
572
+ render();
573
+ timer = setInterval(render, FRAME_INTERVAL);
574
+ }
575
+ },
576
+ stop() {
577
+ running = false;
578
+ if (timer) {
579
+ clearInterval(timer);
580
+ timer = null;
581
+ }
582
+ clearLine();
583
+ },
584
+ setText(text2) {
585
+ currentText = text2;
586
+ },
587
+ setPhase(phase) {
588
+ currentPhase = phase;
589
+ },
590
+ succeed(text2) {
591
+ instance.stop();
592
+ const sym = isColorEnabled() ? colorize("\u2713", "#4ADE80") : "\u2713";
593
+ writeFinalLine(sym, text2);
594
+ },
595
+ fail(text2) {
596
+ instance.stop();
597
+ const sym = isColorEnabled() ? colorize("\u2717", "#F87171") : "\u2717";
598
+ writeFinalLine(sym, text2);
599
+ },
600
+ warn(text2) {
601
+ instance.stop();
602
+ const sym = isColorEnabled() ? colorize("\u26A0", "#FACC15") : "\u26A0";
603
+ writeFinalLine(sym, text2);
604
+ },
605
+ info(text2) {
606
+ instance.stop();
607
+ const sym = isColorEnabled() ? colorize("\u2139", "#6BCEFF") : "\u2139";
608
+ writeFinalLine(sym, text2);
609
+ }
610
+ };
611
+ return instance;
612
+ }
613
+
614
+ // src/primitives/progress.ts
615
+ var FILL_CHAR = "\u2588";
616
+ var EMPTY_CHAR = "\u2591";
617
+ function createProgressBar(opts) {
618
+ const {
619
+ total,
620
+ label: label2 = "",
621
+ width: fixedWidth,
622
+ color = brand.lime,
623
+ output = process.stderr
624
+ } = opts;
625
+ const enabled = isTTY();
626
+ let startTime = Date.now();
627
+ function renderBar(current, barWidth) {
628
+ const pct = total > 0 ? Math.min(current / total, 1) : 0;
629
+ const pctStr = `${Math.round(pct * 100)}%`;
630
+ const termWidth = barWidth || fixedWidth || Math.max(20, getTerminalWidth() - (label2.length + 12));
631
+ const filled = Math.round(pct * termWidth);
632
+ const empty = termWidth - filled;
633
+ const bar = isColorEnabled() ? colorize(FILL_CHAR.repeat(filled), color) + dim(EMPTY_CHAR.repeat(empty)) : FILL_CHAR.repeat(filled) + EMPTY_CHAR.repeat(empty);
634
+ const eta = formatETA(current, total, startTime);
635
+ const labelStr = label2 ? padEnd(label2, 16) : "";
636
+ return `${labelStr}${bar} ${pctStr}${eta ? ` ${dim(eta)}` : ""}`;
637
+ }
638
+ return {
639
+ update(current) {
640
+ if (!enabled) return;
641
+ const line = renderBar(current);
642
+ output.write(screen.clearLine + "\r" + line);
643
+ },
644
+ complete(message) {
645
+ if (!enabled) return;
646
+ output.write(screen.clearLine + "\r");
647
+ if (message) {
648
+ const sym = isColorEnabled() ? colorize("\u2713", "#4ADE80") : "\u2713";
649
+ output.write(`${sym} ${message}
650
+ `);
651
+ }
652
+ },
653
+ fail(message) {
654
+ if (!enabled) return;
655
+ output.write(screen.clearLine + "\r");
656
+ if (message) {
657
+ const sym = isColorEnabled() ? colorize("\u2717", "#F87171") : "\u2717";
658
+ output.write(`${sym} ${message}
659
+ `);
660
+ }
661
+ },
662
+ render(current, barWidth) {
663
+ return renderBar(current, barWidth);
664
+ }
665
+ };
666
+ }
667
+ function formatETA(current, total, startTime) {
668
+ if (current <= 0 || total <= 0) return "";
669
+ const elapsed = (Date.now() - startTime) / 1e3;
670
+ const rate = current / elapsed;
671
+ const remaining = (total - current) / rate;
672
+ if (remaining <= 0 || !isFinite(remaining)) return "";
673
+ if (remaining < 60) return `~${Math.ceil(remaining)}s`;
674
+ return `~${Math.ceil(remaining / 60)}m`;
675
+ }
676
+ function createMultiProgress(opts = {}) {
677
+ const output = opts.output || process.stderr;
678
+ const bars = /* @__PURE__ */ new Map();
679
+ let drawnLines = 0;
680
+ return {
681
+ add(id, barOpts) {
682
+ const bar = createProgressBar({ ...barOpts, output });
683
+ bars.set(id, { bar, current: 0, total: barOpts.total, completed: false });
684
+ },
685
+ update(id, current) {
686
+ const entry = bars.get(id);
687
+ if (entry) {
688
+ entry.current = current;
689
+ }
690
+ },
691
+ complete(id) {
692
+ const entry = bars.get(id);
693
+ if (entry) {
694
+ entry.current = entry.total;
695
+ entry.completed = true;
696
+ }
697
+ },
698
+ renderAll() {
699
+ const lines = [];
700
+ for (const [, entry] of bars) {
701
+ lines.push(entry.bar.render(entry.current));
702
+ }
703
+ return lines.join("\n");
704
+ },
705
+ draw() {
706
+ if (!isTTY()) return;
707
+ if (drawnLines > 0) {
708
+ output.write(cursor.up(drawnLines));
709
+ }
710
+ const lines = [];
711
+ for (const [, entry] of bars) {
712
+ lines.push(screen.clearLine + entry.bar.render(entry.current));
713
+ }
714
+ output.write(lines.join("\n") + "\n");
715
+ drawnLines = lines.length;
716
+ },
717
+ clear() {
718
+ if (!isTTY() || drawnLines === 0) return;
719
+ output.write(cursor.up(drawnLines));
720
+ for (let i = 0; i < drawnLines; i++) {
721
+ output.write(screen.clearLine + "\n");
722
+ }
723
+ output.write(cursor.up(drawnLines));
724
+ drawnLines = 0;
725
+ }
726
+ };
727
+ }
728
+
729
+ // src/primitives/list.ts
730
+ function renderList(items, opts = {}) {
731
+ const { ordered = false, indent = 0, bullet = "\u2022" } = opts;
732
+ const pad = " ".repeat(indent);
733
+ return items.map((item, i) => {
734
+ const prefix = ordered ? `${pad}${i + 1}.` : `${pad}${bullet}`;
735
+ return `${prefix} ${item}`;
736
+ }).join("\n");
737
+ }
738
+ function renderTree(node, prefix = "", isLast = true, isRoot = true) {
739
+ const lines = [];
740
+ if (isRoot) {
741
+ lines.push(node.label);
742
+ } else {
743
+ const connector = isLast ? "\u2514\u2500\u2500 " : "\u251C\u2500\u2500 ";
744
+ lines.push(prefix + dim(connector) + node.label);
745
+ }
746
+ if (node.children && !node.collapsed) {
747
+ const childPrefix = isRoot ? "" : prefix + (isLast ? " " : dim("\u2502 "));
748
+ node.children.forEach((child, index) => {
749
+ const childIsLast = index === node.children.length - 1;
750
+ lines.push(renderTree(child, childPrefix, childIsLast, false));
751
+ });
752
+ }
753
+ return lines.join("\n");
754
+ }
755
+ function renderGroupedList(groups, opts = {}) {
756
+ const entries = groups instanceof Map ? [...groups.entries()] : Object.entries(groups);
757
+ const sections = [];
758
+ for (const [groupLabel, items] of entries) {
759
+ if (items.length === 0) continue;
760
+ const header = dim(`\u2500\u2500 ${groupLabel} (${items.length}) ${"\u2500".repeat(20)}`);
761
+ const list = renderList(items, { ...opts, indent: (opts.indent || 0) + 1 });
762
+ sections.push(`${header}
763
+ ${list}`);
764
+ }
765
+ return sections.join("\n\n");
766
+ }
767
+
768
+ // src/primitives/diff.ts
769
+ function renderDiff(lines, opts = {}) {
770
+ const { mode = "unified" } = opts;
771
+ if (mode === "side-by-side") {
772
+ return renderSideBySide(lines, opts);
773
+ }
774
+ return renderUnified(lines);
775
+ }
776
+ function renderUnified(lines) {
777
+ return lines.map((line) => {
778
+ switch (line.type) {
779
+ case "header":
780
+ return dim(line.content);
781
+ case "add":
782
+ return colorize(`+ ${line.content}`, tokens.success);
783
+ case "remove":
784
+ return colorize(`- ${line.content}`, tokens.error);
785
+ case "context":
786
+ return dim(` ${line.content}`);
787
+ }
788
+ }).join("\n");
789
+ }
790
+ function renderSideBySide(lines, opts) {
791
+ const maxWidth = opts.maxWidth || getTerminalWidth();
792
+ const halfWidth = Math.floor((maxWidth - 3) / 2);
793
+ const left = [];
794
+ const right = [];
795
+ for (const line of lines) {
796
+ if (line.type === "header") {
797
+ left.push(dim(line.content));
798
+ right.push("");
799
+ } else if (line.type === "remove") {
800
+ left.push(colorize(truncateLine(line.content, halfWidth), tokens.error));
801
+ right.push("");
802
+ } else if (line.type === "add") {
803
+ left.push("");
804
+ right.push(colorize(truncateLine(line.content, halfWidth), tokens.success));
805
+ } else {
806
+ const ctx = dim(truncateLine(line.content, halfWidth));
807
+ left.push(ctx);
808
+ right.push(ctx);
809
+ }
810
+ }
811
+ const merged = mergeSideBySide(left, right, halfWidth);
812
+ return merged.join("\n");
813
+ }
814
+ function mergeSideBySide(left, right, halfWidth) {
815
+ const result = [];
816
+ const sep = dim(" \u2502 ");
817
+ let li = 0;
818
+ let ri = 0;
819
+ while (li < left.length || ri < right.length) {
820
+ const l = li < left.length ? left[li] : "";
821
+ const r = ri < right.length ? right[ri] : "";
822
+ if (l === "" && r === "") {
823
+ li++;
824
+ ri++;
825
+ continue;
826
+ }
827
+ if (l !== "" && r === "") {
828
+ result.push(padEnd(l, halfWidth) + sep + padEnd("", halfWidth));
829
+ li++;
830
+ ri++;
831
+ continue;
832
+ }
833
+ if (l === "" && r !== "") {
834
+ result.push(padEnd("", halfWidth) + sep + padEnd(r, halfWidth));
835
+ li++;
836
+ ri++;
837
+ continue;
838
+ }
839
+ result.push(padEnd(l, halfWidth) + sep + padEnd(r, halfWidth));
840
+ li++;
841
+ ri++;
842
+ }
843
+ return result;
844
+ }
845
+ function truncateLine(text, maxWidth) {
846
+ if (text.length <= maxWidth) return text;
847
+ return text.slice(0, maxWidth - 1) + "\u2026";
848
+ }
849
+ function parseDiff(diffText) {
850
+ const lines = [];
851
+ for (const raw of diffText.split("\n")) {
852
+ if (raw.startsWith("@@") || raw.startsWith("---") || raw.startsWith("+++") || raw.startsWith("diff ")) {
853
+ lines.push({ type: "header", content: raw });
854
+ } else if (raw.startsWith("+")) {
855
+ lines.push({ type: "add", content: raw.slice(1) });
856
+ } else if (raw.startsWith("-")) {
857
+ lines.push({ type: "remove", content: raw.slice(1) });
858
+ } else {
859
+ lines.push({ type: "context", content: raw.startsWith(" ") ? raw.slice(1) : raw });
860
+ }
861
+ }
862
+ return lines;
863
+ }
864
+
865
+ // src/dashboard/state.ts
866
+ var AuditPhase = {
867
+ Connecting: "Connecting",
868
+ Crawling: "Crawling",
869
+ Analyzing: "Analyzing",
870
+ Scoring: "Scoring",
871
+ Done: "Done",
872
+ Failed: "Failed"
873
+ };
874
+ var PHASE_ORDER = [
875
+ AuditPhase.Connecting,
876
+ AuditPhase.Crawling,
877
+ AuditPhase.Analyzing,
878
+ AuditPhase.Scoring,
879
+ AuditPhase.Done
880
+ ];
881
+ function phaseIndex(phase) {
882
+ const idx = PHASE_ORDER.indexOf(phase);
883
+ return idx >= 0 ? idx : 0;
884
+ }
885
+ function phaseTotal() {
886
+ return PHASE_ORDER.length - 1;
887
+ }
888
+
889
+ // src/dashboard/frame.ts
890
+ function renderFrame(state, width, _height) {
891
+ const sections = [];
892
+ const innerWidth = Math.min(width - 4, 96);
893
+ const time = formatTime(/* @__PURE__ */ new Date());
894
+ sections.push(
895
+ box(padEnd(state.url, innerWidth - state.mode.length - 14) + `${dim("mode:")} ${state.mode}`, {
896
+ border: "rounded",
897
+ title: `VertaaUX Audit`,
898
+ subtitle: time,
899
+ width: innerWidth + 4,
900
+ borderColor: brand.teal,
901
+ titleColor: brand.lime
902
+ })
903
+ );
904
+ const currentPhaseIdx = phaseIndex(state.phase);
905
+ const phaseDots = PHASE_ORDER.slice(0, -1).map((_, i) => {
906
+ if (i < currentPhaseIdx) return statusDot("pass");
907
+ if (i === currentPhaseIdx) return statusDot("active");
908
+ return statusDot("skip");
909
+ }).join("");
910
+ const phaseLabel = bold(state.phase);
911
+ const phasePct = state.phaseTotal > 0 ? dim(` (${state.phaseIndex}/${state.phaseTotal})`) : "";
912
+ sections.push(` Phase: ${phaseLabel} ${phaseDots}${phasePct}`);
913
+ sections.push("");
914
+ const barWidth = innerWidth - 22;
915
+ const analyzerNames = Object.keys(state.progress);
916
+ if (analyzerNames.length > 0) {
917
+ for (const name of analyzerNames) {
918
+ const current = state.progress[name] || 0;
919
+ const total = state.totals[name] || 100;
920
+ const pct = total > 0 ? Math.min(current / total, 1) : 0;
921
+ const filled = Math.round(pct * barWidth);
922
+ const empty = barWidth - filled;
923
+ const fillStr = isColorEnabled() ? colorize("\u2588".repeat(filled), brand.lime) + dim("\u2591".repeat(empty)) : "\u2588".repeat(filled) + "\u2591".repeat(empty);
924
+ const pctStr = `${Math.round(pct * 100)}%`;
925
+ const label2 = padEnd(capitalize(name), 16);
926
+ sections.push(` ${label2}${fillStr} ${pctStr}`);
927
+ }
928
+ } else {
929
+ sections.push(dim(" Waiting for analyzers..."));
930
+ }
931
+ sections.push("");
932
+ const issueStr = `Issues found: ${bold(String(state.issueCount))}`;
933
+ const scoreStr = state.scorePreview !== null ? `Score preview: ${colorize(String(state.scorePreview), scoreColor(state.scorePreview))}` : dim("Score: --");
934
+ sections.push(` ${issueStr} ${scoreStr}`);
935
+ sections.push("");
936
+ const keys = dim("[q] abort [v] verbose");
937
+ const elapsed = dim(formatElapsed(state.elapsed));
938
+ const footerPad = Math.max(0, innerWidth - visibleLength(keys) - visibleLength(elapsed));
939
+ sections.push(` ${keys}${" ".repeat(footerPad)}${elapsed}`);
940
+ return sections.join("\n");
941
+ }
942
+ function formatTime(date) {
943
+ const h = String(date.getHours()).padStart(2, "0");
944
+ const m = String(date.getMinutes()).padStart(2, "0");
945
+ const s = String(date.getSeconds()).padStart(2, "0");
946
+ return `${h}:${m}:${s}`;
947
+ }
948
+ function formatElapsed(ms) {
949
+ const totalSecs = Math.floor(ms / 1e3);
950
+ const mins = Math.floor(totalSecs / 60);
951
+ const secs = totalSecs % 60;
952
+ return `${String(mins).padStart(2, "0")}:${String(secs).padStart(2, "0")} elapsed`;
953
+ }
954
+ function capitalize(str) {
955
+ return str.charAt(0).toUpperCase() + str.slice(1);
956
+ }
957
+
958
+ // src/layout/alternate.ts
959
+ var AlternateScreenRenderer = class {
960
+ output;
961
+ entered = false;
962
+ constructor(output = process.stderr) {
963
+ this.output = output;
964
+ }
965
+ update(state) {
966
+ if (!this.entered) {
967
+ this.output.write(screen.altEnter + cursor.hide);
968
+ this.entered = true;
969
+ }
970
+ const width = getTerminalWidth();
971
+ getTerminalHeight();
972
+ const frame = renderFrame(state, width);
973
+ this.output.write(cursor.home + screen.clear + frame);
974
+ }
975
+ finish(result) {
976
+ this.dispose();
977
+ const summary = this.renderSummary(result);
978
+ this.output.write(summary + "\n");
979
+ }
980
+ dispose() {
981
+ if (this.entered) {
982
+ this.output.write(cursor.show + screen.altExit);
983
+ this.entered = false;
984
+ }
985
+ }
986
+ renderSummary(result) {
987
+ const status = result.passed ? colorize("PASSED", "#4ADE80") : colorize("FAILED", "#F87171");
988
+ const scoreStr = colorize(String(result.overallScore), result.overallScore >= 70 ? "#4ADE80" : "#F87171");
989
+ const lines = [
990
+ `${bold("Audit Complete")} \u2014 ${status}`,
991
+ `${dim("URL:")} ${result.url}`,
992
+ `${dim("Score:")} ${scoreStr} ${dim(`| ${result.issueCount} issues | ${formatElapsed2(result.elapsed)}`)}`
993
+ ];
994
+ const categories = Object.entries(result.scores).map(([cat, score]) => ` ${cat}: ${score}`).join("\n");
995
+ if (categories) {
996
+ lines.push(dim(categories));
997
+ }
998
+ return box(lines.join("\n"), { border: "rounded", title: "VertaaUX", width: Math.min(getTerminalWidth(), 80) });
999
+ }
1000
+ };
1001
+ function formatElapsed2(ms) {
1002
+ const secs = Math.round(ms / 1e3);
1003
+ if (secs < 60) return `${secs}s`;
1004
+ return `${Math.floor(secs / 60)}m ${secs % 60}s`;
1005
+ }
1006
+
1007
+ // src/layout/inline.ts
1008
+ var InlineRenderer = class {
1009
+ output;
1010
+ lastPhase = "";
1011
+ constructor(output = process.stderr) {
1012
+ this.output = output;
1013
+ }
1014
+ update(state) {
1015
+ if (state.phase !== this.lastPhase) {
1016
+ this.lastPhase = state.phase;
1017
+ const ts = timestamp();
1018
+ const phasePct = state.phaseTotal > 0 ? ` (${state.phaseIndex}/${state.phaseTotal})` : "";
1019
+ this.output.write(
1020
+ `${dim(ts)} ${bold(state.phase)}${dim(phasePct)} ${dim(`| ${state.issueCount} issues`)}
1021
+ `
1022
+ );
1023
+ }
1024
+ }
1025
+ finish(result) {
1026
+ const ts = timestamp();
1027
+ const status = result.passed ? isColorEnabled() ? colorize("PASSED", "#4ADE80") : "PASSED" : isColorEnabled() ? colorize("FAILED", "#F87171") : "FAILED";
1028
+ const elapsed = formatElapsed3(result.elapsed);
1029
+ this.output.write(
1030
+ `${dim(ts)} ${bold("Audit Complete")} ${status} score=${result.overallScore} issues=${result.issueCount} ${dim(elapsed)}
1031
+ `
1032
+ );
1033
+ }
1034
+ dispose() {
1035
+ }
1036
+ };
1037
+ function timestamp() {
1038
+ const now = /* @__PURE__ */ new Date();
1039
+ return `[${pad2(now.getHours())}:${pad2(now.getMinutes())}:${pad2(now.getSeconds())}]`;
1040
+ }
1041
+ function pad2(n) {
1042
+ return n < 10 ? `0${n}` : String(n);
1043
+ }
1044
+ function formatElapsed3(ms) {
1045
+ const secs = Math.round(ms / 1e3);
1046
+ if (secs < 60) return `(${secs}s)`;
1047
+ return `(${Math.floor(secs / 60)}m ${secs % 60}s)`;
1048
+ }
1049
+
1050
+ // src/layout/renderer.ts
1051
+ function createRenderer(mode = "auto", output = process.stderr) {
1052
+ if (mode === "auto") {
1053
+ mode = isTTY() && !isCI() ? "alternate" : "inline";
1054
+ }
1055
+ if (mode === "alternate") {
1056
+ return new AlternateScreenRenderer(output);
1057
+ }
1058
+ return new InlineRenderer(output);
1059
+ }
1060
+ function createKeyboardHandler(stdin = process.stdin) {
1061
+ const emitter = new events.EventEmitter();
1062
+ let started = false;
1063
+ let wasRawMode = false;
1064
+ function onData(data) {
1065
+ const key = data.toString();
1066
+ if (key === "") {
1067
+ emitter.emit("quit");
1068
+ return;
1069
+ }
1070
+ switch (key.toLowerCase()) {
1071
+ case "q":
1072
+ emitter.emit("quit");
1073
+ break;
1074
+ case "v":
1075
+ emitter.emit("verbose");
1076
+ break;
1077
+ }
1078
+ }
1079
+ return {
1080
+ start() {
1081
+ if (started) return;
1082
+ if (!stdin.isTTY || typeof stdin.setRawMode !== "function") return;
1083
+ started = true;
1084
+ wasRawMode = stdin.isRaw;
1085
+ stdin.setRawMode(true);
1086
+ stdin.resume();
1087
+ stdin.on("data", onData);
1088
+ },
1089
+ dispose() {
1090
+ if (!started) return;
1091
+ started = false;
1092
+ stdin.removeListener("data", onData);
1093
+ if (stdin.isTTY && typeof stdin.setRawMode === "function") {
1094
+ stdin.setRawMode(wasRawMode);
1095
+ }
1096
+ stdin.pause();
1097
+ },
1098
+ on(event, handler) {
1099
+ emitter.on(event, handler);
1100
+ }
1101
+ };
1102
+ }
1103
+
1104
+ exports.AlternateScreenRenderer = AlternateScreenRenderer;
1105
+ exports.AuditPhase = AuditPhase;
1106
+ exports.InlineRenderer = InlineRenderer;
1107
+ exports.PHASE_ORDER = PHASE_ORDER;
1108
+ exports.applyGradient = applyGradient;
1109
+ exports.bold = bold;
1110
+ exports.boldColor = boldColor;
1111
+ exports.borders = borders;
1112
+ exports.box = box;
1113
+ exports.brand = brand;
1114
+ exports.center = center;
1115
+ exports.colorize = colorize;
1116
+ exports.createKeyboardHandler = createKeyboardHandler;
1117
+ exports.createMultiProgress = createMultiProgress;
1118
+ exports.createProgressBar = createProgressBar;
1119
+ exports.createRenderer = createRenderer;
1120
+ exports.createSpinner = createSpinner;
1121
+ exports.cursor = cursor;
1122
+ exports.dim = dim;
1123
+ exports.getTerminalHeight = getTerminalHeight;
1124
+ exports.getTerminalWidth = getTerminalWidth;
1125
+ exports.gradient = gradient;
1126
+ exports.isCI = isCI;
1127
+ exports.isColorEnabled = isColorEnabled;
1128
+ exports.isStdinTTY = isStdinTTY;
1129
+ exports.isStdoutTTY = isStdoutTTY;
1130
+ exports.isTTY = isTTY;
1131
+ exports.padEnd = padEnd;
1132
+ exports.padStart = padStart;
1133
+ exports.parseDiff = parseDiff;
1134
+ exports.phaseIndex = phaseIndex;
1135
+ exports.phaseTotal = phaseTotal;
1136
+ exports.renderDiff = renderDiff;
1137
+ exports.renderFrame = renderFrame;
1138
+ exports.renderGroupedList = renderGroupedList;
1139
+ exports.renderList = renderList;
1140
+ exports.renderTable = renderTable;
1141
+ exports.renderTree = renderTree;
1142
+ exports.scoreColor = scoreColor;
1143
+ exports.screen = screen;
1144
+ exports.setColorEnabled = setColorEnabled;
1145
+ exports.severity = severity;
1146
+ exports.severityLabels = severityLabels;
1147
+ exports.severityOrder = severityOrder;
1148
+ exports.shouldUseColor = shouldUseColor;
1149
+ exports.stripAnsi = stripAnsi;
1150
+ exports.style = style;
1151
+ exports.supportsUnicode = supportsUnicode;
1152
+ exports.text = text_exports;
1153
+ exports.tokens = tokens;
1154
+ exports.truncate = truncate;
1155
+ exports.visibleLength = visibleLength;
1156
+ //# sourceMappingURL=index.cjs.map
1157
+ //# sourceMappingURL=index.cjs.map