ghagga 2.4.1 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +48 -8
  2. package/dist/commands/__tests__/review-tui.test.d.ts +11 -0
  3. package/dist/commands/__tests__/review-tui.test.d.ts.map +1 -0
  4. package/dist/commands/__tests__/review-tui.test.js +256 -0
  5. package/dist/commands/__tests__/review-tui.test.js.map +1 -0
  6. package/dist/commands/health.d.ts +16 -0
  7. package/dist/commands/health.d.ts.map +1 -0
  8. package/dist/commands/health.js +139 -0
  9. package/dist/commands/health.js.map +1 -0
  10. package/dist/commands/review-output.test.d.ts +10 -0
  11. package/dist/commands/review-output.test.d.ts.map +1 -0
  12. package/dist/commands/review-output.test.js +222 -0
  13. package/dist/commands/review-output.test.js.map +1 -0
  14. package/dist/commands/review.d.ts +8 -1
  15. package/dist/commands/review.d.ts.map +1 -1
  16. package/dist/commands/review.js +139 -22
  17. package/dist/commands/review.js.map +1 -1
  18. package/dist/commands/review.test.js +29 -11
  19. package/dist/commands/review.test.js.map +1 -1
  20. package/dist/index.d.ts +1 -1
  21. package/dist/index.js +45 -9
  22. package/dist/index.js.map +1 -1
  23. package/dist/lib/github-api.d.ts +69 -0
  24. package/dist/lib/github-api.d.ts.map +1 -0
  25. package/dist/lib/github-api.js +186 -0
  26. package/dist/lib/github-api.js.map +1 -0
  27. package/dist/lib/github-api.test.d.ts +2 -0
  28. package/dist/lib/github-api.test.d.ts.map +1 -0
  29. package/dist/lib/github-api.test.js +197 -0
  30. package/dist/lib/github-api.test.js.map +1 -0
  31. package/dist/lib/oauth.d.ts +2 -2
  32. package/dist/lib/oauth.d.ts.map +1 -1
  33. package/dist/lib/oauth.js +2 -2
  34. package/dist/lib/oauth.js.map +1 -1
  35. package/dist/lib/oauth.test.js +1 -1
  36. package/dist/lib/oauth.test.js.map +1 -1
  37. package/dist/ui/__tests__/tui-extensions.test.d.ts +9 -0
  38. package/dist/ui/__tests__/tui-extensions.test.d.ts.map +1 -0
  39. package/dist/ui/__tests__/tui-extensions.test.js +230 -0
  40. package/dist/ui/__tests__/tui-extensions.test.js.map +1 -0
  41. package/dist/ui/chalk.d.ts +17 -0
  42. package/dist/ui/chalk.d.ts.map +1 -0
  43. package/dist/ui/chalk.js +25 -0
  44. package/dist/ui/chalk.js.map +1 -0
  45. package/dist/ui/format.d.ts +21 -1
  46. package/dist/ui/format.d.ts.map +1 -1
  47. package/dist/ui/format.js +67 -1
  48. package/dist/ui/format.js.map +1 -1
  49. package/dist/ui/sarif.d.ts +6 -0
  50. package/dist/ui/sarif.d.ts.map +1 -0
  51. package/dist/ui/sarif.js +5 -0
  52. package/dist/ui/sarif.js.map +1 -0
  53. package/dist/ui/theme.d.ts +16 -0
  54. package/dist/ui/theme.d.ts.map +1 -1
  55. package/dist/ui/theme.js +16 -0
  56. package/dist/ui/theme.js.map +1 -1
  57. package/dist/ui/tui.d.ts +31 -0
  58. package/dist/ui/tui.d.ts.map +1 -1
  59. package/dist/ui/tui.js +91 -0
  60. package/dist/ui/tui.js.map +1 -1
  61. package/package.json +17 -15
  62. package/LICENSE +0 -21
