@m3hti/commit-genie 3.1.0 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/commands/generate.d.ts.map +1 -1
  2. package/dist/commands/generate.js +10 -0
  3. package/dist/commands/generate.js.map +1 -1
  4. package/dist/commands/generate.test.js +38 -0
  5. package/dist/commands/generate.test.js.map +1 -1
  6. package/dist/services/analyzerService.d.ts +0 -157
  7. package/dist/services/analyzerService.d.ts.map +1 -1
  8. package/dist/services/analyzerService.js +75 -2010
  9. package/dist/services/analyzerService.js.map +1 -1
  10. package/dist/services/analyzerService.test.js +66 -4
  11. package/dist/services/analyzerService.test.js.map +1 -1
  12. package/dist/services/breakingChangeDetector.d.ts +9 -0
  13. package/dist/services/breakingChangeDetector.d.ts.map +1 -0
  14. package/dist/services/breakingChangeDetector.js +76 -0
  15. package/dist/services/breakingChangeDetector.js.map +1 -0
  16. package/dist/services/commitTypeDetector.d.ts +39 -0
  17. package/dist/services/commitTypeDetector.d.ts.map +1 -0
  18. package/dist/services/commitTypeDetector.js +510 -0
  19. package/dist/services/commitTypeDetector.js.map +1 -0
  20. package/dist/services/descriptionGenerator.d.ts +58 -0
  21. package/dist/services/descriptionGenerator.d.ts.map +1 -0
  22. package/dist/services/descriptionGenerator.js +566 -0
  23. package/dist/services/descriptionGenerator.js.map +1 -0
  24. package/dist/services/gitService.test.js +242 -24
  25. package/dist/services/gitService.test.js.map +1 -1
  26. package/dist/services/hookService.test.d.ts +2 -0
  27. package/dist/services/hookService.test.d.ts.map +1 -0
  28. package/dist/services/hookService.test.js +182 -0
  29. package/dist/services/hookService.test.js.map +1 -0
  30. package/dist/services/lintService.test.d.ts +2 -0
  31. package/dist/services/lintService.test.d.ts.map +1 -0
  32. package/dist/services/lintService.test.js +288 -0
  33. package/dist/services/lintService.test.js.map +1 -0
  34. package/dist/services/messageBuilder.d.ts +16 -0
  35. package/dist/services/messageBuilder.d.ts.map +1 -0
  36. package/dist/services/messageBuilder.js +135 -0
  37. package/dist/services/messageBuilder.js.map +1 -0
  38. package/dist/services/scopeDetector.d.ts +6 -0
  39. package/dist/services/scopeDetector.d.ts.map +1 -0
  40. package/dist/services/scopeDetector.js +51 -0
  41. package/dist/services/scopeDetector.js.map +1 -0
  42. package/dist/services/semanticAnalyzer.d.ts +25 -0
  43. package/dist/services/semanticAnalyzer.d.ts.map +1 -0
  44. package/dist/services/semanticAnalyzer.js +713 -0
  45. package/dist/services/semanticAnalyzer.js.map +1 -0
  46. package/dist/services/splitService.test.d.ts +2 -0
  47. package/dist/services/splitService.test.d.ts.map +1 -0
  48. package/dist/services/splitService.test.js +190 -0
  49. package/dist/services/splitService.test.js.map +1 -0
  50. package/dist/services/statsService.test.d.ts +2 -0
  51. package/dist/services/statsService.test.d.ts.map +1 -0
  52. package/dist/services/statsService.test.js +211 -0
  53. package/dist/services/statsService.test.js.map +1 -0
  54. package/dist/types/index.d.ts +5 -0
  55. package/dist/types/index.d.ts.map +1 -1
  56. package/package.json +1 -1
