@m3hti/commit-genie 1.2.5 → 1.2.7

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 (101) hide show
  1. package/dist/commands/config.d.ts +3 -0
  2. package/dist/commands/config.d.ts.map +1 -0
  3. package/dist/commands/config.js +31 -0
  4. package/dist/commands/config.js.map +1 -0
  5. package/dist/commands/generate.d.ts +12 -0
  6. package/dist/commands/generate.d.ts.map +1 -0
  7. package/dist/commands/generate.js +550 -0
  8. package/dist/commands/generate.js.map +1 -0
  9. package/dist/commands/generate.test.d.ts +2 -0
  10. package/dist/commands/generate.test.d.ts.map +1 -0
  11. package/dist/commands/generate.test.js +168 -0
  12. package/dist/commands/generate.test.js.map +1 -0
  13. package/dist/commands/hook.d.ts +4 -0
  14. package/dist/commands/hook.d.ts.map +1 -0
  15. package/dist/commands/hook.js +62 -0
  16. package/dist/commands/hook.js.map +1 -0
  17. package/dist/commands/stats.d.ts +6 -0
  18. package/dist/commands/stats.d.ts.map +1 -0
  19. package/dist/commands/stats.js +39 -0
  20. package/dist/commands/stats.js.map +1 -0
  21. package/dist/data/wordlist.d.ts +11 -0
  22. package/dist/data/wordlist.d.ts.map +1 -0
  23. package/dist/data/wordlist.js +170 -0
  24. package/dist/data/wordlist.js.map +1 -0
  25. package/dist/index.d.ts +3 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +82 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/services/aiService.d.ts +42 -0
  30. package/dist/services/aiService.d.ts.map +1 -0
  31. package/dist/services/aiService.js +224 -0
  32. package/dist/services/aiService.js.map +1 -0
  33. package/dist/services/analyzerService.d.ts +139 -0
  34. package/dist/services/analyzerService.d.ts.map +1 -0
  35. package/dist/services/analyzerService.js +1811 -0
  36. package/dist/services/analyzerService.js.map +1 -0
  37. package/dist/services/analyzerService.test.d.ts +2 -0
  38. package/dist/services/analyzerService.test.d.ts.map +1 -0
  39. package/dist/services/analyzerService.test.js +577 -0
  40. package/dist/services/analyzerService.test.js.map +1 -0
  41. package/dist/services/configService.d.ts +25 -0
  42. package/dist/services/configService.d.ts.map +1 -0
  43. package/dist/services/configService.js +228 -0
  44. package/dist/services/configService.js.map +1 -0
  45. package/dist/services/configService.test.d.ts +2 -0
  46. package/dist/services/configService.test.d.ts.map +1 -0
  47. package/dist/services/configService.test.js +165 -0
  48. package/dist/services/configService.test.js.map +1 -0
  49. package/dist/services/gitService.d.ts +64 -0
  50. package/dist/services/gitService.d.ts.map +1 -0
  51. package/dist/services/gitService.js +303 -0
  52. package/dist/services/gitService.js.map +1 -0
  53. package/dist/services/gitService.test.d.ts +2 -0
  54. package/dist/services/gitService.test.d.ts.map +1 -0
  55. package/dist/services/gitService.test.js +140 -0
  56. package/dist/services/gitService.test.js.map +1 -0
  57. package/dist/services/historyService.d.ts +39 -0
  58. package/dist/services/historyService.d.ts.map +1 -0
  59. package/dist/services/historyService.js +195 -0
  60. package/dist/services/historyService.js.map +1 -0
  61. package/dist/services/historyService.test.d.ts +2 -0
  62. package/dist/services/historyService.test.d.ts.map +1 -0
  63. package/dist/services/historyService.test.js +157 -0
  64. package/dist/services/historyService.test.js.map +1 -0
  65. package/dist/services/hookService.d.ts +29 -0
  66. package/dist/services/hookService.d.ts.map +1 -0
  67. package/dist/services/hookService.js +164 -0
  68. package/dist/services/hookService.js.map +1 -0
  69. package/dist/services/lintService.d.ts +32 -0
  70. package/dist/services/lintService.d.ts.map +1 -0
  71. package/dist/services/lintService.js +191 -0
  72. package/dist/services/lintService.js.map +1 -0
  73. package/dist/services/spellService.d.ts +42 -0
  74. package/dist/services/spellService.d.ts.map +1 -0
  75. package/dist/services/spellService.js +175 -0
  76. package/dist/services/spellService.js.map +1 -0
  77. package/dist/services/splitService.d.ts +32 -0
  78. package/dist/services/splitService.d.ts.map +1 -0
  79. package/dist/services/splitService.js +184 -0
  80. package/dist/services/splitService.js.map +1 -0
  81. package/dist/services/statsService.d.ts +28 -0
  82. package/dist/services/statsService.d.ts.map +1 -0
  83. package/dist/services/statsService.js +204 -0
  84. package/dist/services/statsService.js.map +1 -0
  85. package/dist/types/index.d.ts +222 -0
  86. package/dist/types/index.d.ts.map +1 -0
  87. package/dist/types/index.js +3 -0
  88. package/dist/types/index.js.map +1 -0
  89. package/dist/utils/filePatterns.d.ts +5 -0
  90. package/dist/utils/filePatterns.d.ts.map +1 -0
  91. package/dist/utils/filePatterns.js +77 -0
  92. package/dist/utils/filePatterns.js.map +1 -0
  93. package/dist/utils/filePatterns.test.d.ts +2 -0
  94. package/dist/utils/filePatterns.test.d.ts.map +1 -0
  95. package/dist/utils/filePatterns.test.js +51 -0
  96. package/dist/utils/filePatterns.test.js.map +1 -0
  97. package/dist/utils/prompt.d.ts +4 -0
  98. package/dist/utils/prompt.d.ts.map +1 -0
  99. package/dist/utils/prompt.js +60 -0
  100. package/dist/utils/prompt.js.map +1 -0
  101. package/package.json +1 -1
