@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.
Files changed (149) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +150 -0
  3. package/dist/cjs/ManualProcess.d.ts +6 -0
  4. package/dist/cjs/ManualProcess.d.ts.map +1 -0
  5. package/dist/cjs/ManualProcess.js +111 -0
  6. package/dist/cjs/ManualProcess.js.map +1 -0
  7. package/dist/cjs/Process.d.ts +6 -0
  8. package/dist/cjs/Process.d.ts.map +1 -0
  9. package/dist/cjs/Process.js +165 -0
  10. package/dist/cjs/Process.js.map +1 -0
  11. package/dist/cjs/Question.d.ts +46 -0
  12. package/dist/cjs/Question.d.ts.map +1 -0
  13. package/dist/cjs/SectionBody.d.ts +4 -0
  14. package/dist/cjs/SectionBody.d.ts.map +1 -0
  15. package/dist/cjs/SectionFooter.d.ts +13 -0
  16. package/dist/cjs/SectionFooter.d.ts.map +1 -0
  17. package/dist/cjs/SectionHeader.d.ts +15 -0
  18. package/dist/cjs/SectionHeader.d.ts.map +1 -0
  19. package/dist/cjs/index.d.ts +14 -0
  20. package/dist/cjs/index.d.ts.map +1 -0
  21. package/dist/cjs/index.js +70 -0
  22. package/dist/cjs/index.js.map +1 -0
  23. package/dist/cjs/services/commitlintConfig.d.ts +4 -0
  24. package/dist/cjs/services/commitlintConfig.d.ts.map +1 -0
  25. package/dist/cjs/services/commitlintConfig.js +198 -0
  26. package/dist/cjs/services/commitlintConfig.js.map +1 -0
  27. package/dist/cjs/services/commitlintValidator.d.ts +20 -0
  28. package/dist/cjs/services/commitlintValidator.d.ts.map +1 -0
  29. package/dist/cjs/services/commitlintValidator.js +145 -0
  30. package/dist/cjs/services/commitlintValidator.js.map +1 -0
  31. package/dist/cjs/services/getRuleQuestionConfig.d.ts +4 -0
  32. package/dist/cjs/services/getRuleQuestionConfig.d.ts.map +1 -0
  33. package/dist/cjs/services/llm/anthropic.d.ts +3 -0
  34. package/dist/cjs/services/llm/anthropic.d.ts.map +1 -0
  35. package/dist/cjs/services/llm/anthropic.js +118 -0
  36. package/dist/cjs/services/llm/anthropic.js.map +1 -0
  37. package/dist/cjs/services/llm/config.d.ts +5 -0
  38. package/dist/cjs/services/llm/config.d.ts.map +1 -0
  39. package/dist/cjs/services/llm/config.js +181 -0
  40. package/dist/cjs/services/llm/config.js.map +1 -0
  41. package/dist/cjs/services/llm/index.d.ts +6 -0
  42. package/dist/cjs/services/llm/index.d.ts.map +1 -0
  43. package/dist/cjs/services/llm/index.js +398 -0
  44. package/dist/cjs/services/llm/index.js.map +1 -0
  45. package/dist/cjs/services/llm/models.d.ts +34 -0
  46. package/dist/cjs/services/llm/models.d.ts.map +1 -0
  47. package/dist/cjs/services/llm/models.js +65 -0
  48. package/dist/cjs/services/llm/models.js.map +1 -0
  49. package/dist/cjs/services/llm/openai.d.ts +3 -0
  50. package/dist/cjs/services/llm/openai.d.ts.map +1 -0
  51. package/dist/cjs/services/llm/openai.js +111 -0
  52. package/dist/cjs/services/llm/openai.js.map +1 -0
  53. package/dist/cjs/services/llm/types.d.ts +71 -0
  54. package/dist/cjs/services/llm/types.d.ts.map +1 -0
  55. package/dist/cjs/store/defaultPromptConfigs.d.ts +33 -0
  56. package/dist/cjs/store/defaultPromptConfigs.d.ts.map +1 -0
  57. package/dist/cjs/store/defaultPromptConfigs.js +39 -0
  58. package/dist/cjs/store/defaultPromptConfigs.js.map +1 -0
  59. package/dist/cjs/store/prompts.d.ts +6 -0
  60. package/dist/cjs/store/prompts.d.ts.map +1 -0
  61. package/dist/cjs/store/prompts.js +40 -0
  62. package/dist/cjs/store/prompts.js.map +1 -0
  63. package/dist/cjs/store/rules.d.ts +7 -0
  64. package/dist/cjs/store/rules.d.ts.map +1 -0
  65. package/dist/cjs/types.d.ts +3 -0
  66. package/dist/cjs/types.d.ts.map +1 -0
  67. package/dist/cjs/utils/case-function.d.ts +9 -0
  68. package/dist/cjs/utils/case-function.d.ts.map +1 -0
  69. package/dist/cjs/utils/full-stop-function.d.ts +9 -0
  70. package/dist/cjs/utils/full-stop-function.d.ts.map +1 -0
  71. package/dist/cjs/utils/leading-blank-function.d.ts +8 -0
  72. package/dist/cjs/utils/leading-blank-function.d.ts.map +1 -0
  73. package/dist/cjs/utils/rules.d.ts +26 -0
  74. package/dist/cjs/utils/rules.d.ts.map +1 -0
  75. package/dist/esm/ManualProcess.d.ts +6 -0
  76. package/dist/esm/ManualProcess.d.ts.map +1 -0
  77. package/dist/esm/ManualProcess.js +107 -0
  78. package/dist/esm/ManualProcess.js.map +1 -0
  79. package/dist/esm/Process.d.ts +6 -0
  80. package/dist/esm/Process.d.ts.map +1 -0
  81. package/dist/esm/Process.js +161 -0
  82. package/dist/esm/Process.js.map +1 -0
  83. package/dist/esm/Question.d.ts +46 -0
  84. package/dist/esm/Question.d.ts.map +1 -0
  85. package/dist/esm/SectionBody.d.ts +4 -0
  86. package/dist/esm/SectionBody.d.ts.map +1 -0
  87. package/dist/esm/SectionFooter.d.ts +13 -0
  88. package/dist/esm/SectionFooter.d.ts.map +1 -0
  89. package/dist/esm/SectionHeader.d.ts +15 -0
  90. package/dist/esm/SectionHeader.d.ts.map +1 -0
  91. package/dist/esm/index.d.ts +14 -0
  92. package/dist/esm/index.d.ts.map +1 -0
  93. package/dist/esm/index.js +67 -0
  94. package/dist/esm/index.js.map +1 -0
  95. package/dist/esm/services/commitlintConfig.d.ts +4 -0
  96. package/dist/esm/services/commitlintConfig.d.ts.map +1 -0
  97. package/dist/esm/services/commitlintConfig.js +196 -0
  98. package/dist/esm/services/commitlintConfig.js.map +1 -0
  99. package/dist/esm/services/commitlintValidator.d.ts +20 -0
  100. package/dist/esm/services/commitlintValidator.d.ts.map +1 -0
  101. package/dist/esm/services/commitlintValidator.js +142 -0
  102. package/dist/esm/services/commitlintValidator.js.map +1 -0
  103. package/dist/esm/services/getRuleQuestionConfig.d.ts +4 -0
  104. package/dist/esm/services/getRuleQuestionConfig.d.ts.map +1 -0
  105. package/dist/esm/services/llm/anthropic.d.ts +3 -0
  106. package/dist/esm/services/llm/anthropic.d.ts.map +1 -0
  107. package/dist/esm/services/llm/anthropic.js +116 -0
  108. package/dist/esm/services/llm/anthropic.js.map +1 -0
  109. package/dist/esm/services/llm/config.d.ts +5 -0
  110. package/dist/esm/services/llm/config.d.ts.map +1 -0
  111. package/dist/esm/services/llm/config.js +178 -0
  112. package/dist/esm/services/llm/config.js.map +1 -0
  113. package/dist/esm/services/llm/index.d.ts +6 -0
  114. package/dist/esm/services/llm/index.d.ts.map +1 -0
  115. package/dist/esm/services/llm/index.js +393 -0
  116. package/dist/esm/services/llm/index.js.map +1 -0
  117. package/dist/esm/services/llm/models.d.ts +34 -0
  118. package/dist/esm/services/llm/models.d.ts.map +1 -0
  119. package/dist/esm/services/llm/models.js +60 -0
  120. package/dist/esm/services/llm/models.js.map +1 -0
  121. package/dist/esm/services/llm/openai.d.ts +3 -0
  122. package/dist/esm/services/llm/openai.d.ts.map +1 -0
  123. package/dist/esm/services/llm/openai.js +109 -0
  124. package/dist/esm/services/llm/openai.js.map +1 -0
  125. package/dist/esm/services/llm/types.d.ts +71 -0
  126. package/dist/esm/services/llm/types.d.ts.map +1 -0
  127. package/dist/esm/store/defaultPromptConfigs.d.ts +33 -0
  128. package/dist/esm/store/defaultPromptConfigs.d.ts.map +1 -0
  129. package/dist/esm/store/defaultPromptConfigs.js +35 -0
  130. package/dist/esm/store/defaultPromptConfigs.js.map +1 -0
  131. package/dist/esm/store/prompts.d.ts +6 -0
  132. package/dist/esm/store/prompts.d.ts.map +1 -0
  133. package/dist/esm/store/prompts.js +38 -0
  134. package/dist/esm/store/prompts.js.map +1 -0
  135. package/dist/esm/store/rules.d.ts +7 -0
  136. package/dist/esm/store/rules.d.ts.map +1 -0
  137. package/dist/esm/types.d.ts +3 -0
  138. package/dist/esm/types.d.ts.map +1 -0
  139. package/dist/esm/utils/case-function.d.ts +9 -0
  140. package/dist/esm/utils/case-function.d.ts.map +1 -0
  141. package/dist/esm/utils/full-stop-function.d.ts +9 -0
  142. package/dist/esm/utils/full-stop-function.d.ts.map +1 -0
  143. package/dist/esm/utils/leading-blank-function.d.ts +8 -0
  144. package/dist/esm/utils/leading-blank-function.d.ts.map +1 -0
  145. package/dist/esm/utils/rules.d.ts +26 -0
  146. package/dist/esm/utils/rules.d.ts.map +1 -0
  147. package/dist/tsconfig.tsbuildinfo +1 -0
  148. package/index.cjs +6 -0
  149. 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,3 @@
1
+ import type { CommitConfig, LLMPromptContext } from "./types.js";
2
+ export declare function generateCommitWithOpenAI(apiKey: string, model: string, context: LLMPromptContext): Promise<CommitConfig>;
3
+ //# sourceMappingURL=openai.d.ts.map
@@ -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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"}