@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.
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +10 -0
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/generate.test.js +38 -0
- package/dist/commands/generate.test.js.map +1 -1
- package/dist/services/analyzerService.d.ts +0 -157
- package/dist/services/analyzerService.d.ts.map +1 -1
- package/dist/services/analyzerService.js +75 -2010
- package/dist/services/analyzerService.js.map +1 -1
- package/dist/services/analyzerService.test.js +66 -4
- package/dist/services/analyzerService.test.js.map +1 -1
- package/dist/services/breakingChangeDetector.d.ts +9 -0
- package/dist/services/breakingChangeDetector.d.ts.map +1 -0
- package/dist/services/breakingChangeDetector.js +76 -0
- package/dist/services/breakingChangeDetector.js.map +1 -0
- package/dist/services/commitTypeDetector.d.ts +39 -0
- package/dist/services/commitTypeDetector.d.ts.map +1 -0
- package/dist/services/commitTypeDetector.js +510 -0
- package/dist/services/commitTypeDetector.js.map +1 -0
- package/dist/services/descriptionGenerator.d.ts +58 -0
- package/dist/services/descriptionGenerator.d.ts.map +1 -0
- package/dist/services/descriptionGenerator.js +566 -0
- package/dist/services/descriptionGenerator.js.map +1 -0
- package/dist/services/gitService.test.js +242 -24
- package/dist/services/gitService.test.js.map +1 -1
- package/dist/services/hookService.test.d.ts +2 -0
- package/dist/services/hookService.test.d.ts.map +1 -0
- package/dist/services/hookService.test.js +182 -0
- package/dist/services/hookService.test.js.map +1 -0
- package/dist/services/lintService.test.d.ts +2 -0
- package/dist/services/lintService.test.d.ts.map +1 -0
- package/dist/services/lintService.test.js +288 -0
- package/dist/services/lintService.test.js.map +1 -0
- package/dist/services/messageBuilder.d.ts +16 -0
- package/dist/services/messageBuilder.d.ts.map +1 -0
- package/dist/services/messageBuilder.js +135 -0
- package/dist/services/messageBuilder.js.map +1 -0
- package/dist/services/scopeDetector.d.ts +6 -0
- package/dist/services/scopeDetector.d.ts.map +1 -0
- package/dist/services/scopeDetector.js +51 -0
- package/dist/services/scopeDetector.js.map +1 -0
- package/dist/services/semanticAnalyzer.d.ts +25 -0
- package/dist/services/semanticAnalyzer.d.ts.map +1 -0
- package/dist/services/semanticAnalyzer.js +713 -0
- package/dist/services/semanticAnalyzer.js.map +1 -0
- package/dist/services/splitService.test.d.ts +2 -0
- package/dist/services/splitService.test.d.ts.map +1 -0
- package/dist/services/splitService.test.js +190 -0
- package/dist/services/splitService.test.js.map +1 -0
- package/dist/services/statsService.test.d.ts +2 -0
- package/dist/services/statsService.test.d.ts.map +1 -0
- package/dist/services/statsService.test.js +211 -0
- package/dist/services/statsService.test.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -1
- 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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"}
|