@elsikora/commitizen-plugin-commitlint-ai 1.0.0-dev.1
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 +150 -0
- package/dist/cjs/ManualProcess.d.ts +6 -0
- package/dist/cjs/ManualProcess.d.ts.map +1 -0
- package/dist/cjs/ManualProcess.js +111 -0
- package/dist/cjs/ManualProcess.js.map +1 -0
- package/dist/cjs/Process.d.ts +6 -0
- package/dist/cjs/Process.d.ts.map +1 -0
- package/dist/cjs/Process.js +165 -0
- package/dist/cjs/Process.js.map +1 -0
- package/dist/cjs/Question.d.ts +46 -0
- package/dist/cjs/Question.d.ts.map +1 -0
- package/dist/cjs/SectionBody.d.ts +4 -0
- package/dist/cjs/SectionBody.d.ts.map +1 -0
- package/dist/cjs/SectionFooter.d.ts +13 -0
- package/dist/cjs/SectionFooter.d.ts.map +1 -0
- package/dist/cjs/SectionHeader.d.ts +15 -0
- package/dist/cjs/SectionHeader.d.ts.map +1 -0
- package/dist/cjs/index.d.ts +14 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +70 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/services/commitlintConfig.d.ts +4 -0
- package/dist/cjs/services/commitlintConfig.d.ts.map +1 -0
- package/dist/cjs/services/commitlintConfig.js +198 -0
- package/dist/cjs/services/commitlintConfig.js.map +1 -0
- package/dist/cjs/services/commitlintValidator.d.ts +20 -0
- package/dist/cjs/services/commitlintValidator.d.ts.map +1 -0
- package/dist/cjs/services/commitlintValidator.js +145 -0
- package/dist/cjs/services/commitlintValidator.js.map +1 -0
- package/dist/cjs/services/getRuleQuestionConfig.d.ts +4 -0
- package/dist/cjs/services/getRuleQuestionConfig.d.ts.map +1 -0
- package/dist/cjs/services/llm/anthropic.d.ts +3 -0
- package/dist/cjs/services/llm/anthropic.d.ts.map +1 -0
- package/dist/cjs/services/llm/anthropic.js +118 -0
- package/dist/cjs/services/llm/anthropic.js.map +1 -0
- package/dist/cjs/services/llm/config.d.ts +5 -0
- package/dist/cjs/services/llm/config.d.ts.map +1 -0
- package/dist/cjs/services/llm/config.js +181 -0
- package/dist/cjs/services/llm/config.js.map +1 -0
- package/dist/cjs/services/llm/index.d.ts +6 -0
- package/dist/cjs/services/llm/index.d.ts.map +1 -0
- package/dist/cjs/services/llm/index.js +398 -0
- package/dist/cjs/services/llm/index.js.map +1 -0
- package/dist/cjs/services/llm/models.d.ts +34 -0
- package/dist/cjs/services/llm/models.d.ts.map +1 -0
- package/dist/cjs/services/llm/models.js +65 -0
- package/dist/cjs/services/llm/models.js.map +1 -0
- package/dist/cjs/services/llm/openai.d.ts +3 -0
- package/dist/cjs/services/llm/openai.d.ts.map +1 -0
- package/dist/cjs/services/llm/openai.js +111 -0
- package/dist/cjs/services/llm/openai.js.map +1 -0
- package/dist/cjs/services/llm/types.d.ts +71 -0
- package/dist/cjs/services/llm/types.d.ts.map +1 -0
- package/dist/cjs/store/defaultPromptConfigs.d.ts +33 -0
- package/dist/cjs/store/defaultPromptConfigs.d.ts.map +1 -0
- package/dist/cjs/store/defaultPromptConfigs.js +39 -0
- package/dist/cjs/store/defaultPromptConfigs.js.map +1 -0
- package/dist/cjs/store/prompts.d.ts +6 -0
- package/dist/cjs/store/prompts.d.ts.map +1 -0
- package/dist/cjs/store/prompts.js +40 -0
- package/dist/cjs/store/prompts.js.map +1 -0
- package/dist/cjs/store/rules.d.ts +7 -0
- package/dist/cjs/store/rules.d.ts.map +1 -0
- package/dist/cjs/types.d.ts +3 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/utils/case-function.d.ts +9 -0
- package/dist/cjs/utils/case-function.d.ts.map +1 -0
- package/dist/cjs/utils/full-stop-function.d.ts +9 -0
- package/dist/cjs/utils/full-stop-function.d.ts.map +1 -0
- package/dist/cjs/utils/leading-blank-function.d.ts +8 -0
- package/dist/cjs/utils/leading-blank-function.d.ts.map +1 -0
- package/dist/cjs/utils/rules.d.ts +26 -0
- package/dist/cjs/utils/rules.d.ts.map +1 -0
- package/dist/esm/ManualProcess.d.ts +6 -0
- package/dist/esm/ManualProcess.d.ts.map +1 -0
- package/dist/esm/ManualProcess.js +107 -0
- package/dist/esm/ManualProcess.js.map +1 -0
- package/dist/esm/Process.d.ts +6 -0
- package/dist/esm/Process.d.ts.map +1 -0
- package/dist/esm/Process.js +161 -0
- package/dist/esm/Process.js.map +1 -0
- package/dist/esm/Question.d.ts +46 -0
- package/dist/esm/Question.d.ts.map +1 -0
- package/dist/esm/SectionBody.d.ts +4 -0
- package/dist/esm/SectionBody.d.ts.map +1 -0
- package/dist/esm/SectionFooter.d.ts +13 -0
- package/dist/esm/SectionFooter.d.ts.map +1 -0
- package/dist/esm/SectionHeader.d.ts +15 -0
- package/dist/esm/SectionHeader.d.ts.map +1 -0
- package/dist/esm/index.d.ts +14 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +67 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/services/commitlintConfig.d.ts +4 -0
- package/dist/esm/services/commitlintConfig.d.ts.map +1 -0
- package/dist/esm/services/commitlintConfig.js +196 -0
- package/dist/esm/services/commitlintConfig.js.map +1 -0
- package/dist/esm/services/commitlintValidator.d.ts +20 -0
- package/dist/esm/services/commitlintValidator.d.ts.map +1 -0
- package/dist/esm/services/commitlintValidator.js +142 -0
- package/dist/esm/services/commitlintValidator.js.map +1 -0
- package/dist/esm/services/getRuleQuestionConfig.d.ts +4 -0
- package/dist/esm/services/getRuleQuestionConfig.d.ts.map +1 -0
- package/dist/esm/services/llm/anthropic.d.ts +3 -0
- package/dist/esm/services/llm/anthropic.d.ts.map +1 -0
- package/dist/esm/services/llm/anthropic.js +116 -0
- package/dist/esm/services/llm/anthropic.js.map +1 -0
- package/dist/esm/services/llm/config.d.ts +5 -0
- package/dist/esm/services/llm/config.d.ts.map +1 -0
- package/dist/esm/services/llm/config.js +178 -0
- package/dist/esm/services/llm/config.js.map +1 -0
- package/dist/esm/services/llm/index.d.ts +6 -0
- package/dist/esm/services/llm/index.d.ts.map +1 -0
- package/dist/esm/services/llm/index.js +393 -0
- package/dist/esm/services/llm/index.js.map +1 -0
- package/dist/esm/services/llm/models.d.ts +34 -0
- package/dist/esm/services/llm/models.d.ts.map +1 -0
- package/dist/esm/services/llm/models.js +60 -0
- package/dist/esm/services/llm/models.js.map +1 -0
- package/dist/esm/services/llm/openai.d.ts +3 -0
- package/dist/esm/services/llm/openai.d.ts.map +1 -0
- package/dist/esm/services/llm/openai.js +109 -0
- package/dist/esm/services/llm/openai.js.map +1 -0
- package/dist/esm/services/llm/types.d.ts +71 -0
- package/dist/esm/services/llm/types.d.ts.map +1 -0
- package/dist/esm/store/defaultPromptConfigs.d.ts +33 -0
- package/dist/esm/store/defaultPromptConfigs.d.ts.map +1 -0
- package/dist/esm/store/defaultPromptConfigs.js +35 -0
- package/dist/esm/store/defaultPromptConfigs.js.map +1 -0
- package/dist/esm/store/prompts.d.ts +6 -0
- package/dist/esm/store/prompts.d.ts.map +1 -0
- package/dist/esm/store/prompts.js +38 -0
- package/dist/esm/store/prompts.js.map +1 -0
- package/dist/esm/store/rules.d.ts +7 -0
- package/dist/esm/store/rules.d.ts.map +1 -0
- package/dist/esm/types.d.ts +3 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/utils/case-function.d.ts +9 -0
- package/dist/esm/utils/case-function.d.ts.map +1 -0
- package/dist/esm/utils/full-stop-function.d.ts +9 -0
- package/dist/esm/utils/full-stop-function.d.ts.map +1 -0
- package/dist/esm/utils/leading-blank-function.d.ts +8 -0
- package/dist/esm/utils/leading-blank-function.d.ts.map +1 -0
- package/dist/esm/utils/rules.d.ts +26 -0
- package/dist/esm/utils/rules.d.ts.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/index.cjs +6 -0
- package/package.json +101 -0
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
import { exec } from 'node:child_process';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { generateCommitWithAnthropic } from './anthropic.js';
|
|
5
|
+
import { getLLMConfig, setLLMConfig } from './config.js';
|
|
6
|
+
import { OPENAI_MODEL_CHOICES, ANTHROPIC_MODEL_CHOICES } from './models.js';
|
|
7
|
+
import { generateCommitWithOpenAI } from './openai.js';
|
|
8
|
+
|
|
9
|
+
// @ts-ignore
|
|
10
|
+
const execAsync = promisify(exec);
|
|
11
|
+
async function generateCommitMessage(context) {
|
|
12
|
+
const config = getLLMConfig();
|
|
13
|
+
if (!config) {
|
|
14
|
+
throw new Error("LLM not configured. Please run selectLLMProvider first.");
|
|
15
|
+
}
|
|
16
|
+
// Check if we're in manual mode
|
|
17
|
+
if (config.mode === "manual") {
|
|
18
|
+
throw new Error("Manual mode enabled. Skipping AI generation.");
|
|
19
|
+
}
|
|
20
|
+
// Validate provider only, not model
|
|
21
|
+
if (!isValidProvider(config.provider)) {
|
|
22
|
+
throw new Error(`Invalid LLM provider: ${config.provider}. Please reconfigure with a valid provider.`);
|
|
23
|
+
}
|
|
24
|
+
// Get git diff for better context
|
|
25
|
+
try {
|
|
26
|
+
// Get staged files for scope inference
|
|
27
|
+
const { stdout: stagedFiles } = await execAsync("git diff --name-only --cached");
|
|
28
|
+
context.files = stagedFiles;
|
|
29
|
+
// Get directory structure for better scope inference
|
|
30
|
+
if (stagedFiles.trim()) {
|
|
31
|
+
const directories = stagedFiles
|
|
32
|
+
.split("\n")
|
|
33
|
+
.filter(Boolean)
|
|
34
|
+
.map((file) => {
|
|
35
|
+
const parts = file.split("/");
|
|
36
|
+
return parts.length > 1 ? parts[0] : "root";
|
|
37
|
+
})
|
|
38
|
+
.filter((v, index, a) => a.indexOf(v) === index) // Remove duplicates
|
|
39
|
+
.join(", ");
|
|
40
|
+
// eslint-disable-next-line @elsikora-typescript/restrict-plus-operands
|
|
41
|
+
context.files += `\n\nModified directories: ${directories}`;
|
|
42
|
+
}
|
|
43
|
+
// Get the diff for content analysis
|
|
44
|
+
const { stdout: diff } = await execAsync("git diff --cached");
|
|
45
|
+
if (!context.diff)
|
|
46
|
+
context.diff = diff;
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
console.warn("Failed to get git diff information, continuing without it");
|
|
50
|
+
}
|
|
51
|
+
// Generate commit with selected provider
|
|
52
|
+
if (config.provider === "openai") {
|
|
53
|
+
return generateCommitWithOpenAI(config.apiKey, config.model, context);
|
|
54
|
+
}
|
|
55
|
+
else if (config.provider === "anthropic") {
|
|
56
|
+
return generateCommitWithAnthropic(config.apiKey, config.model, context);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
// This shouldn't happen due to the validation above, but just in case
|
|
60
|
+
throw new Error(`Unsupported provider: ${config.provider}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// eslint-disable-next-line @elsikora-typescript/explicit-module-boundary-types
|
|
64
|
+
async function selectLLMProvider(inquirer) {
|
|
65
|
+
// Check if we have a partial config
|
|
66
|
+
const existingConfig = getLLMConfig();
|
|
67
|
+
let provider;
|
|
68
|
+
let model;
|
|
69
|
+
let mode = "auto"; // Default mode
|
|
70
|
+
if (existingConfig) {
|
|
71
|
+
// We have a saved config
|
|
72
|
+
provider = existingConfig.provider;
|
|
73
|
+
model = existingConfig.model;
|
|
74
|
+
mode = existingConfig.mode ?? "auto";
|
|
75
|
+
const modelDisplay = model ?? "[not set]";
|
|
76
|
+
// eslint-disable-next-line @elsikora-sonar/no-nested-conditional
|
|
77
|
+
const providerDisplay = provider ? (provider === "openai" ? "OpenAI" : "Anthropic") : "[not set]";
|
|
78
|
+
const modeDisplay = mode || "auto";
|
|
79
|
+
// First check if we want to use the existing config at all
|
|
80
|
+
const { useExisting } = await inquirer.prompt([
|
|
81
|
+
{
|
|
82
|
+
// eslint-disable-next-line @elsikora-typescript/naming-convention
|
|
83
|
+
default: true,
|
|
84
|
+
message: `Use saved configuration? (Provider: ${providerDisplay}, Model: ${modelDisplay}, Mode: ${modeDisplay})`,
|
|
85
|
+
name: "useExisting",
|
|
86
|
+
type: "confirm",
|
|
87
|
+
},
|
|
88
|
+
]);
|
|
89
|
+
if (useExisting) {
|
|
90
|
+
// We're using existing config, but we need to check if it's complete
|
|
91
|
+
// We have a provider but it's invalid
|
|
92
|
+
if (provider && !isValidProvider(provider)) {
|
|
93
|
+
console.log(chalk.yellow(`Provider "${provider}" is not supported. Please select a valid provider below.`));
|
|
94
|
+
// Fall through to ask for a new provider
|
|
95
|
+
}
|
|
96
|
+
else if (!provider) {
|
|
97
|
+
console.log(chalk.yellow(`No AI provider specified in configuration. Please select a provider below.`));
|
|
98
|
+
// Fall through to ask for a provider
|
|
99
|
+
}
|
|
100
|
+
else if (!model && mode === "auto") {
|
|
101
|
+
// We have a valid provider but no model in auto mode
|
|
102
|
+
console.log(chalk.yellow("No model saved in configuration. Please select a model."));
|
|
103
|
+
if (provider === "openai") {
|
|
104
|
+
const response = await inquirer.prompt([
|
|
105
|
+
{
|
|
106
|
+
choices: OPENAI_MODEL_CHOICES,
|
|
107
|
+
message: "Select an OpenAI model:",
|
|
108
|
+
name: "model",
|
|
109
|
+
type: "list",
|
|
110
|
+
},
|
|
111
|
+
]);
|
|
112
|
+
if (response.model === "custom") {
|
|
113
|
+
const customResponse = await inquirer.prompt([
|
|
114
|
+
{
|
|
115
|
+
message: "Enter the OpenAI model name:",
|
|
116
|
+
name: "customModel",
|
|
117
|
+
type: "input",
|
|
118
|
+
// eslint-disable-next-line @elsikora-typescript/explicit-function-return-type
|
|
119
|
+
validate: (input) => {
|
|
120
|
+
if (!input)
|
|
121
|
+
return "Model name is required";
|
|
122
|
+
return true;
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
]);
|
|
126
|
+
model = customResponse.customModel;
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
model = response.model;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
else if (provider === "anthropic") {
|
|
133
|
+
const response = await inquirer.prompt([
|
|
134
|
+
{
|
|
135
|
+
choices: ANTHROPIC_MODEL_CHOICES,
|
|
136
|
+
message: "Select an Anthropic model:",
|
|
137
|
+
name: "model",
|
|
138
|
+
type: "list",
|
|
139
|
+
},
|
|
140
|
+
]);
|
|
141
|
+
if (response.model === "custom") {
|
|
142
|
+
const customResponse = await inquirer.prompt([
|
|
143
|
+
{
|
|
144
|
+
message: "Enter the Anthropic model name:",
|
|
145
|
+
name: "customModel",
|
|
146
|
+
type: "input",
|
|
147
|
+
// eslint-disable-next-line @elsikora-typescript/explicit-function-return-type
|
|
148
|
+
validate: (input) => {
|
|
149
|
+
if (!input)
|
|
150
|
+
return "Model name is required";
|
|
151
|
+
return true;
|
|
152
|
+
},
|
|
153
|
+
},
|
|
154
|
+
]);
|
|
155
|
+
model = customResponse.customModel;
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
model = response.model;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// Update the existing config with the selected model
|
|
162
|
+
existingConfig.model = model;
|
|
163
|
+
// Save the updated config to file with the selected model
|
|
164
|
+
setLLMConfig({
|
|
165
|
+
apiKey: existingConfig.apiKey || "",
|
|
166
|
+
mode: existingConfig.mode ?? "auto",
|
|
167
|
+
model,
|
|
168
|
+
provider: existingConfig.provider,
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
// In manual mode, we don't need a model or provider, so skip forward
|
|
172
|
+
if (mode === "manual") {
|
|
173
|
+
// Even in manual mode, save the config to remember the mode choice
|
|
174
|
+
setLLMConfig({
|
|
175
|
+
apiKey: "",
|
|
176
|
+
mode: "manual",
|
|
177
|
+
model: model || "",
|
|
178
|
+
provider: provider || "",
|
|
179
|
+
});
|
|
180
|
+
console.log(chalk.green(`✅ Manual commit mode configured successfully!`));
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
// Now check if we need an API key (only in auto mode)
|
|
184
|
+
if (existingConfig.apiKey) {
|
|
185
|
+
// We have a complete config with API key
|
|
186
|
+
console.log(chalk.green(`✅ Using existing configuration.`));
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
// Double-check environment variables again
|
|
191
|
+
const environmentVariableName = provider === "openai" ? "OPENAI_API_KEY" : "ANTHROPIC_API_KEY";
|
|
192
|
+
let environmentApiKey;
|
|
193
|
+
try {
|
|
194
|
+
if (typeof process !== "undefined" && process?.env) {
|
|
195
|
+
environmentApiKey = provider === "openai" ? process.env.OPENAI_API_KEY : process.env.ANTHROPIC_API_KEY;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
// Ignore error
|
|
200
|
+
}
|
|
201
|
+
if (environmentApiKey) {
|
|
202
|
+
// Found API key in environment variable
|
|
203
|
+
console.log(chalk.green(`✅ Found ${provider === "openai" ? "OpenAI" : "Anthropic"} API key in environment variable ${environmentVariableName}`));
|
|
204
|
+
existingConfig.apiKey = environmentApiKey;
|
|
205
|
+
setLLMConfig(existingConfig);
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
console.log(chalk.yellow(`No ${provider === "openai" ? "OpenAI" : "Anthropic"} API key found in environment.`));
|
|
209
|
+
console.log(chalk.blue(`Tip: Set the ${environmentVariableName} environment variable to avoid entering your API key each time.`));
|
|
210
|
+
console.log(chalk.blue(`You can create a .env file in your project root with ${environmentVariableName}=your-key-here`));
|
|
211
|
+
const { apiKey } = await inquirer.prompt([
|
|
212
|
+
{
|
|
213
|
+
message: `Enter your ${provider === "openai" ? "OpenAI" : "Anthropic"} API key:`,
|
|
214
|
+
name: "apiKey",
|
|
215
|
+
type: "password",
|
|
216
|
+
// eslint-disable-next-line @elsikora-typescript/explicit-function-return-type,@elsikora-sonar/function-return-type
|
|
217
|
+
validate: (input) => {
|
|
218
|
+
if (!input)
|
|
219
|
+
return "API key is required";
|
|
220
|
+
if (provider === "openai" && !input.startsWith("sk-")) {
|
|
221
|
+
return 'OpenAI API keys typically start with "sk-"';
|
|
222
|
+
}
|
|
223
|
+
return true;
|
|
224
|
+
},
|
|
225
|
+
},
|
|
226
|
+
]);
|
|
227
|
+
// Update the config with the API key for this session only
|
|
228
|
+
// @ts-ignore
|
|
229
|
+
const config = { apiKey, mode, model, provider };
|
|
230
|
+
setLLMConfig(config);
|
|
231
|
+
console.log(chalk.green(`✅ Configuration completed successfully!`));
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
// No config or user wants to change it, run the full setup
|
|
237
|
+
// First ask for commit mode preference
|
|
238
|
+
const modeResponse = await inquirer.prompt([
|
|
239
|
+
{
|
|
240
|
+
choices: [
|
|
241
|
+
{ name: "AI-powered (auto)", value: "auto" },
|
|
242
|
+
{ name: "Manual (traditional commitizen)", value: "manual" },
|
|
243
|
+
],
|
|
244
|
+
default: "auto",
|
|
245
|
+
message: "Select your preferred commit mode:",
|
|
246
|
+
name: "mode",
|
|
247
|
+
type: "list",
|
|
248
|
+
},
|
|
249
|
+
]);
|
|
250
|
+
mode = modeResponse.mode;
|
|
251
|
+
// If the user selected manual mode, we don't need provider or model
|
|
252
|
+
if (mode === "manual") {
|
|
253
|
+
// Save minimal config with just the mode
|
|
254
|
+
// Note: explicit provider/model values to make debugging easier
|
|
255
|
+
setLLMConfig({
|
|
256
|
+
apiKey: "",
|
|
257
|
+
mode: "manual",
|
|
258
|
+
model: "none",
|
|
259
|
+
// @ts-ignore
|
|
260
|
+
provider: "none",
|
|
261
|
+
});
|
|
262
|
+
console.log(chalk.green(`✅ Manual commit mode configured successfully!`));
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
// Only proceed with provider/model selection if in auto mode
|
|
266
|
+
const providerResponse = await inquirer.prompt([
|
|
267
|
+
{
|
|
268
|
+
choices: [
|
|
269
|
+
{ name: "OpenAI", value: "openai" },
|
|
270
|
+
{ name: "Anthropic", value: "anthropic" },
|
|
271
|
+
],
|
|
272
|
+
message: "Select an LLM provider:",
|
|
273
|
+
name: "provider",
|
|
274
|
+
type: "list",
|
|
275
|
+
},
|
|
276
|
+
]);
|
|
277
|
+
provider = providerResponse.provider;
|
|
278
|
+
// Check if API key is in environment variables
|
|
279
|
+
let environmentApiKey = null;
|
|
280
|
+
const environmentVariableName = provider === "openai" ? "OPENAI_API_KEY" : "ANTHROPIC_API_KEY";
|
|
281
|
+
try {
|
|
282
|
+
if (typeof process !== "undefined" && process?.env) {
|
|
283
|
+
environmentApiKey = provider === "openai" ? (process.env.OPENAI_API_KEY ?? null) : (process.env.ANTHROPIC_API_KEY ?? null);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
catch (error) {
|
|
287
|
+
console.warn("Error accessing environment variables:", error);
|
|
288
|
+
}
|
|
289
|
+
let apiKey;
|
|
290
|
+
if (environmentApiKey) {
|
|
291
|
+
console.log(chalk.green(`✅ Found ${provider === "openai" ? "OpenAI" : "Anthropic"} API key in environment variable ${environmentVariableName}`));
|
|
292
|
+
apiKey = environmentApiKey;
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
console.log(chalk.yellow(`No ${provider === "openai" ? "OpenAI" : "Anthropic"} API key found in environment.`));
|
|
296
|
+
console.log(chalk.blue(`Tip: Set the ${environmentVariableName} environment variable to avoid entering your API key each time.`));
|
|
297
|
+
const response = await inquirer.prompt([
|
|
298
|
+
{
|
|
299
|
+
message: `Enter your ${provider === "openai" ? "OpenAI" : "Anthropic"} API key:`,
|
|
300
|
+
name: "apiKey",
|
|
301
|
+
type: "password",
|
|
302
|
+
// eslint-disable-next-line @elsikora-typescript/explicit-function-return-type,@elsikora-sonar/function-return-type
|
|
303
|
+
validate: (input) => {
|
|
304
|
+
if (!input)
|
|
305
|
+
return "API key is required";
|
|
306
|
+
if (provider === "openai" && !input.startsWith("sk-")) {
|
|
307
|
+
return 'OpenAI API keys typically start with "sk-"';
|
|
308
|
+
}
|
|
309
|
+
return true;
|
|
310
|
+
},
|
|
311
|
+
},
|
|
312
|
+
]);
|
|
313
|
+
apiKey = response.apiKey;
|
|
314
|
+
}
|
|
315
|
+
// Now get models based on provider
|
|
316
|
+
if (provider === "openai") {
|
|
317
|
+
// Display model selection
|
|
318
|
+
const response = await inquirer.prompt([
|
|
319
|
+
{
|
|
320
|
+
choices: OPENAI_MODEL_CHOICES,
|
|
321
|
+
message: "Select an OpenAI model:",
|
|
322
|
+
name: "model",
|
|
323
|
+
type: "list",
|
|
324
|
+
},
|
|
325
|
+
]);
|
|
326
|
+
// If user selected custom, ask for model name
|
|
327
|
+
if (response.model === "custom") {
|
|
328
|
+
const customResponse = await inquirer.prompt([
|
|
329
|
+
{
|
|
330
|
+
message: "Enter the OpenAI model name:",
|
|
331
|
+
name: "customModel",
|
|
332
|
+
type: "input",
|
|
333
|
+
// eslint-disable-next-line @elsikora-typescript/explicit-function-return-type
|
|
334
|
+
validate: (input) => {
|
|
335
|
+
if (!input)
|
|
336
|
+
return "Model name is required";
|
|
337
|
+
return true;
|
|
338
|
+
},
|
|
339
|
+
},
|
|
340
|
+
]);
|
|
341
|
+
model = customResponse.customModel;
|
|
342
|
+
}
|
|
343
|
+
else {
|
|
344
|
+
model = response.model;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
else if (provider === "anthropic") {
|
|
348
|
+
// For Anthropic, use hardcoded list
|
|
349
|
+
const response = await inquirer.prompt([
|
|
350
|
+
{
|
|
351
|
+
choices: ANTHROPIC_MODEL_CHOICES,
|
|
352
|
+
message: "Select an Anthropic model:",
|
|
353
|
+
name: "model",
|
|
354
|
+
type: "list",
|
|
355
|
+
},
|
|
356
|
+
]);
|
|
357
|
+
// If user selected custom, ask for model name
|
|
358
|
+
if (response.model === "custom") {
|
|
359
|
+
const customResponse = await inquirer.prompt([
|
|
360
|
+
{
|
|
361
|
+
message: "Enter the Anthropic model name:",
|
|
362
|
+
name: "customModel",
|
|
363
|
+
type: "input",
|
|
364
|
+
// eslint-disable-next-line @elsikora-typescript/explicit-function-return-type
|
|
365
|
+
validate: (input) => {
|
|
366
|
+
if (!input)
|
|
367
|
+
return "Model name is required";
|
|
368
|
+
return true;
|
|
369
|
+
},
|
|
370
|
+
},
|
|
371
|
+
]);
|
|
372
|
+
model = customResponse.customModel;
|
|
373
|
+
}
|
|
374
|
+
else {
|
|
375
|
+
model = response.model;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
else {
|
|
379
|
+
throw new Error(`Invalid provider: ${provider}`);
|
|
380
|
+
}
|
|
381
|
+
// Save the complete config
|
|
382
|
+
// @ts-ignore
|
|
383
|
+
const config = { apiKey, mode, model, provider };
|
|
384
|
+
setLLMConfig(config);
|
|
385
|
+
console.log(chalk.green(`✅ AI-powered commit mode configured successfully!`));
|
|
386
|
+
}
|
|
387
|
+
// We'll only validate provider, not model
|
|
388
|
+
function isValidProvider(provider) {
|
|
389
|
+
return provider === "openai" || provider === "anthropic";
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
export { generateCommitMessage, getLLMConfig, selectLLMProvider, setLLMConfig };
|
|
393
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../src/services/llm/index.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized model definitions for LLM providers
|
|
3
|
+
*/
|
|
4
|
+
export declare const OPENAI_MODELS: {
|
|
5
|
+
GPT35_TURBO: string;
|
|
6
|
+
GPT4: string;
|
|
7
|
+
GPT4_TURBO: string;
|
|
8
|
+
GPT45_PREVIEW: string;
|
|
9
|
+
GPT4O: string;
|
|
10
|
+
GPT4O_MINI: string;
|
|
11
|
+
O1: string;
|
|
12
|
+
O1_MINI: string;
|
|
13
|
+
O3_MINI: string;
|
|
14
|
+
};
|
|
15
|
+
export declare const ANTHROPIC_MODELS: {
|
|
16
|
+
CLAUDE_3_HAIKU: string;
|
|
17
|
+
CLAUDE_3_OPUS: string;
|
|
18
|
+
CLAUDE_3_SONNET: string;
|
|
19
|
+
CLAUDE_35_HAIKU: string;
|
|
20
|
+
CLAUDE_35_SONNET: string;
|
|
21
|
+
CLAUDE_35_SONNET_V2: string;
|
|
22
|
+
CLAUDE_37_SONNET: string;
|
|
23
|
+
};
|
|
24
|
+
export declare const OPENAI_MODEL_CHOICES: Array<{
|
|
25
|
+
name: string;
|
|
26
|
+
value: string;
|
|
27
|
+
}>;
|
|
28
|
+
export declare const ANTHROPIC_MODEL_CHOICES: Array<{
|
|
29
|
+
name: string;
|
|
30
|
+
value: string;
|
|
31
|
+
}>;
|
|
32
|
+
export declare function getAnthropicModels(): Array<string>;
|
|
33
|
+
export declare function getOpenAIModels(): Array<string>;
|
|
34
|
+
//# sourceMappingURL=models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../../../src/services/llm/models.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,eAAO,MAAM,aAAa,EAAE;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CAoBhB,CAAC;AAGF,eAAO,MAAM,gBAAgB,EAAE;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;CAczB,CAAC;AAGF,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACd,CAWA,CAAC;AAGF,eAAO,MAAM,uBAAuB,EAAE,KAAK,CAAC;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACd,CASA,CAAC;AAEF,wBAAgB,kBAAkB,IAAI,KAAK,CAAC,MAAM,CAAC,CAElD;AAGD,wBAAgB,eAAe,IAAI,KAAK,CAAC,MAAM,CAAC,CAE/C"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized model definitions for LLM providers
|
|
3
|
+
*/
|
|
4
|
+
// OpenAI Models
|
|
5
|
+
const OPENAI_MODELS = {
|
|
6
|
+
// GPT-3.5 models
|
|
7
|
+
GPT35_TURBO: "gpt-3.5-turbo",
|
|
8
|
+
// Legacy GPT-4 models
|
|
9
|
+
GPT4: "gpt-4",
|
|
10
|
+
GPT4_TURBO: "gpt-4-turbo",
|
|
11
|
+
// GPT-4.5 Preview
|
|
12
|
+
GPT45_PREVIEW: "gpt-4.5-preview",
|
|
13
|
+
// GPT-4o Family
|
|
14
|
+
GPT4O: "gpt-4o",
|
|
15
|
+
GPT4O_MINI: "gpt-4o-mini",
|
|
16
|
+
// O1 Family (Next-gen models)
|
|
17
|
+
O1: "o1",
|
|
18
|
+
O1_MINI: "o1-mini",
|
|
19
|
+
O3_MINI: "o3-mini",
|
|
20
|
+
};
|
|
21
|
+
// Anthropic Models
|
|
22
|
+
const ANTHROPIC_MODELS = {
|
|
23
|
+
CLAUDE_3_HAIKU: "claude-3-haiku-20240307",
|
|
24
|
+
// Claude 3 Family
|
|
25
|
+
CLAUDE_3_OPUS: "claude-3-opus-20240229",
|
|
26
|
+
CLAUDE_3_SONNET: "claude-3-sonnet-20240229",
|
|
27
|
+
CLAUDE_35_HAIKU: "claude-3-5-haiku-20241022",
|
|
28
|
+
CLAUDE_35_SONNET: "claude-3-5-sonnet-20240620",
|
|
29
|
+
// Claude 3.5 Family
|
|
30
|
+
CLAUDE_35_SONNET_V2: "claude-3-5-sonnet-20241022",
|
|
31
|
+
// Claude 3.7 Family
|
|
32
|
+
CLAUDE_37_SONNET: "claude-3-7-sonnet-20250219",
|
|
33
|
+
};
|
|
34
|
+
// Model choices for OpenAI UI
|
|
35
|
+
const OPENAI_MODEL_CHOICES = [
|
|
36
|
+
{ name: "GPT-4o", value: OPENAI_MODELS.GPT4O },
|
|
37
|
+
{ name: "GPT-4o Mini", value: OPENAI_MODELS.GPT4O_MINI },
|
|
38
|
+
{ name: "O1", value: OPENAI_MODELS.O1 },
|
|
39
|
+
{ name: "O1 Mini", value: OPENAI_MODELS.O1_MINI },
|
|
40
|
+
{ name: "O3 Mini", value: OPENAI_MODELS.O3_MINI },
|
|
41
|
+
{ name: "GPT-4.5 Preview", value: OPENAI_MODELS.GPT45_PREVIEW },
|
|
42
|
+
{ name: "GPT-4 Turbo", value: OPENAI_MODELS.GPT4_TURBO },
|
|
43
|
+
{ name: "GPT-4", value: OPENAI_MODELS.GPT4 },
|
|
44
|
+
{ name: "GPT-3.5 Turbo", value: OPENAI_MODELS.GPT35_TURBO },
|
|
45
|
+
{ name: "Custom Model...", value: "custom" },
|
|
46
|
+
];
|
|
47
|
+
// Model choices for Anthropic UI
|
|
48
|
+
const ANTHROPIC_MODEL_CHOICES = [
|
|
49
|
+
{ name: "Claude 3.7 Sonnet", value: ANTHROPIC_MODELS.CLAUDE_37_SONNET },
|
|
50
|
+
{ name: "Claude 3.5 Sonnet v2", value: ANTHROPIC_MODELS.CLAUDE_35_SONNET_V2 },
|
|
51
|
+
{ name: "Claude 3.5 Sonnet", value: ANTHROPIC_MODELS.CLAUDE_35_SONNET },
|
|
52
|
+
{ name: "Claude 3.5 Haiku", value: ANTHROPIC_MODELS.CLAUDE_35_HAIKU },
|
|
53
|
+
{ name: "Claude 3 Opus", value: ANTHROPIC_MODELS.CLAUDE_3_OPUS },
|
|
54
|
+
{ name: "Claude 3 Sonnet", value: ANTHROPIC_MODELS.CLAUDE_3_SONNET },
|
|
55
|
+
{ name: "Claude 3 Haiku", value: ANTHROPIC_MODELS.CLAUDE_3_HAIKU },
|
|
56
|
+
{ name: "Custom Model...", value: "custom" },
|
|
57
|
+
];
|
|
58
|
+
|
|
59
|
+
export { ANTHROPIC_MODELS, ANTHROPIC_MODEL_CHOICES, OPENAI_MODELS, OPENAI_MODEL_CHOICES };
|
|
60
|
+
//# sourceMappingURL=models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","sources":["../../../../../src/services/llm/models.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;;AAEG;AAEH;AACa,MAAA,aAAa,GAUtB;;AAEH,IAAA,WAAW,EAAE,eAAe;;AAE5B,IAAA,IAAI,EAAE,OAAO;AAEb,IAAA,UAAU,EAAE,aAAa;;AAEzB,IAAA,aAAa,EAAE,iBAAiB;;AAEhC,IAAA,KAAK,EAAE,QAAQ;AAEf,IAAA,UAAU,EAAE,aAAa;;AAGzB,IAAA,EAAE,EAAE,IAAI;AACR,IAAA,OAAO,EAAE,SAAS;AAElB,IAAA,OAAO,EAAE,SAAS;;AAGnB;AACa,MAAA,gBAAgB,GAQzB;AACH,IAAA,cAAc,EAAE,yBAAyB;;AAGzC,IAAA,aAAa,EAAE,wBAAwB;AACvC,IAAA,eAAe,EAAE,0BAA0B;AAC3C,IAAA,eAAe,EAAE,2BAA2B;AAE5C,IAAA,gBAAgB,EAAE,4BAA4B;;AAE9C,IAAA,mBAAmB,EAAE,4BAA4B;;AAEjD,IAAA,gBAAgB,EAAE,4BAA4B;;AAG/C;AACa,MAAA,oBAAoB,GAG5B;IACJ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,CAAC,KAAK,EAAE;IAC9C,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,CAAC,UAAU,EAAE;IACxD,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,CAAC,EAAE,EAAE;IACvC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,CAAC,OAAO,EAAE;IACjD,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,CAAC,OAAO,EAAE;IACjD,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,aAAa,CAAC,aAAa,EAAE;IAC/D,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,CAAC,UAAU,EAAE;IACxD,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,CAAC,IAAI,EAAE;IAC5C,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,CAAC,WAAW,EAAE;AAC3D,IAAA,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,QAAQ,EAAE;;AAG7C;AACa,MAAA,uBAAuB,GAG/B;IACJ,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,gBAAgB,CAAC,gBAAgB,EAAE;IACvE,EAAE,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,gBAAgB,CAAC,mBAAmB,EAAE;IAC7E,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,gBAAgB,CAAC,gBAAgB,EAAE;IACvE,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,gBAAgB,CAAC,eAAe,EAAE;IACrE,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,gBAAgB,CAAC,aAAa,EAAE;IAChE,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,gBAAgB,CAAC,eAAe,EAAE;IACpE,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,gBAAgB,CAAC,cAAc,EAAE;AAClE,IAAA,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,QAAQ,EAAE;;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../../src/services/llm/openai.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAIjE,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,CAgH9H"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import OpenAI from 'openai';
|
|
2
|
+
|
|
3
|
+
async function generateCommitWithOpenAI(apiKey, model, context) {
|
|
4
|
+
const openai = new OpenAI({
|
|
5
|
+
apiKey: apiKey,
|
|
6
|
+
});
|
|
7
|
+
const typeOptions = context.typeEnum
|
|
8
|
+
?.map((type) => {
|
|
9
|
+
const description = context.typeDescriptions?.[type]?.description ?? "";
|
|
10
|
+
const emoji = context.typeDescriptions?.[type]?.emoji ?? "";
|
|
11
|
+
const title = context.typeDescriptions?.[type]?.title ?? "";
|
|
12
|
+
// eslint-disable-next-line @elsikora-sonar/no-nested-template-literals
|
|
13
|
+
return `${type}${emoji ? ` (${emoji})` : ""}: ${description}${title ? ` (${title})` : ""}`;
|
|
14
|
+
})
|
|
15
|
+
.join("\n") ?? "";
|
|
16
|
+
const systemPrompt = `You are a commit message generator. Based on the git changes, generate a conventional commit message that follows the commit conventions.
|
|
17
|
+
|
|
18
|
+
The commit should follow this format:
|
|
19
|
+
<type>[(scope)]: <subject>
|
|
20
|
+
[BLANK LINE]
|
|
21
|
+
[body]
|
|
22
|
+
[BLANK LINE]
|
|
23
|
+
[footer]
|
|
24
|
+
|
|
25
|
+
Type constraints:
|
|
26
|
+
${context.typeEnum ? "- Allowed types: " + context.typeEnum.join(", ") : ""}
|
|
27
|
+
${context.typeCase ? "- Case style: " + context.typeCase.join(", ") : ""}
|
|
28
|
+
${context.typeEmpty === undefined ? "" : "- Can be empty: " + (context.typeEmpty ? "yes" : "no")}
|
|
29
|
+
|
|
30
|
+
Available types:
|
|
31
|
+
${typeOptions}
|
|
32
|
+
|
|
33
|
+
Scope constraints:
|
|
34
|
+
${context.scopeCase ? "- Case style: " + context.scopeCase.join(", ") : ""}
|
|
35
|
+
${context.scopeEmpty === undefined ? "" : "- Can be empty: " + (context.scopeEmpty ? "yes" : "no")}
|
|
36
|
+
${context.scopeMaxLength ? "- Max length: " + context.scopeMaxLength + " characters" : ""}
|
|
37
|
+
|
|
38
|
+
Scope guidelines:
|
|
39
|
+
- The scope should represent the area of the codebase being modified
|
|
40
|
+
- If the changes affect multiple areas, use a comma-separated list or select the most significant area
|
|
41
|
+
- If unsure, use "global" as the scope
|
|
42
|
+
- If the scope is not relevant, it can be omitted
|
|
43
|
+
- Analyze the changed files and determine the most appropriate scope based on directories, modules or components
|
|
44
|
+
- Scopes are usually short (one or two words) and lowercase
|
|
45
|
+
|
|
46
|
+
Subject constraints:
|
|
47
|
+
${context.subject.case ? "- Case style: " + context.subject.case.join(", ") : ""}
|
|
48
|
+
${context.subject.empty === undefined ? "" : "- Can be empty: " + (context.subject.empty ? "yes" : "no")}
|
|
49
|
+
${context.subject.maxLength ? "- Max length: " + context.subject.maxLength + " characters" : ""}
|
|
50
|
+
${context.subject.minLength ? "- Min length: " + context.subject.minLength + " characters" : ""}
|
|
51
|
+
${context.subject.fullStop ? "- End with '" + context.subject.fullStop.value + "': " + (context.subject.fullStop.required ? "yes" : "no") : ""}
|
|
52
|
+
|
|
53
|
+
Header constraints:
|
|
54
|
+
${context.headerCase ? "- Case style: " + context.headerCase.join(", ") : ""}
|
|
55
|
+
${context.headerMaxLength ? "- Max length: " + context.headerMaxLength + " characters" : ""}
|
|
56
|
+
${context.headerMinLength ? "- Min length: " + context.headerMinLength + " characters" : ""}
|
|
57
|
+
${context.headerFullStop ? "- End with '" + context.headerFullStop.value + "': " + (context.headerFullStop.required ? "yes" : "no") : ""}
|
|
58
|
+
|
|
59
|
+
Body constraints:
|
|
60
|
+
${context.body?.maxLength ? "- Max length: " + context.body.maxLength + " characters" : ""}
|
|
61
|
+
${context.body?.maxLineLength ? "- Max line length: " + context.body.maxLineLength + " characters" : ""}
|
|
62
|
+
${context.body?.leadingBlank === undefined ? "" : "- Leading blank line: " + (context.body.leadingBlank ? "required" : "not required")}
|
|
63
|
+
${context.body?.fullStop ? "- End with '" + context.body.fullStop.value + "': " + (context.body.fullStop.required ? "yes" : "no") : ""}
|
|
64
|
+
|
|
65
|
+
Footer constraints:
|
|
66
|
+
${context.footerLeadingBlank === undefined ? "" : "- Leading blank line: " + (context.footerLeadingBlank ? "required" : "not required")}
|
|
67
|
+
${context.footerMaxLineLength ? "- Max line length: " + context.footerMaxLineLength + " characters" : ""}
|
|
68
|
+
|
|
69
|
+
Return a JSON object with these fields:
|
|
70
|
+
{
|
|
71
|
+
"type": "the commit type",
|
|
72
|
+
"scope": "the commit scope (optional)",
|
|
73
|
+
"subject": "the commit subject line",
|
|
74
|
+
"body": "the commit body (optional)",
|
|
75
|
+
"isBreaking": boolean,
|
|
76
|
+
"breakingBody": "description of breaking changes (if isBreaking is true)",
|
|
77
|
+
"issues": ["list of issue references"],
|
|
78
|
+
"references": ["list of other references"]
|
|
79
|
+
}`;
|
|
80
|
+
const userPrompt = `Here are the changes to commit:
|
|
81
|
+
${context.diff ? `Diff:\n${context.diff}\n` : ""}
|
|
82
|
+
${context.files ? `Files changed:\n${context.files}` : ""}
|
|
83
|
+
|
|
84
|
+
Based on these changes, generate an appropriate commit message following the conventions.`;
|
|
85
|
+
try {
|
|
86
|
+
const response = await openai.chat.completions.create({
|
|
87
|
+
messages: [
|
|
88
|
+
{ content: systemPrompt, role: "system" },
|
|
89
|
+
{ content: userPrompt, role: "user" },
|
|
90
|
+
],
|
|
91
|
+
model: model,
|
|
92
|
+
response_format: { type: "json_object" },
|
|
93
|
+
});
|
|
94
|
+
// eslint-disable-next-line @elsikora-typescript/no-unsafe-member-access,@elsikora-typescript/no-unsafe-assignment
|
|
95
|
+
const content = response.choices[0]?.message.content;
|
|
96
|
+
if (!content) {
|
|
97
|
+
throw new Error("Empty response from OpenAI");
|
|
98
|
+
}
|
|
99
|
+
// eslint-disable-next-line @elsikora-typescript/no-unsafe-argument
|
|
100
|
+
return JSON.parse(content);
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
console.error("Error generating commit with OpenAI:", error);
|
|
104
|
+
throw error;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export { generateCommitWithOpenAI };
|
|
109
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sources":["../../../../../src/services/llm/openai.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|