cadr-cli 2.0.0 → 2.0.2

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 (153) hide show
  1. package/dist/adr/adr.d.ts +17 -0
  2. package/dist/adr/adr.d.ts.map +1 -0
  3. package/dist/{adr.js → adr/adr.js} +4 -44
  4. package/dist/adr/adr.js.map +1 -0
  5. package/dist/adr/adr.test.d.ts +5 -0
  6. package/dist/{adr.test.d.ts.map → adr/adr.test.d.ts.map} +1 -1
  7. package/dist/{adr.test.js → adr/adr.test.js} +0 -14
  8. package/dist/adr/adr.test.js.map +1 -0
  9. package/dist/adr/index.d.ts +2 -0
  10. package/dist/adr/index.d.ts.map +1 -0
  11. package/dist/adr/index.js +18 -0
  12. package/dist/adr/index.js.map +1 -0
  13. package/dist/analysis/analysis.orchestrator.d.ts +14 -0
  14. package/dist/analysis/analysis.orchestrator.d.ts.map +1 -0
  15. package/dist/analysis/analysis.orchestrator.js +175 -0
  16. package/dist/analysis/analysis.orchestrator.js.map +1 -0
  17. package/dist/analysis/analysis.orchestrator.test.d.ts +2 -0
  18. package/dist/analysis/analysis.orchestrator.test.d.ts.map +1 -0
  19. package/dist/analysis/analysis.orchestrator.test.js +177 -0
  20. package/dist/analysis/analysis.orchestrator.test.js.map +1 -0
  21. package/dist/analysis/strategies/git-strategy.d.ts +22 -0
  22. package/dist/analysis/strategies/git-strategy.d.ts.map +1 -0
  23. package/dist/analysis/strategies/git-strategy.js +114 -0
  24. package/dist/analysis/strategies/git-strategy.js.map +1 -0
  25. package/dist/analysis/strategies/git-strategy.test.d.ts +2 -0
  26. package/dist/analysis/strategies/git-strategy.test.d.ts.map +1 -0
  27. package/dist/analysis/strategies/git-strategy.test.js +147 -0
  28. package/dist/analysis/strategies/git-strategy.test.js.map +1 -0
  29. package/dist/commands/analyze.js +3 -3
  30. package/dist/commands/analyze.js.map +1 -1
  31. package/dist/commands/analyze.test.d.ts +2 -0
  32. package/dist/commands/analyze.test.d.ts.map +1 -0
  33. package/dist/commands/analyze.test.js +70 -0
  34. package/dist/commands/analyze.test.js.map +1 -0
  35. package/dist/commands/init.test.js +128 -2
  36. package/dist/commands/init.test.js.map +1 -1
  37. package/dist/config.test.js +167 -0
  38. package/dist/config.test.js.map +1 -1
  39. package/dist/git/git.errors.d.ts +6 -0
  40. package/dist/git/git.errors.d.ts.map +1 -0
  41. package/dist/git/git.errors.js +15 -0
  42. package/dist/git/git.errors.js.map +1 -0
  43. package/dist/git/git.errors.test.d.ts +2 -0
  44. package/dist/git/git.errors.test.d.ts.map +1 -0
  45. package/dist/git/git.errors.test.js +34 -0
  46. package/dist/git/git.errors.test.js.map +1 -0
  47. package/dist/git/git.operations.d.ts +12 -0
  48. package/dist/git/git.operations.d.ts.map +1 -0
  49. package/dist/git/git.operations.js +64 -0
  50. package/dist/git/git.operations.js.map +1 -0
  51. package/dist/git/git.operations.test.d.ts +2 -0
  52. package/dist/git/git.operations.test.d.ts.map +1 -0
  53. package/dist/git/git.operations.test.js +164 -0
  54. package/dist/git/git.operations.test.js.map +1 -0
  55. package/dist/git/index.d.ts +4 -0
  56. package/dist/git/index.d.ts.map +1 -0
  57. package/dist/git/index.js +19 -0
  58. package/dist/git/index.js.map +1 -0
  59. package/dist/llm/index.d.ts +3 -0
  60. package/dist/llm/index.d.ts.map +1 -0
  61. package/dist/llm/index.js +19 -0
  62. package/dist/llm/index.js.map +1 -0
  63. package/dist/llm/llm.d.ts +35 -0
  64. package/dist/llm/llm.d.ts.map +1 -0
  65. package/dist/{llm.js → llm/llm.js} +16 -58
  66. package/dist/llm/llm.js.map +1 -0
  67. package/dist/{llm.test.d.ts.map → llm/llm.test.d.ts.map} +1 -1
  68. package/dist/llm/llm.test.js +224 -0
  69. package/dist/llm/llm.test.js.map +1 -0
  70. package/dist/{prompts.d.ts → llm/prompts.d.ts} +1 -38
  71. package/dist/llm/prompts.d.ts.map +1 -0
  72. package/dist/{prompts.js → llm/prompts.js} +9 -54
  73. package/dist/llm/prompts.js.map +1 -0
  74. package/dist/llm/response-parser.d.ts +9 -0
  75. package/dist/llm/response-parser.d.ts.map +1 -0
  76. package/dist/llm/response-parser.js +67 -0
  77. package/dist/llm/response-parser.js.map +1 -0
  78. package/dist/llm/response-parser.test.d.ts +2 -0
  79. package/dist/llm/response-parser.test.d.ts.map +1 -0
  80. package/dist/llm/response-parser.test.js +134 -0
  81. package/dist/llm/response-parser.test.js.map +1 -0
  82. package/dist/presenters/console-presenter.d.ts +35 -0
  83. package/dist/presenters/console-presenter.d.ts.map +1 -0
  84. package/dist/presenters/console-presenter.js +114 -0
  85. package/dist/presenters/console-presenter.js.map +1 -0
  86. package/dist/presenters/console-presenter.test.d.ts +2 -0
  87. package/dist/presenters/console-presenter.test.d.ts.map +1 -0
  88. package/dist/presenters/console-presenter.test.js +227 -0
  89. package/dist/presenters/console-presenter.test.js.map +1 -0
  90. package/dist/version.test.d.ts +1 -2
  91. package/dist/version.test.d.ts.map +1 -1
  92. package/dist/version.test.js +29 -16
  93. package/dist/version.test.js.map +1 -1
  94. package/package.json +1 -1
  95. package/src/{adr.test.ts → adr/adr.test.ts} +10 -23
  96. package/src/{adr.ts → adr/adr.ts} +7 -48
  97. package/src/adr/index.ts +1 -0
  98. package/src/analysis/analysis.orchestrator.test.ts +237 -0
  99. package/src/analysis/analysis.orchestrator.ts +175 -0
  100. package/src/analysis/strategies/git-strategy.test.ts +210 -0
  101. package/src/analysis/strategies/git-strategy.ts +106 -0
  102. package/src/commands/analyze.test.ts +91 -0
  103. package/src/commands/analyze.ts +8 -9
  104. package/src/commands/init.test.ts +200 -5
  105. package/src/config.test.ts +232 -2
  106. package/src/git/git.errors.test.ts +43 -0
  107. package/src/git/git.errors.ts +10 -0
  108. package/src/git/git.operations.test.ts +222 -0
  109. package/src/git/git.operations.ts +85 -0
  110. package/src/git/index.ts +3 -0
  111. package/src/llm/index.ts +2 -0
  112. package/src/llm/llm.test.ts +315 -0
  113. package/src/{llm.ts → llm/llm.ts} +46 -107
  114. package/src/{prompts.ts → llm/prompts.ts} +30 -72
  115. package/src/llm/response-parser.test.ts +170 -0
  116. package/src/llm/response-parser.ts +90 -0
  117. package/src/presenters/console-presenter.test.ts +259 -0
  118. package/src/presenters/console-presenter.ts +152 -0
  119. package/src/version.test.ts +30 -16
  120. package/dist/adr.d.ts +0 -50
  121. package/dist/adr.d.ts.map +0 -1
  122. package/dist/adr.js.map +0 -1
  123. package/dist/adr.test.d.ts +0 -8
  124. package/dist/adr.test.js.map +0 -1
  125. package/dist/analysis.d.ts +0 -24
  126. package/dist/analysis.d.ts.map +0 -1
  127. package/dist/analysis.js +0 -281
  128. package/dist/analysis.js.map +0 -1
  129. package/dist/analysis.test.d.ts +0 -8
  130. package/dist/analysis.test.d.ts.map +0 -1
  131. package/dist/analysis.test.js +0 -351
  132. package/dist/analysis.test.js.map +0 -1
  133. package/dist/git.d.ts +0 -54
  134. package/dist/git.d.ts.map +0 -1
  135. package/dist/git.js +0 -204
  136. package/dist/git.js.map +0 -1
  137. package/dist/llm.d.ts +0 -73
  138. package/dist/llm.d.ts.map +0 -1
  139. package/dist/llm.js.map +0 -1
  140. package/dist/llm.test.js +0 -592
  141. package/dist/llm.test.js.map +0 -1
  142. package/dist/prompts.d.ts.map +0 -1
  143. package/dist/prompts.js.map +0 -1
  144. package/dist/prompts.test.d.ts +0 -2
  145. package/dist/prompts.test.d.ts.map +0 -1
  146. package/dist/prompts.test.js +0 -427
  147. package/dist/prompts.test.js.map +0 -1
  148. package/src/analysis.test.ts +0 -396
  149. package/src/analysis.ts +0 -262
  150. package/src/git.ts +0 -300
  151. package/src/llm.test.ts +0 -701
  152. package/src/prompts.test.ts +0 -515
  153. /package/dist/{llm.test.d.ts → llm/llm.test.d.ts} +0 -0