@@ -0,0 +1,577 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const analyzerService_1 = require("./analyzerService");
4
+ const gitService_1 = require("./gitService");
5
+ const configService_1 = require("./configService");
6
+ const historyService_1 = require("./historyService");
7
+ // Mock dependencies
8
+ jest.mock('./gitService');
9
+ jest.mock('./configService');
10
+ jest.mock('./historyService');
11
+ const mockedGitService = gitService_1.GitService;
12
+ const mockedConfigService = configService_1.ConfigService;
13
+ const mockedHistoryService = historyService_1.HistoryService;
14
+ describe('AnalyzerService', () => {
15
+ beforeEach(() => {
16
+ jest.clearAllMocks();
17
+ // Default config mock
18
+ mockedConfigService.getConfig.mockReturnValue({
19
+ scopes: [],
20
+ defaultType: 'feat',
21
+ maxMessageLength: 72,
22
+ });
23
+ // Default diff stats mock
24
+ mockedGitService.getDiffStats.mockReturnValue({
25
+ filesChanged: 1,
26
+ insertions: 10,
27
+ deletions: 0,
28
+ });
29
+ // Default history service mocks
30
+ mockedHistoryService.projectUsesEmojis.mockReturnValue(true);
31
+ mockedHistoryService.detectTicketFromBranch.mockReturnValue(null);
32
+ mockedHistoryService.getSuggestedScope.mockReturnValue(undefined);
33
+ });
34
+ describe('generateCommitMessage', () => {
35
+ it('should generate feat commit for new source files with emoji', () => {
36
+ mockedGitService.getStagedFiles.mockReturnValue([
37
+ { status: 'A', path: 'src/services/newService.ts' },
38
+ ]);
39
+ mockedGitService.getDiff.mockReturnValue('');
40
+ const result = analyzerService_1.AnalyzerService.generateCommitMessage();
41
+ expect(result.type).toBe('feat');
42
+ expect(result.description).toBe('add newService.ts');
43
+ expect(result.full).toBe('✨ feat: add newService.ts');
44
+ });
45
+ it('should exclude emoji when includeEmoji is false', () => {
46
+ mockedConfigService.getConfig.mockReturnValue({
47
+ scopes: [],
48
+ defaultType: 'feat',
49
+ maxMessageLength: 72,
50
+ includeEmoji: false,
51
+ });
52
+ mockedGitService.getStagedFiles.mockReturnValue([
53
+ { status: 'A', path: 'src/services/newService.ts' },
54
+ ]);
55
+ mockedGitService.getDiff.mockReturnValue('');
56
+ const result = analyzerService_1.AnalyzerService.generateCommitMessage();
57
+ expect(result.full).toBe('feat: add newService.ts');
58
+ });
59
+ it('should generate docs commit for markdown files', () => {
60
+ mockedGitService.getStagedFiles.mockReturnValue([
61
+ { status: 'M', path: 'README.md' },
62
+ ]);
63
+ mockedGitService.getDiff.mockReturnValue('');
64
+ const result = analyzerService_1.AnalyzerService.generateCommitMessage();
65
+ expect(result.type).toBe('docs');
66
+ expect(result.description).toBe('update README.md');
67
+ });
68
+ it('should generate test commit for test files', () => {
69
+ mockedGitService.getStagedFiles.mockReturnValue([
70
+ { status: 'A', path: 'src/utils/helper.test.ts' },
71
+ ]);
72
+ mockedGitService.getDiff.mockReturnValue('');
73
+ const result = analyzerService_1.AnalyzerService.generateCommitMessage();
74
+ expect(result.type).toBe('test');
75
+ });
76
+ it('should generate chore commit for config files', () => {
77
+ mockedGitService.getStagedFiles.mockReturnValue([
78
+ { status: 'M', path: 'package.json' },
79
+ ]);
80
+ mockedGitService.getDiff.mockReturnValue('');
81
+ const result = analyzerService_1.AnalyzerService.generateCommitMessage();
82
+ expect(result.type).toBe('chore');
83
+ });
84
+ it('should detect fix from diff content', () => {
85
+ mockedGitService.getStagedFiles.mockReturnValue([
86
+ { status: 'M', path: 'src/services/api.ts' },
87
+ ]);
88
+ // Use actual code change with fix-related null check pattern
89
+ mockedGitService.getDiff.mockReturnValue('+ if (!user) return null;\n+ if (data === undefined) throw new Error("Data required");');
90
+ const result = analyzerService_1.AnalyzerService.generateCommitMessage();
91
+ expect(result.type).toBe('fix');
92
+ });
93
+ it('should detect refactor from diff content', () => {
94
+ mockedGitService.getStagedFiles.mockReturnValue([
95
+ { status: 'M', path: 'src/services/api.ts' },
96
+ ]);
97
+ // Use actual code change with refactor keyword in diff
98
+ mockedGitService.getDiff.mockReturnValue('- const oldName = getValue();\n+ // refactored: renamed for clarity\n+ const newName = getValue();');
99
+ const result = analyzerService_1.AnalyzerService.generateCommitMessage();
100
+ expect(result.type).toBe('refactor');
101
+ });
102
+ it('should detect refactor when simplifying nested ifs with optional chaining', () => {
103
+ mockedGitService.getStagedFiles.mockReturnValue([
104
+ { status: 'M', path: 'src/services/api.ts' },
105
+ ]);
106
+ // Simulating: replacing nested if statements with optional chaining
107
+ // This is code simplification, not a bug fix
108
+ mockedGitService.getDiff.mockReturnValue('- if (user) {\n' +
109
+ '- if (user.role) {\n' +
110
+ '- if (user.role === "admin") {\n' +
111
+ '- return true;\n' +
112
+ '- }\n' +
113
+ '- }\n' +
114
+ '- }\n' +
115
+ '- return false;\n' +
116
+ '+ return user?.role === "admin";');
117
+ const result = analyzerService_1.AnalyzerService.generateCommitMessage();
118
+ expect(result.type).toBe('refactor');
119
+ });
120
+ it('should detect perf from diff content', () => {
121
+ mockedGitService.getStagedFiles.mockReturnValue([
122
+ { status: 'M', path: 'src/services/api.ts' },
123
+ ]);
124
+ // Use actual code change with performance-related pattern
125
+ mockedGitService.getDiff.mockReturnValue('+ const cachedResult = cache.get(key);\n+ return memoize(expensiveCalculation);');
126
+ const result = analyzerService_1.AnalyzerService.generateCommitMessage();
127
+ expect(result.type).toBe('perf');
128
+ });
129
+ it('should detect docs for comment-only changes', () => {
130
+ mockedGitService.getStagedFiles.mockReturnValue([
131
+ { status: 'M', path: 'src/services/api.ts' },
132
+ ]);
133
+ // Only adding comments should be classified as docs
134
+ mockedGitService.getDiff.mockReturnValue('+ // This function handles user authentication\n+ // Returns the authenticated user object');
135
+ const result = analyzerService_1.AnalyzerService.generateCommitMessage();
136
+ expect(result.type).toBe('docs');
137
+ });
138
+ it('should handle deleted files', () => {
139
+ mockedGitService.getStagedFiles.mockReturnValue([
140
+ { status: 'D', path: 'src/deprecated/oldFile.ts' },
141
+ ]);
142
+ mockedGitService.getDiff.mockReturnValue('');
143
+ const result = analyzerService_1.AnalyzerService.generateCommitMessage();
144
+ expect(result.description).toBe('remove oldFile.ts');
145
+ });
146
+ it('should handle multiple files', () => {
147
+ mockedGitService.getStagedFiles.mockReturnValue([
148
+ { status: 'A', path: 'src/file1.ts' },
149
+ { status: 'A', path: 'src/file2.ts' },
150
+ { status: 'M', path: 'src/file3.ts' },
151
+ ]);
152
+ mockedGitService.getDiff.mockReturnValue('');
153
+ const result = analyzerService_1.AnalyzerService.generateCommitMessage();
154
+ expect(result.description).toContain('add');
155
+ expect(result.description).toContain('file');
156
+ });
157
+ it('should use scope from config when matching', () => {
158
+ mockedConfigService.getConfig.mockReturnValue({
159
+ scopes: [
160
+ { pattern: 'src/api', scope: 'api' },
161
+ ],
162
+ defaultType: 'feat',
163
+ maxMessageLength: 72,
164
+ });
165
+ mockedGitService.getStagedFiles.mockReturnValue([
166
+ { status: 'A', path: 'src/api/endpoints.ts' },
167
+ ]);
168
+ mockedGitService.getDiff.mockReturnValue('');
169
+ const result = analyzerService_1.AnalyzerService.generateCommitMessage();
170
+ expect(result.scope).toBe('api');
171
+ expect(result.full).toContain('(api)');
172
+ });
173
+ });
174
+ describe('analyzeChanges', () => {
175
+ it('should count file types correctly', () => {
176
+ mockedGitService.getStagedFiles.mockReturnValue([
177
+ { status: 'A', path: 'src/index.ts' },
178
+ { status: 'A', path: 'src/helper.test.ts' },
179
+ { status: 'M', path: 'README.md' },
180
+ { status: 'M', path: 'package.json' },
181
+ ]);
182
+ mockedGitService.getDiff.mockReturnValue('');
183
+ const analysis = analyzerService_1.AnalyzerService.analyzeChanges();
184
+ expect(analysis.filesAffected.source).toBe(1);
185
+ expect(analysis.filesAffected.test).toBe(1);
186
+ expect(analysis.filesAffected.docs).toBe(1);
187
+ expect(analysis.filesAffected.config).toBe(1);
188
+ });
189
+ });
190
+ describe('ticket linking', () => {
191
+ it('should include ticket reference from branch', () => {
192
+ mockedGitService.getStagedFiles.mockReturnValue([
193
+ { status: 'A', path: 'src/newFeature.ts' },
194
+ ]);
195
+ mockedGitService.getDiff.mockReturnValue('');
196
+ mockedHistoryService.detectTicketFromBranch.mockReturnValue({
197
+ id: 'ABC-123',
198
+ source: 'branch',
199
+ prefix: 'Refs:',
200
+ });
201
+ const result = analyzerService_1.AnalyzerService.generateCommitMessage();
202
+ expect(result.full).toContain('Refs: ABC-123');
203
+ });
204
+ it('should not include ticket when none detected', () => {
205
+ mockedGitService.getStagedFiles.mockReturnValue([
206
+ { status: 'A', path: 'src/newFeature.ts' },
207
+ ]);
208
+ mockedGitService.getDiff.mockReturnValue('');
209
+ mockedHistoryService.detectTicketFromBranch.mockReturnValue(null);
210
+ const result = analyzerService_1.AnalyzerService.generateCommitMessage();
211
+ expect(result.full).not.toContain('Refs:');
212
+ });
213
+ });
214
+ describe('history learning', () => {
215
+ it('should use history to determine emoji usage', () => {
216
+ mockedConfigService.getConfig.mockReturnValue({
217
+ scopes: [],
218
+ defaultType: 'feat',
219
+ maxMessageLength: 72,
220
+ includeEmoji: undefined, // Let history decide
221
+ });
222
+ mockedGitService.getStagedFiles.mockReturnValue([
223
+ { status: 'A', path: 'src/newFeature.ts' },
224
+ ]);
225
+ mockedGitService.getDiff.mockReturnValue('');
226
+ mockedHistoryService.projectUsesEmojis.mockReturnValue(false);
227
+ const result = analyzerService_1.AnalyzerService.generateCommitMessage();
228
+ expect(result.full).not.toMatch(/^[✨🐛📚💄♻️🧪🔧⚡]/);
229
+ });
230
+ it('should use config emoji setting over history', () => {
231
+ mockedConfigService.getConfig.mockReturnValue({
232
+ scopes: [],
233
+ defaultType: 'feat',
234
+ maxMessageLength: 72,
235
+ includeEmoji: true, // Explicitly set
236
+ });
237
+ mockedGitService.getStagedFiles.mockReturnValue([
238
+ { status: 'A', path: 'src/newFeature.ts' },
239
+ ]);
240
+ mockedGitService.getDiff.mockReturnValue('');
241
+ mockedHistoryService.projectUsesEmojis.mockReturnValue(false); // Would suggest no emoji
242
+ const result = analyzerService_1.AnalyzerService.generateCommitMessage();
243
+ expect(result.full).toMatch(/^✨/);
244
+ });
245
+ });
246
+ describe('breaking change detection', () => {
247
+ it('should detect breaking change from keyword in diff', () => {
248
+ mockedGitService.getStagedFiles.mockReturnValue([
249
+ { status: 'M', path: 'src/api/endpoints.ts' },
250
+ ]);
251
+ mockedGitService.getDiff.mockReturnValue('// BREAKING CHANGE: removed old endpoint');
252
+ const result = analyzerService_1.AnalyzerService.generateCommitMessage();
253
+ expect(result.isBreaking).toBe(true);
254
+ expect(result.full).toContain('!');
255
+ expect(result.full).toContain('BREAKING CHANGE:');
256
+ });
257
+ it('should detect breaking change from deleted source files', () => {
258
+ mockedGitService.getStagedFiles.mockReturnValue([
259
+ { status: 'D', path: 'src/services/oldService.ts' },
260
+ ]);
261
+ mockedGitService.getDiff.mockReturnValue('');
262
+ const result = analyzerService_1.AnalyzerService.generateCommitMessage();
263
+ expect(result.isBreaking).toBe(true);
264
+ expect(result.full).toContain('!');
265
+ });
266
+ it('should detect breaking change from deprecated keyword', () => {
267
+ mockedGitService.getStagedFiles.mockReturnValue([
268
+ { status: 'M', path: 'src/utils/helper.ts' },
269
+ ]);
270
+ mockedGitService.getDiff.mockReturnValue('+ * @deprecated This function will be removed');
271
+ const result = analyzerService_1.AnalyzerService.generateCommitMessage();
272
+ expect(result.isBreaking).toBe(true);
273
+ });
274
+ it('should not flag as breaking when detection is disabled', () => {
275
+ mockedConfigService.getConfig.mockReturnValue({
276
+ scopes: [],
277
+ defaultType: 'feat',
278
+ maxMessageLength: 72,
279
+ breakingChangeDetection: {
280
+ enabled: false,
281
+ },
282
+ });
283
+ mockedGitService.getStagedFiles.mockReturnValue([
284
+ { status: 'D', path: 'src/services/oldService.ts' },
285
+ ]);
286
+ mockedGitService.getDiff.mockReturnValue('// BREAKING: removed feature');
287
+ const result = analyzerService_1.AnalyzerService.generateCommitMessage();
288
+ expect(result.isBreaking).toBeFalsy();
289
+ expect(result.full).not.toContain('!:');
290
+ });
291
+ it('should use custom keywords from config', () => {
292
+ mockedConfigService.getConfig.mockReturnValue({
293
+ scopes: [],
294
+ defaultType: 'feat',
295
+ maxMessageLength: 72,
296
+ breakingChangeDetection: {
297
+ enabled: true,
298
+ keywords: ['major-change'],
299
+ },
300
+ });
301
+ mockedGitService.getStagedFiles.mockReturnValue([
302
+ { status: 'M', path: 'src/api/endpoints.ts' },
303
+ ]);
304
+ mockedGitService.getDiff.mockReturnValue('// major-change in API');
305
+ const result = analyzerService_1.AnalyzerService.generateCommitMessage();
306
+ expect(result.isBreaking).toBe(true);
307
+ });
308
+ it('should include BREAKING CHANGE footer when enabled', () => {
309
+ mockedConfigService.getConfig.mockReturnValue({
310
+ scopes: [],
311
+ defaultType: 'feat',
312
+ maxMessageLength: 72,
313
+ breakingChangeDetection: {
314
+ enabled: true,
315
+ includeFooter: true,
316
+ },
317
+ });
318
+ mockedGitService.getStagedFiles.mockReturnValue([
319
+ { status: 'D', path: 'src/api/oldEndpoint.ts' },
320
+ ]);
321
+ mockedGitService.getDiff.mockReturnValue('');
322
+ const result = analyzerService_1.AnalyzerService.generateCommitMessage();
323
+ expect(result.full).toContain('BREAKING CHANGE:');
324
+ });
325
+ it('should not include BREAKING CHANGE footer when disabled', () => {
326
+ mockedConfigService.getConfig.mockReturnValue({
327
+ scopes: [],
328
+ defaultType: 'feat',
329
+ maxMessageLength: 72,
330
+ breakingChangeDetection: {
331
+ enabled: true,
332
+ includeFooter: false,
333
+ },
334
+ });
335
+ mockedGitService.getStagedFiles.mockReturnValue([
336
+ { status: 'D', path: 'src/api/oldEndpoint.ts' },
337
+ ]);
338
+ mockedGitService.getDiff.mockReturnValue('');
339
+ const result = analyzerService_1.AnalyzerService.generateCommitMessage();
340
+ expect(result.full).toContain('!');
341
+ expect(result.full).not.toContain('BREAKING CHANGE:');
342
+ });
343
+ it('should not detect breaking change for non-source file deletions', () => {
344
+ mockedGitService.getStagedFiles.mockReturnValue([
345
+ { status: 'D', path: 'docs/old-guide.md' },
346
+ ]);
347
+ mockedGitService.getDiff.mockReturnValue('');
348
+ const result = analyzerService_1.AnalyzerService.generateCommitMessage();
349
+ expect(result.isBreaking).toBeFalsy();
350
+ });
351
+ });
352
+ describe('semantic analysis', () => {
353
+ it('should detect UI role changes in JSX', () => {
354
+ mockedGitService.getStagedFiles.mockReturnValue([
355
+ { status: 'M', path: 'src/components/UserProfile.tsx' },
356
+ ]);
357
+ mockedGitService.getDiff.mockReturnValue('+ <div className="profile-card">\n' +
358
+ '+ <UserAvatar />\n' +
359
+ '+ <button onClick={handleEdit}>Edit</button>\n' +
360
+ '+ </div>');
361
+ const analysis = analyzerService_1.AnalyzerService.analyzeChanges();
362
+ expect(analysis.semanticAnalysis).toBeDefined();
363
+ expect(analysis.semanticAnalysis?.primaryRole).toBe('ui');
364
+ });
365
+ it('should detect data/state role changes', () => {
366
+ mockedGitService.getStagedFiles.mockReturnValue([
367
+ { status: 'M', path: 'src/components/Form.tsx' },
368
+ ]);
369
+ mockedGitService.getDiff.mockReturnValue('+ const [formData, setFormData] = useState({});\n' +
370
+ '+ const [errors, setErrors] = useState([]);\n');
371
+ const analysis = analyzerService_1.AnalyzerService.analyzeChanges();
372
+ expect(analysis.semanticAnalysis).toBeDefined();
373
+ expect(analysis.semanticAnalysis?.primaryRole).toBe('data');
374
+ });
375
+ it('should detect API role changes', () => {
376
+ mockedGitService.getStagedFiles.mockReturnValue([
377
+ { status: 'M', path: 'src/services/userService.ts' },
378
+ ]);
379
+ mockedGitService.getDiff.mockReturnValue('+ const response = await fetch("/api/users");\n' +
380
+ '+ const data = await response.json();\n');
381
+ const analysis = analyzerService_1.AnalyzerService.analyzeChanges();
382
+ expect(analysis.semanticAnalysis).toBeDefined();
383
+ expect(analysis.semanticAnalysis?.primaryRole).toBe('api');
384
+ });
385
+ it('should detect logic role changes', () => {
386
+ mockedGitService.getStagedFiles.mockReturnValue([
387
+ { status: 'M', path: 'src/utils/validator.ts' },
388
+ ]);
389
+ mockedGitService.getDiff.mockReturnValue('+ if (value < 0) {\n' +
390
+ '+ throw new Error("Value must be positive");\n' +
391
+ '+ }\n' +
392
+ '+ const result = items.filter(item => item.active).map(item => item.id);\n');
393
+ const analysis = analyzerService_1.AnalyzerService.analyzeChanges();
394
+ expect(analysis.semanticAnalysis).toBeDefined();
395
+ expect(analysis.semanticAnalysis?.primaryRole).toBe('logic');
396
+ });
397
+ it('should detect style role changes', () => {
398
+ mockedGitService.getStagedFiles.mockReturnValue([
399
+ { status: 'M', path: 'src/components/Button.tsx' },
400
+ ]);
401
+ mockedGitService.getDiff.mockReturnValue('+ const buttonStyle = styled.button`\n' +
402
+ '+ background: #3498db;\n' +
403
+ '+ padding: 10px 20px;\n' +
404
+ '+ `;\n');
405
+ const analysis = analyzerService_1.AnalyzerService.analyzeChanges();
406
+ expect(analysis.semanticAnalysis).toBeDefined();
407
+ expect(analysis.semanticAnalysis?.primaryRole).toBe('style');
408
+ });
409
+ it('should generate intent-based description for UI changes', () => {
410
+ mockedGitService.getStagedFiles.mockReturnValue([
411
+ { status: 'M', path: 'src/components/UserCard.tsx' },
412
+ ]);
413
+ mockedGitService.getDiff.mockReturnValue('+ <Card className="user-card">\n' +
414
+ '+ <Avatar />\n' +
415
+ '+ <Name>{user.name}</Name>\n' +
416
+ '+ </Card>');
417
+ const result = analyzerService_1.AnalyzerService.generateCommitMessage();
418
+ // Should include role-based description
419
+ expect(result.description).toMatch(/ui|rendering/i);
420
+ });
421
+ it('should detect add intent for new functions', () => {
422
+ mockedGitService.getStagedFiles.mockReturnValue([
423
+ { status: 'M', path: 'src/utils/helpers.ts' },
424
+ ]);
425
+ mockedGitService.getDiff.mockReturnValue('+ export function formatCurrency(amount: number): string {\n' +
426
+ '+ return `$${amount.toFixed(2)}`;\n' +
427
+ '+ }\n');
428
+ const analysis = analyzerService_1.AnalyzerService.analyzeChanges();
429
+ expect(analysis.semanticAnalysis).toBeDefined();
430
+ expect(analysis.semanticAnalysis?.primaryIntent).toBe('add');
431
+ });
432
+ it('should detect fix intent for validation patterns', () => {
433
+ mockedGitService.getStagedFiles.mockReturnValue([
434
+ { status: 'M', path: 'src/utils/api.ts' },
435
+ ]);
436
+ mockedGitService.getDiff.mockReturnValue('+ if (!response) {\n' +
437
+ '+ throw new Error("No response");\n' +
438
+ '+ }\n' +
439
+ '+ const data = response?.data ?? [];\n');
440
+ const analysis = analyzerService_1.AnalyzerService.analyzeChanges();
441
+ expect(analysis.semanticAnalysis).toBeDefined();
442
+ expect(analysis.semanticAnalysis?.primaryIntent).toBe('fix');
443
+ });
444
+ it('should detect multiple roles in large JSX changes', () => {
445
+ mockedGitService.getStagedFiles.mockReturnValue([
446
+ { status: 'M', path: 'src/components/Dashboard.tsx' },
447
+ ]);
448
+ mockedGitService.getDiff.mockReturnValue('+ const [data, setData] = useState([]);\n' + // data role
449
+ '+ const response = await fetch("/api/stats");\n' + // api role
450
+ '+ <div className="dashboard">\n' + // ui role
451
+ '+ <Chart data={data} />\n' + // ui role
452
+ '+ </div>');
453
+ const analysis = analyzerService_1.AnalyzerService.analyzeChanges();
454
+ expect(analysis.semanticAnalysis).toBeDefined();
455
+ expect(analysis.semanticAnalysis?.hasMultipleRoles).toBe(true);
456
+ expect(analysis.semanticAnalysis?.roleChanges.length).toBeGreaterThan(1);
457
+ });
458
+ it('should not perform semantic analysis for config-only changes', () => {
459
+ mockedGitService.getStagedFiles.mockReturnValue([
460
+ { status: 'M', path: 'package.json' },
461
+ ]);
462
+ mockedGitService.getDiff.mockReturnValue('- "version": "1.0.0"\n' +
463
+ '+ "version": "1.0.1"');
464
+ const analysis = analyzerService_1.AnalyzerService.analyzeChanges();
465
+ // Semantic analysis should be undefined for config-only changes
466
+ expect(analysis.semanticAnalysis).toBeUndefined();
467
+ });
468
+ it('should extract component names from JSX changes', () => {
469
+ mockedGitService.getStagedFiles.mockReturnValue([
470
+ { status: 'A', path: 'src/components/NewFeature.tsx' },
471
+ ]);
472
+ mockedGitService.getDiff.mockReturnValue('+ export function NewFeature() {\n' +
473
+ '+ return <Container><Header /></Container>;\n' +
474
+ '+ }\n');
475
+ const analysis = analyzerService_1.AnalyzerService.analyzeChanges();
476
+ expect(analysis.semanticAnalysis).toBeDefined();
477
+ const elements = analysis.semanticAnalysis?.roleChanges
478
+ .flatMap(r => r.affectedElements) || [];
479
+ expect(elements.some(e => e === 'Container' || e === 'Header')).toBe(true);
480
+ });
481
+ it('should detect function renames', () => {
482
+ mockedGitService.getStagedFiles.mockReturnValue([
483
+ { status: 'M', path: 'src/utils/helpers.ts' },
484
+ ]);
485
+ mockedGitService.getDiff.mockReturnValue('- function removeTrim(str) {\n' +
486
+ '- return str.replace(/[ \\t]/g, "");\n' +
487
+ '- }\n' +
488
+ '+ function normalize(str) {\n' +
489
+ '+ return str.replace(/[ \\t]/g, "");\n' +
490
+ '+ }\n');
491
+ const analysis = analyzerService_1.AnalyzerService.analyzeChanges();
492
+ expect(analysis.semanticAnalysis).toBeDefined();
493
+ expect(analysis.semanticAnalysis?.primaryIntent).toBe('rename');
494
+ expect(analysis.semanticAnalysis?.renames).toBeDefined();
495
+ expect(analysis.semanticAnalysis?.renames?.length).toBe(1);
496
+ expect(analysis.semanticAnalysis?.renames?.[0].oldName).toBe('removeTrim');
497
+ expect(analysis.semanticAnalysis?.renames?.[0].newName).toBe('normalize');
498
+ expect(analysis.commitType).toBe('refactor');
499
+ expect(analysis.isBreakingChange).toBe(false);
500
+ });
501
+ it('should generate rename description for function renames', () => {
502
+ mockedGitService.getStagedFiles.mockReturnValue([
503
+ { status: 'M', path: 'src/utils/helpers.ts' },
504
+ ]);
505
+ mockedGitService.getDiff.mockReturnValue('- function removeTrim(str) {\n' +
506
+ '- return str.replace(/[ \\t]/g, "");\n' +
507
+ '- }\n' +
508
+ '+ function normalize(str) {\n' +
509
+ '+ return str.replace(/[ \\t]/g, "");\n' +
510
+ '+ }\n');
511
+ const result = analyzerService_1.AnalyzerService.generateCommitMessage();
512
+ expect(result.description).toBe('rename removeTrim to normalize');
513
+ });
514
+ });
515
+ describe('formatting-only changes', () => {
516
+ it('should classify adding a missing semicolon as style', () => {
517
+ mockedGitService.getStagedFiles.mockReturnValue([
518
+ { status: 'M', path: 'src/algorithms.js' },
519
+ ]);
520
+ mockedGitService.getDiff.mockReturnValue('- return counter\n' +
521
+ '+ return counter;');
522
+ const result = analyzerService_1.AnalyzerService.generateCommitMessage();
523
+ expect(result.type).toBe('style');
524
+ expect(result.description).toContain('semicolon');
525
+ });
526
+ it('should classify blank line removal as style', () => {
527
+ mockedGitService.getStagedFiles.mockReturnValue([
528
+ { status: 'M', path: 'src/utils/helpers.ts' },
529
+ ]);
530
+ mockedGitService.getDiff.mockReturnValue('- \n' +
531
+ '- ');
532
+ const result = analyzerService_1.AnalyzerService.generateCommitMessage();
533
+ expect(result.type).toBe('style');
534
+ expect(result.description).toContain('blank lines');
535
+ });
536
+ it('should classify indentation-only changes as style', () => {
537
+ mockedGitService.getStagedFiles.mockReturnValue([
538
+ { status: 'M', path: 'src/utils/helpers.ts' },
539
+ ]);
540
+ mockedGitService.getDiff.mockReturnValue('- const x = 1;\n' +
541
+ '+ const x = 1;');
542
+ const result = analyzerService_1.AnalyzerService.generateCommitMessage();
543
+ expect(result.type).toBe('style');
544
+ expect(result.description).toContain('indentation');
545
+ });
546
+ it('should NOT classify mixed formatting and logic changes as style', () => {
547
+ mockedGitService.getStagedFiles.mockReturnValue([
548
+ { status: 'M', path: 'src/utils/helpers.ts' },
549
+ ]);
550
+ mockedGitService.getDiff.mockReturnValue('- return counter\n' +
551
+ '+ return counter;\n' +
552
+ '+ const newVar = computeValue();');
553
+ const result = analyzerService_1.AnalyzerService.generateCommitMessage();
554
+ expect(result.type).not.toBe('style');
555
+ });
556
+ it('should NOT classify new file with semicolons as style', () => {
557
+ mockedGitService.getStagedFiles.mockReturnValue([
558
+ { status: 'A', path: 'src/newService.ts' },
559
+ ]);
560
+ mockedGitService.getDiff.mockReturnValue('+ export function hello() {\n' +
561
+ '+ return "world";\n' +
562
+ '+ }');
563
+ const result = analyzerService_1.AnalyzerService.generateCommitMessage();
564
+ expect(result.type).toBe('feat');
565
+ });
566
+ it('should include filename in description for single-file formatting changes', () => {
567
+ mockedGitService.getStagedFiles.mockReturnValue([
568
+ { status: 'M', path: 'src/algorithms.js' },
569
+ ]);
570
+ mockedGitService.getDiff.mockReturnValue('- return counter\n' +
571
+ '+ return counter;');
572
+ const result = analyzerService_1.AnalyzerService.generateCommitMessage();
573
+ expect(result.description).toContain('algorithms.js');
574
+ });
575
+ });
576
+ });
577
+ //# sourceMappingURL=analyzerService.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzerService.test.js","sourceRoot":"","sources":["../../src/services/analyzerService.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { CommitGenieConfig } from '../types';
2
+ export declare class ConfigService {
3
+ private static cachedConfig;
4
+ /**
5
+ * Find and load the config file
6
+ */
7
+ static loadConfig(): CommitGenieConfig;
8
+ /**
9
+ * Get the current config
10
+ */
11
+ static getConfig(): CommitGenieConfig;
12
+ /**
13
+ * Clear the cached config (useful for testing)
14
+ */
15
+ static clearCache(): void;
16
+ /**
17
+ * Create a default config file
18
+ */
19
+ static initConfig(): {
20
+ success: boolean;
21
+ message: string;
22
+ path?: string;
23
+ };
24
+ }
25
+ //# sourceMappingURL=configService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configService.d.ts","sourceRoot":"","sources":["../../src/services/configService.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AA4D7C,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,YAAY,CAAkC;IAE7D;;OAEG;IACH,MAAM,CAAC,UAAU,IAAI,iBAAiB;IAiDtC;;OAEG;IACH,MAAM,CAAC,SAAS,IAAI,iBAAiB;IAIrC;;OAEG;IACH,MAAM,CAAC,UAAU,IAAI,IAAI;IAIzB;;OAEG;IACH,MAAM,CAAC,UAAU,IAAI;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE;CAqE1E"}