ghagga 2.2.0 → 2.4.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 (124) hide show
  1. package/dist/commands/hooks/index.d.ts.map +1 -1
  2. package/dist/commands/hooks/index.js +2 -3
  3. package/dist/commands/hooks/index.js.map +1 -1
  4. package/dist/commands/hooks/install.d.ts +1 -1
  5. package/dist/commands/hooks/install.d.ts.map +1 -1
  6. package/dist/commands/hooks/install.js +2 -2
  7. package/dist/commands/hooks/install.js.map +1 -1
  8. package/dist/commands/hooks/install.test.js +23 -11
  9. package/dist/commands/hooks/install.test.js.map +1 -1
  10. package/dist/commands/hooks/status.d.ts +1 -1
  11. package/dist/commands/hooks/status.d.ts.map +1 -1
  12. package/dist/commands/hooks/status.js +1 -1
  13. package/dist/commands/hooks/status.js.map +1 -1
  14. package/dist/commands/hooks/status.test.js +44 -14
  15. package/dist/commands/hooks/status.test.js.map +1 -1
  16. package/dist/commands/hooks/uninstall.d.ts +1 -1
  17. package/dist/commands/hooks/uninstall.d.ts.map +1 -1
  18. package/dist/commands/hooks/uninstall.js +1 -1
  19. package/dist/commands/hooks/uninstall.js.map +1 -1
  20. package/dist/commands/hooks/uninstall.test.js +34 -12
  21. package/dist/commands/hooks/uninstall.test.js.map +1 -1
  22. package/dist/commands/login.d.ts.map +1 -1
  23. package/dist/commands/login.js +1 -1
  24. package/dist/commands/login.js.map +1 -1
  25. package/dist/commands/login.test.js +5 -3
  26. package/dist/commands/login.test.js.map +1 -1
  27. package/dist/commands/logout.test.js +1 -1
  28. package/dist/commands/logout.test.js.map +1 -1
  29. package/dist/commands/memory/clear.d.ts +1 -1
  30. package/dist/commands/memory/clear.d.ts.map +1 -1
  31. package/dist/commands/memory/clear.js +1 -1
  32. package/dist/commands/memory/clear.js.map +1 -1
  33. package/dist/commands/memory/clear.test.js +5 -7
  34. package/dist/commands/memory/clear.test.js.map +1 -1
  35. package/dist/commands/memory/delete.d.ts +1 -1
  36. package/dist/commands/memory/delete.d.ts.map +1 -1
  37. package/dist/commands/memory/delete.js +2 -2
  38. package/dist/commands/memory/delete.js.map +1 -1
  39. package/dist/commands/memory/delete.test.js +5 -7
  40. package/dist/commands/memory/delete.test.js.map +1 -1
  41. package/dist/commands/memory/index.d.ts.map +1 -1
  42. package/dist/commands/memory/index.js +3 -4
  43. package/dist/commands/memory/index.js.map +1 -1
  44. package/dist/commands/memory/list.d.ts +1 -1
  45. package/dist/commands/memory/list.d.ts.map +1 -1
  46. package/dist/commands/memory/list.js +1 -1
  47. package/dist/commands/memory/list.js.map +1 -1
  48. package/dist/commands/memory/list.test.js +17 -5
  49. package/dist/commands/memory/list.test.js.map +1 -1
  50. package/dist/commands/memory/search.d.ts +1 -1
  51. package/dist/commands/memory/search.d.ts.map +1 -1
  52. package/dist/commands/memory/search.js +1 -1
  53. package/dist/commands/memory/search.js.map +1 -1
  54. package/dist/commands/memory/search.test.js +9 -4
  55. package/dist/commands/memory/search.test.js.map +1 -1
  56. package/dist/commands/memory/show.d.ts +1 -1
  57. package/dist/commands/memory/show.d.ts.map +1 -1
  58. package/dist/commands/memory/show.js +3 -5
  59. package/dist/commands/memory/show.js.map +1 -1
  60. package/dist/commands/memory/show.test.js +4 -6
  61. package/dist/commands/memory/show.test.js.map +1 -1
  62. package/dist/commands/memory/stats.d.ts +1 -1
  63. package/dist/commands/memory/stats.d.ts.map +1 -1
  64. package/dist/commands/memory/stats.js +3 -7
  65. package/dist/commands/memory/stats.js.map +1 -1
  66. package/dist/commands/memory/stats.test.js +3 -3
  67. package/dist/commands/memory/stats.test.js.map +1 -1
  68. package/dist/commands/memory/utils.d.ts.map +1 -1
  69. package/dist/commands/memory/utils.js +1 -1
  70. package/dist/commands/memory/utils.js.map +1 -1
  71. package/dist/commands/memory/utils.test.js +2 -2
  72. package/dist/commands/memory/utils.test.js.map +1 -1
  73. package/dist/commands/review-commit-msg.d.ts.map +1 -1
  74. package/dist/commands/review-commit-msg.js.map +1 -1
  75. package/dist/commands/review-commit-msg.test.js +11 -11
  76. package/dist/commands/review-commit-msg.test.js.map +1 -1
  77. package/dist/commands/review.d.ts +7 -1
  78. package/dist/commands/review.d.ts.map +1 -1
  79. package/dist/commands/review.js +145 -18
  80. package/dist/commands/review.js.map +1 -1
  81. package/dist/commands/review.test.js +463 -33
  82. package/dist/commands/review.test.js.map +1 -1
  83. package/dist/commands/status.js +1 -1
  84. package/dist/commands/status.js.map +1 -1
  85. package/dist/commands/status.test.js +2 -2
  86. package/dist/commands/status.test.js.map +1 -1
  87. package/dist/index.js +30 -13
  88. package/dist/index.js.map +1 -1
  89. package/dist/lib/config.js +3 -3
  90. package/dist/lib/config.js.map +1 -1
  91. package/dist/lib/config.test.js +11 -9
  92. package/dist/lib/config.test.js.map +1 -1
  93. package/dist/lib/git-hooks.d.ts +1 -1
  94. package/dist/lib/git-hooks.d.ts.map +1 -1
  95. package/dist/lib/git-hooks.js +3 -3
  96. package/dist/lib/git-hooks.js.map +1 -1
  97. package/dist/lib/git-hooks.test.js +2 -2
  98. package/dist/lib/git-hooks.test.js.map +1 -1
  99. package/dist/lib/git.js +1 -1
  100. package/dist/lib/git.js.map +1 -1
  101. package/dist/lib/git.test.js +5 -3
  102. package/dist/lib/git.test.js.map +1 -1
  103. package/dist/lib/hook-templates.test.js +2 -2
  104. package/dist/lib/hook-templates.test.js.map +1 -1
  105. package/dist/lib/oauth.js +1 -1
  106. package/dist/lib/oauth.js.map +1 -1
  107. package/dist/lib/oauth.test.js +4 -3
  108. package/dist/lib/oauth.test.js.map +1 -1
  109. package/dist/ui/__tests__/format.test.js +36 -7
  110. package/dist/ui/__tests__/format.test.js.map +1 -1
  111. package/dist/ui/__tests__/theme.test.js +16 -7
  112. package/dist/ui/__tests__/theme.test.js.map +1 -1
  113. package/dist/ui/__tests__/tui.test.js +8 -8
  114. package/dist/ui/__tests__/tui.test.js.map +1 -1
  115. package/dist/ui/format.d.ts.map +1 -1
  116. package/dist/ui/format.js +6 -6
  117. package/dist/ui/format.js.map +1 -1
  118. package/dist/ui/theme.d.ts +1 -1
  119. package/dist/ui/theme.d.ts.map +1 -1
  120. package/dist/ui/theme.js +1 -1
  121. package/dist/ui/theme.js.map +1 -1
  122. package/dist/ui/tui.js +1 -1
  123. package/dist/ui/tui.js.map +1 -1
  124. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"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"}