@@ -0,0 +1,230 @@
1
+ /**
2
+ * TUI extension tests — severity, box, divider, progress, setActiveSpinner.
3
+ *
4
+ * Tests the new TUI foundation methods in both plain and styled modes.
5
+ * Also tests colorSeverity() from the chalk adapter.
6
+ * Follows the same freshTui() + styledTui() patterns as tui.test.ts.
7
+ */
8
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
9
+ // ─── Mock @clack/prompts ────────────────────────────────────────
10
+ const mockClackIntro = vi.hoisted(() => vi.fn());
11
+ const mockClackOutro = vi.hoisted(() => vi.fn());
12
+ const mockClackLog = vi.hoisted(() => ({
13
+ info: vi.fn(),
14
+ success: vi.fn(),
15
+ warn: vi.fn(),
16
+ error: vi.fn(),
17
+ step: vi.fn(),
18
+ message: vi.fn(),
19
+ }));
20
+ const mockClackSpinner = vi.hoisted(() => vi.fn());
21
+ vi.mock('@clack/prompts', () => ({
22
+ intro: mockClackIntro,
23
+ outro: mockClackOutro,
24
+ log: mockClackLog,
25
+ spinner: mockClackSpinner,
26
+ }));
27
+ // ─── Mock chalk ─────────────────────────────────────────────────
28
+ vi.mock('chalk', () => {
29
+ const mockChalk = {
30
+ red: (t) => `[RED]${t}[/RED]`,
31
+ hex: (_color) => (t) => `[HEX]${t}[/HEX]`,
32
+ yellow: (t) => `[YELLOW]${t}[/YELLOW]`,
33
+ blue: (t) => `[BLUE]${t}[/BLUE]`,
34
+ gray: (t) => `[GRAY]${t}[/GRAY]`,
35
+ };
36
+ return { default: mockChalk };
37
+ });
38
+ // ─── Tests ──────────────────────────────────────────────────────
39
+ describe('TUI extensions', () => {
40
+ let logSpy;
41
+ let errorSpy;
42
+ beforeEach(() => {
43
+ vi.clearAllMocks();
44
+ logSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
45
+ errorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
46
+ });
47
+ afterEach(() => {
48
+ logSpy.mockRestore();
49
+ errorSpy.mockRestore();
50
+ });
51
+ // Fresh module for each test to reset _plain and _activeSpinner state
52
+ async function freshTui() {
53
+ vi.resetModules();
54
+ return import('../tui.js');
55
+ }
56
+ // Styled mode: isTTY=true, no CI
57
+ async function styledTui() {
58
+ const originalTTY = process.stdout.isTTY;
59
+ const originalCI = process.env.CI;
60
+ Object.defineProperty(process.stdout, 'isTTY', { value: true, configurable: true });
61
+ delete process.env.CI;
62
+ const tui = await freshTui();
63
+ tui.init(); // should detect TTY, no CI → styled
64
+ // Restore immediately after init
65
+ Object.defineProperty(process.stdout, 'isTTY', { value: originalTTY, configurable: true });
66
+ if (originalCI !== undefined)
67
+ process.env.CI = originalCI;
68
+ return tui;
69
+ }
70
+ // ─── severity() ─────────────────────────────────────────────
71
+ describe('severity() — plain mode', () => {
72
+ it('returns "[CRITICAL] msg" for critical level', async () => {
73
+ const tui = await freshTui();
74
+ tui.init({ plain: true });
75
+ expect(tui.severity('msg', 'critical')).toBe('[CRITICAL] msg');
76
+ });
77
+ it('returns "[HIGH] msg" for high level', async () => {
78
+ const tui = await freshTui();
79
+ tui.init({ plain: true });
80
+ expect(tui.severity('msg', 'high')).toBe('[HIGH] msg');
81
+ });
82
+ it('returns "[MEDIUM] msg" for medium level', async () => {
83
+ const tui = await freshTui();
84
+ tui.init({ plain: true });
85
+ expect(tui.severity('msg', 'medium')).toBe('[MEDIUM] msg');
86
+ });
87
+ it('returns "[LOW] msg" for low level', async () => {
88
+ const tui = await freshTui();
89
+ tui.init({ plain: true });
90
+ expect(tui.severity('msg', 'low')).toBe('[LOW] msg');
91
+ });
92
+ it('returns "[INFO] msg" for info level', async () => {
93
+ const tui = await freshTui();
94
+ tui.init({ plain: true });
95
+ expect(tui.severity('msg', 'info')).toBe('[INFO] msg');
96
+ });
97
+ it('returns empty string for empty text', async () => {
98
+ const tui = await freshTui();
99
+ tui.init({ plain: true });
100
+ expect(tui.severity('', 'critical')).toBe('');
101
+ });
102
+ });
103
+ describe('severity() — styled mode', () => {
104
+ it('returns a colored string (not plain [LEVEL] format)', async () => {
105
+ const tui = await styledTui();
106
+ const result = tui.severity('msg', 'critical');
107
+ // Should be a non-empty string
108
+ expect(result).toBeTruthy();
109
+ expect(typeof result).toBe('string');
110
+ // Must NOT be the plain format
111
+ expect(result).not.toBe('[CRITICAL] msg');
112
+ });
113
+ });
114
+ // ─── box() ──────────────────────────────────────────────────
115
+ describe('box() — plain mode', () => {
116
+ it('renders plain box with title and content lines', async () => {
117
+ const tui = await freshTui();
118
+ tui.init({ plain: true });
119
+ const result = tui.box('Title', ['line1', 'line2']);
120
+ expect(result).toBe('--- Title ---\nline1\nline2\n---');
121
+ });
122
+ it('renders plain box with empty content', async () => {
123
+ const tui = await freshTui();
124
+ tui.init({ plain: true });
125
+ const result = tui.box('Title', []);
126
+ expect(result).toBe('--- Title ---\n---');
127
+ });
128
+ });
129
+ describe('box() — styled mode', () => {
130
+ it('renders Unicode box-drawing characters', async () => {
131
+ const tui = await styledTui();
132
+ const result = tui.box('Title', ['line1', 'line2']);
133
+ expect(result).toContain('┌');
134
+ expect(result).toContain('┐');
135
+ expect(result).toContain('│');
136
+ expect(result).toContain('└');
137
+ expect(result).toContain('┘');
138
+ });
139
+ });
140
+ // ─── divider() ──────────────────────────────────────────────
141
+ describe('divider() — plain mode', () => {
142
+ it('renders "--- label ---" with a label', async () => {
143
+ const tui = await freshTui();
144
+ tui.init({ plain: true });
145
+ expect(tui.divider('label')).toBe('--- label ---');
146
+ });
147
+ it('renders "---" without a label', async () => {
148
+ const tui = await freshTui();
149
+ tui.init({ plain: true });
150
+ expect(tui.divider()).toBe('---');
151
+ });
152
+ });
153
+ describe('divider() — styled mode', () => {
154
+ it('renders ─ chars and the label text when given a label', async () => {
155
+ const tui = await styledTui();
156
+ const result = tui.divider('label');
157
+ expect(result).toContain('─');
158
+ expect(result).toContain('label');
159
+ });
160
+ it('renders 60 ─ chars without a label', async () => {
161
+ const tui = await styledTui();
162
+ const result = tui.divider();
163
+ expect(result).toBe('─'.repeat(60));
164
+ });
165
+ });
166
+ // ─── progress() ─────────────────────────────────────────────
167
+ describe('progress() — plain mode', () => {
168
+ it('calls console.log with "[current/total] label"', async () => {
169
+ const tui = await freshTui();
170
+ tui.init({ plain: true });
171
+ tui.progress(3, 7, 'Running...');
172
+ expect(logSpy).toHaveBeenCalledWith('[3/7] Running...');
173
+ });
174
+ });
175
+ describe('progress() — styled mode', () => {
176
+ it('updates active spinner message when spinner is set', async () => {
177
+ const mockMessage = vi.fn();
178
+ const mockSpinner = {
179
+ start: vi.fn(),
180
+ message: mockMessage,
181
+ stop: vi.fn(),
182
+ };
183
+ // Set up clack spinner mock so setActiveSpinner works
184
+ mockClackSpinner.mockReturnValue({
185
+ start: vi.fn(),
186
+ message: vi.fn(),
187
+ stop: vi.fn(),
188
+ });
189
+ const tui = await styledTui();
190
+ tui.setActiveSpinner(mockSpinner);
191
+ tui.progress(3, 7, 'Running...');
192
+ expect(mockMessage).toHaveBeenCalledWith('[3/7] Running...');
193
+ expect(logSpy).not.toHaveBeenCalled();
194
+ });
195
+ it('falls back to console.log when no active spinner', async () => {
196
+ mockClackSpinner.mockReturnValue({
197
+ start: vi.fn(),
198
+ message: vi.fn(),
199
+ stop: vi.fn(),
200
+ });
201
+ const tui = await styledTui();
202
+ // No setActiveSpinner call — _activeSpinner is null
203
+ tui.progress(3, 7, 'Running...');
204
+ expect(logSpy).toHaveBeenCalledWith('[3/7] Running...');
205
+ });
206
+ });
207
+ // ─── colorSeverity() from chalk.ts ──────────────────────────
208
+ describe('colorSeverity()', () => {
209
+ it('returns a non-empty string for each severity level', async () => {
210
+ vi.resetModules();
211
+ const { colorSeverity } = await import('../chalk.js');
212
+ const levels = ['critical', 'high', 'medium', 'low', 'info'];
213
+ for (const level of levels) {
214
+ const result = colorSeverity('test', level);
215
+ expect(result).toBeTruthy();
216
+ expect(typeof result).toBe('string');
217
+ }
218
+ });
219
+ it('produces distinct output for each severity level', async () => {
220
+ vi.resetModules();
221
+ const { colorSeverity } = await import('../chalk.js');
222
+ const levels = ['critical', 'high', 'medium', 'low', 'info'];
223
+ const results = levels.map((level) => colorSeverity('test', level));
224
+ // All 5 should be unique (distinct colors)
225
+ const unique = new Set(results);
226
+ expect(unique.size).toBe(5);
227
+ });
228
+ });
229
+ });
230
+ //# sourceMappingURL=tui-extensions.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui-extensions.test.js","sourceRoot":"","sources":["../../../src/ui/__tests__/tui-extensions.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Chalk adapter — single choke point for the chalk dependency.
3
+ *
4
+ * Only tui.ts and theme.ts import from this module.
5
+ * Commands NEVER import chalk directly (Design AD2).
6
+ */
7
+ import chalk from 'chalk';
8
+ import type { FindingSeverity } from 'ghagga-core';
9
+ export { chalk };
10
+ /** Map severity level to a chalk color function. */
11
+ export declare const SEVERITY_COLOR_FNS: Record<FindingSeverity, (text: string) => string>;
12
+ /**
13
+ * Apply severity coloring to text.
14
+ * Returns plain text for unknown levels.
15
+ */
16
+ export declare function colorSeverity(text: string, level: FindingSeverity): string;
17
+ //# sourceMappingURL=chalk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chalk.d.ts","sourceRoot":"","sources":["../../src/ui/chalk.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,EAAE,KAAK,EAAE,CAAC;AAEjB,oDAAoD;AACpD,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAMhF,CAAC;AAEF;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,MAAM,CAG1E"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Chalk adapter — single choke point for the chalk dependency.
3
+ *
4
+ * Only tui.ts and theme.ts import from this module.
5
+ * Commands NEVER import chalk directly (Design AD2).
6
+ */
7
+ import chalk from 'chalk';
8
+ export { chalk };
9
+ /** Map severity level to a chalk color function. */
10
+ export const SEVERITY_COLOR_FNS = {
11
+ critical: (t) => chalk.red(t),
12
+ high: (t) => chalk.hex('#FFA500')(t),
13
+ medium: (t) => chalk.yellow(t),
14
+ low: (t) => chalk.blue(t),
15
+ info: (t) => chalk.gray(t),
16
+ };
17
+ /**
18
+ * Apply severity coloring to text.
19
+ * Returns plain text for unknown levels.
20
+ */
21
+ export function colorSeverity(text, level) {
22
+ const fn = SEVERITY_COLOR_FNS[level];
23
+ return fn ? fn(text) : text;
24
+ }
25
+ //# sourceMappingURL=chalk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chalk.js","sourceRoot":"","sources":["../../src/ui/chalk.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAE,KAAK,EAAE,CAAC;AAEjB,oDAAoD;AACpD,MAAM,CAAC,MAAM,kBAAkB,GAAsD;IACnF,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9B,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACzB,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;CAC3B,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,KAAsB;IAChE,MAAM,EAAE,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACrC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9B,CAAC"}
@@ -4,7 +4,7 @@
4
4
  * Contains formatting helpers moved from memory/utils.ts and review.ts
