@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.
- package/LICENSE +21 -0
- package/README.md +430 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +31 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/generate.d.ts +10 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +313 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/generate.test.d.ts +2 -0
- package/dist/commands/generate.test.d.ts.map +1 -0
- package/dist/commands/generate.test.js +168 -0
- package/dist/commands/generate.test.js.map +1 -0
- package/dist/commands/hook.d.ts +4 -0
- package/dist/commands/hook.d.ts.map +1 -0
- package/dist/commands/hook.js +62 -0
- package/dist/commands/hook.js.map +1 -0
- package/dist/commands/stats.d.ts +6 -0
- package/dist/commands/stats.d.ts.map +1 -0
- package/dist/commands/stats.js +39 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +77 -0
- package/dist/index.js.map +1 -0
- package/dist/services/aiService.d.ts +38 -0
- package/dist/services/aiService.d.ts.map +1 -0
- package/dist/services/aiService.js +187 -0
- package/dist/services/aiService.js.map +1 -0
- package/dist/services/analyzerService.d.ts +60 -0
- package/dist/services/analyzerService.d.ts.map +1 -0
- package/dist/services/analyzerService.js +832 -0
- package/dist/services/analyzerService.js.map +1 -0
- package/dist/services/analyzerService.test.d.ts +2 -0
- package/dist/services/analyzerService.test.d.ts.map +1 -0
- package/dist/services/analyzerService.test.js +323 -0
- package/dist/services/analyzerService.test.js.map +1 -0
- package/dist/services/configService.d.ts +25 -0
- package/dist/services/configService.d.ts.map +1 -0
- package/dist/services/configService.js +207 -0
- package/dist/services/configService.js.map +1 -0
- package/dist/services/configService.test.d.ts +2 -0
- package/dist/services/configService.test.d.ts.map +1 -0
- package/dist/services/configService.test.js +165 -0
- package/dist/services/configService.test.js.map +1 -0
- package/dist/services/gitService.d.ts +44 -0
- package/dist/services/gitService.d.ts.map +1 -0
- package/dist/services/gitService.js +217 -0
- package/dist/services/gitService.js.map +1 -0
- package/dist/services/gitService.test.d.ts +2 -0
- package/dist/services/gitService.test.d.ts.map +1 -0
- package/dist/services/gitService.test.js +140 -0
- package/dist/services/gitService.test.js.map +1 -0
- package/dist/services/historyService.d.ts +39 -0
- package/dist/services/historyService.d.ts.map +1 -0
- package/dist/services/historyService.js +195 -0
- package/dist/services/historyService.js.map +1 -0
- package/dist/services/historyService.test.d.ts +2 -0
- package/dist/services/historyService.test.d.ts.map +1 -0
- package/dist/services/historyService.test.js +157 -0
- package/dist/services/historyService.test.js.map +1 -0
- package/dist/services/hookService.d.ts +29 -0
- package/dist/services/hookService.d.ts.map +1 -0
- package/dist/services/hookService.js +164 -0
- package/dist/services/hookService.js.map +1 -0
- package/dist/services/statsService.d.ts +28 -0
- package/dist/services/statsService.d.ts.map +1 -0
- package/dist/services/statsService.js +204 -0
- package/dist/services/statsService.js.map +1 -0
- package/dist/types/index.d.ts +134 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/filePatterns.d.ts +5 -0
- package/dist/utils/filePatterns.d.ts.map +1 -0
- package/dist/utils/filePatterns.js +77 -0
- package/dist/utils/filePatterns.js.map +1 -0
- package/dist/utils/filePatterns.test.d.ts +2 -0
- package/dist/utils/filePatterns.test.d.ts.map +1 -0
- package/dist/utils/filePatterns.test.js +51 -0
- package/dist/utils/filePatterns.test.js.map +1 -0
- package/dist/utils/prompt.d.ts +4 -0
- package/dist/utils/prompt.d.ts.map +1 -0
- package/dist/utils/prompt.js +60 -0
- package/dist/utils/prompt.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configService.js","sourceRoot":"","sources":["../../src/services/configService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configService.test.d.ts","sourceRoot":"","sources":["../../src/services/configService.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,165 @@
|
|
|
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 fs = __importStar(require("fs"));
|
|
37
|
+
const configService_1 = require("./configService");
|
|
38
|
+
const gitService_1 = require("./gitService");
|
|
39
|
+
// Mock dependencies
|
|
40
|
+
jest.mock('fs');
|
|
41
|
+
jest.mock('./gitService');
|
|
42
|
+
const mockedFs = fs;
|
|
43
|
+
const mockedGitService = gitService_1.GitService;
|
|
44
|
+
describe('ConfigService', () => {
|
|
45
|
+
beforeEach(() => {
|
|
46
|
+
jest.clearAllMocks();
|
|
47
|
+
configService_1.ConfigService.clearCache();
|
|
48
|
+
});
|
|
49
|
+
describe('loadConfig', () => {
|
|
50
|
+
it('should return default config when no config file exists', () => {
|
|
51
|
+
mockedGitService.getGitRoot.mockReturnValue('/project');
|
|
52
|
+
mockedFs.existsSync.mockReturnValue(false);
|
|
53
|
+
const config = configService_1.ConfigService.loadConfig();
|
|
54
|
+
expect(config.defaultType).toBe('feat');
|
|
55
|
+
expect(config.maxMessageLength).toBe(72);
|
|
56
|
+
expect(config.includeEmoji).toBeUndefined(); // Let history learning decide
|
|
57
|
+
expect(config.scopes).toEqual([]);
|
|
58
|
+
expect(config.ticketLinking?.enabled).toBe(true);
|
|
59
|
+
expect(config.learnFromHistory?.enabled).toBe(true);
|
|
60
|
+
expect(config.breakingChangeDetection?.enabled).toBe(true);
|
|
61
|
+
expect(config.breakingChangeDetection?.includeFooter).toBe(true);
|
|
62
|
+
});
|
|
63
|
+
it('should load config from .commitgenierc.json', () => {
|
|
64
|
+
mockedGitService.getGitRoot.mockReturnValue('/project');
|
|
65
|
+
mockedFs.existsSync.mockImplementation((filePath) => {
|
|
66
|
+
return String(filePath).includes('.commitgenierc.json');
|
|
67
|
+
});
|
|
68
|
+
mockedFs.readFileSync.mockReturnValue(JSON.stringify({
|
|
69
|
+
scopes: [{ pattern: 'src/api', scope: 'api' }],
|
|
70
|
+
defaultType: 'fix',
|
|
71
|
+
}));
|
|
72
|
+
const config = configService_1.ConfigService.loadConfig();
|
|
73
|
+
expect(config.defaultType).toBe('fix');
|
|
74
|
+
expect(config.scopes).toHaveLength(1);
|
|
75
|
+
expect(config.scopes[0].scope).toBe('api');
|
|
76
|
+
});
|
|
77
|
+
it('should merge user config with defaults', () => {
|
|
78
|
+
mockedGitService.getGitRoot.mockReturnValue('/project');
|
|
79
|
+
mockedFs.existsSync.mockImplementation((filePath) => {
|
|
80
|
+
return String(filePath).includes('.commitgenierc.json');
|
|
81
|
+
});
|
|
82
|
+
mockedFs.readFileSync.mockReturnValue(JSON.stringify({
|
|
83
|
+
defaultType: 'chore',
|
|
84
|
+
}));
|
|
85
|
+
const config = configService_1.ConfigService.loadConfig();
|
|
86
|
+
expect(config.defaultType).toBe('chore');
|
|
87
|
+
expect(config.maxMessageLength).toBe(72); // Default preserved
|
|
88
|
+
});
|
|
89
|
+
it('should cache config after first load', () => {
|
|
90
|
+
mockedGitService.getGitRoot.mockReturnValue('/project');
|
|
91
|
+
mockedFs.existsSync.mockReturnValue(false);
|
|
92
|
+
configService_1.ConfigService.loadConfig();
|
|
93
|
+
configService_1.ConfigService.loadConfig();
|
|
94
|
+
configService_1.ConfigService.loadConfig();
|
|
95
|
+
// getGitRoot should only be called once due to caching
|
|
96
|
+
expect(mockedGitService.getGitRoot).toHaveBeenCalledTimes(1);
|
|
97
|
+
});
|
|
98
|
+
it('should handle invalid JSON gracefully', () => {
|
|
99
|
+
mockedGitService.getGitRoot.mockReturnValue('/project');
|
|
100
|
+
mockedFs.existsSync.mockImplementation((filePath) => {
|
|
101
|
+
return String(filePath).includes('.commitgenierc.json');
|
|
102
|
+
});
|
|
103
|
+
mockedFs.readFileSync.mockReturnValue('{ invalid json }');
|
|
104
|
+
// Should not throw, should return defaults
|
|
105
|
+
const config = configService_1.ConfigService.loadConfig();
|
|
106
|
+
expect(config.defaultType).toBe('feat');
|
|
107
|
+
});
|
|
108
|
+
it('should fallback to cwd when not in git repo', () => {
|
|
109
|
+
mockedGitService.getGitRoot.mockImplementation(() => {
|
|
110
|
+
throw new Error('Not a git repo');
|
|
111
|
+
});
|
|
112
|
+
mockedFs.existsSync.mockReturnValue(false);
|
|
113
|
+
const config = configService_1.ConfigService.loadConfig();
|
|
114
|
+
expect(config).toBeDefined();
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
describe('getConfig', () => {
|
|
118
|
+
it('should return loaded config', () => {
|
|
119
|
+
mockedGitService.getGitRoot.mockReturnValue('/project');
|
|
120
|
+
mockedFs.existsSync.mockReturnValue(false);
|
|
121
|
+
const config = configService_1.ConfigService.getConfig();
|
|
122
|
+
expect(config).toBeDefined();
|
|
123
|
+
expect(config.defaultType).toBe('feat');
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
describe('clearCache', () => {
|
|
127
|
+
it('should clear the cached config', () => {
|
|
128
|
+
mockedGitService.getGitRoot.mockReturnValue('/project');
|
|
129
|
+
mockedFs.existsSync.mockReturnValue(false);
|
|
130
|
+
configService_1.ConfigService.loadConfig();
|
|
131
|
+
configService_1.ConfigService.clearCache();
|
|
132
|
+
configService_1.ConfigService.loadConfig();
|
|
133
|
+
expect(mockedGitService.getGitRoot).toHaveBeenCalledTimes(2);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
describe('initConfig', () => {
|
|
137
|
+
it('should create config file successfully', () => {
|
|
138
|
+
mockedGitService.getGitRoot.mockReturnValue('/project');
|
|
139
|
+
mockedFs.existsSync.mockReturnValue(false);
|
|
140
|
+
mockedFs.writeFileSync.mockImplementation(() => { });
|
|
141
|
+
const result = configService_1.ConfigService.initConfig();
|
|
142
|
+
expect(result.success).toBe(true);
|
|
143
|
+
expect(result.message).toBe('Config file created');
|
|
144
|
+
expect(mockedFs.writeFileSync).toHaveBeenCalled();
|
|
145
|
+
});
|
|
146
|
+
it('should fail if config already exists', () => {
|
|
147
|
+
mockedGitService.getGitRoot.mockReturnValue('/project');
|
|
148
|
+
mockedFs.existsSync.mockReturnValue(true);
|
|
149
|
+
const result = configService_1.ConfigService.initConfig();
|
|
150
|
+
expect(result.success).toBe(false);
|
|
151
|
+
expect(result.message).toBe('Config file already exists');
|
|
152
|
+
});
|
|
153
|
+
it('should handle write errors', () => {
|
|
154
|
+
mockedGitService.getGitRoot.mockReturnValue('/project');
|
|
155
|
+
mockedFs.existsSync.mockReturnValue(false);
|
|
156
|
+
mockedFs.writeFileSync.mockImplementation(() => {
|
|
157
|
+
throw new Error('Permission denied');
|
|
158
|
+
});
|
|
159
|
+
const result = configService_1.ConfigService.initConfig();
|
|
160
|
+
expect(result.success).toBe(false);
|
|
161
|
+
expect(result.message).toContain('Failed to create config');
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
//# sourceMappingURL=configService.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configService.test.js","sourceRoot":"","sources":["../../src/services/configService.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { GitStatus, FileChange, DiffStats, HistoricalCommit } from '../types';
|
|
2
|
+
export declare class GitService {
|
|
3
|
+
/**
|
|
4
|
+
* Check if current directory is a git repository
|
|
5
|
+
*/
|
|
6
|
+
static isGitRepository(): boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Get current git status with staged and unstaged files
|
|
9
|
+
*/
|
|
10
|
+
static getStatus(): GitStatus;
|
|
11
|
+
/**
|
|
12
|
+
* Get diff statistics for staged changes
|
|
13
|
+
*/
|
|
14
|
+
static getDiffStats(): DiffStats;
|
|
15
|
+
/**
|
|
16
|
+
* Get the actual diff content for staged changes
|
|
17
|
+
*/
|
|
18
|
+
static getDiff(): string;
|
|
19
|
+
/**
|
|
20
|
+
* Get list of staged files with their status
|
|
21
|
+
*/
|
|
22
|
+
static getStagedFiles(): FileChange[];
|
|
23
|
+
/**
|
|
24
|
+
* Commit staged changes with the given message (supports multi-line)
|
|
25
|
+
*/
|
|
26
|
+
static commit(message: string): void;
|
|
27
|
+
/**
|
|
28
|
+
* Get the root directory of the git repository
|
|
29
|
+
*/
|
|
30
|
+
static getGitRoot(): string;
|
|
31
|
+
/**
|
|
32
|
+
* Get the .git directory path (works reliably on Windows)
|
|
33
|
+
*/
|
|
34
|
+
static getGitDir(): string;
|
|
35
|
+
/**
|
|
36
|
+
* Get the current branch name
|
|
37
|
+
*/
|
|
38
|
+
static getCurrentBranch(): string | null;
|
|
39
|
+
/**
|
|
40
|
+
* Get recent commit history
|
|
41
|
+
*/
|
|
42
|
+
static getCommitHistory(count?: number): HistoricalCommit[];
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=gitService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitService.d.ts","sourceRoot":"","sources":["../../src/services/gitService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE9E,qBAAa,UAAU;IACrB;;OAEG;IACH,MAAM,CAAC,eAAe,IAAI,OAAO;IASjC;;OAEG;IACH,MAAM,CAAC,SAAS,IAAI,SAAS;IAuC7B;;OAEG;IACH,MAAM,CAAC,YAAY,IAAI,SAAS;IA0BhC;;OAEG;IACH,MAAM,CAAC,OAAO,IAAI,MAAM;IAYxB;;OAEG;IACH,MAAM,CAAC,cAAc,IAAI,UAAU,EAAE;IAKrC;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAqBpC;;OAEG;IACH,MAAM,CAAC,UAAU,IAAI,MAAM;IAW3B;;OAEG;IACH,MAAM,CAAC,SAAS,IAAI,MAAM;IAqB1B;;OAEG;IACH,MAAM,CAAC,gBAAgB,IAAI,MAAM,GAAG,IAAI;IAYxC;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,KAAK,GAAE,MAAW,GAAG,gBAAgB,EAAE;CAsChE"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GitService = void 0;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
class GitService {
|
|
6
|
+
/**
|
|
7
|
+
* Check if current directory is a git repository
|
|
8
|
+
*/
|
|
9
|
+
static isGitRepository() {
|
|
10
|
+
try {
|
|
11
|
+
(0, child_process_1.execSync)('git rev-parse --git-dir', { stdio: 'pipe' });
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Get current git status with staged and unstaged files
|
|
20
|
+
*/
|
|
21
|
+
static getStatus() {
|
|
22
|
+
try {
|
|
23
|
+
const output = (0, child_process_1.execSync)('git status --porcelain', {
|
|
24
|
+
encoding: 'utf-8',
|
|
25
|
+
});
|
|
26
|
+
const staged = [];
|
|
27
|
+
const unstaged = [];
|
|
28
|
+
const lines = output.split('\n').filter((line) => line.trim());
|
|
29
|
+
for (const line of lines) {
|
|
30
|
+
if (line.length < 3)
|
|
31
|
+
continue;
|
|
32
|
+
const stagedStatus = line[0];
|
|
33
|
+
const unstagedStatus = line[1];
|
|
34
|
+
const path = line.substring(3).trim();
|
|
35
|
+
// Staged changes (first character)
|
|
36
|
+
if (stagedStatus !== ' ' && stagedStatus !== '?') {
|
|
37
|
+
staged.push({ status: stagedStatus, path });
|
|
38
|
+
}
|
|
39
|
+
// Unstaged changes (second character)
|
|
40
|
+
if (unstagedStatus !== ' ' && stagedStatus === ' ') {
|
|
41
|
+
unstaged.push({ status: unstagedStatus, path });
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
staged,
|
|
46
|
+
unstaged,
|
|
47
|
+
hasStagedChanges: staged.length > 0,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
throw new Error(`Failed to get git status: ${error}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get diff statistics for staged changes
|
|
56
|
+
*/
|
|
57
|
+
static getDiffStats() {
|
|
58
|
+
try {
|
|
59
|
+
const output = (0, child_process_1.execSync)('git diff --cached --shortstat', {
|
|
60
|
+
encoding: 'utf-8',
|
|
61
|
+
});
|
|
62
|
+
let filesChanged = 0;
|
|
63
|
+
let insertions = 0;
|
|
64
|
+
let deletions = 0;
|
|
65
|
+
if (output.trim()) {
|
|
66
|
+
const filesMatch = output.match(/(\d+) files? changed/);
|
|
67
|
+
const insertionsMatch = output.match(/(\d+) insertions?/);
|
|
68
|
+
const deletionsMatch = output.match(/(\d+) deletions?/);
|
|
69
|
+
if (filesMatch)
|
|
70
|
+
filesChanged = parseInt(filesMatch[1], 10);
|
|
71
|
+
if (insertionsMatch)
|
|
72
|
+
insertions = parseInt(insertionsMatch[1], 10);
|
|
73
|
+
if (deletionsMatch)
|
|
74
|
+
deletions = parseInt(deletionsMatch[1], 10);
|
|
75
|
+
}
|
|
76
|
+
return { filesChanged, insertions, deletions };
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
throw new Error(`Failed to get diff stats: ${error}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Get the actual diff content for staged changes
|
|
84
|
+
*/
|
|
85
|
+
static getDiff() {
|
|
86
|
+
try {
|
|
87
|
+
const output = (0, child_process_1.execSync)('git diff --cached', {
|
|
88
|
+
encoding: 'utf-8',
|
|
89
|
+
maxBuffer: 1024 * 1024 * 10, // 10MB buffer
|
|
90
|
+
});
|
|
91
|
+
return output;
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
throw new Error(`Failed to get diff: ${error}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Get list of staged files with their status
|
|
99
|
+
*/
|
|
100
|
+
static getStagedFiles() {
|
|
101
|
+
const status = this.getStatus();
|
|
102
|
+
return status.staged;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Commit staged changes with the given message (supports multi-line)
|
|
106
|
+
*/
|
|
107
|
+
static commit(message) {
|
|
108
|
+
try {
|
|
109
|
+
// Use -F - to read message from stdin (supports multi-line)
|
|
110
|
+
const result = (0, child_process_1.spawnSync)('git', ['commit', '-F', '-'], {
|
|
111
|
+
input: message,
|
|
112
|
+
encoding: 'utf-8',
|
|
113
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
114
|
+
});
|
|
115
|
+
if (result.status !== 0) {
|
|
116
|
+
const errorMsg = result.stderr?.trim() || result.stdout?.trim() || 'Unknown error';
|
|
117
|
+
throw new Error(errorMsg);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
if (error.message) {
|
|
122
|
+
throw new Error(`Failed to commit: ${error.message}`);
|
|
123
|
+
}
|
|
124
|
+
throw new Error('Failed to commit: Unknown error');
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Get the root directory of the git repository
|
|
129
|
+
*/
|
|
130
|
+
static getGitRoot() {
|
|
131
|
+
try {
|
|
132
|
+
const output = (0, child_process_1.execSync)('git rev-parse --show-toplevel', {
|
|
133
|
+
encoding: 'utf-8',
|
|
134
|
+
});
|
|
135
|
+
return output.trim();
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
throw new Error('Failed to get git root directory');
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Get the .git directory path (works reliably on Windows)
|
|
143
|
+
*/
|
|
144
|
+
static getGitDir() {
|
|
145
|
+
try {
|
|
146
|
+
const output = (0, child_process_1.execSync)('git rev-parse --git-dir', {
|
|
147
|
+
encoding: 'utf-8',
|
|
148
|
+
});
|
|
149
|
+
const gitDir = output.trim();
|
|
150
|
+
// If relative path, resolve from cwd
|
|
151
|
+
if (gitDir === '.git' || !gitDir.startsWith('/')) {
|
|
152
|
+
return require('path').resolve(process.cwd(), gitDir);
|
|
153
|
+
}
|
|
154
|
+
// Handle Unix-style absolute paths on Windows (from Git Bash)
|
|
155
|
+
if (process.platform === 'win32' && gitDir.match(/^\/[a-zA-Z]\//)) {
|
|
156
|
+
// Convert /d/path to D:/path
|
|
157
|
+
return gitDir.replace(/^\/([a-zA-Z])\//, '$1:/').replace(/\//g, '\\');
|
|
158
|
+
}
|
|
159
|
+
return gitDir;
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
throw new Error('Failed to get git directory');
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Get the current branch name
|
|
167
|
+
*/
|
|
168
|
+
static getCurrentBranch() {
|
|
169
|
+
try {
|
|
170
|
+
const output = (0, child_process_1.execSync)('git rev-parse --abbrev-ref HEAD', {
|
|
171
|
+
encoding: 'utf-8',
|
|
172
|
+
});
|
|
173
|
+
const branch = output.trim();
|
|
174
|
+
return branch === 'HEAD' ? null : branch; // Detached HEAD state
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Get recent commit history
|
|
182
|
+
*/
|
|
183
|
+
static getCommitHistory(count = 50) {
|
|
184
|
+
try {
|
|
185
|
+
// Use %x00 as delimiter to handle multi-line messages
|
|
186
|
+
const format = '%H%x00%s%x00%b%x00';
|
|
187
|
+
const output = (0, child_process_1.execSync)(`git log -${count} --format="${format}"`, {
|
|
188
|
+
encoding: 'utf-8',
|
|
189
|
+
maxBuffer: 1024 * 1024 * 5, // 5MB buffer
|
|
190
|
+
});
|
|
191
|
+
const commits = [];
|
|
192
|
+
const entries = output.split('\x00\x00').filter(e => e.trim());
|
|
193
|
+
for (const entry of entries) {
|
|
194
|
+
const parts = entry.split('\x00');
|
|
195
|
+
if (parts.length >= 2) {
|
|
196
|
+
const hash = parts[0].trim();
|
|
197
|
+
const subject = parts[1].trim();
|
|
198
|
+
const body = parts[2]?.trim() || undefined;
|
|
199
|
+
if (hash && subject) {
|
|
200
|
+
commits.push({
|
|
201
|
+
hash,
|
|
202
|
+
subject,
|
|
203
|
+
message: body ? `${subject}\n\n${body}` : subject,
|
|
204
|
+
body,
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return commits;
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
return [];
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
exports.GitService = GitService;
|
|
217
|
+
//# sourceMappingURL=gitService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitService.js","sourceRoot":"","sources":["../../src/services/gitService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitService.test.d.ts","sourceRoot":"","sources":["../../src/services/gitService.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const child_process_1 = require("child_process");
|
|
4
|
+
const gitService_1 = require("./gitService");
|
|
5
|
+
// Mock child_process
|
|
6
|
+
jest.mock('child_process', () => ({
|
|
7
|
+
execSync: jest.fn(),
|
|
8
|
+
spawnSync: jest.fn(),
|
|
9
|
+
}));
|
|
10
|
+
const mockedExecSync = child_process_1.execSync;
|
|
11
|
+
const mockedSpawnSync = child_process_1.spawnSync;
|
|
12
|
+
describe('GitService', () => {
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
jest.clearAllMocks();
|
|
15
|
+
});
|
|
16
|
+
describe('isGitRepository', () => {
|
|
17
|
+
it('should return true when in a git repository', () => {
|
|
18
|
+
mockedExecSync.mockReturnValueOnce(Buffer.from('.git'));
|
|
19
|
+
expect(gitService_1.GitService.isGitRepository()).toBe(true);
|
|
20
|
+
});
|
|
21
|
+
it('should return false when not in a git repository', () => {
|
|
22
|
+
mockedExecSync.mockImplementationOnce(() => {
|
|
23
|
+
throw new Error('Not a git repository');
|
|
24
|
+
});
|
|
25
|
+
expect(gitService_1.GitService.isGitRepository()).toBe(false);
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
describe('getStatus', () => {
|
|
29
|
+
it('should parse staged files correctly', () => {
|
|
30
|
+
mockedExecSync.mockReturnValueOnce('A src/newFile.ts\nM src/modified.ts\nD src/deleted.ts\n');
|
|
31
|
+
const status = gitService_1.GitService.getStatus();
|
|
32
|
+
expect(status.hasStagedChanges).toBe(true);
|
|
33
|
+
expect(status.staged).toHaveLength(3);
|
|
34
|
+
expect(status.staged[0]).toEqual({ status: 'A', path: 'src/newFile.ts' });
|
|
35
|
+
expect(status.staged[1]).toEqual({ status: 'M', path: 'src/modified.ts' });
|
|
36
|
+
expect(status.staged[2]).toEqual({ status: 'D', path: 'src/deleted.ts' });
|
|
37
|
+
});
|
|
38
|
+
it('should return empty arrays when no changes', () => {
|
|
39
|
+
mockedExecSync.mockReturnValueOnce('');
|
|
40
|
+
const status = gitService_1.GitService.getStatus();
|
|
41
|
+
expect(status.hasStagedChanges).toBe(false);
|
|
42
|
+
expect(status.staged).toHaveLength(0);
|
|
43
|
+
expect(status.unstaged).toHaveLength(0);
|
|
44
|
+
});
|
|
45
|
+
it('should handle renamed files', () => {
|
|
46
|
+
mockedExecSync.mockReturnValueOnce('R old.ts -> new.ts\n');
|
|
47
|
+
const status = gitService_1.GitService.getStatus();
|
|
48
|
+
expect(status.staged[0].status).toBe('R');
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
describe('getDiffStats', () => {
|
|
52
|
+
it('should parse diff stats correctly', () => {
|
|
53
|
+
mockedExecSync.mockReturnValueOnce(' 3 files changed, 45 insertions(+), 10 deletions(-)\n');
|
|
54
|
+
const stats = gitService_1.GitService.getDiffStats();
|
|
55
|
+
expect(stats.filesChanged).toBe(3);
|
|
56
|
+
expect(stats.insertions).toBe(45);
|
|
57
|
+
expect(stats.deletions).toBe(10);
|
|
58
|
+
});
|
|
59
|
+
it('should handle empty diff', () => {
|
|
60
|
+
mockedExecSync.mockReturnValueOnce('');
|
|
61
|
+
const stats = gitService_1.GitService.getDiffStats();
|
|
62
|
+
expect(stats.filesChanged).toBe(0);
|
|
63
|
+
expect(stats.insertions).toBe(0);
|
|
64
|
+
expect(stats.deletions).toBe(0);
|
|
65
|
+
});
|
|
66
|
+
it('should handle single file change', () => {
|
|
67
|
+
mockedExecSync.mockReturnValueOnce(' 1 file changed, 5 insertions(+)\n');
|
|
68
|
+
const stats = gitService_1.GitService.getDiffStats();
|
|
69
|
+
expect(stats.filesChanged).toBe(1);
|
|
70
|
+
expect(stats.insertions).toBe(5);
|
|
71
|
+
expect(stats.deletions).toBe(0);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
describe('getDiff', () => {
|
|
75
|
+
it('should return diff content', () => {
|
|
76
|
+
const mockDiff = `diff --git a/file.ts b/file.ts
|
|
77
|
+
+++ b/file.ts
|
|
78
|
+
+const newLine = true;`;
|
|
79
|
+
mockedExecSync.mockReturnValueOnce(mockDiff);
|
|
80
|
+
const diff = gitService_1.GitService.getDiff();
|
|
81
|
+
expect(diff).toBe(mockDiff);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
describe('commit', () => {
|
|
85
|
+
it('should execute git commit with message', () => {
|
|
86
|
+
mockedSpawnSync.mockReturnValueOnce({
|
|
87
|
+
status: 0,
|
|
88
|
+
stdout: '',
|
|
89
|
+
stderr: '',
|
|
90
|
+
pid: 123,
|
|
91
|
+
output: [],
|
|
92
|
+
signal: null,
|
|
93
|
+
});
|
|
94
|
+
expect(() => gitService_1.GitService.commit('feat: add new feature')).not.toThrow();
|
|
95
|
+
expect(mockedSpawnSync).toHaveBeenCalledWith('git', ['commit', '-F', '-'], expect.objectContaining({
|
|
96
|
+
input: 'feat: add new feature',
|
|
97
|
+
}));
|
|
98
|
+
});
|
|
99
|
+
it('should handle multi-line commit messages', () => {
|
|
100
|
+
mockedSpawnSync.mockReturnValueOnce({
|
|
101
|
+
status: 0,
|
|
102
|
+
stdout: '',
|
|
103
|
+
stderr: '',
|
|
104
|
+
pid: 123,
|
|
105
|
+
output: [],
|
|
106
|
+
signal: null,
|
|
107
|
+
});
|
|
108
|
+
const multiLineMessage = 'feat: add new feature\n\nThis is the body\nwith multiple lines';
|
|
109
|
+
gitService_1.GitService.commit(multiLineMessage);
|
|
110
|
+
expect(mockedSpawnSync).toHaveBeenCalledWith('git', ['commit', '-F', '-'], expect.objectContaining({
|
|
111
|
+
input: multiLineMessage,
|
|
112
|
+
}));
|
|
113
|
+
});
|
|
114
|
+
it('should throw error when commit fails', () => {
|
|
115
|
+
mockedSpawnSync.mockReturnValueOnce({
|
|
116
|
+
status: 1,
|
|
117
|
+
stdout: '',
|
|
118
|
+
stderr: 'nothing to commit',
|
|
119
|
+
pid: 123,
|
|
120
|
+
output: [],
|
|
121
|
+
signal: null,
|
|
122
|
+
});
|
|
123
|
+
expect(() => gitService_1.GitService.commit('test')).toThrow('Failed to commit');
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
describe('getGitDir', () => {
|
|
127
|
+
it('should resolve relative .git path', () => {
|
|
128
|
+
mockedExecSync.mockReturnValueOnce('.git\n');
|
|
129
|
+
const result = gitService_1.GitService.getGitDir();
|
|
130
|
+
// Should resolve to absolute path ending with .git
|
|
131
|
+
expect(result.endsWith('.git')).toBe(true);
|
|
132
|
+
});
|
|
133
|
+
it('should handle absolute paths', () => {
|
|
134
|
+
mockedExecSync.mockReturnValueOnce('/home/user/project/.git\n');
|
|
135
|
+
const result = gitService_1.GitService.getGitDir();
|
|
136
|
+
expect(result).toBe('/home/user/project/.git');
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
//# sourceMappingURL=gitService.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitService.test.js","sourceRoot":"","sources":["../../src/services/gitService.test.ts"],"names":[],"mappings":"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"}
|