@m3hti/commit-genie 3.0.1 → 3.1.1

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 (57) hide show
  1. package/dist/services/analyzerService.d.ts +0 -141
  2. package/dist/services/analyzerService.d.ts.map +1 -1
  3. package/dist/services/analyzerService.js +23 -1880
  4. package/dist/services/analyzerService.js.map +1 -1
  5. package/dist/services/analyzerService.test.js +97 -0
  6. package/dist/services/analyzerService.test.js.map +1 -1
  7. package/dist/services/breakingChangeDetector.d.ts +9 -0
  8. package/dist/services/breakingChangeDetector.d.ts.map +1 -0
  9. package/dist/services/breakingChangeDetector.js +76 -0
  10. package/dist/services/breakingChangeDetector.js.map +1 -0
  11. package/dist/services/commitTypeDetector.d.ts +32 -0
  12. package/dist/services/commitTypeDetector.d.ts.map +1 -0
  13. package/dist/services/commitTypeDetector.js +490 -0
  14. package/dist/services/commitTypeDetector.js.map +1 -0
  15. package/dist/services/descriptionGenerator.d.ts +58 -0
  16. package/dist/services/descriptionGenerator.d.ts.map +1 -0
  17. package/dist/services/descriptionGenerator.js +569 -0
  18. package/dist/services/descriptionGenerator.js.map +1 -0
  19. package/dist/services/fileContentAnalyzer.d.ts +10 -0
  20. package/dist/services/fileContentAnalyzer.d.ts.map +1 -0
  21. package/dist/services/fileContentAnalyzer.js +170 -0
  22. package/dist/services/fileContentAnalyzer.js.map +1 -0
  23. package/dist/services/fileContentAnalyzer.test.d.ts +2 -0
  24. package/dist/services/fileContentAnalyzer.test.d.ts.map +1 -0
  25. package/dist/services/fileContentAnalyzer.test.js +118 -0
  26. package/dist/services/fileContentAnalyzer.test.js.map +1 -0
  27. package/dist/services/gitService.test.js +242 -24
  28. package/dist/services/gitService.test.js.map +1 -1
  29. package/dist/services/hookService.test.d.ts +2 -0
  30. package/dist/services/hookService.test.d.ts.map +1 -0
  31. package/dist/services/hookService.test.js +182 -0
  32. package/dist/services/hookService.test.js.map +1 -0
  33. package/dist/services/lintService.test.d.ts +2 -0
  34. package/dist/services/lintService.test.d.ts.map +1 -0
  35. package/dist/services/lintService.test.js +288 -0
  36. package/dist/services/lintService.test.js.map +1 -0
  37. package/dist/services/messageBuilder.d.ts +16 -0
  38. package/dist/services/messageBuilder.d.ts.map +1 -0
  39. package/dist/services/messageBuilder.js +135 -0
  40. package/dist/services/messageBuilder.js.map +1 -0
  41. package/dist/services/scopeDetector.d.ts +6 -0
  42. package/dist/services/scopeDetector.d.ts.map +1 -0
  43. package/dist/services/scopeDetector.js +51 -0
  44. package/dist/services/scopeDetector.js.map +1 -0
  45. package/dist/services/semanticAnalyzer.d.ts +25 -0
  46. package/dist/services/semanticAnalyzer.d.ts.map +1 -0
  47. package/dist/services/semanticAnalyzer.js +713 -0
  48. package/dist/services/semanticAnalyzer.js.map +1 -0
  49. package/dist/services/splitService.test.d.ts +2 -0
  50. package/dist/services/splitService.test.d.ts.map +1 -0
  51. package/dist/services/splitService.test.js +190 -0
  52. package/dist/services/splitService.test.js.map +1 -0
  53. package/dist/services/statsService.test.d.ts +2 -0
  54. package/dist/services/statsService.test.d.ts.map +1 -0
  55. package/dist/services/statsService.test.js +211 -0
  56. package/dist/services/statsService.test.js.map +1 -0
  57. package/package.json +1 -1