5
5
  * plus new shared formatters. All functions are pure (CC2).
6
6
  */
7
- import type { ReviewResult } from 'ghagga-core';
7
+ import type { ReviewFinding, ReviewResult } from 'ghagga-core';
8
8
  /**
9
9
  * Format a plain-text table with headers, separator, and padded columns.
10
10
  * Moved from memory/utils.ts — same signature, same behavior.
@@ -30,9 +30,29 @@ export declare function truncate(str: string, maxLen: number): string;
30
30
  * Example: formatKeyValue('Provider', 'github') → " Provider: github"
31
31
  */
32
32
  export declare function formatKeyValue(label: string, value: string, indent?: number): string;
33
+ /**
34
+ * Format a tool section divider.
35
+ * Pure function — does not call tui.*.
36
+ */
37
+ export declare function formatToolDivider(label: string): string;
33
38
  /**
34
39
  * Format a ReviewResult as a human-readable markdown string for the terminal.
35
40
  * Moved from review.ts — same output, uses theme constants.
36
41
  */
37
42
  export declare function formatMarkdownResult(result: ReviewResult): string;
43
+ /**
44
+ * Produce summary lines for a box display.
45
+ * Returns lines showing: status, finding counts by severity, time, tools run.
46
+ */
47
+ export declare function formatBoxSummary(result: ReviewResult): string[];
48
+ /**
49
+ * Format a single finding with severity emoji and message.
50
+ * Used by both review and health commands.
51
+ */
52
+ export declare function formatSeverityLine(finding: ReviewFinding): string;
53
+ /**
54
+ * Format health score for display.
55
+ * Returns lines for the health score box.
56
+ */
57
+ export declare function formatHealthScore(score: number, grade: string): string[];
38
58
  //# sourceMappingURL=format.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/ui/format.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAKhD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAiBzF;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAG5D;AAID;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,MAAU,GAAG,MAAM,CAGvF;AAID;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAiFjE"}
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/ui/format.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAK/D;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAiBzF;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAG5D;AAID;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,MAAU,GAAG,MAAM,CAGvF;AAID;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEvD;AAID;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAiFjE;AAID;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,EAAE,CAoC/D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAIjE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAMxE"}
package/dist/ui/format.js CHANGED
@@ -60,6 +60,14 @@ export function formatKeyValue(label, value, indent = 3) {
60
60
  const pad = ' '.repeat(indent);
61
61
  return `${pad}${label.padEnd(12)} ${value}`;
62
62
  }
