@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,65 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Centralized model definitions for LLM providers
5
+ */
6
+ // OpenAI Models
7
+ const OPENAI_MODELS = {
8
+ // GPT-3.5 models
9
+ GPT35_TURBO: "gpt-3.5-turbo",
10
+ // Legacy GPT-4 models
11
+ GPT4: "gpt-4",
12
+ GPT4_TURBO: "gpt-4-turbo",
13
+ // GPT-4.5 Preview
14
+ GPT45_PREVIEW: "gpt-4.5-preview",
15
+ // GPT-4o Family
16
+ GPT4O: "gpt-4o",
17
+ GPT4O_MINI: "gpt-4o-mini",
18
+ // O1 Family (Next-gen models)
19
+ O1: "o1",
20
+ O1_MINI: "o1-mini",
21
+ O3_MINI: "o3-mini",
22
+ };
23
+ // Anthropic Models
24
+ const ANTHROPIC_MODELS = {
25
+ CLAUDE_3_HAIKU: "claude-3-haiku-20240307",
26
+ // Claude 3 Family
27
+ CLAUDE_3_OPUS: "claude-3-opus-20240229",
28
+ CLAUDE_3_SONNET: "claude-3-sonnet-20240229",
29
+ CLAUDE_35_HAIKU: "claude-3-5-haiku-20241022",
30
+ CLAUDE_35_SONNET: "claude-3-5-sonnet-20240620",
31
+ // Claude 3.5 Family
32
+ CLAUDE_35_SONNET_V2: "claude-3-5-sonnet-20241022",
33
+ // Claude 3.7 Family
34
+ CLAUDE_37_SONNET: "claude-3-7-sonnet-20250219",
35
+ };
36
+ // Model choices for OpenAI UI
37
+ const OPENAI_MODEL_CHOICES = [
38
+ { name: "GPT-4o", value: OPENAI_MODELS.GPT4O },
39
+ { name: "GPT-4o Mini", value: OPENAI_MODELS.GPT4O_MINI },
40
+ { name: "O1", value: OPENAI_MODELS.O1 },
41
+ { name: "O1 Mini", value: OPENAI_MODELS.O1_MINI },
42
+ { name: "O3 Mini", value: OPENAI_MODELS.O3_MINI },
43
+ { name: "GPT-4.5 Preview", value: OPENAI_MODELS.GPT45_PREVIEW },
44
+ { name: "GPT-4 Turbo", value: OPENAI_MODELS.GPT4_TURBO },
45
+ { name: "GPT-4", value: OPENAI_MODELS.GPT4 },
46
+ { name: "GPT-3.5 Turbo", value: OPENAI_MODELS.GPT35_TURBO },
47
+ { name: "Custom Model...", value: "custom" },
48
+ ];
49
+ // Model choices for Anthropic UI
50
+ const ANTHROPIC_MODEL_CHOICES = [
51
+ { name: "Claude 3.7 Sonnet", value: ANTHROPIC_MODELS.CLAUDE_37_SONNET },
52
+ { name: "Claude 3.5 Sonnet v2", value: ANTHROPIC_MODELS.CLAUDE_35_SONNET_V2 },
53
+ { name: "Claude 3.5 Sonnet", value: ANTHROPIC_MODELS.CLAUDE_35_SONNET },
54
+ { name: "Claude 3.5 Haiku", value: ANTHROPIC_MODELS.CLAUDE_35_HAIKU },
55
+ { name: "Claude 3 Opus", value: ANTHROPIC_MODELS.CLAUDE_3_OPUS },
56
+ { name: "Claude 3 Sonnet", value: ANTHROPIC_MODELS.CLAUDE_3_SONNET },
57
+ { name: "Claude 3 Haiku", value: ANTHROPIC_MODELS.CLAUDE_3_HAIKU },
58
+ { name: "Custom Model...", value: "custom" },
59
+ ];
60
+
61
+ exports.ANTHROPIC_MODELS = ANTHROPIC_MODELS;
62
+ exports.ANTHROPIC_MODEL_CHOICES = ANTHROPIC_MODEL_CHOICES;
63
+ exports.OPENAI_MODELS = OPENAI_MODELS;
64
+ exports.OPENAI_MODEL_CHOICES = OPENAI_MODEL_CHOICES;
65
+ //# 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,111 @@
1
+ 'use strict';
2
+
3
+ var OpenAI = require('openai');
4
+
5
+ async function generateCommitWithOpenAI(apiKey, model, context) {
6
+ const openai = new OpenAI({
7
+ apiKey: apiKey,
8
+ });
9
+ const typeOptions = context.typeEnum
10
+ ?.map((type) => {
11
+ const description = context.typeDescriptions?.[type]?.description ?? "";
12
+ const emoji = context.typeDescriptions?.[type]?.emoji ?? "";
13
+ const title = context.typeDescriptions?.[type]?.title ?? "";
14
+ // eslint-disable-next-line @elsikora-sonar/no-nested-template-literals
15
+ return `${type}${emoji ? ` (${emoji})` : ""}: ${description}${title ? ` (${title})` : ""}`;
16
+ })
17
+ .join("\n") ?? "";
18
+ const systemPrompt = `You are a commit message generator. Based on the git changes, generate a conventional commit message that follows the commit conventions.
19
+
20
+ The commit should follow this format:
21
+ <type>[(scope)]: <subject>
22
+ [BLANK LINE]
23
+ [body]
24
+ [BLANK LINE]
25
+ [footer]
26
+
27
+ Type constraints:
28
+ ${context.typeEnum ? "- Allowed types: " + context.typeEnum.join(", ") : ""}
29
+ ${context.typeCase ? "- Case style: " + context.typeCase.join(", ") : ""}
30
+ ${context.typeEmpty === undefined ? "" : "- Can be empty: " + (context.typeEmpty ? "yes" : "no")}
31
+
32
+ Available types:
33
+ ${typeOptions}
34
+
35
+ Scope constraints:
36
+ ${context.scopeCase ? "- Case style: " + context.scopeCase.join(", ") : ""}
37
+ ${context.scopeEmpty === undefined ? "" : "- Can be empty: " + (context.scopeEmpty ? "yes" : "no")}
38
+ ${context.scopeMaxLength ? "- Max length: " + context.scopeMaxLength + " characters" : ""}
39
+
40
+ Scope guidelines:
41
+ - The scope should represent the area of the codebase being modified
42
+ - If the changes affect multiple areas, use a comma-separated list or select the most significant area
43
+ - If unsure, use "global" as the scope
44
+ - If the scope is not relevant, it can be omitted
45
+ - Analyze the changed files and determine the most appropriate scope based on directories, modules or components
46
+ - Scopes are usually short (one or two words) and lowercase
47
+
48
+ Subject constraints:
49
+ ${context.subject.case ? "- Case style: " + context.subject.case.join(", ") : ""}
50
+ ${context.subject.empty === undefined ? "" : "- Can be empty: " + (context.subject.empty ? "yes" : "no")}
51
+ ${context.subject.maxLength ? "- Max length: " + context.subject.maxLength + " characters" : ""}
52
+ ${context.subject.minLength ? "- Min length: " + context.subject.minLength + " characters" : ""}
53
+ ${context.subject.fullStop ? "- End with '" + context.subject.fullStop.value + "': " + (context.subject.fullStop.required ? "yes" : "no") : ""}
54
+
55
+ Header constraints:
56
+ ${context.headerCase ? "- Case style: " + context.headerCase.join(", ") : ""}
57
+ ${context.headerMaxLength ? "- Max length: " + context.headerMaxLength + " characters" : ""}
58
+ ${context.headerMinLength ? "- Min length: " + context.headerMinLength + " characters" : ""}
59
+ ${context.headerFullStop ? "- End with '" + context.headerFullStop.value + "': " + (context.headerFullStop.required ? "yes" : "no") : ""}
60
+
61
+ Body constraints:
62
+ ${context.body?.maxLength ? "- Max length: " + context.body.maxLength + " characters" : ""}
63
+ ${context.body?.maxLineLength ? "- Max line length: " + context.body.maxLineLength + " characters" : ""}
64
+ ${context.body?.leadingBlank === undefined ? "" : "- Leading blank line: " + (context.body.leadingBlank ? "required" : "not required")}
65
+ ${context.body?.fullStop ? "- End with '" + context.body.fullStop.value + "': " + (context.body.fullStop.required ? "yes" : "no") : ""}
66
+
67
+ Footer constraints:
68
+ ${context.footerLeadingBlank === undefined ? "" : "- Leading blank line: " + (context.footerLeadingBlank ? "required" : "not required")}
69
+ ${context.footerMaxLineLength ? "- Max line length: " + context.footerMaxLineLength + " characters" : ""}
70
+
71
+ Return a JSON object with these fields:
72
+ {
73
+ "type": "the commit type",
74
+ "scope": "the commit scope (optional)",
75
+ "subject": "the commit subject line",
76
+ "body": "the commit body (optional)",
77
+ "isBreaking": boolean,
78
+ "breakingBody": "description of breaking changes (if isBreaking is true)",
79
+ "issues": ["list of issue references"],
80
+ "references": ["list of other references"]
81
+ }`;
82
+ const userPrompt = `Here are the changes to commit:
83
+ ${context.diff ? `Diff:\n${context.diff}\n` : ""}
84
+ ${context.files ? `Files changed:\n${context.files}` : ""}
85
+
86
+ Based on these changes, generate an appropriate commit message following the conventions.`;
87
+ try {
88
+ const response = await openai.chat.completions.create({
89
+ messages: [
90
+ { content: systemPrompt, role: "system" },
91
+ { content: userPrompt, role: "user" },
92
+ ],
93
+ model: model,
94
+ response_format: { type: "json_object" },
95
+ });
96
+ // eslint-disable-next-line @elsikora-typescript/no-unsafe-member-access,@elsikora-typescript/no-unsafe-assignment
97
+ const content = response.choices[0]?.message.content;
98
+ if (!content) {
99
+ throw new Error("Empty response from OpenAI");
100
+ }
101
+ // eslint-disable-next-line @elsikora-typescript/no-unsafe-argument
102
+ return JSON.parse(content);
103
+ }
104
+ catch (error) {
105
+ console.error("Error generating commit with OpenAI:", error);
106
+ throw error;
107
+ }
108
+ }
109
+
110
+ exports.generateCommitWithOpenAI = generateCommitWithOpenAI;
111
+ //# 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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"}
@@ -0,0 +1,71 @@
1
+ export type CommitConfig = {
2
+ body?: string;
3
+ breakingBody?: string;
4
+ isBreaking?: boolean;
5
+ issues?: Array<string>;
6
+ references?: Array<string>;
7
+ scope?: string;
8
+ subject: string;
9
+ type: string;
10
+ };
11
+ export type CommitMode = "auto" | "manual";
12
+ export type LLMConfig = {
13
+ apiKey: string;
14
+ } & LLMConfigStorage;
15
+ export type LLMConfigStorage = {
16
+ mode?: CommitMode;
17
+ model: LLMModel;
18
+ provider: LLMProvider;
19
+ };
20
+ export type LLMModel = string;
21
+ export type LLMPromptContext = {
22
+ body?: {
23
+ description?: string;
24
+ fullStop?: {
25
+ required: boolean;
26
+ value: string;
27
+ };
28
+ leadingBlank?: boolean;
29
+ maxLength?: number;
30
+ maxLineLength?: number;
31
+ minLength?: number;
32
+ };
33
+ caseFnOptions?: Array<string>;
34
+ diff?: string;
35
+ files?: string;
36
+ footerLeadingBlank?: boolean;
37
+ footerMaxLineLength?: number;
38
+ headerCase?: Array<string>;
39
+ headerFullStop?: {
40
+ required: boolean;
41
+ value: string;
42
+ };
43
+ headerMaxLength?: number;
44
+ headerMinLength?: number;
45
+ scopeCase?: Array<string>;
46
+ scopeDescription?: string;
47
+ scopeEmpty?: boolean;
48
+ scopeMaxLength?: number;
49
+ subject: {
50
+ case?: Array<string>;
51
+ description?: string;
52
+ empty?: boolean;
53
+ fullStop?: {
54
+ required: boolean;
55
+ value: string;
56
+ };
57
+ maxLength?: number;
58
+ minLength?: number;
59
+ };
60
+ typeCase?: Array<string>;
61
+ typeDescription?: string;
62
+ typeDescriptions?: Record<string, {
63
+ description: string;
64
+ emoji?: string;
65
+ title?: string;
66
+ }>;
67
+ typeEmpty?: boolean;
68
+ typeEnum?: Array<string>;
69
+ };
70
+ export type LLMProvider = "anthropic" | "openai";
71
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/services/llm/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ declare const _default: {
2
+ messages: {
3
+ emptyWarning: string;
4
+ lowerLimitWarning: string;
5
+ max: string;
6
+ min: string;
7
+ skip: string;
8
+ upperLimitWarning: string;
9
+ };
10
+ questions: {
11
+ body: {
12
+ description: string;
13
+ };
14
+ footer: {
15
+ description: string;
16
+ };
17
+ scope: {
18
+ description: string;
19
+ };
20
+ subject: {
21
+ description: string;
22
+ };
23
+ type: {
24
+ description: string;
25
+ };
26
+ };
27
+ settings: {
28
+ enableMultipleScopes: boolean;
29
+ scopeEnumSeparator: string;
30
+ };
31
+ };
32
+ export default _default;
33
+ //# sourceMappingURL=defaultPromptConfigs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaultPromptConfigs.d.ts","sourceRoot":"","sources":["../../../src/store/defaultPromptConfigs.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wBA+BE"}
@@ -0,0 +1,39 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var defaultPromptConfigs = {
6
+ messages: {
7
+ emptyWarning: "(%s is required)",
8
+ lowerLimitWarning: "%s is %d characters less than the lower limit",
9
+ max: "(max %d chars)",
10
+ min: "(min %d chars)",
11
+ skip: "(press enter to skip)",
12
+ upperLimitWarning: "%s is %d characters longer than the upper limit",
13
+ },
14
+ questions: {
15
+ body: {
16
+ description: "<body> holds additional information about the change",
17
+ },
18
+ footer: {
19
+ description: "<footer> holds further meta data, such as breaking changes and issue ids",
20
+ },
21
+ scope: {
22
+ description: "<scope> marks which sub-component of the project is affected",
23
+ },
24
+ subject: {
25
+ description: "<subject> is a short, high-level description of the change",
26
+ },
27
+ type: {
28
+ description: "<type> holds information about the goal of a change.",
29
+ },
30
+ },
31
+ settings: {
32
+ // eslint-disable-next-line @elsikora-typescript/naming-convention
33
+ enableMultipleScopes: false,
34
+ scopeEnumSeparator: ",",
35
+ },
36
+ };
37
+
38
+ exports.default = defaultPromptConfigs;
39
+ //# sourceMappingURL=defaultPromptConfigs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaultPromptConfigs.js","sources":["../../../../src/store/defaultPromptConfigs.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAAA,2BAAe;AACd,IAAA,QAAQ,EAAE;AACT,QAAA,YAAY,EAAE,kBAAkB;AAChC,QAAA,iBAAiB,EAAE,+CAA+C;AAClE,QAAA,GAAG,EAAE,gBAAgB;AACrB,QAAA,GAAG,EAAE,gBAAgB;AACrB,QAAA,IAAI,EAAE,uBAAuB;AAC7B,QAAA,iBAAiB,EAAE,iDAAiD;AACpE,KAAA;AACD,IAAA,SAAS,EAAE;AACV,QAAA,IAAI,EAAE;AACL,YAAA,WAAW,EAAE,sDAAsD;AACnE,SAAA;AACD,QAAA,MAAM,EAAE;AACP,YAAA,WAAW,EAAE,0EAA0E;AACvF,SAAA;AACD,QAAA,KAAK,EAAE;AACN,YAAA,WAAW,EAAE,8DAA8D;AAC3E,SAAA;AACD,QAAA,OAAO,EAAE;AACR,YAAA,WAAW,EAAE,4DAA4D;AACzE,SAAA;AACD,QAAA,IAAI,EAAE;AACL,YAAA,WAAW,EAAE,sDAAsD;AACnE,SAAA;AACD,KAAA;AACD,IAAA,QAAQ,EAAE;;AAET,QAAA,oBAAoB,EAAE,KAAK;AAC3B,QAAA,kBAAkB,EAAE,GAAG;AACvB,KAAA;CACD;;;;"}
@@ -0,0 +1,6 @@
1
+ import type { PromptConfig, UserPromptConfig } from "@commitlint/types";
2
+ export declare function getPromptMessages(): Readonly<PromptConfig["messages"]>;
3
+ export declare function getPromptQuestions(): Readonly<PromptConfig["questions"]>;
4
+ export declare function getPromptSettings(): Readonly<PromptConfig["settings"]>;
5
+ export declare function setPromptConfig(newPromptConfig: UserPromptConfig): void;
6
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../src/store/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAcxE,wBAAgB,iBAAiB,IAAI,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAEtE;AAED,wBAAgB,kBAAkB,IAAI,QAAQ,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAExE;AAED,wBAAgB,iBAAiB,IAAI,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAEtE;AAED,wBAAgB,eAAe,CAAC,eAAe,EAAE,gBAAgB,GAAG,IAAI,CA+BvE"}
@@ -0,0 +1,40 @@
1
+ 'use strict';
2
+
3
+ var isPlainObject = require('lodash.isplainobject');
4
+ var defaultPromptConfigs = require('./defaultPromptConfigs.js');
5
+
6
+ const storeKey = Symbol("promptConfig");
7
+ const store = {
8
+ [storeKey]: defaultPromptConfigs.default,
9
+ };
10
+ function setPromptConfig(newPromptConfig) {
11
+ const { messages, questions, settings } = newPromptConfig;
12
+ if (messages) {
13
+ const requiredMessageKeys = Object.keys(defaultPromptConfigs.default.messages);
14
+ // eslint-disable-next-line @elsikora-unicorn/no-array-for-each
15
+ requiredMessageKeys.forEach((key) => {
16
+ const message = messages[key];
17
+ if (typeof message === "string") {
18
+ store[storeKey].messages[key] = message;
19
+ }
20
+ });
21
+ }
22
+ if (questions && isPlainObject(questions)) {
23
+ store[storeKey].questions = questions;
24
+ }
25
+ if (settings && isPlainObject(settings)) {
26
+ // eslint-disable-next-line @elsikora-sonar/anchor-precedence
27
+ if (settings.scopeEnumSeparator && !/^\/|\\|,$/.test(settings.scopeEnumSeparator)) {
28
+ console.log(`prompt.settings.scopeEnumSeparator must be one of ',', '\\', '/'.`);
29
+ // eslint-disable-next-line @elsikora-unicorn/no-process-exit,elsikora-node/no-process-exit
30
+ process.exit(1);
31
+ }
32
+ store[storeKey].settings = {
33
+ ...defaultPromptConfigs.default.settings,
34
+ ...settings,
35
+ };
36
+ }
37
+ }
38
+
39
+ exports.setPromptConfig = setPromptConfig;
40
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sources":["../../../../src/store/prompts.ts"],"sourcesContent":[null],"names":["defaultPromptConfigs"],"mappings":";;;;;AAMA,MAAM,QAAQ,GAAkB,MAAM,CAAC,cAAc,CAAC;AAEtD,MAAM,KAAK,GAEP;IACH,CAAC,QAAQ,GAAGA,4BAAoB;CAChC;AAcK,SAAU,eAAe,CAAC,eAAiC,EAAA;IAChE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAqB,eAAe;IAE3E,IAAI,QAAQ,EAAE;QACb,MAAM,mBAAmB,GAAkB,MAAM,CAAC,IAAI,CAACA,4BAAoB,CAAC,QAAQ,CAAC;;AAErF,QAAA,mBAAmB,CAAC,OAAO,CAAC,CAAC,GAAW,KAAI;AAC3C,YAAA,MAAM,OAAO,GAAQ,QAAQ,CAAC,GAAG,CAAC;AAElC,YAAA,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;gBAChC,KAAK,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,OAAO;;AAEzC,SAAC,CAAC;;AAGH,IAAA,IAAI,SAAS,IAAI,aAAa,CAAC,SAAS,CAAC,EAAE;AAC1C,QAAA,KAAK,CAAC,QAAQ,CAAC,CAAC,SAAS,GAAG,SAAS;;AAGtC,IAAA,IAAI,QAAQ,IAAI,aAAa,CAAC,QAAQ,CAAC,EAAE;;AAExC,QAAA,IAAI,QAAQ,CAAC,kBAAkB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE;AAClF,YAAA,OAAO,CAAC,GAAG,CAAC,CAAA,iEAAA,CAAmE,CAAC;;AAEhF,YAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;;AAEhB,QAAA,KAAK,CAAC,QAAQ,CAAC,CAAC,QAAQ,GAAG;YAC1B,GAAGA,4BAAoB,CAAC,QAAQ;AAChC,YAAA,GAAG,QAAQ;SACX;;AAEH;;;;"}
@@ -0,0 +1,7 @@
1
+ import type { QualifiedRules } from "@commitlint/types";
2
+ import type { Rule } from "../types.js";
3
+ export type GetRuleMethod = typeof getRule;
4
+ export type SetRulesMethod = typeof setRules;
5
+ export declare function getRule(key: string, property: string): Rule | undefined;
6
+ export declare function setRules(newRules: QualifiedRules): void;
7
+ //# sourceMappingURL=rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../../src/store/rules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAWxC,MAAM,MAAM,aAAa,GAAG,OAAO,OAAO,CAAC;AAG3C,MAAM,MAAM,cAAc,GAAG,OAAO,QAAQ,CAAC;AAE7C,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAMvE;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAEvD"}
@@ -0,0 +1,3 @@
1
+ import type { RuleConfigCondition, RuleConfigSeverity } from "@commitlint/types";
2
+ export type Rule = Readonly<[RuleConfigSeverity, RuleConfigCondition, unknown]> | Readonly<[RuleConfigSeverity, RuleConfigCondition]> | Readonly<[RuleConfigSeverity.Disabled]>;
3
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAGjF,MAAM,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,kBAAkB,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,kBAAkB,EAAE,mBAAmB,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Rule } from "../types.js";
2
+ export type CaseFunction = (input: Array<string> | string, delimiter?: string) => string;
3
+ /**
4
+ * Get forced case for rule
5
+ * @param rule to parse
6
+ * @return transform function applying the enforced case
7
+ */
8
+ export default function getCaseFunction(rule?: Rule): CaseFunction;
9
+ //# sourceMappingURL=case-function.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"case-function.d.ts","sourceRoot":"","sources":["../../../src/utils/case-function.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAOxC,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;AAEzF;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,YAAY,CAwCjE"}
@@ -0,0 +1,9 @@
1
+ import type { Rule } from "../types.js";
2
+ export type FullStopFunction = (input: string) => string;
3
+ /**
4
+ * Get forced case for rule
5
+ * @param rule to parse
6
+ * @return transform function applying the enforced case
7
+ */
8
+ export default function getFullStopFunction(rule?: Rule): FullStopFunction;
9
+ //# sourceMappingURL=full-stop-function.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"full-stop-function.d.ts","sourceRoot":"","sources":["../../../src/utils/full-stop-function.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAKxC,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;AAEzD;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,gBAAgB,CAyBzE"}
@@ -0,0 +1,8 @@
1
+ import type { Rule } from "../types.js";
2
+ /**
3
+ * Get forced leading for rule
4
+ * @param rule to parse
5
+ * @return transform function applying the leading
6
+ */
7
+ export default function getLeadingBlankFunction(rule?: Rule): (input: string) => string;
8
+ //# sourceMappingURL=leading-blank-function.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"leading-blank-function.d.ts","sourceRoot":"","sources":["../../../src/utils/leading-blank-function.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAIxC;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,uBAAuB,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAwBtF"}
@@ -0,0 +1,26 @@
1
+ import type { Rule } from "../types.js";
2
+ import { RuleConfigSeverity } from "@commitlint/types";
3
+ export declare function enumRuleIsActive(rule: Rule): rule is Readonly<[RuleConfigSeverity.Error | RuleConfigSeverity.Warning, "always", Array<string>]>;
4
+ export declare function getEnumList(rule: Rule): Array<string>;
5
+ export declare function getMaxLength(rule?: Rule): number;
6
+ export declare function getMinLength(rule?: Rule): number;
7
+ /**
8
+ * Check if a rule definition is active
9
+ * @param rule to check
10
+ * @return if the rule definition is active
11
+ */
12
+ export declare function ruleIsActive<T extends Rule>(rule: T): rule is Exclude<T, Readonly<[RuleConfigSeverity.Disabled]>>;
13
+ /**
14
+ * Check if a rule definition is applicable
15
+ * @param rule to check
16
+ * @return if the rule definition is applicable
17
+ */
18
+ export declare function ruleIsApplicable(rule: Rule): rule is Readonly<[RuleConfigSeverity, "always", unknown]> | Readonly<[RuleConfigSeverity, "always"]>;
19
+ export declare function ruleIsDisabled(rule: Rule): rule is Readonly<[RuleConfigSeverity.Disabled]>;
20
+ /**
21
+ * Check if a rule definition is applicable
22
+ * @param rule to check
23
+ * @return if the rule definition is applicable
24
+ */
25
+ export declare function ruleIsNotApplicable(rule: Rule): rule is Readonly<[RuleConfigSeverity, "never", unknown]> | Readonly<[RuleConfigSeverity, "never"]>;
26
+ //# sourceMappingURL=rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../../src/utils/rules.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,QAAQ,CAAC,CAAC,kBAAkB,CAAC,KAAK,GAAG,kBAAkB,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAE/I;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAGrD;AAED,wBAAgB,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,MAAM,CAMhD;AAED,wBAAgB,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,MAAM,CAMhD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAMjH;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,QAAQ,CAAC,CAAC,kBAAkB,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC,CAMjJ;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,QAAQ,CAAC,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAE1F;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,QAAQ,CAAC,CAAC,kBAAkB,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC,CAMlJ"}
@@ -0,0 +1,6 @@
1
+ import type { QualifiedRules, UserPromptConfig } from "@commitlint/types";
2
+ import type { Answers, DistinctQuestion } from "inquirer";
3
+ export default function ManualProcess(rules: QualifiedRules, prompts: UserPromptConfig, inquirer: {
4
+ prompt(questions: Array<DistinctQuestion>): Promise<Answers>;
5
+ }): Promise<string>;
6
+ //# sourceMappingURL=ManualProcess.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ManualProcess.d.ts","sourceRoot":"","sources":["../../src/ManualProcess.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAU1D,wBAA8B,aAAa,CAC1C,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,gBAAgB,EACzB,QAAQ,EAAE;IACT,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7D,GACC,OAAO,CAAC,MAAM,CAAC,CA4IjB"}
@@ -0,0 +1,107 @@
1
+ import chalk from 'chalk';
2
+ import { extractLLMPromptContext } from './services/commitlintConfig.js';
3
+ import { setPromptConfig } from './store/prompts.js';
4
+
5
+ async function ManualProcess(rules, prompts, inquirer) {
6
+ setPromptConfig(prompts);
7
+ // Extract context from commitlint config
8
+ const promptContext = extractLLMPromptContext(rules, prompts);
9
+ // Message removed as it's now handled in the index.ts file
10
+ // Manual entry prompts
11
+ const commitQuestions = [
12
+ {
13
+ choices: promptContext.typeEnum?.map((type) => {
14
+ const desc = promptContext.typeDescriptions?.[type]?.description ?? "";
15
+ const emoji = promptContext.typeDescriptions?.[type]?.emoji ?? "";
16
+ // Remove emoji from description if it already appears at the beginning
17
+ let cleanDesc = desc;
18
+ if (emoji && desc.startsWith(emoji)) {
19
+ cleanDesc = desc.slice(emoji.length).trim();
20
+ }
21
+ return {
22
+ // eslint-disable-next-line @elsikora-sonar/no-nested-template-literals
23
+ name: `${type}${emoji ? ` ${emoji}` : ""}: ${cleanDesc}`,
24
+ value: type,
25
+ };
26
+ }) ?? [],
27
+ message: promptContext.typeDescription ?? "Select the type of change that you're committing:",
28
+ name: "type",
29
+ type: "list",
30
+ },
31
+ {
32
+ message: promptContext.scopeDescription ?? 'What is the scope of this change:\n - Use component, directory or area of codebase\n - Use comma-separated list for multiple areas\n - Type "global" for project-wide changes\n - Press enter to skip if scope is not applicable',
33
+ name: "scope",
34
+ type: "input",
35
+ },
36
+ {
37
+ message: promptContext.subject.description ?? "Write a short, imperative mood description of the change:",
38
+ name: "subject",
39
+ type: "input",
40
+ // eslint-disable-next-line @elsikora-typescript/explicit-function-return-type
41
+ validate: (input) => {
42
+ if (!input)
43
+ return "Subject is required";
44
+ return true;
45
+ },
46
+ },
47
+ {
48
+ message: promptContext.body?.description ?? "Provide a longer description of the change: (press enter to skip)",
49
+ name: "body",
50
+ type: "input",
51
+ },
52
+ {
53
+ // eslint-disable-next-line @elsikora-typescript/naming-convention
54
+ default: false,
55
+ message: "Are there any breaking changes?",
56
+ name: "isBreaking",
57
+ type: "confirm",
58
+ },
59
+ {
60
+ message: "Describe the breaking changes:",
61
+ name: "breakingBody",
62
+ type: "input",
63
+ // eslint-disable-next-line @elsikora-typescript/no-unsafe-return
64
+ when: (answers) => answers.isBreaking,
65
+ },
66
+ ];
67
+ // First get all commit details
68
+ // @ts-ignore
69
+ const answers = await inquirer.prompt(commitQuestions);
70
+ // Construct message from manual answers
71
+ // eslint-disable-next-line @elsikora-typescript/restrict-template-expressions,@elsikora-sonar/no-nested-template-literals
72
+ const header = `${answers.type}${answers.scope ? `(${answers.scope})` : ""}: ${answers.subject}`;
73
+ let body = "";
74
+ if (answers.isBreaking) {
75
+ // eslint-disable-next-line @elsikora-typescript/restrict-template-expressions
76
+ body = `BREAKING CHANGE: ${answers.breakingBody || "This commit introduces breaking changes."}\n\n`;
77
+ }
78
+ if (answers.body) {
79
+ // eslint-disable-next-line @elsikora-typescript/restrict-plus-operands
80
+ body += answers.body;
81
+ }
82
+ const commitMessage = [header, body].filter(Boolean).join("\n\n");
83
+ // Display the commit message to the user
84
+ console.log("\n" + chalk.yellow("Your commit message:"));
85
+ console.log(chalk.white("-----------------------------------"));
86
+ console.log(chalk.white(commitMessage));
87
+ console.log(chalk.white("-----------------------------------\n"));
88
+ // Now ask for confirmation
89
+ const { confirmCommit } = await inquirer.prompt([
90
+ {
91
+ // eslint-disable-next-line @elsikora-typescript/naming-convention
92
+ default: true,
93
+ message: "Are you sure you want to proceed with the commit above?",
94
+ name: "confirmCommit",
95
+ type: "confirm",
96
+ },
97
+ ]);
98
+ // Check confirmation
99
+ if (!confirmCommit) {
100
+ console.log(chalk.yellow("Commit canceled."));
101
+ throw new Error("User canceled the commit");
102
+ }
103
+ return commitMessage;
104
+ }
105
+
106
+ export { ManualProcess as default };
107
+ //# sourceMappingURL=ManualProcess.js.map