@@ -5,34 +5,155 @@
5
5
  * and exit code mapping. The reviewPipeline is mocked to avoid
6
6
  * needing an actual LLM API key.
7
7
  */
8
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
8
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
9
9
  // ─── Mock ghagga-core to prevent actual LLM calls ───────────────
10
- vi.mock('ghagga-core', () => ({
11
- reviewPipeline: vi.fn(),
12
- SqliteMemoryStorage: {
13
- create: vi.fn().mockResolvedValue({
14
- searchObservations: vi.fn().mockResolvedValue([]),
15
- saveObservation: vi.fn().mockResolvedValue({}),
16
- createSession: vi.fn().mockResolvedValue({ id: 1 }),
17
- endSession: vi.fn().mockResolvedValue(undefined),
18
- close: vi.fn().mockResolvedValue(undefined),
19
- }),
20
- },
21
- DEFAULT_SETTINGS: {
22
- enableSemgrep: true,
23
- enableTrivy: true,
24
- enableCpd: true,
25
- enableMemory: true,
26
- customRules: [],
27
- ignorePatterns: ['*.md', '*.txt', '.gitignore', 'LICENSE', '*.lock'],
28
- reviewLevel: 'normal',
29
- },
30
- DEFAULT_MODELS: {
31
- anthropic: 'claude-sonnet-4-20250514',
32
- openai: 'gpt-4o',
33
- google: 'gemini-2.0-flash',
34
- },
35
- }));
10
+ vi.mock('ghagga-core', () => {
11
+ const mockTools = [
12
+ {
13
+ name: 'semgrep',
14
+ displayName: 'Security (SAST multi-language)',
15
+ category: 'security',
16
+ tier: 'always-on',
17
+ version: '1.90.0',
18
+ },
19
+ {
20
+ name: 'trivy',
21
+ displayName: 'SCA + IaC + Licenses',
22
+ category: 'sca',
23
+ tier: 'always-on',
24
+ version: '0.69.3',
25
+ },
26
+ {
27
+ name: 'cpd',
28
+ displayName: 'Duplication detection',
29
+ category: 'duplication',
30
+ tier: 'always-on',
31
+ version: '7.8.0',
32
+ },
33
+ {
34
+ name: 'gitleaks',
35
+ displayName: 'Secrets scanning',
36
+ category: 'secrets',
37
+ tier: 'always-on',
38
+ version: '8.21.2',
39
+ },
40
+ {
41
+ name: 'shellcheck',
42
+ displayName: 'Shell script analysis',
43
+ category: 'linting',
44
+ tier: 'always-on',
45
+ version: '0.10.0',
46
+ },
47
+ {
48
+ name: 'markdownlint',
49
+ displayName: 'Markdown linting',
50
+ category: 'docs',
51
+ tier: 'always-on',
52
+ version: '0.17.1',
53
+ },
54
+ {
55
+ name: 'lizard',
56
+ displayName: 'Cyclomatic complexity',
57
+ category: 'complexity',
58
+ tier: 'always-on',
59
+ version: '1.17.13',
60
+ },
61
+ {
62
+ name: 'ruff',
63
+ displayName: 'Python quality (*.py)',
64
+ category: 'linting',
65
+ tier: 'auto-detect',
66
+ version: '0.9.7',
67
+ },
68
+ {
69
+ name: 'bandit',
70
+ displayName: 'Python security (*.py)',
71
+ category: 'security',
72
+ tier: 'auto-detect',
73
+ version: '1.8.3',
74
+ },
75
+ {
76
+ name: 'golangci-lint',
77
+ displayName: 'Go quality + security (go.mod)',
78
+ category: 'linting',
79
+ tier: 'auto-detect',
80
+ version: '1.63.4',
81
+ },
82
+ {
83
+ name: 'biome',
84
+ displayName: 'JS/TS quality (*.ts, *.js)',
85
+ category: 'linting',
86
+ tier: 'auto-detect',
87
+ version: '1.9.4',
88
+ },
89
+ {
90
+ name: 'pmd',
91
+ displayName: 'Java quality (*.java)',
92
+ category: 'quality',
93
+ tier: 'auto-detect',
94
+ version: '7.8.0',
95
+ },
96
+ {
97
+ name: 'psalm',
98
+ displayName: 'PHP quality + security (*.php)',
99
+ category: 'quality',
100
+ tier: 'auto-detect',
101
+ version: '6.5.1',
102
+ },
103
+ {
104
+ name: 'clippy',
105
+ displayName: 'Rust quality (Cargo.toml)',
106
+ category: 'linting',
107
+ tier: 'auto-detect',
108
+ version: '0.0.0',
109
+ },
110
+ {
111
+ name: 'hadolint',
112
+ displayName: 'Dockerfile best practices (Dockerfile)',
113
+ category: 'linting',
114
+ tier: 'auto-detect',
115
+ version: '2.12.0',
116
+ },
117
+ ];
118
+ return {
119
+ reviewPipeline: vi.fn(),
120
+ SqliteMemoryStorage: {
121
+ create: vi.fn().mockResolvedValue({
122
+ searchObservations: vi.fn().mockResolvedValue([]),
123
+ saveObservation: vi.fn().mockResolvedValue({}),
124
+ createSession: vi.fn().mockResolvedValue({ id: 1 }),
125
+ endSession: vi.fn().mockResolvedValue(undefined),
126
+ close: vi.fn().mockResolvedValue(undefined),
127
+ }),
128
+ },
129
+ DEFAULT_SETTINGS: {
130
+ enableSemgrep: true,
131
+ enableTrivy: true,
132
+ enableCpd: true,
133
+ enableMemory: true,
134
+ customRules: [],
135
+ ignorePatterns: ['*.md', '*.txt', '.gitignore', 'LICENSE', '*.lock'],
136
+ reviewLevel: 'normal',
137
+ enabledTools: [],
138
+ disabledTools: [],
139
+ },
140
+ DEFAULT_MODELS: {
141
+ anthropic: 'claude-sonnet-4-20250514',
142
+ openai: 'gpt-4o',
143
+ google: 'gemini-2.0-flash',
144
+ },
145
+ initializeDefaultTools: vi.fn(),
146
+ toolRegistry: {
147
+ getAll: vi.fn().mockReturnValue(mockTools),
148
+ getByName: vi.fn(),
149
+ getByTier: vi.fn(),
150
+ register: vi.fn(),
151
+ size: 15,
152
+ validateAll: vi.fn(),
153
+ clear: vi.fn(),
154
+ },
155
+ };
156
+ });
36
157
  vi.mock('node:child_process', () => ({
37
158
  execSync: vi.fn(),
38
159
  }));