63
+ // ─── Tool Dividers ──────────────────────────────────────────────
64
+ /**
65
+ * Format a tool section divider.
66
+ * Pure function — does not call tui.*.
67
+ */
68
+ export function formatToolDivider(label) {
69
+ return `\n─── ${label} ${'─'.repeat(Math.max(0, 50 - label.length))}`;
70
+ }
63
71
  // ─── Review Result Formatting ───────────────────────────────────
64
72
  /**
65
73
  * Format a ReviewResult as a human-readable markdown string for the terminal.
@@ -98,7 +106,7 @@ export function formatMarkdownResult(result) {
98
106
  if (!findings || findings.length === 0)
99
107
  continue;
100
108
  const label = SOURCE_LABELS[src] ?? src;
101
- lines.push(`### ${label} (${findings.length})`);
109
+ lines.push(formatToolDivider(`${label} (${findings.length})`));
102
110
  lines.push('');
103
111
  for (const finding of findings) {
104
112
  const emoji = SEVERITY_EMOJI[finding.severity] ?? '';
@@ -133,4 +141,62 @@ export function formatMarkdownResult(result) {
133
141
  lines.push('Powered by GHAGGA — AI Code Review');
134
142
  return lines.join('\n');
135
143
  }
144
+ // ─── TUI Summary Formatting ────────────────────────────────────
145
+ /**
146
+ * Produce summary lines for a box display.
147
+ * Returns lines showing: status, finding counts by severity, time, tools run.
148
+ */
149
+ export function formatBoxSummary(result) {
150
+ const status = STATUS_EMOJI[result.status] ?? result.status;
151
+ const timeSeconds = (result.metadata.executionTimeMs / 1000).toFixed(1);
152
+ const lines = [];
153
+ lines.push(`Status: ${status}`);
154
+ lines.push(`Time: ${timeSeconds}s | Tokens: ${result.metadata.tokensUsed}`);
155
+ lines.push(`Mode: ${result.metadata.mode} | Model: ${result.metadata.model}`);
156
+ lines.push('');
157
+ // Finding counts by severity
158
+ const counts = {};
159
+ for (const f of result.findings) {
160
+ counts[f.severity] = (counts[f.severity] ?? 0) + 1;
161
+ }
162
+ if (result.findings.length > 0) {
163
+ const parts = [];
164
+ for (const sev of ['critical', 'high', 'medium', 'low', 'info']) {
165
+ if (counts[sev]) {
166
+ parts.push(`${SEVERITY_EMOJI[sev]} ${sev}: ${counts[sev]}`);
167
+ }
168
+ }
169
+ lines.push(`Findings: ${result.findings.length} total`);
170
+ lines.push(parts.join(' '));
171
+ }
172
+ else {
173
+ lines.push('Findings: 0 — clean! 🎉');
174
+ }
175
+ // Tools run
176
+ if (result.metadata.toolsRun.length > 0) {
177
+ lines.push('');
178
+ lines.push(`Tools: ${result.metadata.toolsRun.join(', ')}`);
179
+ }
180
+ return lines;
181
+ }
182
+ /**
183
+ * Format a single finding with severity emoji and message.
184
+ * Used by both review and health commands.
185
+ */
186
+ export function formatSeverityLine(finding) {
187
+ const emoji = SEVERITY_EMOJI[finding.severity] ?? '';
188
+ const location = finding.line ? `${finding.file}:${finding.line}` : finding.file;
189
+ return `${emoji} [${finding.severity.toUpperCase()}] ${finding.category} — ${location}: ${finding.message}`;
190
+ }
191
+ /**
192
+ * Format health score for display.
193
+ * Returns lines for the health score box.
194
+ */
195
+ export function formatHealthScore(score, grade) {
196
+ const lines = [];
197
+ const bar = '█'.repeat(Math.round(score / 5)) + '░'.repeat(20 - Math.round(score / 5));
198
+ lines.push(`Health Score: ${score}/100 (${grade})`);
199
+ lines.push(`[${bar}]`);
200
+ return lines;
201
+ }
136
202
  //# sourceMappingURL=format.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/ui/format.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/ui/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * SARIF re-export from core for CLI convenience.