@@ -0,0 +1,177 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ jest.mock('../config');
4
+ jest.mock('../llm/prompts');
5
+ jest.mock('../llm/llm');
6
+ jest.mock('../logger');
7
+ jest.mock('../adr/adr');
8
+ jest.mock('./strategies/git-strategy');
9
+ jest.mock('../presenters/console-presenter');
10
+ const config_1 = require("../config");
11
+ const prompts_1 = require("../llm/prompts");
12
+ const llm_1 = require("../llm/llm");
13
+ const adr_1 = require("../adr/adr");
14
+ const git_strategy_1 = require("./strategies/git-strategy");
15
+ const console_presenter_1 = require("../presenters/console-presenter");
16
+ const analysis_orchestrator_1 = require("./analysis.orchestrator");
17
+ const mockPresenter = console_presenter_1.presenter;
18
+ const mockStrategy = { getFiles: jest.fn(), getDiff: jest.fn() };
19
+ git_strategy_1.createGitStrategy.mockReturnValue(mockStrategy);
20
+ config_1.getDefaultConfigPath.mockReturnValue('cadr.yaml');
21
+ prompts_1.formatPrompt.mockReturnValue('formatted-prompt');
22
+ prompts_1.formatGenerationPrompt.mockReturnValue('formatted-generation-prompt');
23
+ const mockConfig = {
24
+ provider: 'openai',
25
+ analysis_model: 'gpt-4',
26
+ api_key_env: 'KEY',
27
+ timeout_seconds: 15,
28
+ };
29
+ const defaultDiffOptions = { mode: 'all' };
30
+ function setupHappyPath(overrides) {
31
+ const isSignificant = overrides?.isSignificant ?? true;
32
+ const confidence = overrides?.confidence ?? 0.9;
33
+ config_1.loadConfig.mockResolvedValue(mockConfig);
34
+ mockStrategy.getFiles.mockResolvedValue(['src/index.ts', 'src/utils.ts']);
35
+ mockStrategy.getDiff.mockResolvedValue('diff content here');
36
+ llm_1.analyzeChanges.mockResolvedValue({
37
+ result: {
38
+ is_significant: isSignificant,
39
+ reason: 'Introduced new dependency',
40
+ confidence,
41
+ timestamp: '2026-01-01T00:00:00.000Z',
42
+ },
43
+ error: undefined,
44
+ });
45
+ }
46
+ describe('runAnalysis', () => {
47
+ beforeEach(() => {
48
+ jest.clearAllMocks();
49
+ git_strategy_1.createGitStrategy.mockReturnValue(mockStrategy);
50
+ config_1.getDefaultConfigPath.mockReturnValue('cadr.yaml');
51
+ prompts_1.formatPrompt.mockReturnValue('formatted-prompt');
52
+ prompts_1.formatGenerationPrompt.mockReturnValue('formatted-generation-prompt');
53
+ });
54
+ it('should show config error and return early when loadConfig returns null', async () => {
55
+ config_1.loadConfig.mockResolvedValue(null);
56
+ await (0, analysis_orchestrator_1.runAnalysis)(defaultDiffOptions);
57
+ expect(mockPresenter.showConfigError).toHaveBeenCalled();
58
+ expect(mockStrategy.getFiles).not.toHaveBeenCalled();
59
+ });
60
+ it('should show git error when getFiles throws a GitError', async () => {
61
+ config_1.loadConfig.mockResolvedValue(mockConfig);
62
+ const gitError = new Error('Not a git repo');
63
+ gitError.name = 'GitError';
64
+ mockStrategy.getFiles.mockRejectedValue(gitError);
65
+ await (0, analysis_orchestrator_1.runAnalysis)(defaultDiffOptions);
66
+ expect(mockPresenter.showGitError).toHaveBeenCalledWith('Not a git repo');
67
+ });
68
+ it('should show read files error when getFiles throws a non-GitError', async () => {
69
+ config_1.loadConfig.mockResolvedValue(mockConfig);
70
+ mockStrategy.getFiles.mockRejectedValue(new Error('some other error'));
71
+ await (0, analysis_orchestrator_1.runAnalysis)(defaultDiffOptions);
72
+ expect(mockPresenter.showReadFilesError).toHaveBeenCalled();
73
+ });
74
+ it('should show no changes when getFiles returns empty array', async () => {
75
+ config_1.loadConfig.mockResolvedValue(mockConfig);
76
+ mockStrategy.getFiles.mockResolvedValue([]);
77
+ await (0, analysis_orchestrator_1.runAnalysis)(defaultDiffOptions);
78
+ expect(mockPresenter.showNoChanges).toHaveBeenCalledWith(defaultDiffOptions);
79
+ });
80
+ it('should show read files error when getDiff throws', async () => {
81
+ config_1.loadConfig.mockResolvedValue(mockConfig);
82
+ mockStrategy.getFiles.mockResolvedValue(['file.ts']);
83
+ mockStrategy.getDiff.mockRejectedValue(new Error('diff failed'));
84
+ await (0, analysis_orchestrator_1.runAnalysis)(defaultDiffOptions);
85
+ expect(mockPresenter.showReadFilesError).toHaveBeenCalled();
86
+ });
87
+ it('should show no diff content when getDiff returns empty string', async () => {
88
+ config_1.loadConfig.mockResolvedValue(mockConfig);
89
+ mockStrategy.getFiles.mockResolvedValue(['file.ts']);
90
+ mockStrategy.getDiff.mockResolvedValue('');
91
+ await (0, analysis_orchestrator_1.runAnalysis)(defaultDiffOptions);
92
+ expect(mockPresenter.showNoDiffContent).toHaveBeenCalled();
93
+ });
94
+ it('should show analysis failed when analyzeChanges returns error', async () => {
95
+ config_1.loadConfig.mockResolvedValue(mockConfig);
96
+ mockStrategy.getFiles.mockResolvedValue(['file.ts']);
97
+ mockStrategy.getDiff.mockResolvedValue('diff content');
98
+ llm_1.analyzeChanges.mockResolvedValue({
99
+ result: null,
100
+ error: 'api error',
101
+ });
102
+ await (0, analysis_orchestrator_1.runAnalysis)(defaultDiffOptions);
103
+ expect(mockPresenter.showAnalysisFailed).toHaveBeenCalledWith('api error');
104
+ });
105
+ it('should show not significant result when analysis result is not significant', async () => {
106
+ setupHappyPath({ isSignificant: false });
107
+ await (0, analysis_orchestrator_1.runAnalysis)(defaultDiffOptions);
108
+ expect(mockPresenter.showNotSignificantResult).toHaveBeenCalledWith(expect.objectContaining({
109
+ fileCount: 2,
110
+ mode: 'all',
111
+ isSignificant: false,
112
+ reason: 'Introduced new dependency',
113
+ confidence: 0.9,
114
+ }));
115
+ });
116
+ it('should show skipping generation when user declines', async () => {
117
+ setupHappyPath({ isSignificant: true });
118
+ prompts_1.promptForGeneration.mockResolvedValue(false);
119
+ await (0, analysis_orchestrator_1.runAnalysis)(defaultDiffOptions);
120
+ expect(mockPresenter.showSignificantResult).toHaveBeenCalled();
121
+ expect(mockPresenter.showSkippingGeneration).toHaveBeenCalled();
122
+ });
123
+ it('should show generation failed when generateADRContent returns error', async () => {
124
+ setupHappyPath({ isSignificant: true });
125
+ prompts_1.promptForGeneration.mockResolvedValue(true);
126
+ llm_1.generateADRContent.mockResolvedValue({
127
+ result: null,
128
+ error: 'generation error',
129
+ });
130
+ await (0, analysis_orchestrator_1.runAnalysis)(defaultDiffOptions);
131
+ expect(mockPresenter.showGeneratingADR).toHaveBeenCalled();
132
+ expect(mockPresenter.showGenerationFailed).toHaveBeenCalledWith('generation error');
133
+ });
134
+ it('should show ADR success when generation and save succeed', async () => {
135
+ setupHappyPath({ isSignificant: true });
136
+ prompts_1.promptForGeneration.mockResolvedValue(true);
137
+ llm_1.generateADRContent.mockResolvedValue({
138
+ result: { content: '# ADR Content', title: 'Use Redis', timestamp: '2026-01-01' },
139
+ error: undefined,
140
+ });
141
+ adr_1.saveADR.mockReturnValue({
142
+ success: true,
143
+ filePath: 'docs/adr/0001-use-redis.md',
144
+ });
145
+ await (0, analysis_orchestrator_1.runAnalysis)(defaultDiffOptions);
146
+ expect(mockPresenter.showGeneratingADR).toHaveBeenCalled();
147
+ expect(adr_1.saveADR).toHaveBeenCalledWith('# ADR Content', 'Use Redis');
148
+ expect(mockPresenter.showADRSuccess).toHaveBeenCalledWith('docs/adr/0001-use-redis.md');
149
+ });
150
+ it('should show ADR save error when save fails', async () => {
151
+ setupHappyPath({ isSignificant: true });
152
+ prompts_1.promptForGeneration.mockResolvedValue(true);
153
+ llm_1.generateADRContent.mockResolvedValue({
154
+ result: { content: '# ADR Content', title: 'Use Redis', timestamp: '2026-01-01' },
155
+ error: undefined,
156
+ });
157
+ adr_1.saveADR.mockReturnValue({
158
+ success: false,
159
+ error: 'permission denied',
160
+ });
161
+ await (0, analysis_orchestrator_1.runAnalysis)(defaultDiffOptions);
162
+ expect(mockPresenter.showADRSaveError).toHaveBeenCalledWith('permission denied');
163
+ });
164
+ it('should show unexpected error when runAnalysisInternal throws', async () => {
165
+ config_1.loadConfig.mockRejectedValue(new Error('unexpected boom'));
166
+ await (0, analysis_orchestrator_1.runAnalysis)(defaultDiffOptions);
167
+ expect(mockPresenter.showUnexpectedError).toHaveBeenCalled();
168
+ });
169
+ it('should call showAnalyzingFiles, showSendingToLLM, and showAnalysisComplete in happy path', async () => {
170
+ setupHappyPath({ isSignificant: false });
171
+ await (0, analysis_orchestrator_1.runAnalysis)(defaultDiffOptions);
172
+ expect(mockPresenter.showAnalyzingFiles).toHaveBeenCalledWith(['src/index.ts', 'src/utils.ts'], defaultDiffOptions);
173
+ expect(mockPresenter.showSendingToLLM).toHaveBeenCalledWith(defaultDiffOptions, 'openai', 'gpt-4');
174
+ expect(mockPresenter.showAnalysisComplete).toHaveBeenCalled();
175
+ });
176
+ });
177
+ //# sourceMappingURL=analysis.orchestrator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis.orchestrator.test.js","sourceRoot":"","sources":["../../src/analysis/analysis.orchestrator.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { type DiffOptions } from '../../git/git.operations';
2
+ export interface GitStrategy {
3
+ getFiles(): Promise<string[]>;
4
+ getDiff(): Promise<string>;
5
+ }
6
+ export declare class StagedChangesStrategy implements GitStrategy {
7
+ getFiles(): Promise<string[]>;
8
+ getDiff(): Promise<string>;
9
+ }
10
+ export declare class AllChangesStrategy implements GitStrategy {
11
+ getFiles(): Promise<string[]>;
12
+ getDiff(): Promise<string>;
13
+ }
14
+ export declare class BranchDiffStrategy implements GitStrategy {
15
+ private base;
16
+ private head;
17
+ constructor(base: string, head: string);
18
+ getFiles(): Promise<string[]>;
19
+ getDiff(): Promise<string>;
20
+ }
21
+ export declare function createGitStrategy(options: DiffOptions): GitStrategy;
22
+ //# sourceMappingURL=git-strategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-strategy.d.ts","sourceRoot":"","sources":["../../../src/analysis/strategies/git-strategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,WAAW,EACjB,MAAM,0BAA0B,CAAC;AAGlC,MAAM,WAAW,WAAW;IAC1B,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9B,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAC5B;AAED,qBAAa,qBAAsB,YAAW,WAAW;IACjD,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAI7B,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;CAGjC;AAED,qBAAa,kBAAmB,YAAW,WAAW;IAC9C,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAI7B,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;CAGjC;AAED,qBAAa,kBAAmB,YAAW,WAAW;IAElD,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,IAAI;gBADJ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM;IAGhB,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IA4B7B,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;CAwBjC;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW,CAWnE"}
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.BranchDiffStrategy = exports.AllChangesStrategy = exports.StagedChangesStrategy = void 0;
37
+ exports.createGitStrategy = createGitStrategy;
38
+ const git_operations_1 = require("../../git/git.operations");
39
+ const git_1 = require("../../git");
40
+ class StagedChangesStrategy {
41
+ async getFiles() {
42
+ return (0, git_operations_1.getStagedFiles)();
43
+ }
44
+ async getDiff() {
45
+ return (0, git_operations_1.getStagedDiff)();
46
+ }
47
+ }
48
+ exports.StagedChangesStrategy = StagedChangesStrategy;
49
+ class AllChangesStrategy {
50
+ async getFiles() {
51
+ return (0, git_operations_1.getAllChanges)();
52
+ }
53
+ async getDiff() {
54
+ return (0, git_operations_1.getAllDiff)();
55
+ }
56
+ }
57
+ exports.AllChangesStrategy = AllChangesStrategy;
58
+ class BranchDiffStrategy {
59
+ base;
60
+ head;
61
+ constructor(base, head) {
62
+ this.base = base;
63
+ this.head = head;
64
+ }
65
+ async getFiles() {
66
+ const { exec } = await Promise.resolve().then(() => __importStar(require('child_process')));
67
+ const { promisify } = await Promise.resolve().then(() => __importStar(require('util')));
68
+ const execAsync = promisify(exec);
69
+ try {
70
+ const { stdout } = await execAsync(`git diff --name-only ${this.base}...${this.head}`);
71
+ return stdout
72
+ .split('\n')
73
+ .map((f) => f.trim())
74
+ .filter((f) => f.length > 0);
75
+ }
76
+ catch (error) {
77
+ const errorWithCode = error;
78
+ if (errorWithCode.code === 128) {
79
+ throw new git_1.GitError(`Invalid git reference: ${this.base} or ${this.head}. Please ensure both references exist.`, 'GIT_ERROR', error instanceof Error ? error : new Error(String(error)));
80
+ }
81
+ throw new git_1.GitError('Unable to read Git repository. Please check repository permissions.', 'GIT_ERROR', error instanceof Error ? error : new Error(String(error)));
82
+ }
83
+ }
84
+ async getDiff() {
85
+ const { exec } = await Promise.resolve().then(() => __importStar(require('child_process')));
86
+ const { promisify } = await Promise.resolve().then(() => __importStar(require('util')));
87
+ const execAsync = promisify(exec);
88
+ try {
89
+ const { stdout } = await execAsync(`git diff ${this.base}...${this.head} --unified=1`);
90
+ return stdout;
91
+ }
92
+ catch (error) {
93
+ const errorWithCode = error;
94
+ if (errorWithCode.code === 128) {
95
+ throw new git_1.GitError(`Invalid git reference: ${this.base} or ${this.head}. Please ensure both references exist.`, 'GIT_ERROR', error instanceof Error ? error : new Error(String(error)));
96
+ }
97
+ throw new git_1.GitError('Unable to read Git repository. Please check repository permissions.', 'GIT_ERROR', error instanceof Error ? error : new Error(String(error)));
98
+ }
99
+ }
100
+ }
101
+ exports.BranchDiffStrategy = BranchDiffStrategy;
102
+ function createGitStrategy(options) {
103
+ switch (options.mode) {
104
+ case 'staged':
105
+ return new StagedChangesStrategy();
106
+ case 'all':
107
+ return new AllChangesStrategy();
108
+ case 'branch-diff':
109
+ return new BranchDiffStrategy(options.base || 'origin/main', options.head || 'HEAD');
110
+ default:
111
+ return new AllChangesStrategy();
112
+ }
113
+ }
114
+ //# sourceMappingURL=git-strategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-strategy.js","sourceRoot":"","sources":["../../../src/analysis/strategies/git-strategy.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8FA,8CAWC;AAzGD,6DAMkC;AAClC,mCAAqC;AAOrC,MAAa,qBAAqB;IAChC,KAAK,CAAC,QAAQ;QACZ,OAAO,IAAA,+BAAc,GAAE,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,OAAO;QACX,OAAO,IAAA,8BAAa,GAAE,CAAC;IACzB,CAAC;CACF;AARD,sDAQC;AAED,MAAa,kBAAkB;IAC7B,KAAK,CAAC,QAAQ;QACZ,OAAO,IAAA,8BAAa,GAAE,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,OAAO,IAAA,2BAAU,GAAE,CAAC;IACtB,CAAC;CACF;AARD,gDAQC;AAED,MAAa,kBAAkB;IAEnB;IACA;IAFV,YACU,IAAY,EACZ,IAAY;QADZ,SAAI,GAAJ,IAAI,CAAQ;QACZ,SAAI,GAAJ,IAAI,CAAQ;IACnB,CAAC;IAEJ,KAAK,CAAC,QAAQ;QACZ,MAAM,EAAE,IAAI,EAAE,GAAG,wDAAa,eAAe,GAAC,CAAC;QAC/C,MAAM,EAAE,SAAS,EAAE,GAAG,wDAAa,MAAM,GAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAElC,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,wBAAwB,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACvF,OAAO,MAAM;iBACV,KAAK,CAAC,IAAI,CAAC;iBACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,aAAa,GAAG,KAA0B,CAAC;YACjD,IAAI,aAAa,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;gBAC/B,MAAM,IAAI,cAAQ,CAChB,0BAA0B,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,wCAAwC,EAC3F,WAAW,EACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAC1D,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,cAAQ,CAChB,qEAAqE,EACrE,WAAW,EACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAC1D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,EAAE,IAAI,EAAE,GAAG,wDAAa,eAAe,GAAC,CAAC;QAC/C,MAAM,EAAE,SAAS,EAAE,GAAG,wDAAa,MAAM,GAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAElC,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,YAAY,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,cAAc,CAAC,CAAC;YACvF,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,aAAa,GAAG,KAA0B,CAAC;YACjD,IAAI,aAAa,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;gBAC/B,MAAM,IAAI,cAAQ,CAChB,0BAA0B,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,wCAAwC,EAC3F,WAAW,EACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAC1D,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,cAAQ,CAChB,qEAAqE,EACrE,WAAW,EACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAC1D,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AA1DD,gDA0DC;AAED,SAAgB,iBAAiB,CAAC,OAAoB;IACpD,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,QAAQ;YACX,OAAO,IAAI,qBAAqB,EAAE,CAAC;QACrC,KAAK,KAAK;YACR,OAAO,IAAI,kBAAkB,EAAE,CAAC;QAClC,KAAK,aAAa;YAChB,OAAO,IAAI,kBAAkB,CAAC,OAAO,CAAC,IAAI,IAAI,aAAa,EAAE,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC;QACvF;YACE,OAAO,IAAI,kBAAkB,EAAE,CAAC;IACpC,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=git-strategy.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-strategy.test.d.ts","sourceRoot":"","sources":["../../../src/analysis/strategies/git-strategy.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const git_strategy_1 = require("./git-strategy");
4
+ const git_errors_1 = require("../../git/git.errors");
5
+ const git_operations_1 = require("../../git/git.operations");
6
+ jest.mock('../../git/git.operations');
7
+ let mockExecAsync;
8
+ jest.mock('child_process', () => ({
9
+ exec: jest.fn(),
10
+ }));
11
+ jest.mock('util', () => {
12
+ const actual = jest.requireActual('util');
13
+ return {
14
+ ...actual,
15
+ promisify: jest.fn(() => (...args) => mockExecAsync(...args)),
16
+ };
17
+ });
18
+ const mockedGetStagedFiles = git_operations_1.getStagedFiles;
19
+ const mockedGetStagedDiff = git_operations_1.getStagedDiff;
20
+ const mockedGetAllChanges = git_operations_1.getAllChanges;
21
+ const mockedGetAllDiff = git_operations_1.getAllDiff;
22
+ beforeEach(() => {
23
+ mockExecAsync = jest.fn();
24
+ jest.clearAllMocks();
25
+ });
26
+ afterEach(() => {
27
+ jest.restoreAllMocks();
28
+ });
29
+ describe('StagedChangesStrategy', () => {
30
+ let strategy;
31
+ beforeEach(() => {
32
+ strategy = new git_strategy_1.StagedChangesStrategy();
33
+ });
34
+ it('getFiles() delegates to getStagedFiles', async () => {
35
+ const files = ['src/a.ts', 'src/b.ts'];
36
+ mockedGetStagedFiles.mockResolvedValue(files);
37
+ const result = await strategy.getFiles();
38
+ expect(result).toEqual(files);
39
+ expect(git_operations_1.getStagedFiles).toHaveBeenCalledTimes(1);
40
+ });
41
+ it('getDiff() delegates to getStagedDiff', async () => {
42
+ const diff = 'diff --git a/file.ts b/file.ts\n+added line';
43
+ mockedGetStagedDiff.mockResolvedValue(diff);
44
+ const result = await strategy.getDiff();
45
+ expect(result).toBe(diff);
46
+ expect(git_operations_1.getStagedDiff).toHaveBeenCalledTimes(1);
47
+ });
48
+ });
49
+ describe('AllChangesStrategy', () => {
50
+ let strategy;
51
+ beforeEach(() => {
52
+ strategy = new git_strategy_1.AllChangesStrategy();
53
+ });
54
+ it('getFiles() delegates to getAllChanges', async () => {
55
+ const files = ['lib/x.ts'];
56
+ mockedGetAllChanges.mockResolvedValue(files);
57
+ const result = await strategy.getFiles();
58
+ expect(result).toEqual(files);
59
+ expect(git_operations_1.getAllChanges).toHaveBeenCalledTimes(1);
60
+ });
61
+ it('getDiff() delegates to getAllDiff', async () => {
62
+ const diff = 'diff output here';
63
+ mockedGetAllDiff.mockResolvedValue(diff);
64
+ const result = await strategy.getDiff();
65
+ expect(result).toBe(diff);
66
+ expect(git_operations_1.getAllDiff).toHaveBeenCalledTimes(1);
67
+ });
68
+ });
69
+ describe('BranchDiffStrategy', () => {
70
+ let strategy;
71
+ beforeEach(() => {
72
+ strategy = new git_strategy_1.BranchDiffStrategy('main', 'feat/test');
73
+ });
74
+ describe('getFiles()', () => {
75
+ it('parses stdout newline list and returns array of files', async () => {
76
+ mockExecAsync.mockResolvedValue({
77
+ stdout: 'src/a.ts\nsrc/b.ts\n',
78
+ stderr: '',
79
+ });
80
+ const result = await strategy.getFiles();
81
+ expect(result).toEqual(['src/a.ts', 'src/b.ts']);
82
+ });
83
+ it('throws GitError with "Invalid git reference" when exec fails with code 128', async () => {
84
+ const execError = Object.assign(new Error('fatal: bad revision'), { code: 128 });
85
+ mockExecAsync.mockRejectedValue(execError);
86
+ await expect(strategy.getFiles()).rejects.toThrow(git_errors_1.GitError);
87
+ await expect(strategy.getFiles()).rejects.toThrow(/Invalid git reference/);
88
+ });
89
+ it('throws GitError with "Unable to read Git repository" when exec fails with other code', async () => {
90
+ const execError = Object.assign(new Error('some error'), { code: 1 });
91
+ mockExecAsync.mockRejectedValue(execError);
92
+ await expect(strategy.getFiles()).rejects.toThrow(git_errors_1.GitError);
93
+ await expect(strategy.getFiles()).rejects.toThrow(/Unable to read Git repository/);
94
+ });
95
+ });
96
+ describe('getDiff()', () => {
97
+ it('returns raw stdout on success', async () => {
98
+ const diffOutput = 'diff --git a/file.ts b/file.ts\n+new line';
99
+ mockExecAsync.mockResolvedValue({
100
+ stdout: diffOutput,
101
+ stderr: '',
102
+ });
103
+ const result = await strategy.getDiff();
104
+ expect(result).toBe(diffOutput);
105
+ });
106
+ it('throws GitError when exec fails with code 128', async () => {
107
+ const execError = Object.assign(new Error('fatal: bad revision'), { code: 128 });
108
+ mockExecAsync.mockRejectedValue(execError);
109
+ await expect(strategy.getDiff()).rejects.toThrow(git_errors_1.GitError);
110
+ await expect(strategy.getDiff()).rejects.toThrow(/Invalid git reference/);
111
+ });
112
+ it('throws GitError when exec fails with other code', async () => {
113
+ const execError = Object.assign(new Error('permission denied'), { code: 2 });
114
+ mockExecAsync.mockRejectedValue(execError);
115
+ await expect(strategy.getDiff()).rejects.toThrow(git_errors_1.GitError);
116
+ await expect(strategy.getDiff()).rejects.toThrow(/Unable to read Git repository/);
117
+ });
118
+ });
119
+ it('uses correct base and head in git commands', async () => {
120
+ const customStrategy = new git_strategy_1.BranchDiffStrategy('origin/develop', 'feature/abc');
121
+ mockExecAsync.mockResolvedValue({ stdout: '', stderr: '' });
122
+ await customStrategy.getFiles();
123
+ expect(mockExecAsync).toHaveBeenCalledWith('git diff --name-only origin/develop...feature/abc');
124
+ mockExecAsync.mockClear();
125
+ await customStrategy.getDiff();
126
+ expect(mockExecAsync).toHaveBeenCalledWith('git diff origin/develop...feature/abc --unified=1');
127
+ });
128
+ });
129
+ describe('createGitStrategy', () => {
130
+ it('returns StagedChangesStrategy for mode "staged"', () => {
131
+ const strategy = (0, git_strategy_1.createGitStrategy)({ mode: 'staged' });
132
+ expect(strategy).toBeInstanceOf(git_strategy_1.StagedChangesStrategy);
133
+ });
134
+ it('returns AllChangesStrategy for mode "all"', () => {
135
+ const strategy = (0, git_strategy_1.createGitStrategy)({ mode: 'all' });
136
+ expect(strategy).toBeInstanceOf(git_strategy_1.AllChangesStrategy);
137
+ });
138
+ it('returns BranchDiffStrategy for mode "branch-diff"', () => {
139
+ const strategy = (0, git_strategy_1.createGitStrategy)({ mode: 'branch-diff', base: 'main', head: 'feat' });
140
+ expect(strategy).toBeInstanceOf(git_strategy_1.BranchDiffStrategy);
141
+ });
142
+ it('returns AllChangesStrategy for unknown mode (default case)', () => {
143
+ const strategy = (0, git_strategy_1.createGitStrategy)({ mode: 'unknown' });
144
+ expect(strategy).toBeInstanceOf(git_strategy_1.AllChangesStrategy);
145
+ });
146
+ });
147
+ //# sourceMappingURL=git-strategy.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-strategy.test.js","sourceRoot":"","sources":["../../../src/analysis/strategies/git-strategy.test.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.analyzeCommand = analyzeCommand;
10
- const analysis_1 = require("../analysis");
10
+ const analysis_orchestrator_1 = require("../analysis/analysis.orchestrator");
11
11
  const logger_1 = require("../logger");