@@ -190,6 +311,8 @@ function defaultOptions(overrides = {}) {
190
311
  cpd: true,
191
312
  memory: true,
192
313
  verbose: false,
314
+ disableTools: [],
315
+ enableTools: [],
193
316
  ...overrides,
194
317
  };
195
318
  }
@@ -212,16 +335,17 @@ function makeReviewResult(overrides = {}) {
212
335
  };
213
336
  }
214
337
  describe('reviewCommand — functional tests', () => {
215
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
338
+ // biome-ignore lint/suspicious/noExplicitAny: mock spy type
216
339
  let logSpy;
217
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
340
+ // biome-ignore lint/suspicious/noExplicitAny: mock spy type
218
341
  let errorSpy;
219
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
342
+ // biome-ignore lint/suspicious/noExplicitAny: mock spy type
220
343
  let exitSpy;
221
344
  beforeEach(() => {
222
345
  vi.clearAllMocks();
223
346
  logSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
224
347
  errorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
348
+ // biome-ignore lint/suspicious/noExplicitAny: mock cast
225
349
  exitSpy = vi.spyOn(process, 'exit').mockImplementation((() => { }));
226
350
  mockExistsSync.mockReturnValue(false); // no .ghagga.json by default
227
351
  });
@@ -376,7 +500,7 @@ describe('reviewCommand — functional tests', () => {
376
500
  const { reviewCommand } = await import('./review.js');
377
501
  await reviewCommand('.', defaultOptions());
378
502
  // reviewPipeline should have been called with settings that include the config
379
- const callArgs = mockReviewPipeline.mock.calls[0][0];
503
+ const callArgs = mockReviewPipeline.mock.calls[0]?.[0];
380
504
  const settings = callArgs.settings;
381
505
  expect(settings.reviewLevel).toBe('strict');
382
506
  expect(settings.customRules).toEqual(['/rules/custom.yml']);
@@ -402,7 +526,7 @@ describe('reviewCommand — functional tests', () => {
402
526
  mockReviewPipeline.mockResolvedValue(makeReviewResult());
403
527
  const { reviewCommand } = await import('./review.js');
404
528
  await reviewCommand('.', defaultOptions({ verbose: true }));
405
- const callArgs = mockReviewPipeline.mock.calls[0][0];
529
+ const callArgs = mockReviewPipeline.mock.calls[0]?.[0];
406
530
  expect(callArgs.onProgress).toBeTypeOf('function');
407
531
  });
408
532
  it('should not pass progress handler when verbose is false', async () => {
@@ -410,7 +534,7 @@ describe('reviewCommand — functional tests', () => {
410
534
  mockReviewPipeline.mockResolvedValue(makeReviewResult());
411
535
  const { reviewCommand } = await import('./review.js');
412
536
  await reviewCommand('.', defaultOptions({ verbose: false }));
413
- const callArgs = mockReviewPipeline.mock.calls[0][0];
537
+ const callArgs = mockReviewPipeline.mock.calls[0]?.[0];
414
538
  expect(callArgs.onProgress).toBeUndefined();
415
539
  });
416
540
  it('should print progress header with mode, provider, and model', async () => {
@@ -424,4 +548,310 @@ describe('reviewCommand — functional tests', () => {
424
548
  expect(allLogCalls.some((s) => s.includes('gpt-4o'))).toBe(true);
425
549
  });
426
550
  });
551
+ // ═══════════════════════════════════════════════════════════════
552
+ // Phase 7: Extensible tool system CLI flags
553
+ // ═══════════════════════════════════════════════════════════════
554
+ describe('Phase 7: --disable-tool flag', () => {
555
+ // biome-ignore lint/suspicious/noExplicitAny: mock spy type
556
+ let logSpy;
557
+ // biome-ignore lint/suspicious/noExplicitAny: mock spy type
558
+ let errorSpy;
559
+ // biome-ignore lint/suspicious/noExplicitAny: mock spy type
560
+ let exitSpy;
561
+ beforeEach(() => {
562
+ vi.clearAllMocks();
563
+ logSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
564
+ errorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
565
+ // biome-ignore lint/suspicious/noExplicitAny: mock cast
566
+ exitSpy = vi.spyOn(process, 'exit').mockImplementation((() => { }));
567
+ mockExistsSync.mockReturnValue(false);
568
+ });
569
+ afterEach(() => {
570
+ logSpy.mockRestore();
571
+ errorSpy.mockRestore();
572
+ exitSpy.mockRestore();
573
+ });
574
+ it('should pass disabledTools to settings when --disable-tool is used', async () => {
575
+ mockExecSync.mockReturnValue('diff content');
576
+ mockReviewPipeline.mockResolvedValue(makeReviewResult());
577
+ const { reviewCommand } = await import('./review.js');
578
+ await reviewCommand('.', defaultOptions({ disableTools: ['gitleaks'] }));
579
+ const callArgs = mockReviewPipeline.mock.calls[0]?.[0];
580
+ const settings = callArgs.settings;
581
+ expect(settings.disabledTools).toContain('gitleaks');
582
+ });
583
+ it('should pass multiple disabledTools when --disable-tool is repeated', async () => {
584
+ mockExecSync.mockReturnValue('diff content');
585
+ mockReviewPipeline.mockResolvedValue(makeReviewResult());
586
+ const { reviewCommand } = await import('./review.js');
587
+ await reviewCommand('.', defaultOptions({ disableTools: ['gitleaks', 'shellcheck', 'cpd'] }));
588
+ const callArgs = mockReviewPipeline.mock.calls[0]?.[0];
589
+ const settings = callArgs.settings;
590
+ const disabled = settings.disabledTools;
591
+ expect(disabled).toContain('gitleaks');
592
+ expect(disabled).toContain('shellcheck');
593
+ expect(disabled).toContain('cpd');
594
+ });
595
+ it('should warn but not error for unknown tool in --disable-tool', async () => {
596
+ mockExecSync.mockReturnValue('diff content');
597
+ mockReviewPipeline.mockResolvedValue(makeReviewResult());
598
+ const { reviewCommand } = await import('./review.js');
599
+ await reviewCommand('.', defaultOptions({ disableTools: ['nonexistent'] }));
600
+ // Should warn about unknown tool
601
+ const allLogCalls = logSpy.mock.calls.map((c) => String(c[0]));
602
+ expect(allLogCalls.some((s) => s.includes('Unknown tool "nonexistent"'))).toBe(true);
603
+ // Should still proceed with review (not exit with error)
604
+ expect(mockReviewPipeline).toHaveBeenCalled();
605
+ });
606
+ });
607
+ describe('Phase 7: --enable-tool flag', () => {
608
+ // biome-ignore lint/suspicious/noExplicitAny: mock spy type
609
+ let logSpy;
610
+ // biome-ignore lint/suspicious/noExplicitAny: mock spy type
611
+ let errorSpy;
612
+ // biome-ignore lint/suspicious/noExplicitAny: mock spy type
613
+ let exitSpy;
614
+ beforeEach(() => {
615
+ vi.clearAllMocks();
616
+ logSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
617
+ errorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
618
+ // biome-ignore lint/suspicious/noExplicitAny: mock cast
619
+ exitSpy = vi.spyOn(process, 'exit').mockImplementation((() => { }));
620
+ mockExistsSync.mockReturnValue(false);
621
+ });
622
+ afterEach(() => {
623
+ logSpy.mockRestore();
624
+ errorSpy.mockRestore();
625
+ exitSpy.mockRestore();
626
+ });
627
+ it('should pass enabledTools to settings when --enable-tool is used', async () => {
628
+ mockExecSync.mockReturnValue('diff content');
629
+ mockReviewPipeline.mockResolvedValue(makeReviewResult());
630
+ const { reviewCommand } = await import('./review.js');
631
+ await reviewCommand('.', defaultOptions({ enableTools: ['ruff'] }));
632
+ const callArgs = mockReviewPipeline.mock.calls[0]?.[0];
633
+ const settings = callArgs.settings;
634
+ expect(settings.enabledTools).toContain('ruff');
635
+ });
636
+ it('should disable tool when both --enable-tool and --disable-tool for same tool', async () => {
637
+ mockExecSync.mockReturnValue('diff content');
638
+ mockReviewPipeline.mockResolvedValue(makeReviewResult());
639
+ const { reviewCommand } = await import('./review.js');
640
+ await reviewCommand('.', defaultOptions({ enableTools: ['ruff'], disableTools: ['ruff'] }));
641
+ const callArgs = mockReviewPipeline.mock.calls[0]?.[0];
642
+ const settings = callArgs.settings;
643
+ // --disable-tool takes precedence
644
+ expect(settings.disabledTools).toContain('ruff');
645
+ expect(settings.enabledTools).not.toContain('ruff');
646
+ });
647
+ });
648
+ describe('Phase 7: --list-tools flag', () => {
649
+ // biome-ignore lint/suspicious/noExplicitAny: mock spy type
650
+ let logSpy;
651
+ // biome-ignore lint/suspicious/noExplicitAny: mock spy type
652
+ let errorSpy;
653
+ // biome-ignore lint/suspicious/noExplicitAny: mock spy type
654
+ let exitSpy;
655
+ beforeEach(() => {
656
+ vi.clearAllMocks();
657
+ logSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
658
+ errorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
659
+ // biome-ignore lint/suspicious/noExplicitAny: mock cast
660
+ exitSpy = vi.spyOn(process, 'exit').mockImplementation((() => { }));
661
+ mockExistsSync.mockReturnValue(false);
662
+ });
663
+ afterEach(() => {
664
+ logSpy.mockRestore();
665
+ errorSpy.mockRestore();
666
+ exitSpy.mockRestore();
667
+ });
668
+ it('should print tool list and exit 0 with --list-tools', async () => {
669
+ const { reviewCommand } = await import('./review.js');
670
+ await reviewCommand('.', defaultOptions({ listTools: true }));
671
+ expect(exitSpy).toHaveBeenCalledWith(0);
672
+ const allLogCalls = logSpy.mock.calls.map((c) => String(c[0]));
673
+ const output = allLogCalls.join('\n');
674
+ expect(output).toContain('ALWAYS-ON:');
675
+ expect(output).toContain('AUTO-DETECT:');
676
+ expect(output).toContain('semgrep');
677
+ expect(output).toContain('ruff');
678
+ expect(output).toContain('hadolint');
679
+ });
680
+ it('should print JSON array with --list-tools --format json', async () => {
681
+ const { reviewCommand } = await import('./review.js');
682
+ await reviewCommand('.', defaultOptions({ listTools: true, format: 'json' }));
683
+ expect(exitSpy).toHaveBeenCalledWith(0);
684
+ // Find the JSON output
685
+ const jsonCall = logSpy.mock.calls.find((c) => {
686
+ try {
687
+ JSON.parse(String(c[0]));
688
+ return true;
689
+ }
690
+ catch {
691
+ return false;
692
+ }
693
+ });
694
+ expect(jsonCall).toBeDefined();
695
+ const tools = JSON.parse(String(jsonCall[0]));
696
+ expect(Array.isArray(tools)).toBe(true);
697
+ expect(tools.length).toBe(15);
698
+ // Each tool should have the required fields
699
+ const first = tools[0];
700
+ expect(first).toHaveProperty('name');
701
+ expect(first).toHaveProperty('displayName');
702
+ expect(first).toHaveProperty('category');
703
+ expect(first).toHaveProperty('tier');
704
+ expect(first).toHaveProperty('version');
705
+ });
706
+ it('should call process.exit(0) before review pipeline when --list-tools is used', async () => {
707
+ // Note: process.exit is mocked as no-op, so execution continues past it.
708
+ // We verify exit(0) is called first (real behavior: exits before pipeline).
709
+ const { reviewCommand } = await import('./review.js');
710
+ await reviewCommand('.', defaultOptions({ listTools: true }));
711
+ // Verify exit(0) was called (which would terminate before pipeline in real execution)
712
+ expect(exitSpy).toHaveBeenCalledWith(0);
713
+ // Verify exit was called before reviewPipeline would have been invoked
714
+ // In real execution, process.exit(0) terminates — the pipeline never runs.
715
+ const exitCallOrder = exitSpy.mock.invocationCallOrder[0];
716
+ if (mockReviewPipeline.mock.invocationCallOrder.length > 0) {
717
+ const pipelineCallOrder = mockReviewPipeline.mock.invocationCallOrder[0];
718
+ expect(exitCallOrder).toBeLessThan(pipelineCallOrder);
719
+ }
720
+ });
721
+ });
722
+ describe('Phase 7: deprecated --no-semgrep/--no-trivy/--no-cpd flags', () => {
723
+ // biome-ignore lint/suspicious/noExplicitAny: mock spy type
724
+ let logSpy;
725
+ // biome-ignore lint/suspicious/noExplicitAny: mock spy type
726
+ let errorSpy;
727
+ // biome-ignore lint/suspicious/noExplicitAny: mock spy type
728
+ let exitSpy;
729
+ beforeEach(() => {
730
+ vi.clearAllMocks();
731
+ logSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
732
+ errorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
733
+ // biome-ignore lint/suspicious/noExplicitAny: mock cast
734
+ exitSpy = vi.spyOn(process, 'exit').mockImplementation((() => { }));
735
+ mockExistsSync.mockReturnValue(false);
736
+ });
737
+ afterEach(() => {
738
+ logSpy.mockRestore();
739
+ errorSpy.mockRestore();
740
+ exitSpy.mockRestore();
741
+ });
742
+ it('should emit deprecation warning and map --no-semgrep to disabledTools', async () => {
743
+ mockExecSync.mockReturnValue('diff content');
744
+ mockReviewPipeline.mockResolvedValue(makeReviewResult());
745
+ const { reviewCommand } = await import('./review.js');
746
+ await reviewCommand('.', defaultOptions({ semgrep: false }));
747
+ // Deprecation warning should be printed
748
+ const allLogCalls = logSpy.mock.calls.map((c) => String(c[0]));
749
+ expect(allLogCalls.some((s) => s.includes('--no-semgrep is deprecated, use --disable-tool semgrep instead'))).toBe(true);
750
+ // Settings should have semgrep in disabledTools
751
+ const callArgs = mockReviewPipeline.mock.calls[0]?.[0];
752
+ const settings = callArgs.settings;
753
+ expect(settings.disabledTools).toContain('semgrep');
754
+ });
755
+ it('should emit deprecation warning for --no-trivy', async () => {
756
+ mockExecSync.mockReturnValue('diff content');
757
+ mockReviewPipeline.mockResolvedValue(makeReviewResult());
758
+ const { reviewCommand } = await import('./review.js');
759
+ await reviewCommand('.', defaultOptions({ trivy: false }));
760
+ const allLogCalls = logSpy.mock.calls.map((c) => String(c[0]));
761
+ expect(allLogCalls.some((s) => s.includes('--no-trivy is deprecated, use --disable-tool trivy instead'))).toBe(true);
762
+ const callArgs = mockReviewPipeline.mock.calls[0]?.[0];
763
+ const settings = callArgs.settings;
764
+ expect(settings.disabledTools).toContain('trivy');
765
+ });
766
+ it('should emit deprecation warning for --no-cpd', async () => {
767
+ mockExecSync.mockReturnValue('diff content');
768
+ mockReviewPipeline.mockResolvedValue(makeReviewResult());
769
+ const { reviewCommand } = await import('./review.js');
770
+ await reviewCommand('.', defaultOptions({ cpd: false }));
771
+ const allLogCalls = logSpy.mock.calls.map((c) => String(c[0]));
772
+ expect(allLogCalls.some((s) => s.includes('--no-cpd is deprecated, use --disable-tool cpd instead'))).toBe(true);
773
+ const callArgs = mockReviewPipeline.mock.calls[0]?.[0];
774
+ const settings = callArgs.settings;
775
+ expect(settings.disabledTools).toContain('cpd');
776
+ });
777
+ it('should combine deprecated --no-semgrep with new --disable-tool gitleaks', async () => {
778
+ mockExecSync.mockReturnValue('diff content');
779
+ mockReviewPipeline.mockResolvedValue(makeReviewResult());
780
+ const { reviewCommand } = await import('./review.js');
781
+ await reviewCommand('.', defaultOptions({ semgrep: false, disableTools: ['gitleaks'] }));
782
+ // Deprecation warning for --no-semgrep
783
+ const allLogCalls = logSpy.mock.calls.map((c) => String(c[0]));
784
+ expect(allLogCalls.some((s) => s.includes('--no-semgrep is deprecated'))).toBe(true);
785
+ // Both should be in disabledTools
786
+ const callArgs = mockReviewPipeline.mock.calls[0]?.[0];
787
+ const settings = callArgs.settings;
788
+ const disabled = settings.disabledTools;
789
+ expect(disabled).toContain('semgrep');
790
+ expect(disabled).toContain('gitleaks');
791
+ });
792
+ });
793
+ describe('Phase 7: config file with new tool fields', () => {
794
+ // biome-ignore lint/suspicious/noExplicitAny: mock spy type
795
+ let logSpy;
796
+ // biome-ignore lint/suspicious/noExplicitAny: mock spy type
797
+ let errorSpy;
798
+ // biome-ignore lint/suspicious/noExplicitAny: mock spy type
799
+ let exitSpy;
800
+ beforeEach(() => {
801
+ vi.clearAllMocks();
802
+ logSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
803
+ errorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
804
+ // biome-ignore lint/suspicious/noExplicitAny: mock cast
805
+ exitSpy = vi.spyOn(process, 'exit').mockImplementation((() => { }));
806
+ });
807
+ afterEach(() => {
808
+ logSpy.mockRestore();
809
+ errorSpy.mockRestore();
810
+ exitSpy.mockRestore();
811
+ });
812
+ it('should merge config file disabledTools with CLI --disable-tool', async () => {
813
+ mockExecSync.mockReturnValue('diff content');
814
+ mockExistsSync.mockReturnValue(true);
815
+ mockReadFileSync.mockReturnValue(JSON.stringify({
816
+ disabledTools: ['cpd', 'markdownlint'],
817
+ }));
818
+ mockReviewPipeline.mockResolvedValue(makeReviewResult());
819
+ const { reviewCommand } = await import('./review.js');
820
+ await reviewCommand('.', defaultOptions({ disableTools: ['gitleaks'] }));
821
+ const callArgs = mockReviewPipeline.mock.calls[0]?.[0];
822
+ const settings = callArgs.settings;
823
+ const disabled = settings.disabledTools;
824
+ expect(disabled).toContain('cpd');
825
+ expect(disabled).toContain('markdownlint');
826
+ expect(disabled).toContain('gitleaks');
827
+ });
828
+ it('should merge config file enabledTools with CLI --enable-tool', async () => {
829
+ mockExecSync.mockReturnValue('diff content');
830
+ mockExistsSync.mockReturnValue(true);
831
+ mockReadFileSync.mockReturnValue(JSON.stringify({
832
+ enabledTools: ['ruff'],
833
+ }));
834
+ mockReviewPipeline.mockResolvedValue(makeReviewResult());
835
+ const { reviewCommand } = await import('./review.js');
836
+ await reviewCommand('.', defaultOptions({ enableTools: ['bandit'] }));
837
+ const callArgs = mockReviewPipeline.mock.calls[0]?.[0];
838
+ const settings = callArgs.settings;
839
+ const enabled = settings.enabledTools;
840
+ expect(enabled).toContain('ruff');
841
+ expect(enabled).toContain('bandit');
842
+ });
843
+ it('should handle config file with old enableCpd: false format', async () => {
844
+ mockExecSync.mockReturnValue('diff content');
845
+ mockExistsSync.mockReturnValue(true);
846
+ mockReadFileSync.mockReturnValue(JSON.stringify({
847
+ enableCpd: false,
848
+ }));
849
+ mockReviewPipeline.mockResolvedValue(makeReviewResult());
850
+ const { reviewCommand } = await import('./review.js');
851
+ await reviewCommand('.', defaultOptions());
852
+ const callArgs = mockReviewPipeline.mock.calls[0]?.[0];
853
+ const settings = callArgs.settings;
854
+ expect(settings.disabledTools).toContain('cpd');
855
+ });
856
+ });
427
857
  //# sourceMappingURL=review.test.js.map