3
+ */
4
+ export type { SarifDocument } from 'ghagga-core';
5
+ export { buildSarif } from 'ghagga-core';
6
+ //# sourceMappingURL=sarif.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sarif.d.ts","sourceRoot":"","sources":["../../src/ui/sarif.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * SARIF re-export from core for CLI convenience.
3
+ */
4
+ export { buildSarif } from 'ghagga-core';
5
+ //# sourceMappingURL=sarif.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sarif.js","sourceRoot":"","sources":["../../src/ui/sarif.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
@@ -23,4 +23,20 @@ export declare const SOURCE_LABELS: Record<string, string>;
23
23
  * Known steps use STEP_ICON, dynamic steps get fallback icons.
24
24
  */
25
25
  export declare function resolveStepIcon(step: string): string;
26
+ /** Box-drawing characters for styled TUI output. */
27
+ export declare const BOX_CHARS: {
28
+ readonly topLeft: "┌";
29
+ readonly topRight: "┐";
30
+ readonly bottomLeft: "└";
31
+ readonly bottomRight: "┘";
32
+ readonly horizontal: "─";
33
+ readonly vertical: "│";
34
+ };
35
+ /** Divider character for section separators. */
36
+ export declare const DIVIDER_CHAR = "\u2500";
37
+ /** Score thresholds for health grade coloring. */
38
+ export declare const SCORE_THRESHOLDS: {
39
+ readonly good: 80;
40
+ readonly warning: 50;
41
+ };
26
42
  //# sourceMappingURL=theme.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/ui/theme.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEjE,sCAAsC;AACtC,eAAO,MAAM,KAAK;;;CAGR,CAAC;AAEX,iCAAiC;AACjC,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAKrD,CAAC;AAEF,6CAA6C;AAC7C,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAM1D,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAc5C,CAAC;AAEF,yCAAyC;AACzC,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAKhD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKpD"}
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/ui/theme.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEjE,sCAAsC;AACtC,eAAO,MAAM,KAAK;;;CAGR,CAAC;AAEX,iCAAiC;AACjC,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAKrD,CAAC;AAEF,6CAA6C;AAC7C,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAM1D,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAc5C,CAAC;AAEF,yCAAyC;AACzC,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAKhD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKpD;AAED,oDAAoD;AACpD,eAAO,MAAM,SAAS;;;;;;;CAOZ,CAAC;AAEX,gDAAgD;AAChD,eAAO,MAAM,YAAY,WAAM,CAAC;AAEhC,kDAAkD;AAClD,eAAO,MAAM,gBAAgB;;;CAGnB,CAAC"}
package/dist/ui/theme.js CHANGED
@@ -60,4 +60,20 @@ export function resolveStepIcon(step) {
60
60
  return '🗳️';
61
61
  return '▸';
62
62
  }
