opencommit 3.0.8 → 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.
Files changed (3) hide show
  1. package/README.md +17 -2
  2. package/out/cli.cjs +95 -41
  3. 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
- OCO_OPENAI_MAX_TOKENS=<max response tokens from OpenAI API>
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
- OCO_OPENAI_MAX_TOKENS: 500
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.8",
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
- ["OCO_OPENAI_MAX_TOKENS" /* OCO_OPENAI_MAX_TOKENS */](value) {
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
- "OCO_OPENAI_MAX_TOKENS" /* OCO_OPENAI_MAX_TOKENS */,
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
- "OCO_OPENAI_MAX_TOKENS" /* OCO_OPENAI_MAX_TOKENS */,
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
- OCO_OPENAI_MAX_TOKENS: process.env.OCO_OPENAI_MAX_TOKENS ? Number(process.env.OCO_OPENAI_MAX_TOKENS) : void 0,
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 maxTokens = config3?.OCO_OPENAI_MAX_TOKENS;
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: maxTokens || 500
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 > DEFAULT_MODEL_TOKEN_LIMIT - maxTokens) {
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 consistency = await engine.generateCommitMessage(consistencyPrompts) || "{}";
22025
- prompts.forEach((prompt) => consistency = consistency.replace(prompt, ""));
22026
- consistency = removeDoubleNewlines(consistency);
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(consistency)
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
- ${config5?.OCO_EMOJI ? "Use GitMoji convention to preface the commit." : "Do not preface the commit with anything."}
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 ? "\u{1F41B} " : ""}${translation4.commitFix}
22081
- ${config5?.OCO_EMOJI ? "\u2728 " : ""}${translation4.commitFeat}
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 generateCommitMessageChatCompletionPrompt = async (diff) => {
22132
- const INIT_MESSAGES_PROMPT = await getMainCommitPrompt();
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 = DEFAULT_MODEL_TOKEN_LIMIT - ADJUSTMENT_FACTOR - INIT_MESSAGES_PROMPT_LENGTH - config6?.OCO_OPENAI_MAX_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(diff);
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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencommit",
3
- "version": "3.0.8",
3
+ "version": "3.0.10",
4
4
  "description": "Auto-generate impressive commits in 1 second. Killing lame commits with AI 🤯🔫",
5
5
  "keywords": [
6
6
  "git",