@m3hti/commit-genie 1.0.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 (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +430 -0
  3. package/dist/commands/config.d.ts +3 -0
  4. package/dist/commands/config.d.ts.map +1 -0
  5. package/dist/commands/config.js +31 -0
  6. package/dist/commands/config.js.map +1 -0
  7. package/dist/commands/generate.d.ts +10 -0
  8. package/dist/commands/generate.d.ts.map +1 -0
  9. package/dist/commands/generate.js +313 -0
  10. package/dist/commands/generate.js.map +1 -0
  11. package/dist/commands/generate.test.d.ts +2 -0
  12. package/dist/commands/generate.test.d.ts.map +1 -0
  13. package/dist/commands/generate.test.js +168 -0
  14. package/dist/commands/generate.test.js.map +1 -0
  15. package/dist/commands/hook.d.ts +4 -0
  16. package/dist/commands/hook.d.ts.map +1 -0
  17. package/dist/commands/hook.js +62 -0
  18. package/dist/commands/hook.js.map +1 -0
  19. package/dist/commands/stats.d.ts +6 -0
  20. package/dist/commands/stats.d.ts.map +1 -0
  21. package/dist/commands/stats.js +39 -0
  22. package/dist/commands/stats.js.map +1 -0
  23. package/dist/index.d.ts +3 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +77 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/services/aiService.d.ts +38 -0
  28. package/dist/services/aiService.d.ts.map +1 -0
  29. package/dist/services/aiService.js +187 -0
  30. package/dist/services/aiService.js.map +1 -0
  31. package/dist/services/analyzerService.d.ts +60 -0
  32. package/dist/services/analyzerService.d.ts.map +1 -0
  33. package/dist/services/analyzerService.js +832 -0
  34. package/dist/services/analyzerService.js.map +1 -0
  35. package/dist/services/analyzerService.test.d.ts +2 -0
  36. package/dist/services/analyzerService.test.d.ts.map +1 -0
  37. package/dist/services/analyzerService.test.js +323 -0
  38. package/dist/services/analyzerService.test.js.map +1 -0
  39. package/dist/services/configService.d.ts +25 -0
  40. package/dist/services/configService.d.ts.map +1 -0
  41. package/dist/services/configService.js +207 -0
  42. package/dist/services/configService.js.map +1 -0
  43. package/dist/services/configService.test.d.ts +2 -0
  44. package/dist/services/configService.test.d.ts.map +1 -0
  45. package/dist/services/configService.test.js +165 -0
  46. package/dist/services/configService.test.js.map +1 -0
  47. package/dist/services/gitService.d.ts +44 -0
  48. package/dist/services/gitService.d.ts.map +1 -0
  49. package/dist/services/gitService.js +217 -0
  50. package/dist/services/gitService.js.map +1 -0
  51. package/dist/services/gitService.test.d.ts +2 -0
  52. package/dist/services/gitService.test.d.ts.map +1 -0
  53. package/dist/services/gitService.test.js +140 -0
  54. package/dist/services/gitService.test.js.map +1 -0
  55. package/dist/services/historyService.d.ts +39 -0
  56. package/dist/services/historyService.d.ts.map +1 -0
  57. package/dist/services/historyService.js +195 -0
  58. package/dist/services/historyService.js.map +1 -0
  59. package/dist/services/historyService.test.d.ts +2 -0
  60. package/dist/services/historyService.test.d.ts.map +1 -0
  61. package/dist/services/historyService.test.js +157 -0
  62. package/dist/services/historyService.test.js.map +1 -0
  63. package/dist/services/hookService.d.ts +29 -0
  64. package/dist/services/hookService.d.ts.map +1 -0
  65. package/dist/services/hookService.js +164 -0
  66. package/dist/services/hookService.js.map +1 -0
  67. package/dist/services/statsService.d.ts +28 -0
  68. package/dist/services/statsService.d.ts.map +1 -0
  69. package/dist/services/statsService.js +204 -0
  70. package/dist/services/statsService.js.map +1 -0
  71. package/dist/types/index.d.ts +134 -0
  72. package/dist/types/index.d.ts.map +1 -0
  73. package/dist/types/index.js +3 -0
  74. package/dist/types/index.js.map +1 -0
  75. package/dist/utils/filePatterns.d.ts +5 -0
  76. package/dist/utils/filePatterns.d.ts.map +1 -0
  77. package/dist/utils/filePatterns.js +77 -0
  78. package/dist/utils/filePatterns.js.map +1 -0
  79. package/dist/utils/filePatterns.test.d.ts +2 -0
  80. package/dist/utils/filePatterns.test.d.ts.map +1 -0
  81. package/dist/utils/filePatterns.test.js +51 -0
  82. package/dist/utils/filePatterns.test.js.map +1 -0
  83. package/dist/utils/prompt.d.ts +4 -0
  84. package/dist/utils/prompt.d.ts.map +1 -0
  85. package/dist/utils/prompt.js +60 -0
  86. package/dist/utils/prompt.js.map +1 -0
  87. package/package.json +47 -0
@@ -0,0 +1,313 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateCommand = generateCommand;
4
+ const gitService_1 = require("../services/gitService");
5
+ const analyzerService_1 = require("../services/analyzerService");
6
+ const prompt_1 = require("../utils/prompt");
7
+ async function generateCommand(options = {}) {
8
+ try {
9
+ // Check if in a git repository
10
+ if (!gitService_1.GitService.isGitRepository()) {
11
+ console.error('Error: Not a git repository');
12
+ console.log('Please run this command inside a git repository.');
13
+ process.exit(1);
14
+ }
15
+ // Get git status
16
+ const status = gitService_1.GitService.getStatus();
17
+ // Check if there are staged changes
18
+ if (!status.hasStagedChanges) {
19
+ console.error('Error: No staged changes found');
20
+ console.log('\nPlease stage your changes first using:');
21
+ console.log(' git add <files>');
22
+ console.log('\nOr stage all changes:');
23
+ console.log(' git add .');
24
+ process.exit(1);
25
+ }
26
+ // Generate suggestions (with optional AI enhancement)
27
+ let suggestions;
28
+ if (options.ai) {
29
+ console.log('\nUsing AI to enhance commit message...');
30
+ suggestions = await analyzerService_1.AnalyzerService.generateSuggestionsWithAI(true);
31
+ }
32
+ else {
33
+ suggestions = analyzerService_1.AnalyzerService.generateMultipleSuggestions();
34
+ }
35
+ const defaultMessage = suggestions[0].message;
36
+ // Message-only mode for scripts and hooks (silent, just output the message)
37
+ if (options.messageOnly) {
38
+ console.log(defaultMessage.full);
39
+ return;
40
+ }
41
+ // Dry run mode - show detailed preview without committing
42
+ if (options.dryRun) {
43
+ displayDryRun(status, suggestions, defaultMessage);
44
+ return;
45
+ }
46
+ // Show what files are being analyzed
47
+ console.log('\nAnalyzing staged changes...\n');
48
+ console.log('Staged files:');
49
+ for (const file of status.staged) {
50
+ const statusSymbol = getStatusSymbol(file.status);
51
+ console.log(` ${statusSymbol} ${file.path}`);
52
+ }
53
+ // Get diff statistics
54
+ const stats = gitService_1.GitService.getDiffStats();
55
+ console.log(`\n${stats.filesChanged} file(s) changed, ${stats.insertions} insertion(s)(+), ${stats.deletions} deletion(s)(-)\n`);
56
+ // Show suggestions
57
+ if (suggestions.length > 1 && !options.single) {
58
+ // Multiple suggestions mode
59
+ console.log('Suggested commit messages:');
60
+ console.log('─'.repeat(50));
61
+ for (const suggestion of suggestions) {
62
+ console.log(`\n [${suggestion.id}] ${suggestion.label}`);
63
+ displayMessage(suggestion.message, ' ');
64
+ }
65
+ console.log('\n' + '─'.repeat(50));
66
+ // Handle commit based on options
67
+ if (options.commit) {
68
+ // Auto-commit with first suggestion
69
+ await commitWithMessage(defaultMessage.full);
70
+ }
71
+ else if (options.interactive !== false) {
72
+ // Interactive mode with selection
73
+ console.log('\nOptions:');
74
+ console.log(` [1-${suggestions.length}] Select a message`);
75
+ console.log(' [e] Edit and write your own');
76
+ console.log(' [n] Cancel\n');
77
+ const choice = await (0, prompt_1.prompt)('Your choice: ');
78
+ await handleMultipleChoice(choice, suggestions);
79
+ }
80
+ else {
81
+ // Non-interactive mode
82
+ console.log('\nTo commit with the recommended message, run:');
83
+ console.log(` git commit -m "${escapeForShell(defaultMessage.full)}"`);
84
+ }
85
+ }
86
+ else {
87
+ // Single suggestion mode
88
+ console.log('Suggested commit message:');
89
+ console.log('─'.repeat(50));
90
+ displayMessage(defaultMessage, '');
91
+ console.log('─'.repeat(50));
92
+ console.log('\nBreakdown:');
93
+ console.log(` Type: ${defaultMessage.type}`);
94
+ if (defaultMessage.scope) {
95
+ console.log(` Scope: ${defaultMessage.scope}`);
96
+ }
97
+ console.log(` Description: ${defaultMessage.description}`);
98
+ if (defaultMessage.body) {
99
+ console.log(' Body: (see above)');
100
+ }
101
+ // Handle commit based on options
102
+ if (options.commit) {
103
+ await commitWithMessage(defaultMessage.full);
104
+ }
105
+ else if (options.interactive !== false) {
106
+ // Interactive mode (default)
107
+ console.log('\nWhat would you like to do?');
108
+ console.log(' [c] Commit with this message');
109
+ console.log(' [e] Edit the message');
110
+ console.log(' [n] Cancel\n');
111
+ const choice = await (0, prompt_1.prompt)('Your choice (c/e/n): ');
112
+ await handleSingleChoice(choice, defaultMessage.full);
113
+ }
114
+ else {
115
+ // Non-interactive mode (just show the message)
116
+ console.log('\nTo commit with this message, run:');
117
+ console.log(` git commit -m "${escapeForShell(defaultMessage.full)}"`);
118
+ }
119
+ }
120
+ }
121
+ catch (error) {
122
+ if (error instanceof Error) {
123
+ console.error(`Error: ${error.message}`);
124
+ }
125
+ else {
126
+ console.error('An unexpected error occurred');
127
+ }
128
+ process.exit(1);
129
+ }
130
+ }
131
+ function getStatusSymbol(status) {
132
+ switch (status) {
133
+ case 'A':
134
+ return '+';
135
+ case 'M':
136
+ return '~';
137
+ case 'D':
138
+ return '-';
139
+ case 'R':
140
+ return '→';
141
+ default:
142
+ return '?';
143
+ }
144
+ }
145
+ function displayMessage(message, indent) {
146
+ const lines = message.full.split('\n');
147
+ const subject = lines[0];
148
+ console.log(`${indent}${subject}`);
149
+ // If there's a body, display it with proper indentation
150
+ if (message.body) {
151
+ console.log('');
152
+ const bodyLines = message.body.split('\n');
153
+ for (const line of bodyLines) {
154
+ console.log(`${indent}${line}`);
155
+ }
156
+ }
157
+ }
158
+ function escapeForShell(message) {
159
+ // For multi-line messages, suggest using -F flag
160
+ if (message.includes('\n')) {
161
+ return message.split('\n')[0] + '" (use -F for full body)';
162
+ }
163
+ return message.replace(/"/g, '\\"');
164
+ }
165
+ async function commitWithMessage(message) {
166
+ try {
167
+ gitService_1.GitService.commit(message);
168
+ console.log('\n✓ Changes committed successfully!');
169
+ }
170
+ catch (err) {
171
+ console.error(`\nFailed to commit: ${err instanceof Error ? err.message : err}`);
172
+ process.exit(1);
173
+ }
174
+ }
175
+ async function handleSingleChoice(choice, message) {
176
+ switch (choice.toLowerCase()) {
177
+ case 'c':
178
+ case 'commit':
179
+ await commitWithMessage(message);
180
+ break;
181
+ case 'e':
182
+ case 'edit':
183
+ const editedMessage = await (0, prompt_1.prompt)('\nEnter your commit message: ');
184
+ if (editedMessage) {
185
+ await commitWithMessage(editedMessage);
186
+ }
187
+ else {
188
+ console.log('\nCommit cancelled - empty message provided.');
189
+ }
190
+ break;
191
+ case 'n':
192
+ case 'no':
193
+ case 'cancel':
194
+ console.log('\nCommit cancelled.');
195
+ break;
196
+ default:
197
+ console.log('\nNo action taken. To commit manually, run:');
198
+ console.log(` git commit -m "${escapeForShell(message)}"`);
199
+ }
200
+ }
201
+ async function handleMultipleChoice(choice, suggestions) {
202
+ const choiceLower = choice.toLowerCase();
203
+ // Check if it's a number selection
204
+ const num = parseInt(choice, 10);
205
+ if (!isNaN(num) && num >= 1 && num <= suggestions.length) {
206
+ const selected = suggestions[num - 1];
207
+ console.log(`\nSelected: ${selected.label}`);
208
+ await commitWithMessage(selected.message.full);
209
+ return;
210
+ }
211
+ // Handle other choices
212
+ switch (choiceLower) {
213
+ case 'e':
214
+ case 'edit':
215
+ const editedMessage = await (0, prompt_1.prompt)('\nEnter your commit message: ');
216
+ if (editedMessage) {
217
+ await commitWithMessage(editedMessage);
218
+ }
219
+ else {
220
+ console.log('\nCommit cancelled - empty message provided.');
221
+ }
222
+ break;
223
+ case 'n':
224
+ case 'no':
225
+ case 'cancel':
226
+ console.log('\nCommit cancelled.');
227
+ break;
228
+ default:
229
+ console.log('\nInvalid choice. No action taken.');
230
+ console.log('\nTo commit with the recommended message, run:');
231
+ console.log(` git commit -m "${escapeForShell(suggestions[0].message.full)}"`);
232
+ }
233
+ }
234
+ function displayDryRun(status, suggestions, defaultMessage) {
235
+ const stats = gitService_1.GitService.getDiffStats();
236
+ console.log('\n' + '═'.repeat(60));
237
+ console.log(' DRY RUN - No changes will be made');
238
+ console.log('═'.repeat(60));
239
+ // Show files that would be committed
240
+ console.log('\n📁 Files to be committed:');
241
+ console.log('─'.repeat(40));
242
+ for (const file of status.staged) {
243
+ const statusSymbol = getStatusSymbol(file.status);
244
+ const statusLabel = getStatusLabel(file.status);
245
+ console.log(` ${statusSymbol} ${file.path} (${statusLabel})`);
246
+ }
247
+ console.log(`\n Total: ${stats.filesChanged} file(s), +${stats.insertions}/-${stats.deletions} lines`);
248
+ // Show commit message details
249
+ console.log('\n📝 Commit message:');
250
+ console.log('─'.repeat(40));
251
+ const lines = defaultMessage.full.split('\n');
252
+ for (const line of lines) {
253
+ console.log(` ${line}`);
254
+ }
255
+ // Show message breakdown
256
+ console.log('\n🔍 Breakdown:');
257
+ console.log('─'.repeat(40));
258
+ console.log(` Type: ${defaultMessage.type}`);
259
+ if (defaultMessage.scope) {
260
+ console.log(` Scope: ${defaultMessage.scope}`);
261
+ }
262
+ console.log(` Description: ${defaultMessage.description}`);
263
+ if (defaultMessage.isBreaking) {
264
+ console.log(` Breaking: Yes`);
265
+ }
266
+ if (defaultMessage.body) {
267
+ console.log(` Body: Yes (multi-line)`);
268
+ }
269
+ // Show alternative suggestions if available
270
+ if (suggestions.length > 1) {
271
+ console.log('\n📋 Alternative suggestions available:');
272
+ console.log('─'.repeat(40));
273
+ for (let i = 1; i < suggestions.length; i++) {
274
+ const s = suggestions[i];
275
+ const subjectLine = s.message.full.split('\n')[0];
276
+ console.log(` [${s.id}] ${s.label}: ${subjectLine}`);
277
+ }
278
+ }
279
+ // Show the command that would be executed
280
+ console.log('\n⚡ Command that would be executed:');
281
+ console.log('─'.repeat(40));
282
+ if (defaultMessage.full.includes('\n')) {
283
+ console.log(' git commit -m "...(multi-line message)"');
284
+ console.log('\n Message content:');
285
+ console.log(' ┌' + '─'.repeat(38));
286
+ for (const line of defaultMessage.full.split('\n')) {
287
+ console.log(` │ ${line}`);
288
+ }
289
+ console.log(' └' + '─'.repeat(38));
290
+ }
291
+ else {
292
+ console.log(` git commit -m "${escapeForShell(defaultMessage.full)}"`);
293
+ }
294
+ console.log('\n' + '═'.repeat(60));
295
+ console.log(' To commit, run: commit-genie -c');
296
+ console.log(' Or interactively: commit-genie');
297
+ console.log('═'.repeat(60) + '\n');
298
+ }
299
+ function getStatusLabel(status) {
300
+ switch (status) {
301
+ case 'A':
302
+ return 'added';
303
+ case 'M':
304
+ return 'modified';
305
+ case 'D':
306
+ return 'deleted';
307
+ case 'R':
308
+ return 'renamed';
309
+ default:
310
+ return 'unknown';
311
+ }
312
+ }
313
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=generate.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.test.d.ts","sourceRoot":"","sources":["../../src/commands/generate.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const gitService_1 = require("../services/gitService");
37
+ const analyzerService_1 = require("../services/analyzerService");
38
+ // Mock dependencies
39
+ jest.mock('../services/gitService');
40
+ jest.mock('../services/analyzerService');
41
+ jest.mock('../utils/prompt', () => ({
42
+ prompt: jest.fn(),
43
+ }));
44
+ const mockedGitService = gitService_1.GitService;
45
+ const mockedAnalyzerService = analyzerService_1.AnalyzerService;
46
+ describe('generate command', () => {
47
+ let consoleLogSpy;
48
+ let consoleErrorSpy;
49
+ let processExitSpy;
50
+ beforeEach(() => {
51
+ jest.clearAllMocks();
52
+ consoleLogSpy = jest.spyOn(console, 'log').mockImplementation();
53
+ consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation();
54
+ processExitSpy = jest.spyOn(process, 'exit').mockImplementation(() => undefined);
55
+ // Default mocks
56
+ mockedGitService.isGitRepository.mockReturnValue(true);
57
+ mockedGitService.getStatus.mockReturnValue({
58
+ hasStagedChanges: true,
59
+ staged: [{ status: 'A', path: 'src/newFile.ts' }],
60
+ unstaged: [],
61
+ });
62
+ mockedGitService.getDiffStats.mockReturnValue({
63
+ filesChanged: 1,
64
+ insertions: 10,
65
+ deletions: 0,
66
+ });
67
+ mockedAnalyzerService.generateMultipleSuggestions.mockReturnValue([
68
+ {
69
+ id: 1,
70
+ label: 'Recommended',
71
+ message: {
72
+ type: 'feat',
73
+ description: 'add newFile.ts',
74
+ full: '✨ feat: add newFile.ts',
75
+ },
76
+ },
77
+ ]);
78
+ });
79
+ afterEach(() => {
80
+ consoleLogSpy.mockRestore();
81
+ consoleErrorSpy.mockRestore();
82
+ processExitSpy.mockRestore();
83
+ });
84
+ describe('GenerateOptions interface', () => {
85
+ it('should have dryRun as optional property', () => {
86
+ const options = {
87
+ dryRun: true,
88
+ };
89
+ expect(options.dryRun).toBe(true);
90
+ });
91
+ it('should have all optional properties', () => {
92
+ const options = {};
93
+ expect(options.commit).toBeUndefined();
94
+ expect(options.dryRun).toBeUndefined();
95
+ expect(options.interactive).toBeUndefined();
96
+ expect(options.messageOnly).toBeUndefined();
97
+ expect(options.single).toBeUndefined();
98
+ });
99
+ });
100
+ describe('dry run mode', () => {
101
+ it('should display DRY RUN header', async () => {
102
+ const { generateCommand } = await Promise.resolve().then(() => __importStar(require('./generate')));
103
+ await generateCommand({ dryRun: true });
104
+ expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('DRY RUN'));
105
+ });
106
+ it('should display files to be committed', async () => {
107
+ const { generateCommand } = await Promise.resolve().then(() => __importStar(require('./generate')));
108
+ await generateCommand({ dryRun: true });
109
+ expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('Files to be committed'));
110
+ });
111
+ it('should display commit message', async () => {
112
+ const { generateCommand } = await Promise.resolve().then(() => __importStar(require('./generate')));
113
+ await generateCommand({ dryRun: true });
114
+ expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('Commit message'));
115
+ });
116
+ it('should not call GitService.commit in dry run mode', async () => {
117
+ const { generateCommand } = await Promise.resolve().then(() => __importStar(require('./generate')));
118
+ await generateCommand({ dryRun: true });
119
+ expect(mockedGitService.commit).not.toHaveBeenCalled();
120
+ });
121
+ it('should display next steps after dry run', async () => {
122
+ const { generateCommand } = await Promise.resolve().then(() => __importStar(require('./generate')));
123
+ await generateCommand({ dryRun: true });
124
+ expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('commit-genie -c'));
125
+ });
126
+ it('should show message breakdown in dry run', async () => {
127
+ const { generateCommand } = await Promise.resolve().then(() => __importStar(require('./generate')));
128
+ await generateCommand({ dryRun: true });
129
+ expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('Breakdown'));
130
+ expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('Type:'));
131
+ });
132
+ it('should show command that would be executed', async () => {
133
+ const { generateCommand } = await Promise.resolve().then(() => __importStar(require('./generate')));
134
+ await generateCommand({ dryRun: true });
135
+ expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('Command that would be executed'));
136
+ });
137
+ });
138
+ describe('error handling', () => {
139
+ it('should exit when not in git repository', async () => {
140
+ mockedGitService.isGitRepository.mockReturnValue(false);
141
+ const { generateCommand } = await Promise.resolve().then(() => __importStar(require('./generate')));
142
+ await generateCommand({});
143
+ expect(consoleErrorSpy).toHaveBeenCalledWith('Error: Not a git repository');
144
+ expect(processExitSpy).toHaveBeenCalledWith(1);
145
+ });
146
+ it('should exit when no staged changes', async () => {
147
+ mockedGitService.getStatus.mockReturnValue({
148
+ hasStagedChanges: false,
149
+ staged: [],
150
+ unstaged: [],
151
+ });
152
+ const { generateCommand } = await Promise.resolve().then(() => __importStar(require('./generate')));
153
+ await generateCommand({});
154
+ expect(consoleErrorSpy).toHaveBeenCalledWith('Error: No staged changes found');
155
+ expect(processExitSpy).toHaveBeenCalledWith(1);
156
+ });
157
+ });
158
+ describe('message-only mode', () => {
159
+ it('should output only the commit message', async () => {
160
+ const { generateCommand } = await Promise.resolve().then(() => __importStar(require('./generate')));
161
+ await generateCommand({ messageOnly: true });
162
+ expect(consoleLogSpy).toHaveBeenCalledWith('✨ feat: add newFile.ts');
163
+ // Should only be called once with just the message
164
+ expect(consoleLogSpy).toHaveBeenCalledTimes(1);
165
+ });
166
+ });
167
+ });
168
+ //# sourceMappingURL=generate.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.test.js","sourceRoot":"","sources":["../../src/commands/generate.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function hookInstallCommand(): void;
2
+ export declare function hookUninstallCommand(): void;
3
+ export declare function hookStatusCommand(): void;
4
+ //# sourceMappingURL=hook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/commands/hook.ts"],"names":[],"mappings":"AAGA,wBAAgB,kBAAkB,SAoBjC;AAED,wBAAgB,oBAAoB,SAkBnC;AAED,wBAAgB,iBAAiB,SAkBhC"}
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hookInstallCommand = hookInstallCommand;
4
+ exports.hookUninstallCommand = hookUninstallCommand;
5
+ exports.hookStatusCommand = hookStatusCommand;
6
+ const hookService_1 = require("../services/hookService");
7
+ const gitService_1 = require("../services/gitService");
8
+ function hookInstallCommand() {
9
+ // Check if in a git repository
10
+ if (!gitService_1.GitService.isGitRepository()) {
11
+ console.error('Error: Not a git repository');
12
+ console.log('Please run this command inside a git repository.');
13
+ process.exit(1);
14
+ }
15
+ console.log('Installing CommitGenie git hook...\n');
16
+ const result = hookService_1.HookService.install();
17
+ if (result.success) {
18
+ console.log(`✓ ${result.message}`);
19
+ console.log('\nThe hook will automatically suggest commit messages when you run:');
20
+ console.log(' git commit');
21
+ }
22
+ else {
23
+ console.error(`✗ ${result.message}`);
24
+ process.exit(1);
25
+ }
26
+ }
27
+ function hookUninstallCommand() {
28
+ // Check if in a git repository
29
+ if (!gitService_1.GitService.isGitRepository()) {
30
+ console.error('Error: Not a git repository');
31
+ console.log('Please run this command inside a git repository.');
32
+ process.exit(1);
33
+ }
34
+ console.log('Uninstalling CommitGenie git hook...\n');
35
+ const result = hookService_1.HookService.uninstall();
36
+ if (result.success) {
37
+ console.log(`✓ ${result.message}`);
38
+ }
39
+ else {
40
+ console.error(`✗ ${result.message}`);
41
+ process.exit(1);
42
+ }
43
+ }
44
+ function hookStatusCommand() {
45
+ // Check if in a git repository
46
+ if (!gitService_1.GitService.isGitRepository()) {
47
+ console.error('Error: Not a git repository');
48
+ console.log('Please run this command inside a git repository.');
49
+ process.exit(1);
50
+ }
51
+ const isInstalled = hookService_1.HookService.isInstalled();
52
+ if (isInstalled) {
53
+ console.log('✓ CommitGenie hook is installed');
54
+ console.log(` Location: ${hookService_1.HookService.getHookPath()}`);
55
+ }
56
+ else {
57
+ console.log('✗ CommitGenie hook is not installed');
58
+ console.log('\nTo install, run:');
59
+ console.log(' commit-genie hook install');
60
+ }
61
+ }
62
+ //# sourceMappingURL=hook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook.js","sourceRoot":"","sources":["../../src/commands/hook.ts"],"names":[],"mappings":";;AAGA,gDAoBC;AAED,oDAkBC;AAED,8CAkBC;AA/DD,yDAAsD;AACtD,uDAAoD;AAEpD,SAAgB,kBAAkB;IAChC,+BAA+B;IAC/B,IAAI,CAAC,uBAAU,CAAC,eAAe,EAAE,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IAEpD,MAAM,MAAM,GAAG,yBAAW,CAAC,OAAO,EAAE,CAAC;IAErC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;QACnF,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC9B,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAgB,oBAAoB;IAClC,+BAA+B;IAC/B,IAAI,CAAC,uBAAU,CAAC,eAAe,EAAE,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IAEtD,MAAM,MAAM,GAAG,yBAAW,CAAC,SAAS,EAAE,CAAC;IAEvC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IACrC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAgB,iBAAiB;IAC/B,+BAA+B;IAC/B,IAAI,CAAC,uBAAU,CAAC,eAAe,EAAE,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,WAAW,GAAG,yBAAW,CAAC,WAAW,EAAE,CAAC;IAE9C,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,eAAe,yBAAW,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC1D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ export interface StatsOptions {
2
+ count?: number;
3
+ json?: boolean;
4
+ }
5
+ export declare function statsCommand(options?: StatsOptions): void;
6
+ //# sourceMappingURL=stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/commands/stats.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,YAAY,CAAC,OAAO,GAAE,YAAiB,QAkCtD"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.statsCommand = statsCommand;
4
+ const gitService_1 = require("../services/gitService");
5
+ const statsService_1 = require("../services/statsService");
6
+ function statsCommand(options = {}) {
7
+ try {
8
+ // Check if in a git repository
9
+ if (!gitService_1.GitService.isGitRepository()) {
10
+ console.error('Error: Not a git repository');
11
+ console.log('Please run this command inside a git repository.');
12
+ process.exit(1);
13
+ }
14
+ const commitCount = options.count || 100;
15
+ console.log(`\nAnalyzing last ${commitCount} commits...`);
16
+ const stats = statsService_1.StatsService.getCommitStats(commitCount);
17
+ if (stats.totalCommits === 0) {
18
+ console.log('\nNo commits found in this repository.');
19
+ console.log('Make some commits first to see statistics.');
20
+ return;
21
+ }
22
+ if (options.json) {
23
+ console.log(JSON.stringify(stats, null, 2));
24
+ }
25
+ else {
26
+ console.log(statsService_1.StatsService.formatStats(stats));
27
+ }
28
+ }
29
+ catch (error) {
30
+ if (error instanceof Error) {
31
+ console.error(`Error: ${error.message}`);
32
+ }
33
+ else {
34
+ console.error('An unexpected error occurred');
35
+ }
36
+ process.exit(1);
37
+ }
38
+ }
39
+ //# sourceMappingURL=stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/commands/stats.ts"],"names":[],"mappings":";;AAQA,oCAkCC;AA1CD,uDAAoD;AACpD,2DAAwD;AAOxD,SAAgB,YAAY,CAAC,UAAwB,EAAE;IACrD,IAAI,CAAC;QACH,+BAA+B;QAC/B,IAAI,CAAC,uBAAU,CAAC,eAAe,EAAE,EAAE,CAAC;YAClC,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;YAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC;QAEzC,OAAO,CAAC,GAAG,CAAC,oBAAoB,WAAW,aAAa,CAAC,CAAC;QAE1D,MAAM,KAAK,GAAG,2BAAY,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QAEvD,IAAI,KAAK,CAAC,YAAY,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;YAC1D,OAAO;QACT,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,2BAAY,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}