@ksw8954/git-ai-commit 1.1.1 → 1.1.4
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/AGENTS.md +8 -0
- package/CHANGELOG.md +22 -0
- package/dist/commands/ai.d.ts +1 -1
- package/dist/commands/ai.d.ts.map +1 -1
- package/dist/commands/ai.js +10 -3
- package/dist/commands/ai.js.map +1 -1
- package/dist/commands/commit.d.ts.map +1 -1
- package/dist/commands/commit.js +8 -0
- package/dist/commands/commit.js.map +1 -1
- package/dist/commands/git.d.ts +1 -0
- package/dist/commands/git.d.ts.map +1 -1
- package/dist/commands/git.js +20 -0
- package/dist/commands/git.js.map +1 -1
- package/dist/commands/history.d.ts.map +1 -1
- package/dist/commands/history.js +5 -5
- package/dist/commands/history.js.map +1 -1
- package/dist/commands/log.d.ts +9 -1
- package/dist/commands/log.d.ts.map +1 -1
- package/dist/commands/log.js +19 -1
- package/dist/commands/log.js.map +1 -1
- package/dist/commands/prCommand.d.ts.map +1 -1
- package/dist/commands/prCommand.js +8 -4
- package/dist/commands/prCommand.js.map +1 -1
- package/dist/commands/tag.d.ts +1 -0
- package/dist/commands/tag.d.ts.map +1 -1
- package/dist/commands/tag.js +82 -28
- package/dist/commands/tag.js.map +1 -1
- package/dist/prompts/tag.d.ts +1 -1
- package/dist/prompts/tag.d.ts.map +1 -1
- package/dist/prompts/tag.js +35 -3
- package/dist/prompts/tag.js.map +1 -1
- package/package.json +12 -12
- package/src/commands/ai.ts +19 -3
- package/src/commands/commit.ts +8 -0
- package/src/commands/git.ts +20 -0
- package/src/commands/history.ts +6 -5
- package/src/commands/log.ts +30 -2
- package/src/commands/prCommand.ts +8 -4
- package/src/commands/tag.ts +98 -30
- package/src/prompts/tag.ts +39 -3
package/dist/commands/tag.js
CHANGED
|
@@ -14,7 +14,7 @@ class TagCommand {
|
|
|
14
14
|
constructor() {
|
|
15
15
|
this.program = new commander_1.Command('tag')
|
|
16
16
|
.description('Create an annotated git tag with optional AI-generated notes')
|
|
17
|
-
.argument('
|
|
17
|
+
.argument('[name]', 'Tag name to create (auto-increments patch version if omitted)')
|
|
18
18
|
.option('-k, --api-key <key>', 'OpenAI API key (overrides env var)')
|
|
19
19
|
.option('--base-url <url>', 'Custom API base URL (overrides env var)')
|
|
20
20
|
.option('-m, --model <model>', 'Model to use (overrides env var)')
|
|
@@ -25,6 +25,16 @@ class TagCommand {
|
|
|
25
25
|
await this.handleTag(tagName, options);
|
|
26
26
|
});
|
|
27
27
|
}
|
|
28
|
+
incrementPatchVersion(version) {
|
|
29
|
+
// Match semver patterns: v1.2.3, 1.2.3, prefix-v1.2.3, prefix-1.2.3, etc.
|
|
30
|
+
const match = version.match(/^(.*?-?)?(v?)(\d+)\.(\d+)\.(\d+)(.*)$/);
|
|
31
|
+
if (!match) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
const [, prefix = '', v = '', major, minor, patch, suffix = ''] = match;
|
|
35
|
+
const newPatch = parseInt(patch, 10) + 1;
|
|
36
|
+
return `${prefix}${v}${major}.${minor}.${newPatch}${suffix}`;
|
|
37
|
+
}
|
|
28
38
|
resolveAIConfig(options) {
|
|
29
39
|
const storedConfig = config_1.ConfigService.getConfig();
|
|
30
40
|
const mergedApiKey = options.apiKey || storedConfig.apiKey;
|
|
@@ -42,23 +52,48 @@ class TagCommand {
|
|
|
42
52
|
};
|
|
43
53
|
}
|
|
44
54
|
async handleTag(tagName, options) {
|
|
45
|
-
const
|
|
55
|
+
const storedConfig = config_1.ConfigService.getConfig();
|
|
56
|
+
const mergedModel = options.model || storedConfig.model;
|
|
57
|
+
let trimmedName = tagName?.trim();
|
|
58
|
+
// If no tag name provided, auto-increment from latest tag
|
|
46
59
|
if (!trimmedName) {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
60
|
+
const latestTagResult = await git_1.GitService.getLatestTag();
|
|
61
|
+
if (!latestTagResult.success || !latestTagResult.tag) {
|
|
62
|
+
console.error('No existing tags found. Please provide a tag name explicitly.');
|
|
63
|
+
await log_1.LogService.append({
|
|
64
|
+
command: 'tag',
|
|
65
|
+
args: { ...options, apiKey: options.apiKey ? '***' : undefined },
|
|
66
|
+
status: 'failure',
|
|
67
|
+
details: 'no existing tags found for auto-increment',
|
|
68
|
+
model: mergedModel
|
|
69
|
+
});
|
|
70
|
+
process.exit(1);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const newVersion = this.incrementPatchVersion(latestTagResult.tag);
|
|
74
|
+
if (!newVersion) {
|
|
75
|
+
console.error(`Cannot parse version from tag "${latestTagResult.tag}". Please provide a tag name explicitly.`);
|
|
76
|
+
await log_1.LogService.append({
|
|
77
|
+
command: 'tag',
|
|
78
|
+
args: { ...options, apiKey: options.apiKey ? '***' : undefined },
|
|
79
|
+
status: 'failure',
|
|
80
|
+
details: `cannot parse version from tag: ${latestTagResult.tag}`,
|
|
81
|
+
model: mergedModel
|
|
82
|
+
});
|
|
83
|
+
process.exit(1);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
console.log(`Latest tag: ${latestTagResult.tag}`);
|
|
87
|
+
console.log(`New tag: ${newVersion}`);
|
|
88
|
+
trimmedName = newVersion;
|
|
56
89
|
}
|
|
57
90
|
// Check if tag already exists locally
|
|
58
91
|
const localTagExists = await git_1.GitService.tagExists(trimmedName);
|
|
59
92
|
let remoteTagExists = false;
|
|
60
|
-
let
|
|
93
|
+
let previousTagMessage = null;
|
|
61
94
|
if (localTagExists) {
|
|
95
|
+
// Get existing tag message before deletion for reference
|
|
96
|
+
previousTagMessage = await git_1.GitService.getTagMessage(trimmedName);
|
|
62
97
|
console.log(`⚠️ Tag ${trimmedName} already exists locally.`);
|
|
63
98
|
const shouldDelete = await this.confirmTagDelete(trimmedName);
|
|
64
99
|
if (!shouldDelete) {
|
|
@@ -67,7 +102,8 @@ class TagCommand {
|
|
|
67
102
|
command: 'tag',
|
|
68
103
|
args: { name: trimmedName, ...options, apiKey: options.apiKey ? '***' : undefined },
|
|
69
104
|
status: 'cancelled',
|
|
70
|
-
details: 'user declined to replace existing tag'
|
|
105
|
+
details: 'user declined to replace existing tag',
|
|
106
|
+
model: mergedModel
|
|
71
107
|
});
|
|
72
108
|
return;
|
|
73
109
|
}
|
|
@@ -85,7 +121,8 @@ class TagCommand {
|
|
|
85
121
|
command: 'tag',
|
|
86
122
|
args: { name: trimmedName, ...options, apiKey: options.apiKey ? '***' : undefined },
|
|
87
123
|
status: 'failure',
|
|
88
|
-
details: 'remote tag deletion failed'
|
|
124
|
+
details: 'remote tag deletion failed',
|
|
125
|
+
model: mergedModel
|
|
89
126
|
});
|
|
90
127
|
process.exit(1);
|
|
91
128
|
return;
|
|
@@ -103,13 +140,13 @@ class TagCommand {
|
|
|
103
140
|
command: 'tag',
|
|
104
141
|
args: { name: trimmedName, ...options, apiKey: options.apiKey ? '***' : undefined },
|
|
105
142
|
status: 'failure',
|
|
106
|
-
details: 'local tag deletion failed'
|
|
143
|
+
details: 'local tag deletion failed',
|
|
144
|
+
model: mergedModel
|
|
107
145
|
});
|
|
108
146
|
process.exit(1);
|
|
109
147
|
return;
|
|
110
148
|
}
|
|
111
149
|
console.log(`✅ Local tag ${trimmedName} deleted`);
|
|
112
|
-
wasTagReplaced = true;
|
|
113
150
|
}
|
|
114
151
|
let tagMessage = options.message?.trim();
|
|
115
152
|
if (!tagMessage) {
|
|
@@ -125,6 +162,14 @@ class TagCommand {
|
|
|
125
162
|
console.log('No existing tag found; using entire commit history.');
|
|
126
163
|
}
|
|
127
164
|
}
|
|
165
|
+
// Get style reference from base tag (if different from current tag being replaced)
|
|
166
|
+
let styleReferenceMessage = null;
|
|
167
|
+
if (baseTag && baseTag !== trimmedName) {
|
|
168
|
+
styleReferenceMessage = await git_1.GitService.getTagMessage(baseTag);
|
|
169
|
+
if (styleReferenceMessage) {
|
|
170
|
+
console.log(`Using ${baseTag} message as style reference.`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
128
173
|
const historyResult = await git_1.GitService.getCommitSummariesSince(baseTag);
|
|
129
174
|
if (!historyResult.success || !historyResult.log) {
|
|
130
175
|
console.error('Error:', historyResult.error ?? 'Unable to read commit history.');
|
|
@@ -132,7 +177,8 @@ class TagCommand {
|
|
|
132
177
|
command: 'tag',
|
|
133
178
|
args: { name: trimmedName, ...options, apiKey: options.apiKey ? '***' : undefined },
|
|
134
179
|
status: 'failure',
|
|
135
|
-
details: historyResult.error ?? 'Unable to read commit history.'
|
|
180
|
+
details: historyResult.error ?? 'Unable to read commit history.',
|
|
181
|
+
model: mergedModel
|
|
136
182
|
});
|
|
137
183
|
process.exit(1);
|
|
138
184
|
return;
|
|
@@ -148,20 +194,22 @@ class TagCommand {
|
|
|
148
194
|
command: 'tag',
|
|
149
195
|
args: { name: trimmedName, ...options, apiKey: options.apiKey ? '***' : undefined },
|
|
150
196
|
status: 'failure',
|
|
151
|
-
details: message
|
|
197
|
+
details: message,
|
|
198
|
+
model: mergedModel
|
|
152
199
|
});
|
|
153
200
|
process.exit(1);
|
|
154
201
|
return;
|
|
155
202
|
}
|
|
156
203
|
const aiService = new ai_1.AIService(aiConfig);
|
|
157
|
-
const aiResult = await aiService.generateTagNotes(trimmedName, historyResult.log, options.prompt);
|
|
204
|
+
const aiResult = await aiService.generateTagNotes(trimmedName, historyResult.log, options.prompt, previousTagMessage, styleReferenceMessage);
|
|
158
205
|
if (!aiResult.success || !aiResult.notes) {
|
|
159
206
|
console.error('Error:', aiResult.error ?? 'Failed to generate tag notes.');
|
|
160
207
|
await log_1.LogService.append({
|
|
161
208
|
command: 'tag',
|
|
162
209
|
args: { name: trimmedName, ...options, apiKey: options.apiKey ? '***' : undefined },
|
|
163
210
|
status: 'failure',
|
|
164
|
-
details: aiResult.error ?? 'Failed to generate tag notes.'
|
|
211
|
+
details: aiResult.error ?? 'Failed to generate tag notes.',
|
|
212
|
+
model: mergedModel
|
|
165
213
|
});
|
|
166
214
|
process.exit(1);
|
|
167
215
|
return;
|
|
@@ -178,7 +226,8 @@ class TagCommand {
|
|
|
178
226
|
command: 'tag',
|
|
179
227
|
args: { name: trimmedName, ...options, apiKey: options.apiKey ? '***' : undefined },
|
|
180
228
|
status: 'cancelled',
|
|
181
|
-
details: 'user declined tag creation'
|
|
229
|
+
details: 'user declined tag creation',
|
|
230
|
+
model: mergedModel
|
|
182
231
|
});
|
|
183
232
|
return;
|
|
184
233
|
}
|
|
@@ -190,7 +239,8 @@ class TagCommand {
|
|
|
190
239
|
command: 'tag',
|
|
191
240
|
args: { name: trimmedName, ...options, apiKey: options.apiKey ? '***' : undefined },
|
|
192
241
|
status: 'failure',
|
|
193
|
-
details: 'git tag creation failed'
|
|
242
|
+
details: 'git tag creation failed',
|
|
243
|
+
model: mergedModel
|
|
194
244
|
});
|
|
195
245
|
process.exit(1);
|
|
196
246
|
return;
|
|
@@ -204,8 +254,8 @@ class TagCommand {
|
|
|
204
254
|
else {
|
|
205
255
|
const selectedRemotes = await this.selectRemotesForPush(trimmedName, remotes);
|
|
206
256
|
if (selectedRemotes && selectedRemotes.length > 0) {
|
|
207
|
-
// If tag
|
|
208
|
-
const needsForcePush =
|
|
257
|
+
// If remote tag still exists (user declined to delete), use force push
|
|
258
|
+
const needsForcePush = remoteTagExists;
|
|
209
259
|
if (needsForcePush) {
|
|
210
260
|
console.log(`\n⚠️ Tag ${trimmedName} may exist on remote. Force push is required.`);
|
|
211
261
|
const shouldForcePush = await this.confirmForcePush(trimmedName);
|
|
@@ -215,7 +265,8 @@ class TagCommand {
|
|
|
215
265
|
command: 'tag',
|
|
216
266
|
args: { name: trimmedName, ...options, apiKey: options.apiKey ? '***' : undefined },
|
|
217
267
|
status: 'cancelled',
|
|
218
|
-
details: 'user declined force push'
|
|
268
|
+
details: 'user declined force push',
|
|
269
|
+
model: mergedModel
|
|
219
270
|
});
|
|
220
271
|
return;
|
|
221
272
|
}
|
|
@@ -231,7 +282,8 @@ class TagCommand {
|
|
|
231
282
|
command: 'tag',
|
|
232
283
|
args: { name: trimmedName, ...options, apiKey: options.apiKey ? '***' : undefined },
|
|
233
284
|
status: 'failure',
|
|
234
|
-
details: `tag force push to ${remote} failed
|
|
285
|
+
details: `tag force push to ${remote} failed`,
|
|
286
|
+
model: mergedModel
|
|
235
287
|
});
|
|
236
288
|
}
|
|
237
289
|
}
|
|
@@ -249,7 +301,8 @@ class TagCommand {
|
|
|
249
301
|
command: 'tag',
|
|
250
302
|
args: { name: trimmedName, ...options, apiKey: options.apiKey ? '***' : undefined },
|
|
251
303
|
status: 'failure',
|
|
252
|
-
details: `tag push to ${remote} failed
|
|
304
|
+
details: `tag push to ${remote} failed`,
|
|
305
|
+
model: mergedModel
|
|
253
306
|
});
|
|
254
307
|
}
|
|
255
308
|
}
|
|
@@ -259,7 +312,8 @@ class TagCommand {
|
|
|
259
312
|
await log_1.LogService.append({
|
|
260
313
|
command: 'tag',
|
|
261
314
|
args: { name: trimmedName, ...options, apiKey: options.apiKey ? '***' : undefined },
|
|
262
|
-
status: 'success'
|
|
315
|
+
status: 'success',
|
|
316
|
+
model: mergedModel
|
|
263
317
|
});
|
|
264
318
|
}
|
|
265
319
|
async selectRemotesForPush(tagName, remotes) {
|
package/dist/commands/tag.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tag.js","sourceRoot":"","sources":["../../src/commands/tag.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tag.js","sourceRoot":"","sources":["../../src/commands/tag.ts"],"names":[],"mappings":"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"}
|
package/dist/prompts/tag.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export type TagPromptLanguage = 'ko' | 'en';
|
|
2
|
-
export declare const generateTagPrompt: (tagName: string, customInstructions?: string, language?: TagPromptLanguage) => string;
|
|
2
|
+
export declare const generateTagPrompt: (tagName: string, customInstructions?: string, language?: TagPromptLanguage, isImprovement?: boolean, hasStyleReference?: boolean) => string;
|
|
3
3
|
//# sourceMappingURL=tag.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tag.d.ts","sourceRoot":"","sources":["../../src/prompts/tag.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,IAAI,GAAG,IAAI,CAAC;AAE5C,eAAO,MAAM,iBAAiB,GAC5B,SAAS,MAAM,EACf,2BAAuB,EACvB,WAAU,iBAAwB,
|
|
1
|
+
{"version":3,"file":"tag.d.ts","sourceRoot":"","sources":["../../src/prompts/tag.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,IAAI,GAAG,IAAI,CAAC;AAE5C,eAAO,MAAM,iBAAiB,GAC5B,SAAS,MAAM,EACf,2BAAuB,EACvB,WAAU,iBAAwB,EAClC,uBAAqB,EACrB,2BAAyB,KACxB,MA0GF,CAAC"}
|
package/dist/prompts/tag.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.generateTagPrompt = void 0;
|
|
4
|
-
const generateTagPrompt = (tagName, customInstructions = '', language = 'ko') => {
|
|
4
|
+
const generateTagPrompt = (tagName, customInstructions = '', language = 'ko', isImprovement = false, hasStyleReference = false) => {
|
|
5
5
|
const titleInstruction = language === 'ko'
|
|
6
6
|
? `첫 줄에 버전 "${tagName}"을 제목으로 작성하세요.`
|
|
7
7
|
: `Write the version "${tagName}" as the title on the first line.`;
|
|
@@ -41,15 +41,47 @@ const generateTagPrompt = (tagName, customInstructions = '', language = 'ko') =>
|
|
|
41
41
|
const outputLanguageLine = language === 'ko'
|
|
42
42
|
? '릴리즈 노트를 한국어로 작성하세요.'
|
|
43
43
|
: 'Write the release notes in English.';
|
|
44
|
+
const improvementInstruction = isImprovement
|
|
45
|
+
? language === 'ko'
|
|
46
|
+
? `\n## 개선 모드
|
|
47
|
+
이전 릴리즈 노트가 제공됩니다. 이를 참고하여:
|
|
48
|
+
- 기존 내용의 구조와 스타일을 유지하면서 개선하세요.
|
|
49
|
+
- 누락된 변경사항이 있으면 추가하세요.
|
|
50
|
+
- 불필요하거나 중복된 내용은 제거하세요.
|
|
51
|
+
- 더 명확하고 사용자 친화적인 표현으로 다듬으세요.\n`
|
|
52
|
+
: `\n## Improvement Mode
|
|
53
|
+
Previous release notes are provided. Use them as reference to:
|
|
54
|
+
- Maintain the structure and style while improving the content.
|
|
55
|
+
- Add any missing changes from the commit log.
|
|
56
|
+
- Remove unnecessary or redundant content.
|
|
57
|
+
- Refine the language to be clearer and more user-friendly.\n`
|
|
58
|
+
: '';
|
|
59
|
+
const styleReferenceInstruction = hasStyleReference && !isImprovement
|
|
60
|
+
? language === 'ko'
|
|
61
|
+
? `\n## 스타일 참조
|
|
62
|
+
이전 태그의 릴리즈 노트가 스타일 참조용으로 제공됩니다.
|
|
63
|
+
- 제공된 형식과 구조를 따르세요.
|
|
64
|
+
- 제목, 카테고리, 항목 스타일을 일관되게 유지하세요.
|
|
65
|
+
- 언어 톤과 상세도 수준을 맞추세요.\n`
|
|
66
|
+
: `\n## Style Reference
|
|
67
|
+
A previous tag's release notes are provided as style reference.
|
|
68
|
+
- Follow the provided format and structure.
|
|
69
|
+
- Maintain consistency in title, categories, and item styles.
|
|
70
|
+
- Match the language tone and level of detail.\n`
|
|
71
|
+
: '';
|
|
44
72
|
return `You are an experienced release manager. Produce clear, user-facing release notes in GitHub Release style.
|
|
45
73
|
|
|
46
74
|
## Objective
|
|
47
|
-
|
|
75
|
+
${isImprovement
|
|
76
|
+
? `Improve the existing release notes for ${tagName} based on the commit history and previous notes.`
|
|
77
|
+
: `Create release notes for ${tagName} that describe the meaningful changes since the previous release.`}
|
|
48
78
|
|
|
49
79
|
## Input Context
|
|
50
80
|
- Target tag to publish: ${tagName}
|
|
51
81
|
- Commit history between the previous tag and ${tagName} will be supplied in the user message.
|
|
52
|
-
|
|
82
|
+
${isImprovement ? '- Previous release notes are provided for improvement.' : ''}
|
|
83
|
+
${hasStyleReference && !isImprovement ? '- Style reference from previous tag is provided.' : ''}
|
|
84
|
+
${improvementInstruction}${styleReferenceInstruction}
|
|
53
85
|
${customInstructions ? `## Additional Instructions\n${customInstructions}\n` : ''}
|
|
54
86
|
## Output Format (GitHub Release Style)
|
|
55
87
|
${titleInstruction}
|
package/dist/prompts/tag.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tag.js","sourceRoot":"","sources":["../../src/prompts/tag.ts"],"names":[],"mappings":";;;AAEO,MAAM,iBAAiB,GAAG,CAC/B,OAAe,EACf,kBAAkB,GAAG,EAAE,EACvB,WAA8B,IAAI,
|
|
1
|
+
{"version":3,"file":"tag.js","sourceRoot":"","sources":["../../src/prompts/tag.ts"],"names":[],"mappings":";;;AAEO,MAAM,iBAAiB,GAAG,CAC/B,OAAe,EACf,kBAAkB,GAAG,EAAE,EACvB,WAA8B,IAAI,EAClC,aAAa,GAAG,KAAK,EACrB,iBAAiB,GAAG,KAAK,EACjB,EAAE;IACV,MAAM,gBAAgB,GAAG,QAAQ,KAAK,IAAI;QACxC,CAAC,CAAC,YAAY,OAAO,gBAAgB;QACrC,CAAC,CAAC,sBAAsB,OAAO,mCAAmC,CAAC;IAErE,MAAM,kBAAkB,GAAG,QAAQ,KAAK,IAAI;QAC1C,CAAC,CAAC,6CAA6C;QAC/C,CAAC,CAAC,yGAAyG,CAAC;IAE9G,MAAM,eAAe,GAAG,QAAQ,KAAK,IAAI;QACvC,CAAC,CAAC,8EAA8E;QAChF,CAAC,CAAC,0IAA0I,CAAC;IAE/I,MAAM,cAAc,GAAG,QAAQ,KAAK,IAAI;QACtC,CAAC,CAAC;;;;;;;;;SASG;QACL,CAAC,CAAC;;;;;;;;;gBASU,CAAC;IAEf,MAAM,wBAAwB,GAAG,QAAQ,KAAK,IAAI;QAChD,CAAC,CAAC,uBAAuB;QACzB,CAAC,CAAC,kCAAkC,CAAC;IAEvC,MAAM,oBAAoB,GAAG,QAAQ,KAAK,IAAI;QAC5C,CAAC,CAAC,mCAAmC;QACrC,CAAC,CAAC,2DAA2D,CAAC;IAEhE,MAAM,kBAAkB,GAAG,QAAQ,KAAK,IAAI;QAC1C,CAAC,CAAC,qBAAqB;QACvB,CAAC,CAAC,qCAAqC,CAAC;IAE1C,MAAM,sBAAsB,GAAG,aAAa;QAC1C,CAAC,CAAC,QAAQ,KAAK,IAAI;YACjB,CAAC,CAAC;;;;;gCAKwB;YAC1B,CAAC,CAAC;;;;;8DAKsD;QAC1D,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,yBAAyB,GAAG,iBAAiB,IAAI,CAAC,aAAa;QACnE,CAAC,CAAC,QAAQ,KAAK,IAAI;YACjB,CAAC,CAAC;;;;wBAIgB;YAClB,CAAC,CAAC;;;;iDAIyC;QAC7C,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;;;EAGP,aAAa;QACb,CAAC,CAAC,0CAA0C,OAAO,kDAAkD;QACrG,CAAC,CAAC,4BAA4B,OAAO,mEAAmE;;;2BAG/E,OAAO;gDACc,OAAO;EACrD,aAAa,CAAC,CAAC,CAAC,wDAAwD,CAAC,CAAC,CAAC,EAAE;EAC7E,iBAAiB,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,kDAAkD,CAAC,CAAC,CAAC,EAAE;EAC7F,sBAAsB,GAAG,yBAAyB;EAClD,kBAAkB,CAAC,CAAC,CAAC,+BAA+B,kBAAkB,IAAI,CAAC,CAAC,CAAC,EAAE;;EAE/E,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;;EAEf,cAAc;;;IAGZ,kBAAkB;IAClB,wBAAwB;IACxB,oBAAoB;;;;wEAIgD,CAAC;AACzE,CAAC,CAAC;AAhHW,QAAA,iBAAiB,qBAgH5B"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ksw8954/git-ai-commit",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.4",
|
|
4
4
|
"description": "AI-powered git commit message generator",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
7
7
|
"git-ai-commit": "./dist/index.js"
|
|
8
8
|
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsc",
|
|
11
|
+
"dev": "ts-node src/index.ts",
|
|
12
|
+
"test": "jest",
|
|
13
|
+
"test:file": "jest",
|
|
14
|
+
"test:watch": "jest --watch",
|
|
15
|
+
"test:coverage": "jest --coverage",
|
|
16
|
+
"lint": "eslint src/**/*.ts",
|
|
17
|
+
"typecheck": "tsc --noEmit"
|
|
18
|
+
},
|
|
9
19
|
"repository": {
|
|
10
20
|
"type": "git",
|
|
11
21
|
"url": "git+https://github.com/onaries/git-ai-commit.git"
|
|
@@ -37,15 +47,5 @@
|
|
|
37
47
|
"dependencies": {
|
|
38
48
|
"commander": "^14.0.1",
|
|
39
49
|
"openai": "^5.20.2"
|
|
40
|
-
},
|
|
41
|
-
"scripts": {
|
|
42
|
-
"build": "tsc",
|
|
43
|
-
"dev": "ts-node src/index.ts",
|
|
44
|
-
"test": "jest",
|
|
45
|
-
"test:file": "jest",
|
|
46
|
-
"test:watch": "jest --watch",
|
|
47
|
-
"test:coverage": "jest --coverage",
|
|
48
|
-
"lint": "eslint src/**/*.ts",
|
|
49
|
-
"typecheck": "tsc --noEmit"
|
|
50
50
|
}
|
|
51
|
-
}
|
|
51
|
+
}
|
package/src/commands/ai.ts
CHANGED
|
@@ -355,7 +355,13 @@ export class AIService {
|
|
|
355
355
|
}
|
|
356
356
|
}
|
|
357
357
|
|
|
358
|
-
async generateTagNotes(
|
|
358
|
+
async generateTagNotes(
|
|
359
|
+
tagName: string,
|
|
360
|
+
commitLog: string,
|
|
361
|
+
extraInstructions?: string,
|
|
362
|
+
previousMessage?: string | null,
|
|
363
|
+
styleReference?: string | null
|
|
364
|
+
): Promise<TagGenerationResult> {
|
|
359
365
|
try {
|
|
360
366
|
this.debugLog('Sending request to AI API for tag notes...');
|
|
361
367
|
this.debugLog('Model:', this.model);
|
|
@@ -365,16 +371,26 @@ export class AIService {
|
|
|
365
371
|
? `${extraInstructions.trim()}`
|
|
366
372
|
: '';
|
|
367
373
|
|
|
374
|
+
let userContent = `Commit log:\n${commitLog}`;
|
|
375
|
+
|
|
376
|
+
if (styleReference && !previousMessage) {
|
|
377
|
+
userContent += `\n\n---\nStyle reference (follow this format):\n${styleReference}`;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
if (previousMessage) {
|
|
381
|
+
userContent += `\n\n---\nPrevious release notes for this tag (improve upon this):\n${previousMessage}`;
|
|
382
|
+
}
|
|
383
|
+
|
|
368
384
|
const response = await this.createChatCompletion({
|
|
369
385
|
model: this.model,
|
|
370
386
|
messages: [
|
|
371
387
|
{
|
|
372
388
|
role: 'system',
|
|
373
|
-
content: generateTagPrompt(tagName, customInstructions, this.language)
|
|
389
|
+
content: generateTagPrompt(tagName, customInstructions, this.language, !!previousMessage, !!styleReference)
|
|
374
390
|
},
|
|
375
391
|
{
|
|
376
392
|
role: 'user',
|
|
377
|
-
content:
|
|
393
|
+
content: userContent
|
|
378
394
|
}
|
|
379
395
|
],
|
|
380
396
|
max_completion_tokens: 3000
|
package/src/commands/commit.ts
CHANGED
|
@@ -177,6 +177,7 @@ export class CommitCommand {
|
|
|
177
177
|
status: "failure",
|
|
178
178
|
details: diffResult.error,
|
|
179
179
|
durationMs: Date.now() - start,
|
|
180
|
+
model: mergedModel,
|
|
180
181
|
});
|
|
181
182
|
process.exit(1);
|
|
182
183
|
}
|
|
@@ -197,6 +198,7 @@ export class CommitCommand {
|
|
|
197
198
|
status: "failure",
|
|
198
199
|
details: aiResult.error,
|
|
199
200
|
durationMs: Date.now() - start,
|
|
201
|
+
model: mergedModel,
|
|
200
202
|
});
|
|
201
203
|
process.exit(1);
|
|
202
204
|
}
|
|
@@ -214,6 +216,7 @@ export class CommitCommand {
|
|
|
214
216
|
status: "success",
|
|
215
217
|
details: "message-only output",
|
|
216
218
|
durationMs: Date.now() - start,
|
|
219
|
+
model: mergedModel,
|
|
217
220
|
});
|
|
218
221
|
return;
|
|
219
222
|
}
|
|
@@ -231,6 +234,7 @@ export class CommitCommand {
|
|
|
231
234
|
status: "cancelled",
|
|
232
235
|
details: "user declined commit",
|
|
233
236
|
durationMs: Date.now() - start,
|
|
237
|
+
model: mergedModel,
|
|
234
238
|
});
|
|
235
239
|
return;
|
|
236
240
|
}
|
|
@@ -264,6 +268,7 @@ export class CommitCommand {
|
|
|
264
268
|
status: "failure",
|
|
265
269
|
details: "push failed",
|
|
266
270
|
durationMs: Date.now() - start,
|
|
271
|
+
model: mergedModel,
|
|
267
272
|
});
|
|
268
273
|
process.exit(1);
|
|
269
274
|
}
|
|
@@ -276,6 +281,7 @@ export class CommitCommand {
|
|
|
276
281
|
status: "failure",
|
|
277
282
|
details: "git commit failed",
|
|
278
283
|
durationMs: Date.now() - start,
|
|
284
|
+
model: mergedModel,
|
|
279
285
|
});
|
|
280
286
|
process.exit(1);
|
|
281
287
|
}
|
|
@@ -284,6 +290,7 @@ export class CommitCommand {
|
|
|
284
290
|
args: safeArgs,
|
|
285
291
|
status: "success",
|
|
286
292
|
durationMs: Date.now() - start,
|
|
293
|
+
model: mergedModel,
|
|
287
294
|
});
|
|
288
295
|
} catch (error) {
|
|
289
296
|
const message = error instanceof Error ? error.message : String(error);
|
|
@@ -294,6 +301,7 @@ export class CommitCommand {
|
|
|
294
301
|
status: "failure",
|
|
295
302
|
details: message,
|
|
296
303
|
durationMs: Date.now() - start,
|
|
304
|
+
model: options.model,
|
|
297
305
|
});
|
|
298
306
|
process.exit(1);
|
|
299
307
|
}
|
package/src/commands/git.ts
CHANGED
|
@@ -264,6 +264,26 @@ export class GitService {
|
|
|
264
264
|
}
|
|
265
265
|
}
|
|
266
266
|
|
|
267
|
+
static async getTagMessage(tagName: string): Promise<string | null> {
|
|
268
|
+
try {
|
|
269
|
+
// Get the tag object content
|
|
270
|
+
const { stdout } = await execFileAsync('git', ['tag', '-l', '-n999', tagName]);
|
|
271
|
+
if (!stdout.trim()) {
|
|
272
|
+
return null;
|
|
273
|
+
}
|
|
274
|
+
// Format: "tagname message line 1\n message line 2..."
|
|
275
|
+
// Remove the tag name prefix and clean up
|
|
276
|
+
const lines = stdout.split('\n');
|
|
277
|
+
const firstLine = lines[0] || '';
|
|
278
|
+
// Remove tag name from first line
|
|
279
|
+
const messageStart = firstLine.replace(new RegExp(`^${tagName}\\s*`), '');
|
|
280
|
+
const restLines = lines.slice(1).map(line => line.replace(/^\s{12}/, ''));
|
|
281
|
+
return [messageStart, ...restLines].join('\n').trim() || null;
|
|
282
|
+
} catch {
|
|
283
|
+
return null;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
267
287
|
static async remoteTagExists(tagName: string): Promise<boolean> {
|
|
268
288
|
try {
|
|
269
289
|
const { stdout } = await execAsync(`git ls-remote --tags origin refs/tags/${tagName}`);
|
package/src/commands/history.ts
CHANGED
|
@@ -38,11 +38,12 @@ export class HistoryCommand {
|
|
|
38
38
|
|
|
39
39
|
private formatLine(e: any): string {
|
|
40
40
|
const ts = new Date(e.timestamp).toISOString();
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
41
|
+
const projectName = e.project?.name || 'unknown';
|
|
42
|
+
const model = e.model || 'default';
|
|
43
|
+
const duration = e.durationMs ? ` (${e.durationMs}ms)` : '';
|
|
44
|
+
const details = e.details ? `\n > ${e.details}` : '';
|
|
45
|
+
|
|
46
|
+
return `${ts} [${projectName}] ${e.command} ${e.status}${duration} model=${model}${details}`;
|
|
46
47
|
}
|
|
47
48
|
|
|
48
49
|
private async handleHistory(options: HistoryOptions) {
|
package/src/commands/log.ts
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
import { promises as fs } from 'fs';
|
|
2
2
|
import path from 'path';
|
|
3
3
|
import os from 'os';
|
|
4
|
+
import { execSync } from 'child_process';
|
|
4
5
|
|
|
5
6
|
export type LogStatus = 'success' | 'failure' | 'cancelled';
|
|
6
7
|
|
|
8
|
+
export interface ProjectInfo {
|
|
9
|
+
name: string;
|
|
10
|
+
path: string;
|
|
11
|
+
gitRemote?: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
7
14
|
export interface HistoryEntry {
|
|
8
15
|
id: string;
|
|
9
16
|
timestamp: string; // ISO
|
|
@@ -12,6 +19,8 @@ export interface HistoryEntry {
|
|
|
12
19
|
status: LogStatus;
|
|
13
20
|
details?: string;
|
|
14
21
|
durationMs?: number;
|
|
22
|
+
project?: ProjectInfo;
|
|
23
|
+
model?: string;
|
|
15
24
|
}
|
|
16
25
|
|
|
17
26
|
function getStorageDir(): string {
|
|
@@ -27,8 +36,25 @@ function genId(): string {
|
|
|
27
36
|
return `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
28
37
|
}
|
|
29
38
|
|
|
39
|
+
function getProjectInfo(): ProjectInfo {
|
|
40
|
+
const cwd = process.cwd();
|
|
41
|
+
const name = path.basename(cwd);
|
|
42
|
+
|
|
43
|
+
let gitRemote: string | undefined;
|
|
44
|
+
try {
|
|
45
|
+
gitRemote = execSync('git config --get remote.origin.url', {
|
|
46
|
+
encoding: 'utf-8',
|
|
47
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
48
|
+
}).trim() || undefined;
|
|
49
|
+
} catch {
|
|
50
|
+
// Not a git repo or no remote
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return { name, path: cwd, gitRemote };
|
|
54
|
+
}
|
|
55
|
+
|
|
30
56
|
export class LogService {
|
|
31
|
-
static async append(entry: Omit<HistoryEntry, 'id' | 'timestamp'> & { timestamp?: string; id?: string }): Promise<void> {
|
|
57
|
+
static async append(entry: Omit<HistoryEntry, 'id' | 'timestamp' | 'project'> & { timestamp?: string; id?: string; model?: string }): Promise<void> {
|
|
32
58
|
const file = getHistoryPath();
|
|
33
59
|
const dir = path.dirname(file);
|
|
34
60
|
await fs.mkdir(dir, { recursive: true });
|
|
@@ -40,7 +66,9 @@ export class LogService {
|
|
|
40
66
|
args: entry.args,
|
|
41
67
|
status: entry.status,
|
|
42
68
|
details: entry.details,
|
|
43
|
-
durationMs: entry.durationMs
|
|
69
|
+
durationMs: entry.durationMs,
|
|
70
|
+
project: getProjectInfo(),
|
|
71
|
+
model: entry.model
|
|
44
72
|
};
|
|
45
73
|
|
|
46
74
|
const line = JSON.stringify(finalized) + '\n';
|