@@ -0,0 +1,566 @@
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 && astResult.signals.length > 0) {
326
+ const astDesc = generateASTDescription(astResult, commitType);
327
+ if (astDesc) {
328
+ return astDesc;
329
+ }
330
+ }
331
+ // Use lightweight file content analysis (JSON keys, CSS selectors, etc.)
332
+ // Elevated above semantic analysis because it produces more specific descriptions
333
+ // e.g. "update .footer in style.css" instead of generic "update styling"
334
+ const fileContentDesc = generateFileContentDescription(stagedFiles, diff);
335
+ if (fileContentDesc) {
336
+ return fileContentDesc;
337
+ }
338
+ // Use semantic analysis for intent-based descriptions when available
339
+ if (semanticAnalysis && semanticAnalysis.roleChanges.length > 0) {
340
+ return generateSemanticDescription(semanticAnalysis, stagedFiles);
341
+ }
342
+ // Detect test + implementation file pairs
343
+ const pair = detectTestImplPair(stagedFiles);
344
+ if (pair) {
345
+ const implName = pair.implFile.replace(/\.\w+$/, '');
346
+ if (pair.implStatus === 'A' && pair.testStatus === 'A') {
347
+ return `add ${implName} with tests`;
348
+ }
349
+ else if (pair.implStatus === 'M' && pair.testStatus === 'A') {
350
+ return `update ${implName} and add tests`;
351
+ }
352
+ else if (pair.implStatus === 'A' && pair.testStatus === 'M') {
353
+ return `add ${implName} and update tests`;
354
+ }
355
+ else {
356
+ return `update ${implName} and tests`;
357
+ }
358
+ }
359
+ // Use hunk header context for function/class names (works for any language)
360
+ if (commitType) {
361
+ const hunkDesc = generateHunkDescription(stagedFiles, diff, commitType);
362
+ if (hunkDesc) {
363
+ return hunkDesc;
364
+ }
365
+ }
366
+ // Single file changes (fallback)
367
+ if (stagedFiles.length === 1) {
368
+ const file = stagedFiles[0];
369
+ const fileName = file.path.split('/').pop() || file.path;
370
+ if (file.status === 'A') {
371
+ return `add ${fileName}`;
372
+ }
373
+ else if (file.status === 'D') {
374
+ return `remove ${fileName}`;
375
+ }
376
+ else if (file.status === 'M') {
377
+ return `update ${fileName}`;
378
+ }
379
+ else if (file.status === 'R') {
380
+ return `rename ${fileName}`;
381
+ }
382
+ }
383
+ // Multiple files of the same type
384
+ if (filesAffected.test > 0 && filesAffected.source === 0) {
385
+ return `update test files`;
386
+ }
387
+ if (filesAffected.docs > 0 && filesAffected.source === 0) {
388
+ return `update documentation`;
389
+ }
390
+ if (filesAffected.config > 0 && filesAffected.source === 0) {
391
+ return `update configuration`;
392
+ }
393
+ // Mixed changes - try to be descriptive
394
+ const parts = [];
395
+ if (fileStatuses.added > 0) {
396
+ parts.push(`add ${fileStatuses.added} file${fileStatuses.added > 1 ? 's' : ''}`);
397
+ }
398
+ if (fileStatuses.modified > 0) {
399
+ if (parts.length === 0) {
400
+ parts.push(`update ${fileStatuses.modified} file${fileStatuses.modified > 1 ? 's' : ''}`);
401
+ }
402
+ }
403
+ if (fileStatuses.deleted > 0) {
404
+ parts.push(`remove ${fileStatuses.deleted} file${fileStatuses.deleted > 1 ? 's' : ''}`);
405
+ }
406
+ if (parts.length > 0) {
407
+ return parts.join(' and ');
408
+ }
409
+ // Fallback
410
+ return `update ${stagedFiles.length} file${stagedFiles.length > 1 ? 's' : ''}`;
411
+ }
412
+ /**
413
+ * Generate description based on semantic analysis
414
+ * Creates intent-based messages like "update UserProfile validation logic"
415
+ */
416
+ function generateSemanticDescription(semantic, stagedFiles) {
417
+ const intent = semantic.primaryIntent;
418
+ const role = semantic.primaryRole;
419
+ const verb = semanticAnalyzer_1.INTENT_VERBS[intent].present;
420
+ const roleDesc = semanticAnalyzer_1.ROLE_DESCRIPTIONS[role];
421
+ const hunkContext = semantic.hunkContext;
422
+ // Handle renames specially - use "rename X to Y" format
423
+ if (intent === 'rename' && semantic.renames && semantic.renames.length > 0) {
424
+ const rename = semantic.renames[0];
425
+ return `${verb} ${rename.oldName} to ${rename.newName}`;
426
+ }
427
+ // If we have specific elements affected, include them
428
+ const whatChanged = semantic.whatChanged;
429
+ // For single file with identified elements
430
+ if (stagedFiles.length === 1 && whatChanged && whatChanged !== 'code') {
431
+ // Check if whatChanged is a component/function name
432
+ if (/^[A-Z][a-zA-Z0-9]*$/.test(whatChanged)) {
433
+ // It's a component name
434
+ return `${verb} ${whatChanged} ${roleDesc}`;
435
+ }
436
+ if (/^[a-z][a-zA-Z0-9]*$/.test(whatChanged)) {
437
+ // It's a function name
438
+ return `${verb} ${whatChanged} ${roleDesc}`;
439
+ }
440
+ // Multiple elements or descriptive text
441
+ return `${verb} ${whatChanged}`;
442
+ }
443
+ // For multiple files with identified elements
444
+ if (stagedFiles.length > 1 && whatChanged && whatChanged !== 'code') {
445
+ // whatChanged contains specific element names (from extractAffectedElements or hunkContext)
446
+ if (/^[a-zA-Z_$][a-zA-Z0-9_$,\s]*$/.test(whatChanged) && !Object.values(semanticAnalyzer_1.ROLE_DESCRIPTIONS).includes(whatChanged)) {
447
+ return `${verb} ${whatChanged} ${roleDesc}`;
448
+ }
449
+ }
450
+ // When whatChanged is generic but hunk context provides specific function/class names
451
+ if (hunkContext && hunkContext.length > 0) {
452
+ const contextNames = hunkContext.length <= 2
453
+ ? hunkContext.join(' and ')
454
+ : `${hunkContext[0]} and ${hunkContext.length - 1} more`;
455
+ return `${verb} ${contextNames} ${roleDesc}`;
456
+ }
457
+ // For multiple files or when we only have role info
458
+ if (semantic.hasMultipleRoles) {
459
+ // Changes span multiple concerns
460
+ const roles = semantic.roleChanges
461
+ .filter(r => r.significance > 20)
462
+ .slice(0, 2)
463
+ .map(r => semanticAnalyzer_1.ROLE_DESCRIPTIONS[r.role]);
464
+ if (roles.length > 1) {
465
+ return `${verb} ${roles.join(' and ')}`;
466
+ }
467
+ }
468
+ // Single role with file context
469
+ if (stagedFiles.length === 1) {
470
+ const fileName = (stagedFiles[0].path.split('/').pop() || stagedFiles[0].path).replace(/\.\w+$/, '');
471
+ return `${verb} ${fileName} ${roleDesc}`;
472
+ }
473
+ // Multiple files, same role
474
+ return `${verb} ${roleDesc}`;
475
+ }
476
+ /**
477
+ * Generate an alternative description style
478
+ * Uses AST data when available, otherwise falls back to regex extraction.
479
+ */
480
+ function generateAlternativeDescription(analysis, diff) {
481
+ const { fileChanges, filesAffected } = analysis;
482
+ const totalFiles = fileChanges.added.length + fileChanges.modified.length +
483
+ fileChanges.deleted.length + fileChanges.renamed.length;
484
+ // Use AST data to build a detailed alternative with file context
485
+ if (analysis.astResult && analysis.astResult.affectedElements.length > 0) {
486
+ const elements = analysis.astResult.affectedElements;
487
+ const verb = analysis.commitType === 'feat' ? 'add' :
488
+ analysis.commitType === 'fix' ? 'fix' :
489
+ analysis.commitType === 'refactor' ? 'refactor' : 'update';
490
+ // For single file, include file name for extra context
491
+ if (totalFiles === 1) {
492
+ const fileName = fileChanges.added[0] || fileChanges.modified[0] || fileChanges.deleted[0] || fileChanges.renamed[0];
493
+ if (elements.length === 1) {
494
+ return `${verb} ${elements[0]} in ${fileName}`;
495
+ }
496
+ if (elements.length === 2) {
497
+ return `${verb} ${elements[0]} and ${elements[1]} in ${fileName}`;
498
+ }
499
+ return `${verb} ${elements[0]}, ${elements[1]} and ${elements.length - 2} more in ${fileName}`;
500
+ }
501
+ // For multiple files, list elements across files
502
+ if (elements.length === 1) {
503
+ return `${verb} ${elements[0]}`;
504
+ }
505
+ if (elements.length === 2) {
506
+ return `${verb} ${elements[0]} and ${elements[1]}`;
507
+ }
508
+ return `${verb} ${elements[0]}, ${elements[1]} and ${elements.length - 2} more`;
509
+ }
510
+ // For single file, provide more detail using extracted elements when available
511
+ if (totalFiles === 1) {
512
+ const elements = (0, semanticAnalyzer_1.extractAffectedElements)(diff);
513
+ const fileName = fileChanges.added[0] || fileChanges.modified[0] || fileChanges.deleted[0] || fileChanges.renamed[0];
514
+ if (elements.length > 0) {
515
+ const verb = analysis.commitType === 'feat' ? 'add' :
516
+ analysis.commitType === 'fix' ? 'fix' :
517
+ analysis.commitType === 'refactor' ? 'refactor' : 'update';
518
+ if (elements.length === 1) {
519
+ return `${verb} ${elements[0]} in ${fileName}`;
520
+ }
521
+ if (elements.length === 2) {
522
+ return `${verb} ${elements[0]} and ${elements[1]} in ${fileName}`;
523
+ }
524
+ return `${verb} ${elements[0]}, ${elements[1]} and ${elements.length - 2} more in ${fileName}`;
525
+ }
526
+ // Fall back to hunk context for modified files where declarations aren't in the diff
527
+ const hunkNames = (0, semanticAnalyzer_1.extractHunkContext)(diff);
528
+ if (hunkNames.length > 0) {
529
+ const verb = analysis.commitType === 'feat' ? 'add' :
530
+ analysis.commitType === 'fix' ? 'fix' :
531
+ analysis.commitType === 'refactor' ? 'refactor' : 'update';
532
+ if (hunkNames.length === 1) {
533
+ return `${verb} ${hunkNames[0]} in ${fileName}`;
534
+ }
535
+ if (hunkNames.length === 2) {
536
+ return `${verb} ${hunkNames[0]} and ${hunkNames[1]} in ${fileName}`;
537
+ }
538
+ return `${verb} ${hunkNames[0]}, ${hunkNames[1]} and ${hunkNames.length - 2} more in ${fileName}`;
539
+ }
540
+ if (fileChanges.added.length === 1) {
541
+ return `implement ${fileChanges.added[0]}`;
542
+ }
543
+ if (fileChanges.modified.length === 1) {
544
+ return `update ${fileChanges.modified[0]}`;
545
+ }
546
+ }
547
+ // For multiple files, be more descriptive about categories
548
+ const parts = [];
549
+ if (filesAffected.source > 0) {
550
+ parts.push(`${filesAffected.source} source file${filesAffected.source > 1 ? 's' : ''}`);
551
+ }
552
+ if (filesAffected.test > 0) {
553
+ parts.push(`${filesAffected.test} test${filesAffected.test > 1 ? 's' : ''}`);
554
+ }
555
+ if (filesAffected.docs > 0) {
556
+ parts.push(`${filesAffected.docs} doc${filesAffected.docs > 1 ? 's' : ''}`);
557
+ }
558
+ if (filesAffected.config > 0) {
559
+ parts.push(`${filesAffected.config} config${filesAffected.config > 1 ? 's' : ''}`);
560
+ }
561
+ if (parts.length > 0) {
562
+ return `update ${parts.join(', ')}`;
563
+ }
564
+ return analysis.description;
565
+ }
566
+ //# 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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"}