@@ -0,0 +1,569 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateFormattingDescription = generateFormattingDescription;
4
+ exports.generateASTDescription = generateASTDescription;
5
+ exports.detectTestImplPair = detectTestImplPair;
6
+ exports.generateFileContentDescription = generateFileContentDescription;
7
+ exports.generateHunkDescription = generateHunkDescription;
8
+ exports.generateDescription = generateDescription;
9
+ exports.generateSemanticDescription = generateSemanticDescription;
10
+ exports.generateAlternativeDescription = generateAlternativeDescription;
11
+ const commitTypeDetector_1 = require("./commitTypeDetector");
12
+ const semanticAnalyzer_1 = require("./semanticAnalyzer");
13
+ const fileContentAnalyzer_1 = require("./fileContentAnalyzer");
14
+ /**
15
+ * Generate a description for formatting-only changes
16
+ */
17
+ function generateFormattingDescription(diff, stagedFiles) {
18
+ const lines = diff.split('\n').filter(line => (line.startsWith('+') || line.startsWith('-')) &&
19
+ !line.startsWith('+++') &&
20
+ !line.startsWith('---'));
21
+ let hasSemicolonChanges = false;
22
+ let hasBlankLineChanges = false;
23
+ let hasIndentationChanges = false;
24
+ let hasBraceChanges = false;
25
+ let hasTrailingCommaChanges = false;
26
+ const removed = [];
27
+ const added = [];
28
+ for (const line of lines) {
29
+ const trimmed = line.substring(1).trim();
30
+ if (trimmed.length === 0) {
31
+ hasBlankLineChanges = true;
32
+ continue;
33
+ }
34
+ if (trimmed === ';') {
35
+ hasSemicolonChanges = true;
36
+ continue;
37
+ }
38
+ if (trimmed === '{' || trimmed === '}') {
39
+ hasBraceChanges = true;
40
+ continue;
41
+ }
42
+ if (trimmed === ',') {
43
+ hasTrailingCommaChanges = true;
44
+ continue;
45
+ }
46
+ if (line.startsWith('-')) {
47
+ removed.push(trimmed);
48
+ }
49
+ else {
50
+ added.push(trimmed);
51
+ }
52
+ }
53
+ // Check paired lines for semicolon-only or indentation-only diffs
54
+ for (let i = 0; i < removed.length && i < added.length; i++) {
55
+ const r = removed[i];
56
+ const a = added[i];
57
+ // If trimmed content is identical, the only difference was indentation
58
+ if (r === a) {
59
+ hasIndentationChanges = true;
60
+ }
61
+ // Semicolon difference (one has semicolon, the other doesn't)
62
+ else if (r + ';' === a || a + ';' === r) {
63
+ hasSemicolonChanges = true;
64
+ }
65
+ // Trailing comma difference
66
+ else if (r + ',' === a || a + ',' === r) {
67
+ hasTrailingCommaChanges = true;
68
+ }
69
+ else {
70
+ hasIndentationChanges = true;
71
+ }
72
+ }
73
+ // Build description based on what changed
74
+ let description;
75
+ if (hasSemicolonChanges && !hasBlankLineChanges && !hasIndentationChanges && !hasBraceChanges && !hasTrailingCommaChanges) {
76
+ description = 'add missing semicolons';
77
+ }
78
+ else if (hasBlankLineChanges && !hasSemicolonChanges && !hasIndentationChanges && !hasBraceChanges && !hasTrailingCommaChanges) {
79
+ description = 'remove blank lines';
80
+ }
81
+ else if (hasIndentationChanges && !hasSemicolonChanges && !hasBlankLineChanges && !hasBraceChanges && !hasTrailingCommaChanges) {
82
+ description = 'fix indentation';
83
+ }
84
+ else if (hasBraceChanges && !hasSemicolonChanges && !hasBlankLineChanges && !hasIndentationChanges && !hasTrailingCommaChanges) {
85
+ description = 'fix brace formatting';
86
+ }
87
+ else if (hasTrailingCommaChanges && !hasSemicolonChanges && !hasBlankLineChanges && !hasIndentationChanges && !hasBraceChanges) {
88
+ description = 'fix trailing commas';
89
+ }
90
+ else {
91
+ description = 'fix code formatting';
92
+ }
93
+ // Append filename for single-file changes
94
+ if (stagedFiles.length === 1) {
95
+ const fileName = stagedFiles[0].path.split('/').pop() || stagedFiles[0].path;
96
+ description += ` in ${fileName}`;
97
+ }
98
+ return description;
99
+ }
100
+ /**
101
+ * Generate a description from AST analysis results.
102
+ * Produces specific, human-readable descriptions based on structural signals.
103
+ * Returns empty string if AST data is insufficient for a good description.
104
+ */
105
+ function generateASTDescription(astResult, commitType) {
106
+ const { declarations, signals } = astResult;
107
+ // Handle renames — most specific and readable
108
+ if (declarations.renamed.length > 0) {
109
+ const r = declarations.renamed[0];
110
+ if (declarations.renamed.length === 1) {
111
+ return `rename ${r.oldName} to ${r.newName}`;
112
+ }
113
+ return `rename ${r.oldName} to ${r.newName} and ${declarations.renamed.length - 1} more`;
114
+ }
115
+ // Handle removed exported declarations (breaking refactor)
116
+ const removedExported = declarations.removed.filter(d => d.exported);
117
+ if (removedExported.length > 0) {
118
+ if (removedExported.length === 1) {
119
+ return `remove ${removedExported[0].name} export`;
120
+ }
121
+ return `remove ${removedExported[0].name} and ${removedExported.length - 1} more exports`;
122
+ }
123
+ // Handle breaking signature changes
124
+ const sigChangeSignals = signals.filter(s => s.signal === 'changed-exported-sig');
125
+ if (sigChangeSignals.length > 0) {
126
+ const nameMatch = sigChangeSignals[0].detail.match(/on '([^']+)'/);
127
+ if (nameMatch) {
128
+ return `change ${nameMatch[1]} signature`;
129
+ }
130
+ }
131
+ // Handle new declarations (feat)
132
+ if (commitType === 'feat' && declarations.added.length > 0) {
133
+ const exported = declarations.added.filter(d => d.exported);
134
+ const target = exported.length > 0 ? exported : declarations.added;
135
+ if (target.length === 1) {
136
+ return `add ${target[0].name} ${target[0].kind}`;
137
+ }
138
+ if (target.length === 2) {
139
+ return `add ${target[0].name} and ${target[1].name}`;
140
+ }
141
+ return `add ${target[0].name}, ${target[1].name} and ${target.length - 2} more`;
142
+ }
143
+ // Handle fix signals (error handling, guards)
144
+ if (commitType === 'fix') {
145
+ const errorSignals = signals.filter(s => s.signal === 'error-handling-change');
146
+ if (errorSignals.length > 0) {
147
+ const nameMatch = errorSignals[0].detail.match(/in '([^']+)'/);
148
+ if (nameMatch) {
149
+ return `handle errors in ${nameMatch[1]}`;
150
+ }
151
+ }
152
+ const guardSignals = signals.filter(s => s.signal === 'guard-added');
153
+ if (guardSignals.length > 0) {
154
+ const nameMatch = guardSignals[0].detail.match(/in '([^']+)'/);
155
+ if (nameMatch) {
156
+ return `add validation to ${nameMatch[1]}`;
157
+ }
158
+ }
159
+ // Literal-only changes
160
+ const literalSignals = signals.filter(s => s.signal === 'literal-only-change');
161
+ if (literalSignals.length > 0) {
162
+ const nameMatch = literalSignals[0].detail.match(/in '([^']+)'/);
163
+ if (nameMatch) {
164
+ return `fix values in ${nameMatch[1]}`;
165
+ }
166
+ }
167
+ }
168
+ // Handle perf signals
169
+ if (commitType === 'perf') {
170
+ const perfSignals = signals.filter(s => s.signal === 'perf-pattern');
171
+ if (perfSignals.length > 0) {
172
+ const nameMatch = perfSignals[0].detail.match(/in '([^']+)'/);
173
+ if (nameMatch) {
174
+ return `optimize ${nameMatch[1]} performance`;
175
+ }
176
+ }
177
+ }
178
+ // Handle refactor signals (control flow, modified)
179
+ if (commitType === 'refactor') {
180
+ const controlFlowSignals = signals.filter(s => s.signal === 'control-flow-restructured');
181
+ if (controlFlowSignals.length > 0) {
182
+ const nameMatch = controlFlowSignals[0].detail.match(/in '([^']+)'/);
183
+ if (nameMatch) {
184
+ return `simplify ${nameMatch[1]} control flow`;
185
+ }
186
+ }
187
+ if (declarations.modified.length > 0) {
188
+ const names = declarations.modified.map(m => m.name);
189
+ if (names.length === 1) {
190
+ return `refactor ${names[0]}`;
191
+ }
192
+ if (names.length === 2) {
193
+ return `refactor ${names[0]} and ${names[1]}`;
194
+ }
195
+ return `refactor ${names[0]}, ${names[1]} and ${names.length - 2} more`;
196
+ }
197
+ }
198
+ // Generic fallback using affectedElements
199
+ if (astResult.affectedElements.length > 0) {
200
+ const verb = commitType === 'feat' ? 'add' :
201
+ commitType === 'fix' ? 'fix' :
202
+ commitType === 'refactor' ? 'refactor' :
203
+ commitType === 'perf' ? 'optimize' : 'update';
204
+ const els = astResult.affectedElements;
205
+ if (els.length === 1) {
206
+ return `${verb} ${els[0]}`;
207
+ }
208
+ if (els.length === 2) {
209
+ return `${verb} ${els[0]} and ${els[1]}`;
210
+ }
211
+ return `${verb} ${els[0]}, ${els[1]} and ${els.length - 2} more`;
212
+ }
213
+ return '';
214
+ }
215
+ /**
216
+ * Detect test+implementation file pairs.
217
+ * Returns the pair info if files match naming conventions, null otherwise.
218
+ */
219
+ function detectTestImplPair(stagedFiles) {
220
+ if (stagedFiles.length < 2)
221
+ return null;
222
+ for (const file of stagedFiles) {
223
+ const path = file.path;
224
+ // Check if this is a test file
225
+ const testMatch = path.match(/^(.+)\.(test|spec)\.(ts|tsx|js|jsx|mts|cts)$/);
226
+ const dirTestMatch = path.match(/^(.+\/)__tests__\/(.+)\.(ts|tsx|js|jsx|mts|cts)$/);
227
+ if (testMatch) {
228
+ const implPath = `${testMatch[1]}.${testMatch[3]}`;
229
+ const implFile = stagedFiles.find(f => f.path === implPath);
230
+ if (implFile) {
231
+ return {
232
+ implFile: implFile.path.split('/').pop() || implFile.path,
233
+ testFile: file.path.split('/').pop() || file.path,
234
+ implStatus: implFile.status,
235
+ testStatus: file.status,
236
+ };
237
+ }
238
+ }
239
+ if (dirTestMatch) {
240
+ const implPath = `${dirTestMatch[1]}${dirTestMatch[2]}.${dirTestMatch[3]}`;
241
+ const implFile = stagedFiles.find(f => f.path === implPath);
242
+ if (implFile) {
243
+ return {
244
+ implFile: implFile.path.split('/').pop() || implFile.path,
245
+ testFile: file.path.split('/').pop() || file.path,
246
+ implStatus: implFile.status,
247
+ testStatus: file.status,
248
+ };
249
+ }
250
+ }
251
+ }
252
+ return null;
253
+ }
254
+ /**
255
+ * Generate description using lightweight file content analysis (JSON, CSS, YAML, MD).
256
+ * Returns null if no structural info is available.
257
+ */
258
+ function generateFileContentDescription(stagedFiles, diff) {
259
+ if (stagedFiles.length !== 1)
260
+ return null;
261
+ const file = stagedFiles[0];
262
+ const analysis = (0, fileContentAnalyzer_1.analyzeFileContent)(file.path, diff);
263
+ if (!analysis || analysis.changedElements.length === 0)
264
+ return null;
265
+ const fileName = file.path.split('/').pop() || file.path;
266
+ const elements = analysis.changedElements;
267
+ const elementStr = elements.length <= 2
268
+ ? elements.join(' and ')
269
+ : `${elements[0]} and ${elements.length - 1} more`;
270
+ const verb = analysis.changeKind === 'added' ? 'add'
271
+ : analysis.changeKind === 'removed' ? 'remove'
272
+ : 'update';
273
+ return `${verb} ${elementStr} in ${fileName}`;
274
+ }
275
+ /**
276
+ * Generate description using hunk header context (function/class names).
277
+ * Works for any language that git can identify scope for.
278
+ * Returns null if no hunk context is available.
279
+ */
280
+ function generateHunkDescription(stagedFiles, diff, commitType) {
281
+ const hunkNames = (0, semanticAnalyzer_1.extractHunkContext)(diff);
282
+ if (hunkNames.length === 0)
283
+ return null;
284
+ const verb = commitType === 'feat' ? 'add' :
285
+ commitType === 'fix' ? 'fix' :
286
+ commitType === 'refactor' ? 'refactor' :
287
+ commitType === 'perf' ? 'optimize' : 'update';
288
+ const nameStr = hunkNames.length <= 2
289
+ ? hunkNames.join(' and ')
290
+ : `${hunkNames[0]} and ${hunkNames.length - 1} more`;
291
+ if (stagedFiles.length === 1) {
292
+ const fileName = stagedFiles[0].path.split('/').pop() || stagedFiles[0].path;
293
+ return `${verb} ${nameStr} in ${fileName}`;
294
+ }
295
+ return `${verb} ${nameStr}`;
296
+ }
297
+ /**
298
+ * Generate a descriptive commit message
299
+ * Uses AST analysis for specific descriptions when available,
300
+ * falls back to semantic analysis and regex-based descriptions.
301
+ */
302
+ function generateDescription(filesAffected, fileStatuses, stagedFiles, diff, semanticAnalysis, astResult, commitType) {
303
+ // Check for comment-only changes (documentation in source files)
304
+ if ((0, commitTypeDetector_1.isCommentOnlyChange)(diff)) {
305
+ const fileName = stagedFiles.length === 1 ? (stagedFiles[0].path.split('/').pop() || stagedFiles[0].path) : null;
306
+ // Detect type of comments being added
307
+ const hasJSDoc = /^\+\s*\/\*\*/.test(diff) || /^\+\s*\*\s*@\w+/.test(diff);
308
+ const hasFunctionComments = /^\+\s*\/\/.*\b(function|method|param|return|arg)/i.test(diff);
309
+ if (hasJSDoc) {
310
+ return fileName ? `add JSDoc comments to ${fileName}` : 'add JSDoc documentation';
311
+ }
312
+ else if (hasFunctionComments) {
313
+ return fileName ? `add function documentation to ${fileName}` : 'add function documentation';
314
+ }
315
+ else {
316
+ return fileName ? `add comments to ${fileName}` : 'add code comments';
317
+ }
318
+ }
319
+ // Check for formatting-only changes (semicolons, whitespace, etc.)
320
+ if ((0, commitTypeDetector_1.isFormattingOnlyChange)(diff)) {
321
+ return generateFormattingDescription(diff, stagedFiles);
322
+ }
323
+ // Use AST analysis for specific, human-readable descriptions when available
324
+ // AST descriptions are preferred because they name exact functions/classes
325
+ if (astResult && commitType) {
326
+ const astMaxWeight = astResult.signals.length > 0
327
+ ? Math.max(...astResult.signals.map(s => s.weight), 0)
328
+ : 0;
329
+ if (astMaxWeight > 1 || astResult.declarations.renamed.length > 0) {
330
+ const astDesc = generateASTDescription(astResult, commitType);
331
+ if (astDesc) {
332
+ return astDesc;
333
+ }
334
+ }
335
+ }
336
+ // Use semantic analysis for intent-based descriptions when available
337
+ if (semanticAnalysis && semanticAnalysis.roleChanges.length > 0) {
338
+ return generateSemanticDescription(semanticAnalysis, stagedFiles);
339
+ }
340
+ // Detect test + implementation file pairs
341
+ const pair = detectTestImplPair(stagedFiles);
342
+ if (pair) {
343
+ const implName = pair.implFile.replace(/\.\w+$/, '');
344
+ if (pair.implStatus === 'A' && pair.testStatus === 'A') {
345
+ return `add ${implName} with tests`;
346
+ }
347
+ else if (pair.implStatus === 'M' && pair.testStatus === 'A') {
348
+ return `update ${implName} and add tests`;
349
+ }
350
+ else if (pair.implStatus === 'A' && pair.testStatus === 'M') {
351
+ return `add ${implName} and update tests`;
352
+ }
353
+ else {
354
+ return `update ${implName} and tests`;
355
+ }
356
+ }
357
+ // Use lightweight file content analysis (JSON keys, CSS selectors, etc.)
358
+ const fileContentDesc = generateFileContentDescription(stagedFiles, diff);
359
+ if (fileContentDesc) {
360
+ return fileContentDesc;
361
+ }
362
+ // Use hunk header context for function/class names (works for any language)
363
+ if (commitType) {
364
+ const hunkDesc = generateHunkDescription(stagedFiles, diff, commitType);
365
+ if (hunkDesc) {
366
+ return hunkDesc;
367
+ }
368
+ }
369
+ // Single file changes (fallback)
370
+ if (stagedFiles.length === 1) {
371
+ const file = stagedFiles[0];
372
+ const fileName = file.path.split('/').pop() || file.path;
373
+ if (file.status === 'A') {
374
+ return `add ${fileName}`;
375
+ }
376
+ else if (file.status === 'D') {
377
+ return `remove ${fileName}`;
378
+ }
379
+ else if (file.status === 'M') {
380
+ return `update ${fileName}`;
381
+ }
382
+ else if (file.status === 'R') {
383
+ return `rename ${fileName}`;
384
+ }
385
+ }
386
+ // Multiple files of the same type
387
+ if (filesAffected.test > 0 && filesAffected.source === 0) {
388
+ return `update test files`;
389
+ }
390
+ if (filesAffected.docs > 0 && filesAffected.source === 0) {
391
+ return `update documentation`;
392
+ }
393
+ if (filesAffected.config > 0 && filesAffected.source === 0) {
394
+ return `update configuration`;
395
+ }
396
+ // Mixed changes - try to be descriptive
397
+ const parts = [];
398
+ if (fileStatuses.added > 0) {
399
+ parts.push(`add ${fileStatuses.added} file${fileStatuses.added > 1 ? 's' : ''}`);
400
+ }
401
+ if (fileStatuses.modified > 0) {
402
+ if (parts.length === 0) {
403
+ parts.push(`update ${fileStatuses.modified} file${fileStatuses.modified > 1 ? 's' : ''}`);
404
+ }
405
+ }
406
+ if (fileStatuses.deleted > 0) {
407
+ parts.push(`remove ${fileStatuses.deleted} file${fileStatuses.deleted > 1 ? 's' : ''}`);
408
+ }
409
+ if (parts.length > 0) {
410
+ return parts.join(' and ');
411
+ }
412
+ // Fallback
413
+ return `update ${stagedFiles.length} file${stagedFiles.length > 1 ? 's' : ''}`;
414
+ }
415
+ /**
416
+ * Generate description based on semantic analysis
417
+ * Creates intent-based messages like "update UserProfile validation logic"
418
+ */
419
+ function generateSemanticDescription(semantic, stagedFiles) {
420
+ const intent = semantic.primaryIntent;
421
+ const role = semantic.primaryRole;
422
+ const verb = semanticAnalyzer_1.INTENT_VERBS[intent].present;
423
+ const roleDesc = semanticAnalyzer_1.ROLE_DESCRIPTIONS[role];
424
+ const hunkContext = semantic.hunkContext;
425
+ // Handle renames specially - use "rename X to Y" format
426
+ if (intent === 'rename' && semantic.renames && semantic.renames.length > 0) {
427
+ const rename = semantic.renames[0];
428
+ return `${verb} ${rename.oldName} to ${rename.newName}`;
429
+ }
430
+ // If we have specific elements affected, include them
431
+ const whatChanged = semantic.whatChanged;
432
+ // For single file with identified elements
433
+ if (stagedFiles.length === 1 && whatChanged && whatChanged !== 'code') {
434
+ // Check if whatChanged is a component/function name
435
+ if (/^[A-Z][a-zA-Z0-9]*$/.test(whatChanged)) {
436
+ // It's a component name
437
+ return `${verb} ${whatChanged} ${roleDesc}`;
438
+ }
439
+ if (/^[a-z][a-zA-Z0-9]*$/.test(whatChanged)) {
440
+ // It's a function name
441
+ return `${verb} ${whatChanged} ${roleDesc}`;
442
+ }
443
+ // Multiple elements or descriptive text
444
+ return `${verb} ${whatChanged}`;
445
+ }
446
+ // For multiple files with identified elements
447
+ if (stagedFiles.length > 1 && whatChanged && whatChanged !== 'code') {
448
+ // whatChanged contains specific element names (from extractAffectedElements or hunkContext)
449
+ if (/^[a-zA-Z_$][a-zA-Z0-9_$,\s]*$/.test(whatChanged) && !Object.values(semanticAnalyzer_1.ROLE_DESCRIPTIONS).includes(whatChanged)) {
450
+ return `${verb} ${whatChanged} ${roleDesc}`;
451
+ }
452
+ }
453
+ // When whatChanged is generic but hunk context provides specific function/class names
454
+ if (hunkContext && hunkContext.length > 0) {
455
+ const contextNames = hunkContext.length <= 2
456
+ ? hunkContext.join(' and ')
457
+ : `${hunkContext[0]} and ${hunkContext.length - 1} more`;
458
+ return `${verb} ${contextNames} ${roleDesc}`;
459
+ }
460
+ // For multiple files or when we only have role info
461
+ if (semantic.hasMultipleRoles) {
462
+ // Changes span multiple concerns
463
+ const roles = semantic.roleChanges
464
+ .filter(r => r.significance > 20)
465
+ .slice(0, 2)
466
+ .map(r => semanticAnalyzer_1.ROLE_DESCRIPTIONS[r.role]);
467
+ if (roles.length > 1) {
468
+ return `${verb} ${roles.join(' and ')}`;
469
+ }
470
+ }
471
+ // Single role with file context
472
+ if (stagedFiles.length === 1) {
473
+ const fileName = (stagedFiles[0].path.split('/').pop() || stagedFiles[0].path).replace(/\.\w+$/, '');
474
+ return `${verb} ${fileName} ${roleDesc}`;
475
+ }
476
+ // Multiple files, same role
477
+ return `${verb} ${roleDesc}`;
478
+ }
479
+ /**
480
+ * Generate an alternative description style
481
+ * Uses AST data when available, otherwise falls back to regex extraction.
482
+ */
483
+ function generateAlternativeDescription(analysis, diff) {
484
+ const { fileChanges, filesAffected } = analysis;
485
+ const totalFiles = fileChanges.added.length + fileChanges.modified.length +
486
+ fileChanges.deleted.length + fileChanges.renamed.length;
487
+ // Use AST data to build a detailed alternative with file context
488
+ if (analysis.astResult && analysis.astResult.affectedElements.length > 0) {
489
+ const elements = analysis.astResult.affectedElements;
490
+ const verb = analysis.commitType === 'feat' ? 'add' :
491
+ analysis.commitType === 'fix' ? 'fix' :
492
+ analysis.commitType === 'refactor' ? 'refactor' : 'update';
493
+ // For single file, include file name for extra context
494
+ if (totalFiles === 1) {
495
+ const fileName = fileChanges.added[0] || fileChanges.modified[0] || fileChanges.deleted[0] || fileChanges.renamed[0];
496
+ if (elements.length === 1) {
497
+ return `${verb} ${elements[0]} in ${fileName}`;
498
+ }
499
+ if (elements.length === 2) {
500
+ return `${verb} ${elements[0]} and ${elements[1]} in ${fileName}`;
501
+ }
502
+ return `${verb} ${elements[0]}, ${elements[1]} and ${elements.length - 2} more in ${fileName}`;
503
+ }
504
+ // For multiple files, list elements across files
505
+ if (elements.length === 1) {
506
+ return `${verb} ${elements[0]}`;
507
+ }
508
+ if (elements.length === 2) {
509
+ return `${verb} ${elements[0]} and ${elements[1]}`;
510
+ }
511
+ return `${verb} ${elements[0]}, ${elements[1]} and ${elements.length - 2} more`;
512
+ }
513
+ // For single file, provide more detail using extracted elements when available
514
+ if (totalFiles === 1) {
515
+ const elements = (0, semanticAnalyzer_1.extractAffectedElements)(diff);
516
+ const fileName = fileChanges.added[0] || fileChanges.modified[0] || fileChanges.deleted[0] || fileChanges.renamed[0];
517
+ if (elements.length > 0) {
518
+ const verb = analysis.commitType === 'feat' ? 'add' :
519
+ analysis.commitType === 'fix' ? 'fix' :
520
+ analysis.commitType === 'refactor' ? 'refactor' : 'update';
521
+ if (elements.length === 1) {
522
+ return `${verb} ${elements[0]} in ${fileName}`;
523
+ }
524
+ if (elements.length === 2) {
525
+ return `${verb} ${elements[0]} and ${elements[1]} in ${fileName}`;
526
+ }
527
+ return `${verb} ${elements[0]}, ${elements[1]} and ${elements.length - 2} more in ${fileName}`;
528
+ }
529
+ // Fall back to hunk context for modified files where declarations aren't in the diff
530
+ const hunkNames = (0, semanticAnalyzer_1.extractHunkContext)(diff);
531
+ if (hunkNames.length > 0) {
532
+ const verb = analysis.commitType === 'feat' ? 'add' :
533
+ analysis.commitType === 'fix' ? 'fix' :
534
+ analysis.commitType === 'refactor' ? 'refactor' : 'update';
535
+ if (hunkNames.length === 1) {
536
+ return `${verb} ${hunkNames[0]} in ${fileName}`;
537
+ }
538
+ if (hunkNames.length === 2) {
539
+ return `${verb} ${hunkNames[0]} and ${hunkNames[1]} in ${fileName}`;
540
+ }
541
+ return `${verb} ${hunkNames[0]}, ${hunkNames[1]} and ${hunkNames.length - 2} more in ${fileName}`;
542
+ }
543
+ if (fileChanges.added.length === 1) {
544
+ return `implement ${fileChanges.added[0]}`;
545
+ }
546
+ if (fileChanges.modified.length === 1) {
547
+ return `update ${fileChanges.modified[0]}`;
548
+ }
549
+ }
550
+ // For multiple files, be more descriptive about categories
551
+ const parts = [];
552
+ if (filesAffected.source > 0) {
553
+ parts.push(`${filesAffected.source} source file${filesAffected.source > 1 ? 's' : ''}`);
554
+ }
555
+ if (filesAffected.test > 0) {
556
+ parts.push(`${filesAffected.test} test${filesAffected.test > 1 ? 's' : ''}`);
557
+ }
558
+ if (filesAffected.docs > 0) {
559
+ parts.push(`${filesAffected.docs} doc${filesAffected.docs > 1 ? 's' : ''}`);
560
+ }
561
+ if (filesAffected.config > 0) {
562
+ parts.push(`${filesAffected.config} config${filesAffected.config > 1 ? 's' : ''}`);
563
+ }
564
+ if (parts.length > 0) {
565
+ return `update ${parts.join(', ')}`;
566
+ }
567
+ return analysis.description;
568
+ }
569
+ //# sourceMappingURL=descriptionGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"descriptionGenerator.js","sourceRoot":"","sources":["../../src/services/descriptionGenerator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface FileContentAnalysis {
2
+ changedElements: string[];
3
+ changeKind: 'added' | 'modified' | 'removed' | 'mixed';
4
+ }
5
+ /**
6
+ * Analyze file content changes for non-JS/TS files.
7
+ * Returns structural descriptions of what changed (keys, selectors, headings, etc.)
8
+ */
9
+ export declare function analyzeFileContent(filePath: string, diff: string): FileContentAnalysis | null;
10
+ //# sourceMappingURL=fileContentAnalyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileContentAnalyzer.d.ts","sourceRoot":"","sources":["../../src/services/fileContentAnalyzer.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC;CACxD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,mBAAmB,GAAG,IAAI,CAoB5B"}