opencommit 3.0.9 → 3.0.10
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/README.md +17 -2
- package/out/cli.cjs +95 -41
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -58,6 +58,8 @@ git add <files...>
|
|
|
58
58
|
oco
|
|
59
59
|
```
|
|
60
60
|
|
|
61
|
+
Link to the GitMoji specification: https://gitmoji.dev/
|
|
62
|
+
|
|
61
63
|
You can also run it with local model through ollama:
|
|
62
64
|
|
|
63
65
|
- install and start ollama
|
|
@@ -69,6 +71,17 @@ git add <files...>
|
|
|
69
71
|
AI_PROVIDER='ollama' opencommit
|
|
70
72
|
```
|
|
71
73
|
|
|
74
|
+
### Flags
|
|
75
|
+
There are multiple optional flags that can be used with the `oco` command:
|
|
76
|
+
|
|
77
|
+
#### Use Full GitMoji Specification
|
|
78
|
+
This flag can only be used if the `OCO_EMOJI` configuration item is set to `true`. This flag allows users to use all emojis in the GitMoji specification, By default, the GitMoji full specification is set to `false`, which only includes 10 emojis (🐛✨📝🚀✅♻️⬆️🔧🌐💡).
|
|
79
|
+
This is due to limit the number of tokens sent in each request. However, if you would like to use the full GitMoji specification, you can use the `--fgm` flag.
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
oco --fgm
|
|
83
|
+
```
|
|
84
|
+
|
|
72
85
|
## Configuration
|
|
73
86
|
|
|
74
87
|
### Local per repo configuration
|
|
@@ -77,7 +90,8 @@ Create a `.env` file and add OpenCommit config variables there like this:
|
|
|
77
90
|
|
|
78
91
|
```env
|
|
79
92
|
OCO_OPENAI_API_KEY=<your OpenAI API token>
|
|
80
|
-
|
|
93
|
+
OCO_TOKENS_MAX_INPUT=<max model token limit (default: 4096)>
|
|
94
|
+
OCO_TOKENS_MAX_OUTPUT=<max response tokens (default: 500)>
|
|
81
95
|
OCO_OPENAI_BASE_PATH=<may be used to set proxy path to OpenAI api>
|
|
82
96
|
OCO_DESCRIPTION=<postface a message with ~3 sentences description of the changes>
|
|
83
97
|
OCO_EMOJI=<boolean, add GitMoji>
|
|
@@ -329,7 +343,8 @@ jobs:
|
|
|
329
343
|
OCO_OPENAI_API_KEY: ${{ secrets.OCO_OPENAI_API_KEY }}
|
|
330
344
|
|
|
331
345
|
# customization
|
|
332
|
-
|
|
346
|
+
OCO_TOKENS_MAX_INPUT: 4096
|
|
347
|
+
OCO_TOKENS_MAX_OUTPUT: 500
|
|
333
348
|
OCO_OPENAI_BASE_PATH: ''
|
|
334
349
|
OCO_DESCRIPTION: false
|
|
335
350
|
OCO_EMOJI: false
|
package/out/cli.cjs
CHANGED
|
@@ -16384,7 +16384,7 @@ function G3(t, e2) {
|
|
|
16384
16384
|
// package.json
|
|
16385
16385
|
var package_default = {
|
|
16386
16386
|
name: "opencommit",
|
|
16387
|
-
version: "3.0.
|
|
16387
|
+
version: "3.0.10",
|
|
16388
16388
|
description: "Auto-generate impressive commits in 1 second. Killing lame commits with AI \u{1F92F}\u{1F52B}",
|
|
16389
16389
|
keywords: [
|
|
16390
16390
|
"git",
|
|
@@ -18650,7 +18650,6 @@ function getI18nLocal(value) {
|
|
|
18650
18650
|
|
|
18651
18651
|
// src/commands/config.ts
|
|
18652
18652
|
dotenv.config();
|
|
18653
|
-
var DEFAULT_MODEL_TOKEN_LIMIT = 4096;
|
|
18654
18653
|
var validateConfig = (key, condition, validationMessage) => {
|
|
18655
18654
|
if (!condition) {
|
|
18656
18655
|
ce(
|
|
@@ -18682,17 +18681,33 @@ var configValidators = {
|
|
|
18682
18681
|
);
|
|
18683
18682
|
return value;
|
|
18684
18683
|
},
|
|
18685
|
-
["
|
|
18684
|
+
["OCO_TOKENS_MAX_INPUT" /* OCO_TOKENS_MAX_INPUT */](value) {
|
|
18686
18685
|
if (typeof value === "string") {
|
|
18687
18686
|
value = parseInt(value);
|
|
18688
18687
|
validateConfig(
|
|
18689
|
-
"
|
|
18688
|
+
"OCO_TOKENS_MAX_INPUT" /* OCO_TOKENS_MAX_INPUT */,
|
|
18690
18689
|
!isNaN(value),
|
|
18691
18690
|
"Must be a number"
|
|
18692
18691
|
);
|
|
18693
18692
|
}
|
|
18694
18693
|
validateConfig(
|
|
18695
|
-
"
|
|
18694
|
+
"OCO_TOKENS_MAX_INPUT" /* OCO_TOKENS_MAX_INPUT */,
|
|
18695
|
+
value ? typeof value === "number" : void 0,
|
|
18696
|
+
"Must be a number"
|
|
18697
|
+
);
|
|
18698
|
+
return value;
|
|
18699
|
+
},
|
|
18700
|
+
["OCO_TOKENS_MAX_OUTPUT" /* OCO_TOKENS_MAX_OUTPUT */](value) {
|
|
18701
|
+
if (typeof value === "string") {
|
|
18702
|
+
value = parseInt(value);
|
|
18703
|
+
validateConfig(
|
|
18704
|
+
"OCO_TOKENS_MAX_OUTPUT" /* OCO_TOKENS_MAX_OUTPUT */,
|
|
18705
|
+
!isNaN(value),
|
|
18706
|
+
"Must be a number"
|
|
18707
|
+
);
|
|
18708
|
+
}
|
|
18709
|
+
validateConfig(
|
|
18710
|
+
"OCO_TOKENS_MAX_OUTPUT" /* OCO_TOKENS_MAX_OUTPUT */,
|
|
18696
18711
|
value ? typeof value === "number" : void 0,
|
|
18697
18712
|
"Must be a number"
|
|
18698
18713
|
);
|
|
@@ -18769,7 +18784,8 @@ var configPath = (0, import_path.join)((0, import_os.homedir)(), ".opencommit");
|
|
|
18769
18784
|
var getConfig = () => {
|
|
18770
18785
|
const configFromEnv = {
|
|
18771
18786
|
OCO_OPENAI_API_KEY: process.env.OCO_OPENAI_API_KEY,
|
|
18772
|
-
|
|
18787
|
+
OCO_TOKENS_MAX_INPUT: process.env.OCO_TOKENS_MAX_INPUT ? Number(process.env.OCO_TOKENS_MAX_INPUT) : void 0,
|
|
18788
|
+
OCO_TOKENS_MAX_OUTPUT: process.env.OCO_TOKENS_MAX_OUTPUT ? Number(process.env.OCO_TOKENS_MAX_OUTPUT) : void 0,
|
|
18773
18789
|
OCO_OPENAI_BASE_PATH: process.env.OCO_OPENAI_BASE_PATH,
|
|
18774
18790
|
OCO_DESCRIPTION: process.env.OCO_DESCRIPTION === "true" ? true : false,
|
|
18775
18791
|
OCO_EMOJI: process.env.OCO_EMOJI === "true" ? true : false,
|
|
@@ -19037,6 +19053,15 @@ var removeDoubleNewlines = (input) => {
|
|
|
19037
19053
|
}
|
|
19038
19054
|
return input;
|
|
19039
19055
|
};
|
|
19056
|
+
var getJSONBlock = (input) => {
|
|
19057
|
+
const jsonIndex = input.search("```json");
|
|
19058
|
+
if (jsonIndex > -1) {
|
|
19059
|
+
input = input.slice(jsonIndex + 8);
|
|
19060
|
+
const endJsonIndex = consistency.search("```");
|
|
19061
|
+
input = input.slice(0, endJsonIndex);
|
|
19062
|
+
}
|
|
19063
|
+
return input;
|
|
19064
|
+
};
|
|
19040
19065
|
var commitlintLLMConfigExists = async () => {
|
|
19041
19066
|
let exists;
|
|
19042
19067
|
try {
|
|
@@ -21900,7 +21925,8 @@ function tokenCount(content) {
|
|
|
21900
21925
|
|
|
21901
21926
|
// src/engine/openAi.ts
|
|
21902
21927
|
var config3 = getConfig();
|
|
21903
|
-
var
|
|
21928
|
+
var MAX_TOKENS_OUTPUT = config3?.OCO_TOKENS_MAX_OUTPUT || 500 /* DEFAULT_MAX_TOKENS_OUTPUT */;
|
|
21929
|
+
var MAX_TOKENS_INPUT = config3?.OCO_TOKENS_MAX_INPUT || 4096 /* DEFAULT_MAX_TOKENS_INPUT */;
|
|
21904
21930
|
var basePath = config3?.OCO_OPENAI_BASE_PATH;
|
|
21905
21931
|
var apiKey = config3?.OCO_OPENAI_API_KEY;
|
|
21906
21932
|
var [command, mode] = process.argv.slice(2);
|
|
@@ -21933,11 +21959,11 @@ var OpenAi = class {
|
|
|
21933
21959
|
messages,
|
|
21934
21960
|
temperature: 0,
|
|
21935
21961
|
top_p: 0.1,
|
|
21936
|
-
max_tokens:
|
|
21962
|
+
max_tokens: MAX_TOKENS_OUTPUT
|
|
21937
21963
|
};
|
|
21938
21964
|
try {
|
|
21939
21965
|
const REQUEST_TOKENS = messages.map((msg) => tokenCount(msg.content) + 4).reduce((a2, b6) => a2 + b6, 0);
|
|
21940
|
-
if (REQUEST_TOKENS >
|
|
21966
|
+
if (REQUEST_TOKENS > MAX_TOKENS_INPUT - MAX_TOKENS_OUTPUT) {
|
|
21941
21967
|
throw new Error("TOO_MUCH_TOKENS" /* tooMuchTokens */);
|
|
21942
21968
|
}
|
|
21943
21969
|
const { data } = await this.openAI.createChatCompletion(params);
|
|
@@ -22021,15 +22047,16 @@ var configureCommitlintIntegration = async (force = false) => {
|
|
|
22021
22047
|
const prompts = inferPromptsFromCommitlintConfig(commitLintConfig);
|
|
22022
22048
|
const consistencyPrompts = commitlintPrompts.GEN_COMMITLINT_CONSISTENCY_PROMPT(prompts);
|
|
22023
22049
|
const engine = getEngine();
|
|
22024
|
-
let
|
|
22025
|
-
prompts.forEach((prompt) =>
|
|
22026
|
-
|
|
22050
|
+
let consistency2 = await engine.generateCommitMessage(consistencyPrompts) || "{}";
|
|
22051
|
+
prompts.forEach((prompt) => consistency2 = consistency2.replace(prompt, ""));
|
|
22052
|
+
consistency2 = getJSONBlock(consistency2);
|
|
22053
|
+
consistency2 = removeDoubleNewlines(consistency2);
|
|
22027
22054
|
const commitlintLLMConfig = {
|
|
22028
22055
|
hash,
|
|
22029
22056
|
prompts,
|
|
22030
22057
|
consistency: {
|
|
22031
22058
|
[translation2.localLanguage]: {
|
|
22032
|
-
...JSON.parse(
|
|
22059
|
+
...JSON.parse(consistency2)
|
|
22033
22060
|
}
|
|
22034
22061
|
}
|
|
22035
22062
|
};
|
|
@@ -22037,14 +22064,19 @@ var configureCommitlintIntegration = async (force = false) => {
|
|
|
22037
22064
|
spin.stop(`Done - please review contents of ${COMMITLINT_LLM_CONFIG_PATH}`);
|
|
22038
22065
|
};
|
|
22039
22066
|
|
|
22067
|
+
// src/utils/removeConventionalCommitWord.ts
|
|
22068
|
+
function removeConventionalCommitWord(message) {
|
|
22069
|
+
return message.replace(/^(fix|feat)\((.+?)\):/, "($2):");
|
|
22070
|
+
}
|
|
22071
|
+
|
|
22040
22072
|
// src/prompts.ts
|
|
22041
22073
|
var config5 = getConfig();
|
|
22042
22074
|
var translation3 = i18n[config5?.OCO_LANGUAGE || "en"];
|
|
22043
22075
|
var IDENTITY = "You are to act as the author of a commit message in git.";
|
|
22044
|
-
var INIT_MAIN_PROMPT2 = (language) => ({
|
|
22076
|
+
var INIT_MAIN_PROMPT2 = (language, fullGitMojiSpec) => ({
|
|
22045
22077
|
role: import_openai3.ChatCompletionRequestMessageRoleEnum.System,
|
|
22046
|
-
content: `${IDENTITY} Your mission is to create clean and comprehensive commit messages as per the conventional commit convention and explain WHAT were the changes and mainly WHY the changes were done. I'll send you an output of 'git diff --staged' command, and you are to convert it into a commit message.
|
|
22047
|
-
|
|
22078
|
+
content: `${IDENTITY} Your mission is to create clean and comprehensive commit messages as per the ${fullGitMojiSpec ? "GitMoji specification" : "conventional commit convention"} and explain WHAT were the changes and mainly WHY the changes were done. I'll send you an output of 'git diff --staged' command, and you are to convert it into a commit message.
|
|
22079
|
+
${config5?.OCO_EMOJI ? `Use GitMoji convention to preface the commit. Here are some help to choose the right emoji (emoji, description): \u{1F41B}, Fix a bug; \u2728, Introduce new features; \u{1F4DD}, Add or update documentation; \u{1F680}, Deploy stuff; \u2705, Add, update, or pass tests; \u267B\uFE0F, Refactor code; \u2B06\uFE0F, Upgrade dependencies; \u{1F527}, Add or update configuration files; \u{1F310}, Internationalization and localization; \u{1F4A1}, Add or update comments in source code; ${fullGitMojiSpec ? "\u{1F3A8}, Improve structure / format of the code; \u26A1\uFE0F, Improve performance; \u{1F525}, Remove code or files; \u{1F691}\uFE0F, Critical hotfix; \u{1F484}, Add or update the UI and style files; \u{1F389}, Begin a project; \u{1F512}\uFE0F, Fix security issues; \u{1F510}, Add or update secrets; \u{1F516}, Release / Version tags; \u{1F6A8}, Fix compiler / linter warnings; \u{1F6A7}, Work in progress; \u{1F49A}, Fix CI Build; \u2B07\uFE0F, Downgrade dependencies; \u{1F4CC}, Pin dependencies to specific versions; \u{1F477}, Add or update CI build system; \u{1F4C8}, Add or update analytics or track code; \u2795, Add a dependency; \u2796, Remove a dependency; \u{1F528}, Add or update development scripts; \u270F\uFE0F, Fix typos; \u{1F4A9}, Write bad code that needs to be improved; \u23EA\uFE0F, Revert changes; \u{1F500}, Merge branches; \u{1F4E6}\uFE0F, Add or update compiled files or packages; \u{1F47D}\uFE0F, Update code due to external API changes; \u{1F69A}, Move or rename resources (e.g.: files, paths, routes); \u{1F4C4}, Add or update license; \u{1F4A5}, Introduce breaking changes; \u{1F371}, Add or update assets; \u267F\uFE0F, Improve accessibility; \u{1F37B}, Write code drunkenly; \u{1F4AC}, Add or update text and literals; \u{1F5C3}\uFE0F, Perform database related changes; \u{1F50A}, Add or update logs; \u{1F507}, Remove logs; \u{1F465}, Add or update contributor(s); \u{1F6B8}, Improve user experience / usability; \u{1F3D7}\uFE0F, Make architectural changes; \u{1F4F1}, Work on responsive design; \u{1F921}, Mock things; \u{1F95A}, Add or update an easter egg; \u{1F648}, Add or update a .gitignore file; \u{1F4F8}, Add or update snapshots; \u2697\uFE0F, Perform experiments; \u{1F50D}\uFE0F, Improve SEO; \u{1F3F7}\uFE0F, Add or update types; \u{1F331}, Add or update seed files; \u{1F6A9}, Add, update, or remove feature flags; \u{1F945}, Catch errors; \u{1F4AB}, Add or update animations and transitions; \u{1F5D1}\uFE0F, Deprecate code that needs to be cleaned up; \u{1F6C2}, Work on code related to authorization, roles and permissions; \u{1FA79}, Simple fix for a non-critical issue; \u{1F9D0}, Data exploration/inspection; \u26B0\uFE0F, Remove dead code; \u{1F9EA}, Add a failing test; \u{1F454}, Add or update business logic; \u{1FA7A}, Add or update healthcheck; \u{1F9F1}, Infrastructure related changes; \u{1F9D1}\u200D\u{1F4BB}, Improve developer experience; \u{1F4B8}, Add sponsorships or money related infrastructure; \u{1F9F5}, Add or update code related to multithreading or concurrency; \u{1F9BA}, Add or update code related to validation." : ""}` : "Do not preface the commit with anything. Conventional commit keywords:fix, feat, build, chore, ci, docs, style, refactor, perf, test."}
|
|
22048
22080
|
${config5?.OCO_DESCRIPTION ? `Add a short description of WHY the changes are done after the commit message. Don't start it with "This commit", just describe the changes.` : "Don't add any descriptions to the commit, only commit message."}
|
|
22049
22081
|
Use the present tense. Lines must not be longer than 74 characters. Use ${language} for the commit message.`
|
|
22050
22082
|
});
|
|
@@ -22077,11 +22109,11 @@ var INIT_DIFF_PROMPT = {
|
|
|
22077
22109
|
};
|
|
22078
22110
|
var INIT_CONSISTENCY_PROMPT = (translation4) => ({
|
|
22079
22111
|
role: import_openai3.ChatCompletionRequestMessageRoleEnum.Assistant,
|
|
22080
|
-
content: `${config5?.OCO_EMOJI ?
|
|
22081
|
-
${config5?.OCO_EMOJI ?
|
|
22112
|
+
content: `${config5?.OCO_EMOJI ? `\u{1F41B} ${removeConventionalCommitWord(translation4.commitFix)}` : translation4.commitFix}
|
|
22113
|
+
${config5?.OCO_EMOJI ? `\u2728 ${removeConventionalCommitWord(translation4.commitFeat)}` : translation4.commitFeat}
|
|
22082
22114
|
${config5?.OCO_DESCRIPTION ? translation4.commitDescription : ""}`
|
|
22083
22115
|
});
|
|
22084
|
-
var getMainCommitPrompt = async () => {
|
|
22116
|
+
var getMainCommitPrompt = async (fullGitMojiSpec) => {
|
|
22085
22117
|
switch (config5?.OCO_PROMPT_MODULE) {
|
|
22086
22118
|
case "@commitlint":
|
|
22087
22119
|
if (!await commitlintLLMConfigExists()) {
|
|
@@ -22103,7 +22135,7 @@ var getMainCommitPrompt = async () => {
|
|
|
22103
22135
|
];
|
|
22104
22136
|
default:
|
|
22105
22137
|
return [
|
|
22106
|
-
INIT_MAIN_PROMPT2(translation3.localLanguage),
|
|
22138
|
+
INIT_MAIN_PROMPT2(translation3.localLanguage, fullGitMojiSpec),
|
|
22107
22139
|
INIT_DIFF_PROMPT,
|
|
22108
22140
|
INIT_CONSISTENCY_PROMPT(translation3)
|
|
22109
22141
|
];
|
|
@@ -22128,8 +22160,10 @@ function mergeDiffs(arr, maxStringLength) {
|
|
|
22128
22160
|
|
|
22129
22161
|
// src/generateCommitMessageFromGitDiff.ts
|
|
22130
22162
|
var config6 = getConfig();
|
|
22131
|
-
var
|
|
22132
|
-
|
|
22163
|
+
var MAX_TOKENS_INPUT2 = config6?.OCO_TOKENS_MAX_INPUT || 4096 /* DEFAULT_MAX_TOKENS_INPUT */;
|
|
22164
|
+
var MAX_TOKENS_OUTPUT2 = config6?.OCO_TOKENS_MAX_OUTPUT || 500 /* DEFAULT_MAX_TOKENS_OUTPUT */;
|
|
22165
|
+
var generateCommitMessageChatCompletionPrompt = async (diff, fullGitMojiSpec) => {
|
|
22166
|
+
const INIT_MESSAGES_PROMPT = await getMainCommitPrompt(fullGitMojiSpec);
|
|
22133
22167
|
const chatContextAsCompletionRequest = [...INIT_MESSAGES_PROMPT];
|
|
22134
22168
|
chatContextAsCompletionRequest.push({
|
|
22135
22169
|
role: import_openai4.ChatCompletionRequestMessageRoleEnum.User,
|
|
@@ -22137,18 +22171,26 @@ var generateCommitMessageChatCompletionPrompt = async (diff) => {
|
|
|
22137
22171
|
});
|
|
22138
22172
|
return chatContextAsCompletionRequest;
|
|
22139
22173
|
};
|
|
22174
|
+
var GenerateCommitMessageErrorEnum = ((GenerateCommitMessageErrorEnum2) => {
|
|
22175
|
+
GenerateCommitMessageErrorEnum2["tooMuchTokens"] = "TOO_MUCH_TOKENS";
|
|
22176
|
+
GenerateCommitMessageErrorEnum2["internalError"] = "INTERNAL_ERROR";
|
|
22177
|
+
GenerateCommitMessageErrorEnum2["emptyMessage"] = "EMPTY_MESSAGE";
|
|
22178
|
+
GenerateCommitMessageErrorEnum2[GenerateCommitMessageErrorEnum2["outputTokensTooHigh"] = `Token limit exceeded, OCO_TOKENS_MAX_OUTPUT must not be much higher than the default ${500 /* DEFAULT_MAX_TOKENS_OUTPUT */} tokens.`] = "outputTokensTooHigh";
|
|
22179
|
+
return GenerateCommitMessageErrorEnum2;
|
|
22180
|
+
})(GenerateCommitMessageErrorEnum || {});
|
|
22140
22181
|
var ADJUSTMENT_FACTOR = 20;
|
|
22141
|
-
var generateCommitMessageByDiff = async (diff) => {
|
|
22182
|
+
var generateCommitMessageByDiff = async (diff, fullGitMojiSpec) => {
|
|
22142
22183
|
try {
|
|
22143
|
-
const INIT_MESSAGES_PROMPT = await getMainCommitPrompt();
|
|
22184
|
+
const INIT_MESSAGES_PROMPT = await getMainCommitPrompt(fullGitMojiSpec);
|
|
22144
22185
|
const INIT_MESSAGES_PROMPT_LENGTH = INIT_MESSAGES_PROMPT.map(
|
|
22145
22186
|
(msg) => tokenCount(msg.content) + 4
|
|
22146
22187
|
).reduce((a2, b6) => a2 + b6, 0);
|
|
22147
|
-
const MAX_REQUEST_TOKENS =
|
|
22188
|
+
const MAX_REQUEST_TOKENS = MAX_TOKENS_INPUT2 - ADJUSTMENT_FACTOR - INIT_MESSAGES_PROMPT_LENGTH - MAX_TOKENS_OUTPUT2;
|
|
22148
22189
|
if (tokenCount(diff) >= MAX_REQUEST_TOKENS) {
|
|
22149
22190
|
const commitMessagePromises = await getCommitMsgsPromisesFromFileDiffs(
|
|
22150
22191
|
diff,
|
|
22151
|
-
MAX_REQUEST_TOKENS
|
|
22192
|
+
MAX_REQUEST_TOKENS,
|
|
22193
|
+
fullGitMojiSpec
|
|
22152
22194
|
);
|
|
22153
22195
|
const commitMessages = [];
|
|
22154
22196
|
for (const promise of commitMessagePromises) {
|
|
@@ -22157,7 +22199,7 @@ var generateCommitMessageByDiff = async (diff) => {
|
|
|
22157
22199
|
}
|
|
22158
22200
|
return commitMessages.join("\n\n");
|
|
22159
22201
|
}
|
|
22160
|
-
const messages = await generateCommitMessageChatCompletionPrompt(diff);
|
|
22202
|
+
const messages = await generateCommitMessageChatCompletionPrompt(diff, fullGitMojiSpec);
|
|
22161
22203
|
const engine = getEngine();
|
|
22162
22204
|
const commitMessage = await engine.generateCommitMessage(messages);
|
|
22163
22205
|
if (!commitMessage)
|
|
@@ -22167,7 +22209,7 @@ var generateCommitMessageByDiff = async (diff) => {
|
|
|
22167
22209
|
throw error;
|
|
22168
22210
|
}
|
|
22169
22211
|
};
|
|
22170
|
-
function getMessagesPromisesByChangesInFile(fileDiff, separator, maxChangeLength) {
|
|
22212
|
+
function getMessagesPromisesByChangesInFile(fileDiff, separator, maxChangeLength, fullGitMojiSpec) {
|
|
22171
22213
|
const hunkHeaderSeparator = "@@ ";
|
|
22172
22214
|
const [fileHeader, ...fileDiffByLines] = fileDiff.split(hunkHeaderSeparator);
|
|
22173
22215
|
const mergedChanges = mergeDiffs(
|
|
@@ -22188,7 +22230,8 @@ function getMessagesPromisesByChangesInFile(fileDiff, separator, maxChangeLength
|
|
|
22188
22230
|
const commitMsgsFromFileLineDiffs = lineDiffsWithHeader.map(
|
|
22189
22231
|
async (lineDiff) => {
|
|
22190
22232
|
const messages = await generateCommitMessageChatCompletionPrompt(
|
|
22191
|
-
separator + lineDiff
|
|
22233
|
+
separator + lineDiff,
|
|
22234
|
+
fullGitMojiSpec
|
|
22192
22235
|
);
|
|
22193
22236
|
return engine.generateCommitMessage(messages);
|
|
22194
22237
|
}
|
|
@@ -22199,6 +22242,9 @@ function splitDiff(diff, maxChangeLength) {
|
|
|
22199
22242
|
const lines = diff.split("\n");
|
|
22200
22243
|
const splitDiffs = [];
|
|
22201
22244
|
let currentDiff = "";
|
|
22245
|
+
if (maxChangeLength <= 0) {
|
|
22246
|
+
throw new Error(GenerateCommitMessageErrorEnum.outputTokensTooHigh);
|
|
22247
|
+
}
|
|
22202
22248
|
for (let line of lines) {
|
|
22203
22249
|
while (tokenCount(line) > maxChangeLength) {
|
|
22204
22250
|
const subLine = line.substring(0, maxChangeLength);
|
|
@@ -22217,7 +22263,7 @@ function splitDiff(diff, maxChangeLength) {
|
|
|
22217
22263
|
}
|
|
22218
22264
|
return splitDiffs;
|
|
22219
22265
|
}
|
|
22220
|
-
var getCommitMsgsPromisesFromFileDiffs = async (diff, maxDiffLength) => {
|
|
22266
|
+
var getCommitMsgsPromisesFromFileDiffs = async (diff, maxDiffLength, fullGitMojiSpec) => {
|
|
22221
22267
|
const separator = "diff --git ";
|
|
22222
22268
|
const diffByFiles = diff.split(separator).slice(1);
|
|
22223
22269
|
const mergedFilesDiffs = mergeDiffs(diffByFiles, maxDiffLength);
|
|
@@ -22227,12 +22273,14 @@ var getCommitMsgsPromisesFromFileDiffs = async (diff, maxDiffLength) => {
|
|
|
22227
22273
|
const messagesPromises = getMessagesPromisesByChangesInFile(
|
|
22228
22274
|
fileDiff,
|
|
22229
22275
|
separator,
|
|
22230
|
-
maxDiffLength
|
|
22276
|
+
maxDiffLength,
|
|
22277
|
+
fullGitMojiSpec
|
|
22231
22278
|
);
|
|
22232
22279
|
commitMessagePromises.push(...messagesPromises);
|
|
22233
22280
|
} else {
|
|
22234
22281
|
const messages = await generateCommitMessageChatCompletionPrompt(
|
|
22235
|
-
separator + fileDiff
|
|
22282
|
+
separator + fileDiff,
|
|
22283
|
+
fullGitMojiSpec
|
|
22236
22284
|
);
|
|
22237
22285
|
const engine = getEngine();
|
|
22238
22286
|
commitMessagePromises.push(engine.generateCommitMessage(messages));
|
|
@@ -22354,12 +22402,15 @@ var checkMessageTemplate = (extraArgs2) => {
|
|
|
22354
22402
|
}
|
|
22355
22403
|
return false;
|
|
22356
22404
|
};
|
|
22357
|
-
var generateCommitMessageFromGitDiff = async (diff, extraArgs2) => {
|
|
22405
|
+
var generateCommitMessageFromGitDiff = async (diff, extraArgs2, fullGitMojiSpec) => {
|
|
22358
22406
|
await assertGitRepo();
|
|
22359
22407
|
const commitSpinner = le();
|
|
22360
22408
|
commitSpinner.start("Generating the commit message");
|
|
22361
22409
|
try {
|
|
22362
|
-
let commitMessage = await generateCommitMessageByDiff(
|
|
22410
|
+
let commitMessage = await generateCommitMessageByDiff(
|
|
22411
|
+
diff,
|
|
22412
|
+
fullGitMojiSpec
|
|
22413
|
+
);
|
|
22363
22414
|
const messageTemplate = checkMessageTemplate(extraArgs2);
|
|
22364
22415
|
if (config7?.OCO_MESSAGE_TEMPLATE_PLACEHOLDER && typeof messageTemplate === "string") {
|
|
22365
22416
|
commitMessage = messageTemplate.replace(
|
|
@@ -22441,7 +22492,7 @@ ${source_default.grey("\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2
|
|
|
22441
22492
|
process.exit(1);
|
|
22442
22493
|
}
|
|
22443
22494
|
};
|
|
22444
|
-
async function commit(extraArgs2 = [], isStageAllFlag = false) {
|
|
22495
|
+
async function commit(extraArgs2 = [], isStageAllFlag = false, fullGitMojiSpec = false) {
|
|
22445
22496
|
if (isStageAllFlag) {
|
|
22446
22497
|
const changedFiles2 = await getChangedFiles();
|
|
22447
22498
|
if (changedFiles2)
|
|
@@ -22470,7 +22521,7 @@ async function commit(extraArgs2 = [], isStageAllFlag = false) {
|
|
|
22470
22521
|
message: "Do you want to stage all files and generate commit message?"
|
|
22471
22522
|
});
|
|
22472
22523
|
if (isStageAllAndCommitConfirmedByUser && !eD2(isStageAllAndCommitConfirmedByUser)) {
|
|
22473
|
-
await commit(extraArgs2, true);
|
|
22524
|
+
await commit(extraArgs2, true, fullGitMojiSpec);
|
|
22474
22525
|
process.exit(1);
|
|
22475
22526
|
}
|
|
22476
22527
|
if (stagedFiles.length === 0 && changedFiles.length > 0) {
|
|
@@ -22485,7 +22536,7 @@ async function commit(extraArgs2 = [], isStageAllFlag = false) {
|
|
|
22485
22536
|
process.exit(1);
|
|
22486
22537
|
await gitAdd({ files });
|
|
22487
22538
|
}
|
|
22488
|
-
await commit(extraArgs2, false);
|
|
22539
|
+
await commit(extraArgs2, false, fullGitMojiSpec);
|
|
22489
22540
|
process.exit(1);
|
|
22490
22541
|
}
|
|
22491
22542
|
stagedFilesSpinner.stop(
|
|
@@ -22495,7 +22546,8 @@ ${stagedFiles.map((file) => ` ${file}`).join("\n")}`
|
|
|
22495
22546
|
const [, generateCommitError] = await trytm(
|
|
22496
22547
|
generateCommitMessageFromGitDiff(
|
|
22497
22548
|
await getDiff({ files: stagedFiles }),
|
|
22498
|
-
extraArgs2
|
|
22549
|
+
extraArgs2,
|
|
22550
|
+
fullGitMojiSpec
|
|
22499
22551
|
)
|
|
22500
22552
|
);
|
|
22501
22553
|
if (generateCommitError) {
|
|
@@ -22701,16 +22753,18 @@ Z2(
|
|
|
22701
22753
|
version: package_default.version,
|
|
22702
22754
|
name: "opencommit",
|
|
22703
22755
|
commands: [configCommand, hookCommand, commitlintConfigCommand],
|
|
22704
|
-
flags: {
|
|
22756
|
+
flags: {
|
|
22757
|
+
fgm: Boolean
|
|
22758
|
+
},
|
|
22705
22759
|
ignoreArgv: (type) => type === "unknown-flag" || type === "argument",
|
|
22706
22760
|
help: { description: package_default.description }
|
|
22707
22761
|
},
|
|
22708
|
-
async () => {
|
|
22762
|
+
async ({ flags }) => {
|
|
22709
22763
|
await checkIsLatestVersion();
|
|
22710
22764
|
if (await isHookCalled()) {
|
|
22711
22765
|
prepareCommitMessageHook();
|
|
22712
22766
|
} else {
|
|
22713
|
-
commit(extraArgs);
|
|
22767
|
+
commit(extraArgs, flags.fgm);
|
|
22714
22768
|
}
|
|
22715
22769
|
},
|
|
22716
22770
|
extraArgs
|