cadr-cli 2.0.1 → 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 (52) hide show
  1. package/dist/analysis/analysis.orchestrator.test.d.ts +2 -0
  2. package/dist/analysis/analysis.orchestrator.test.d.ts.map +1 -0
  3. package/dist/analysis/analysis.orchestrator.test.js +177 -0
  4. package/dist/analysis/analysis.orchestrator.test.js.map +1 -0
  5. package/dist/analysis/strategies/git-strategy.test.d.ts +2 -0
  6. package/dist/analysis/strategies/git-strategy.test.d.ts.map +1 -0
  7. package/dist/analysis/strategies/git-strategy.test.js +147 -0
  8. package/dist/analysis/strategies/git-strategy.test.js.map +1 -0
  9. package/dist/commands/analyze.test.d.ts +2 -0
  10. package/dist/commands/analyze.test.d.ts.map +1 -0
  11. package/dist/commands/analyze.test.js +70 -0
  12. package/dist/commands/analyze.test.js.map +1 -0
  13. package/dist/commands/init.test.js +128 -2
  14. package/dist/commands/init.test.js.map +1 -1
  15. package/dist/config.test.js +167 -0
  16. package/dist/config.test.js.map +1 -1
  17. package/dist/git/git.errors.test.d.ts +2 -0
  18. package/dist/git/git.errors.test.d.ts.map +1 -0
  19. package/dist/git/git.errors.test.js +34 -0
  20. package/dist/git/git.errors.test.js.map +1 -0
  21. package/dist/git/git.operations.test.d.ts +2 -0
  22. package/dist/git/git.operations.test.d.ts.map +1 -0
  23. package/dist/git/git.operations.test.js +164 -0
  24. package/dist/git/git.operations.test.js.map +1 -0
  25. package/dist/llm/llm.test.d.ts +2 -0
  26. package/dist/llm/llm.test.d.ts.map +1 -0
  27. package/dist/llm/llm.test.js +224 -0
  28. package/dist/llm/llm.test.js.map +1 -0
  29. package/dist/llm/response-parser.test.d.ts +2 -0
  30. package/dist/llm/response-parser.test.d.ts.map +1 -0
  31. package/dist/llm/response-parser.test.js +134 -0
  32. package/dist/llm/response-parser.test.js.map +1 -0
  33. package/dist/presenters/console-presenter.test.d.ts +2 -0
  34. package/dist/presenters/console-presenter.test.d.ts.map +1 -0
  35. package/dist/presenters/console-presenter.test.js +227 -0
  36. package/dist/presenters/console-presenter.test.js.map +1 -0
  37. package/dist/version.test.d.ts +1 -2
  38. package/dist/version.test.d.ts.map +1 -1
  39. package/dist/version.test.js +29 -16
  40. package/dist/version.test.js.map +1 -1
  41. package/package.json +1 -1
  42. package/src/analysis/analysis.orchestrator.test.ts +237 -0
  43. package/src/analysis/strategies/git-strategy.test.ts +210 -0
  44. package/src/commands/analyze.test.ts +91 -0
  45. package/src/commands/init.test.ts +200 -5
  46. package/src/config.test.ts +232 -2
  47. package/src/git/git.errors.test.ts +43 -0
  48. package/src/git/git.operations.test.ts +222 -0
  49. package/src/llm/llm.test.ts +315 -0
  50. package/src/llm/response-parser.test.ts +170 -0
  51. package/src/presenters/console-presenter.test.ts +259 -0
  52. package/src/version.test.ts +30 -16
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=analysis.orchestrator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis.orchestrator.test.d.ts","sourceRoot":"","sources":["../../src/analysis/analysis.orchestrator.test.ts"],"names":[],"mappings":""}
@@ -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,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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"}
@@ -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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"}
@@ -35,22 +35,148 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  const init_1 = require("./init");
37
37
  const config = __importStar(require("../config"));
38
+ const fs_1 = require("fs");
39
+ const logger_1 = require("../logger");
38
40
  // Mock dependencies
39
41
  jest.mock('../config');