63
+ /** Box-drawing characters for styled TUI output. */
64
+ export const BOX_CHARS = {
65
+ topLeft: '┌',
66
+ topRight: '┐',
67
+ bottomLeft: '└',
68
+ bottomRight: '┘',
69
+ horizontal: '─',
70
+ vertical: '│',
71
+ };
72
+ /** Divider character for section separators. */
73
+ export const DIVIDER_CHAR = '─';
74
+ /** Score thresholds for health grade coloring. */
75
+ export const SCORE_THRESHOLDS = {
76
+ good: 80,
77
+ warning: 50,
78
+ };
63
79
  //# sourceMappingURL=theme.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/ui/theme.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,sCAAsC;AACtC,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,gBAAgB;CACjB,CAAC;AAEX,iCAAiC;AACjC,MAAM,CAAC,MAAM,YAAY,GAAiC;IACxD,MAAM,EAAE,UAAU;IAClB,MAAM,EAAE,UAAU;IAClB,kBAAkB,EAAE,wBAAwB;IAC5C,OAAO,EAAE,aAAa;CACvB,CAAC;AAEF,6CAA6C;AAC7C,MAAM,CAAC,MAAM,cAAc,GAAoC;IAC7D,QAAQ,EAAE,IAAI;IACd,IAAI,EAAE,IAAI;IACV,MAAM,EAAE,IAAI;IACZ,GAAG,EAAE,IAAI;IACT,IAAI,EAAE,IAAI;CACX,CAAC;AAEF,8CAA8C;AAC9C,MAAM,CAAC,MAAM,SAAS,GAA2B;IAC/C,QAAQ,EAAE,IAAI;IACd,YAAY,EAAE,IAAI;IAClB,eAAe,EAAE,IAAI;IACrB,cAAc,EAAE,IAAI;IACpB,iBAAiB,EAAE,KAAK;IACxB,gBAAgB,EAAE,IAAI;IACtB,aAAa,EAAE,IAAI;IACnB,aAAa,EAAE,IAAI;IACnB,aAAa,EAAE,GAAG;IAClB,gBAAgB,EAAE,IAAI;IACtB,oBAAoB,EAAE,IAAI;IAC1B,iBAAiB,EAAE,KAAK;IACxB,kBAAkB,EAAE,KAAK;CAC1B,CAAC;AAEF,yCAAyC;AACzC,MAAM,CAAC,MAAM,aAAa,GAA2B;IACnD,OAAO,EAAE,YAAY;IACrB,KAAK,EAAE,WAAW;IAClB,GAAG,EAAE,QAAQ;IACb,EAAE,EAAE,cAAc;CACnB,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,SAAS,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,IAAI,CAAC;IAChD,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/ui/theme.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,sCAAsC;AACtC,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,gBAAgB;CACjB,CAAC;AAEX,iCAAiC;AACjC,MAAM,CAAC,MAAM,YAAY,GAAiC;IACxD,MAAM,EAAE,UAAU;IAClB,MAAM,EAAE,UAAU;IAClB,kBAAkB,EAAE,wBAAwB;IAC5C,OAAO,EAAE,aAAa;CACvB,CAAC;AAEF,6CAA6C;AAC7C,MAAM,CAAC,MAAM,cAAc,GAAoC;IAC7D,QAAQ,EAAE,IAAI;IACd,IAAI,EAAE,IAAI;IACV,MAAM,EAAE,IAAI;IACZ,GAAG,EAAE,IAAI;IACT,IAAI,EAAE,IAAI;CACX,CAAC;AAEF,8CAA8C;AAC9C,MAAM,CAAC,MAAM,SAAS,GAA2B;IAC/C,QAAQ,EAAE,IAAI;IACd,YAAY,EAAE,IAAI;IAClB,eAAe,EAAE,IAAI;IACrB,cAAc,EAAE,IAAI;IACpB,iBAAiB,EAAE,KAAK;IACxB,gBAAgB,EAAE,IAAI;IACtB,aAAa,EAAE,IAAI;IACnB,aAAa,EAAE,IAAI;IACnB,aAAa,EAAE,GAAG;IAClB,gBAAgB,EAAE,IAAI;IACtB,oBAAoB,EAAE,IAAI;IAC1B,iBAAiB,EAAE,KAAK;IACxB,kBAAkB,EAAE,KAAK;CAC1B,CAAC;AAEF,yCAAyC;AACzC,MAAM,CAAC,MAAM,aAAa,GAA2B;IACnD,OAAO,EAAE,YAAY;IACrB,KAAK,EAAE,WAAW;IAClB,GAAG,EAAE,QAAQ;IACb,EAAE,EAAE,cAAc;CACnB,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,SAAS,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,IAAI,CAAC;IAChD,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,OAAO,GAAG,CAAC;AACb,CAAC;AAED,oDAAoD;AACpD,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,OAAO,EAAE,GAAG;IACZ,QAAQ,EAAE,GAAG;IACb,UAAU,EAAE,GAAG;IACf,WAAW,EAAE,GAAG;IAChB,UAAU,EAAE,GAAG;IACf,QAAQ,EAAE,GAAG;CACL,CAAC;AAEX,gDAAgD;AAChD,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,CAAC;AAEhC,kDAAkD;AAClD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,EAAE;IACR,OAAO,EAAE,EAAE;CACH,CAAC"}