12
12
  /**
13
13
  * Execute the analyze command
@@ -39,9 +39,9 @@ async function analyzeCommand(args = []) {
39
39
  logger_1.loggerInstance.info('Analyze command started', {
40
40
  mode: diffOptions.mode,
41
41
  base: diffOptions.base,
42
- head: diffOptions.head
42
+ head: diffOptions.head,
43
43
  });
44
- await (0, analysis_1.runAnalysis)(diffOptions);
44
+ await (0, analysis_orchestrator_1.runAnalysis)(diffOptions);
45
45
  logger_1.loggerInstance.info('Analyze command completed');
46
46
  }
47
47
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAYH,wCAqCC;AA/CD,0CAA0C;AAE1C,sCAAqD;AAErD;;;;;GAKG;AACI,KAAK,UAAU,cAAc,CAAC,OAAiB,EAAE;IACtD,IAAI,CAAC;QACH,qDAAqD;QACrD,MAAM,WAAW,GAAgB,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,6BAA6B;QAE/E,mDAAmD;QACnD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,SAAS,KAAK,CAAC,CAAC,IAAI,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACpD,WAAW,CAAC,IAAI,GAAG,aAAa,CAAC;YACjC,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;YAEvC,iCAAiC;YACjC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACzC,IAAI,SAAS,KAAK,CAAC,CAAC,IAAI,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;gBACpD,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACrC,WAAW,CAAC,IAAI,GAAG,QAAQ,CAAC;QAC9B,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,WAAW,CAAC,IAAI,GAAG,KAAK,CAAC;QAC3B,CAAC;QAED,uBAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE;YACrC,IAAI,EAAE,WAAW,CAAC,IAAI;YACtB,IAAI,EAAE,WAAW,CAAC,IAAI;YACtB,IAAI,EAAE,WAAW,CAAC,IAAI;SACvB,CAAC,CAAC;QACH,MAAM,IAAA,sBAAW,EAAC,WAAW,CAAC,CAAC;QAC/B,uBAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,uCAAuC;QACvC,uBAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAClD,sCAAsC;QACtC,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC7C,sCAAsC;QACtC,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAYH,wCAqCC;AA/CD,6EAAgE;AAEhE,sCAAqD;AAErD;;;;;GAKG;AACI,KAAK,UAAU,cAAc,CAAC,OAAiB,EAAE;IACtD,IAAI,CAAC;QACH,qDAAqD;QACrD,MAAM,WAAW,GAAgB,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,6BAA6B;QAE/E,mDAAmD;QACnD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,SAAS,KAAK,CAAC,CAAC,IAAI,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACpD,WAAW,CAAC,IAAI,GAAG,aAAa,CAAC;YACjC,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;YAEvC,iCAAiC;YACjC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACzC,IAAI,SAAS,KAAK,CAAC,CAAC,IAAI,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;gBACpD,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACrC,WAAW,CAAC,IAAI,GAAG,QAAQ,CAAC;QAC9B,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,WAAW,CAAC,IAAI,GAAG,KAAK,CAAC;QAC3B,CAAC;QAED,uBAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE;YACrC,IAAI,EAAE,WAAW,CAAC,IAAI;YACtB,IAAI,EAAE,WAAW,CAAC,IAAI;YACtB,IAAI,EAAE,WAAW,CAAC,IAAI;SACvB,CAAC,CAAC;QACH,MAAM,IAAA,mCAAW,EAAC,WAAW,CAAC,CAAC;QAC/B,uBAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,uCAAuC;QACvC,uBAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAClD,sCAAsC;QACtC,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC7C,sCAAsC;QACtC,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=analyze.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.test.d.ts","sourceRoot":"","sources":["../../src/commands/analyze.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const analyze_1 = require("./analyze");
4
+ const analysis_orchestrator_1 = require("../analysis/analysis.orchestrator");
5
+ const logger_1 = require("../logger");
6
+ jest.mock('../analysis/analysis.orchestrator');
7
+ jest.mock('../logger');
8
+ const mockRunAnalysis = analysis_orchestrator_1.runAnalysis;
9
+ const mockLogger = logger_1.loggerInstance;
10
+ describe('analyzeCommand', () => {
11
+ beforeEach(() => {
12
+ jest.clearAllMocks();
13
+ mockRunAnalysis.mockResolvedValue(undefined);
14
+ });
15
+ afterEach(() => {
16
+ jest.restoreAllMocks();
17
+ });
18
+ it('should call runAnalysis with mode "all" when no args provided', async () => {
19
+ await (0, analyze_1.analyzeCommand)([]);
20
+ expect(mockRunAnalysis).toHaveBeenCalledWith({ mode: 'all' });
21
+ });
22
+ it('should call runAnalysis with mode "all" when --all flag is provided', async () => {
23
+ await (0, analyze_1.analyzeCommand)(['--all']);
24
+ expect(mockRunAnalysis).toHaveBeenCalledWith({ mode: 'all' });
25
+ });
26
+ it('should call runAnalysis with mode "staged" when --staged flag is provided', async () => {
27
+ await (0, analyze_1.analyzeCommand)(['--staged']);
28
+ expect(mockRunAnalysis).toHaveBeenCalledWith({ mode: 'staged' });
29
+ });
30
+ it('should call runAnalysis with mode "branch-diff" and base when --base is provided', async () => {
31
+ await (0, analyze_1.analyzeCommand)(['--base', 'origin/main']);
32
+ expect(mockRunAnalysis).toHaveBeenCalledWith({
33
+ mode: 'branch-diff',
34
+ base: 'origin/main',
35
+ });
36
+ });
37
+ it('should call runAnalysis with mode "branch-diff", base and head when both flags are provided', async () => {
38
+ await (0, analyze_1.analyzeCommand)(['--base', 'origin/main', '--head', 'feature']);
39
+ expect(mockRunAnalysis).toHaveBeenCalledWith({
40
+ mode: 'branch-diff',
41
+ base: 'origin/main',
42
+ head: 'feature',
43
+ });
44
+ });
45
+ it('should fall back to mode "all" when --base has no value after it', async () => {
46
+ await (0, analyze_1.analyzeCommand)(['--base']);
47
+ expect(mockRunAnalysis).toHaveBeenCalledWith({ mode: 'all' });
48
+ });
49
+ it('should detect --staged flag anywhere in the args array', async () => {
50
+ await (0, analyze_1.analyzeCommand)(['analyze', '--staged']);
51
+ expect(mockRunAnalysis).toHaveBeenCalledWith({ mode: 'staged' });
52
+ });
53
+ it('should catch errors from runAnalysis and not re-throw', async () => {
54
+ mockRunAnalysis.mockRejectedValue(new Error('analysis failed'));
55
+ await expect((0, analyze_1.analyzeCommand)(['--all'])).resolves.not.toThrow();
56
+ });
57
+ it('should log "Analyze command started" with mode information', async () => {
58
+ await (0, analyze_1.analyzeCommand)(['--staged']);
59
+ expect(mockLogger.info).toHaveBeenCalledWith('Analyze command started', {
60
+ mode: 'staged',
61
+ base: undefined,
62
+ head: undefined,
63
+ });
64
+ });
65
+ it('should log "Analyze command completed" on success', async () => {
66
+ await (0, analyze_1.analyzeCommand)([]);
67
+ expect(mockLogger.info).toHaveBeenCalledWith('Analyze command completed');
68
+ });
69
+ });
70
+ //# sourceMappingURL=analyze.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.test.js","sourceRoot":"","sources":["../../src/commands/analyze.test.ts"],"names":[],"mappings":"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"}