42
+ jest.mock('fs', () => ({
43
+ existsSync: jest.fn().mockReturnValue(false),
44
+ }));
45
+ jest.mock('../logger');
46
+ const mockExistsSync = fs_1.existsSync;
47
+ const mockCreateConfig = config.createConfig;
48
+ const mockGetDefaultConfigPath = config.getDefaultConfigPath;
49
+ const mockValidateConfig = config.validateConfig;
50
+ function makeValidConfig(overrides = {}) {
51
+ return {
52
+ provider: 'openai',
53
+ analysis_model: 'gpt-4',
54
+ api_key_env: 'OPENAI_API_KEY',
55
+ timeout_seconds: 30,
56
+ ...overrides,
57
+ };
58
+ }
40
59
  describe('Init Command', () => {
60
+ let consoleSpy;
41
61
  beforeEach(() => {
42
62
  jest.clearAllMocks();
63
+ mockExistsSync.mockReturnValue(false);
64
+ mockGetDefaultConfigPath.mockReturnValue('/fake/path/cadr.yaml');
65
+ mockValidateConfig.mockReturnValue({ valid: true, errors: [] });
66
+ consoleSpy = {
67
+ log: jest.spyOn(console, 'log').mockImplementation(),
68
+ error: jest.spyOn(console, 'error').mockImplementation(),
69
+ warn: jest.spyOn(console, 'warn').mockImplementation(),
70
+ };
71
+ });
72
+ afterEach(() => {
73
+ consoleSpy.log.mockRestore();
74
+ consoleSpy.error.mockRestore();
75
+ consoleSpy.warn.mockRestore();
43
76
  });
44
77
  describe('initCommand', () => {
45
78
  test('calls createConfig when no config exists', async () => {
46
- config.createConfig.mockResolvedValue({ provider: 'openai' });
79
+ mockCreateConfig.mockResolvedValue(makeValidConfig());
47
80
  await (0, init_1.initCommand)();
48
81
  expect(config.createConfig).toHaveBeenCalled();
49
82
  });
50
83
  test('handles config creation errors gracefully', async () => {
51
- config.createConfig.mockRejectedValue(new Error('Permission denied'));
84
+ mockCreateConfig.mockRejectedValue(new Error('Permission denied'));
52
85
  await expect((0, init_1.initCommand)()).resolves.not.toThrow();
53
86
  });
87
+ test('prints already-exists message and does not call createConfig when config exists', async () => {
88
+ mockExistsSync.mockReturnValue(true);
89
+ await (0, init_1.initCommand)();
90
+ expect(consoleSpy.log).toHaveBeenCalledWith(expect.stringContaining('already exists'));
91
+ expect(mockCreateConfig).not.toHaveBeenCalled();
92
+ });
93
+ test('prints failure message and does not display summary when createConfig returns null', async () => {
94
+ mockCreateConfig.mockResolvedValue(null);
95
+ await (0, init_1.initCommand)();
96
+ expect(consoleSpy.error).toHaveBeenCalledWith(expect.stringContaining('Failed to create configuration'));
97
+ // Summary header should NOT appear
98
+ const logCalls = consoleSpy.log.mock.calls.map((c) => c[0]);
99
+ expect(logCalls).not.toEqual(expect.arrayContaining([expect.stringContaining('Configuration Summary')]));
100
+ });
101
+ test('displays summary with provider, model, api_key_env, and timeout when config is valid', async () => {
102
+ const cfg = makeValidConfig({
103
+ provider: 'gemini',
104
+ analysis_model: 'gemini-pro',
105
+ api_key_env: 'GEMINI_API_KEY',
106
+ timeout_seconds: 45,
107
+ });
108
+ mockCreateConfig.mockResolvedValue(cfg);
109
+ process.env['GEMINI_API_KEY'] = 'fake-key';
110
+ await (0, init_1.initCommand)();
111
+ expect(consoleSpy.log).toHaveBeenCalledWith('📋 Configuration Summary:');
112
+ expect(consoleSpy.log).toHaveBeenCalledWith(' Provider: gemini');
113
+ expect(consoleSpy.log).toHaveBeenCalledWith(' Model: gemini-pro');
114
+ expect(consoleSpy.log).toHaveBeenCalledWith(' API Key Env: GEMINI_API_KEY');
115
+ expect(consoleSpy.log).toHaveBeenCalledWith(' Timeout: 45s');
116
+ delete process.env['GEMINI_API_KEY'];
117
+ });
118
+ test('includes ignore patterns line when config has ignore_patterns', async () => {
119
+ const cfg = makeValidConfig({
120
+ ignore_patterns: ['node_modules', '*.log'],
121
+ });
122
+ mockCreateConfig.mockResolvedValue(cfg);
123
+ process.env['OPENAI_API_KEY'] = 'fake-key';
124
+ await (0, init_1.initCommand)();
125
+ expect(consoleSpy.log).toHaveBeenCalledWith(' Ignore Patterns: node_modules, *.log');
126
+ delete process.env['OPENAI_API_KEY'];
127
+ });
128
+ test('does not show ignore patterns line when ignore_patterns is undefined', async () => {
129
+ const cfg = makeValidConfig();
130
+ delete cfg.ignore_patterns;
131
+ mockCreateConfig.mockResolvedValue(cfg);
132
+ process.env['OPENAI_API_KEY'] = 'fake-key';
133
+ await (0, init_1.initCommand)();
134
+ const logCalls = consoleSpy.log.mock.calls.map((c) => c[0]);
135
+ expect(logCalls).not.toEqual(expect.arrayContaining([expect.stringContaining('Ignore Patterns')]));
136
+ delete process.env['OPENAI_API_KEY'];
137
+ });
138
+ test('does not display warning when API key env var is set', async () => {
139
+ const cfg = makeValidConfig({ api_key_env: 'OPENAI_API_KEY' });
140
+ mockCreateConfig.mockResolvedValue(cfg);
141
+ process.env['OPENAI_API_KEY'] = 'fake-key';
142
+ await (0, init_1.initCommand)();
143
+ expect(consoleSpy.warn).not.toHaveBeenCalled();
144
+ delete process.env['OPENAI_API_KEY'];
145
+ });
146
+ test('displays warning with OpenAI link when API key env var is not set for OpenAI', async () => {
147
+ const cfg = makeValidConfig({ provider: 'openai', api_key_env: 'OPENAI_API_KEY' });
148
+ mockCreateConfig.mockResolvedValue(cfg);
149
+ delete process.env['OPENAI_API_KEY'];
150
+ await (0, init_1.initCommand)();
151
+ expect(consoleSpy.warn).toHaveBeenCalledWith(expect.stringContaining('OPENAI_API_KEY is not set'));
152
+ expect(consoleSpy.warn).toHaveBeenCalledWith(expect.stringContaining('https://platform.openai.com/api-keys'));
153
+ });
154
+ test('displays warning with Gemini link when API key env var is not set for Gemini', async () => {
155
+ const cfg = makeValidConfig({ provider: 'gemini', api_key_env: 'GEMINI_API_KEY' });
156
+ mockCreateConfig.mockResolvedValue(cfg);
157
+ delete process.env['GEMINI_API_KEY'];
158
+ await (0, init_1.initCommand)();
159
+ expect(consoleSpy.warn).toHaveBeenCalledWith(expect.stringContaining('GEMINI_API_KEY is not set'));
160
+ expect(consoleSpy.warn).toHaveBeenCalledWith(expect.stringContaining('https://aistudio.google.com/app/apikey'));
161
+ });
162
+ test('logs validation warning when validateConfig returns invalid', async () => {
163
+ const cfg = makeValidConfig();
164
+ mockCreateConfig.mockResolvedValue(cfg);
165
+ mockValidateConfig.mockReturnValue({
166
+ valid: false,
167
+ errors: ['timeout too low'],
168
+ });
169
+ process.env['OPENAI_API_KEY'] = 'fake-key';
170
+ await (0, init_1.initCommand)();
171
+ expect(logger_1.loggerInstance.warn).toHaveBeenCalledWith('Created config has validation warnings', { errors: ['timeout too low'] });
172
+ delete process.env['OPENAI_API_KEY'];
173
+ });
174
+ test('catches unexpected error and prints error message', async () => {
175
+ mockCreateConfig.mockRejectedValue(new Error('unexpected boom'));
176
+ await (0, init_1.initCommand)();
177
+ expect(consoleSpy.error).toHaveBeenCalledWith(expect.stringContaining('unexpected error occurred'));
178
+ expect(logger_1.loggerInstance.error).toHaveBeenCalledWith('Init command failed', expect.objectContaining({ error: expect.any(Error) }));
179
+ });
54
180
  });
55
181
  });
56
182
  //# sourceMappingURL=init.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.test.js","sourceRoot":"","sources":["../../src/commands/init.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iCAAqC;AACrC,kDAAoC;AAEpC,oBAAoB;AACpB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAEvB,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,IAAI,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACzD,MAAM,CAAC,YAA0B,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;YAE7E,MAAM,IAAA,kBAAW,GAAE,CAAC;YAEpB,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,CAAC,YAA0B,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;YAErF,MAAM,MAAM,CAAC,IAAA,kBAAW,GAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"init.test.js","sourceRoot":"","sources":["../../src/commands/init.test.ts"],"names":[],"mappings":"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"}