package/dist/ui/tui.d.ts CHANGED
@@ -5,6 +5,7 @@
5
5
  * The mode is resolved once at init() and never changes (R2).
6
6
  * In plain mode, all calls delegate to console.* with zero ANSI (R8, R10).
7
7
  */
8
+ import type { FindingSeverity } from 'ghagga-core';
8
9
  export type TuiMode = 'styled' | 'plain';
9
10
  export interface TuiInitOptions {
10
11
  /** User explicitly passed --plain */
@@ -41,4 +42,34 @@ export declare const log: {
41
42
  * Plain: no-op start/message, stop() prints the final message.
42
43
  */
43
44
  export declare function spinner(): TuiSpinner;
45
+ /**
46
+ * Register the active spinner for progress updates.
47
+ * Called by review.ts when creating its spinner.
48
+ */
49
+ export declare function setActiveSpinner(s: TuiSpinner | null): void;
50
+ /**
51
+ * Return severity-colored text.
52
+ * Styled: ANSI-colored via chalk adapter.
53
+ * Plain: "[LEVEL] text" prefix, no ANSI.
54
+ */
55
+ export declare function severity(text: string, level: FindingSeverity): string;
56
+ /**
57
+ * Render a bordered box with title and content lines.
58
+ * Styled: Unicode box-drawing (┌─ title ─┐, │ line │, └───┘).
59
+ * Plain: "--- title ---\ncontent\n---"
60
+ */
61
+ export declare function box(title: string, content: string[]): string;
62
+ /**
63
+ * Render a section divider.
64
+ * Styled: "──── label ────" using ─ characters (60 char width).
65
+ * Plain: "--- label ---" or "---" if no label.
66
+ */
67
+ export declare function divider(label?: string): string;
68
+ /**
69
+ * Display step progress indicator.
70
+ * Format: "[current/total] label"
71
+ * Styled: updates active spinner message (if set), else console.log.
72
+ * Plain: console.log.
73
+ */
74
+ export declare function progress(current: number, total: number, label: string): void;
44
75
  //# sourceMappingURL=tui.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../src/ui/tui.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEzC,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,iDAAiD;IACjD,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,wDAAwD;IACxD,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,gEAAgE;IAChE,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAQD;;;GAGG;AACH,wBAAgB,IAAI,CAAC,IAAI,CAAC,EAAE,cAAc,GAAG,IAAI,CAEhD;AAED,mDAAmD;AACnD,wBAAgB,OAAO,IAAI,OAAO,CAEjC;AAID,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAMzC;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAM3C;AAID,eAAO,MAAM,GAAG;kBACA,MAAM,GAAG,IAAI;qBAQV,MAAM,GAAG,IAAI;kBAQhB,MAAM,GAAG,IAAI;mBAQZ,MAAM,GAAG,IAAI;kBAQd,MAAM,GAAG,IAAI;qBAQV,MAAM,GAAG,IAAI;CAO/B,CAAC;AAIF;;;;GAIG;AACH,wBAAgB,OAAO,IAAI,UAAU,CAuBpC"}
1
+ {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../src/ui/tui.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAMnD,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEzC,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,iDAAiD;IACjD,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,wDAAwD;IACxD,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,gEAAgE;IAChE,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AASD;;;GAGG;AACH,wBAAgB,IAAI,CAAC,IAAI,CAAC,EAAE,cAAc,GAAG,IAAI,CAEhD;AAED,mDAAmD;AACnD,wBAAgB,OAAO,IAAI,OAAO,CAEjC;AAID,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAMzC;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAM3C;AAID,eAAO,MAAM,GAAG;kBACA,MAAM,GAAG,IAAI;qBAQV,MAAM,GAAG,IAAI;kBAQhB,MAAM,GAAG,IAAI;mBAQZ,MAAM,GAAG,IAAI;kBAQd,MAAM,GAAG,IAAI;qBAQV,MAAM,GAAG,IAAI;CAO/B,CAAC;AAIF;;;;GAIG;AACH,wBAAgB,OAAO,IAAI,UAAU,CAuBpC;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI,GAAG,IAAI,CAE3D;AAID;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,MAAM,CAMrE;AAID;;;;GAIG;AACH,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAwB5D;AAMD;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAe9C;AAID;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAa5E"}