Support Gitmoji Format in Commit Messages (#249)

* 📝 docs(prompts.ts): update prompt message to include information about GitMoji convention and descriptions of changes

📝 docs(prompts.ts): update prompt message to include information about GitMoji convention and descriptions of changes

* 🎨 (prompts.ts): import `removeConventionalCommitWord` function to remove conventional commit word from commit prompts
🐛 (prompts.ts): remove conventional commit word from `commitFix` and `commitFeat` prompts to improve clarity
📝 (removeConventionalCommitWord.ts): add `removeConventionalCommitWord` function to remove conventional commit word from commit message

* 📝 (package.json): update version from 3.0.3 to 3.0.0 to align with the latest release

* 🔧 (cli.ts): add a new flag 'fgm' to the 'flags' object to support the '--fgm' flag in the CLI command
🔧 (commit.ts): pass the value of the 'fgm' flag to the 'commit' function to enable or disable full GitMoji specification
♻️ (commit.ts): refactor the 'commit' function to accept the 'fullGitMojiSpec' parameter and pass it to the 'commit' function recursively
♻️ (generateCommitMessageFromGitDiff.ts): refactor the 'generateCommitMessageByDiff' function to accept the 'fullGitMojiSpec' parameter and pass it to the 'generateCommitMessageChatCompletionPrompt' function
♻️ (generateCommitMessageFromGitDiff.ts): refactor the 'generateCommitMessageChatCompletionPrompt' function to accept the 'fullGitMojiSpec' parameter and pass it to the 'getMainCommitPrompt' function
♻️ (generateCommitMessageFromGitDiff.ts): refactor the 'getCommitMsgsPromisesFromFileDiffs' function to accept the 'fullGitMojiSpec' parameter and pass it to the 'getMessagesPromisesByChangesInFile' function
♻️ (generateCommitMessageFromGitDiff.ts): refactor the 'getMessagesPromisesByChangesInFile' function to accept the 'fullGitMojiSpec' parameter and pass it to the 'generateCommitMessageChatCompletionPrompt' function
♻️ (prompts.ts): refactor the 'getMainCommitPrompt' function to accept the 'fullGitMojiSpec' parameter and pass it to the 'INIT_MAIN_PROMPT' function

* 📝 (README.md): add documentation for the `--fgm` flag in the `oco` command to enable the use of the full GitMoji specification

* 📝 (README.md): update flag description for using full GitMoji specification
📝 (README.md): add link to the GitMoji specification for reference

* 🔧 (README.md): fix a typo in the description of the `Use Full GitMoji Specification` flag
🔧 (api.ts): update the default value of the `apiKey` variable to a placeholder value for testing purposes

* Revert "🔧 (README.md): fix a typo in the description of the `Use Full GitMoji Specification` flag"

This reverts commit 230a4aa449b4718063db22f7aa835bbb68dc1a88.

* 🔧 (README.md): fix a typo in the description of the `Use Full GitMoji Specification` flag

* 📝 (prompts.ts): update INIT_MAIN_PROMPT content to include information about the fullGitMojiSpec flag and provide instructions on how to choose the right emoji for the commit message

---------

Co-authored-by: GPT10 <57486732+di-sukharev@users.noreply.github.com>
This commit is contained in:
Malthe Poulsen
2024-03-03 12:36:55 +01:00
committed by GitHub
parent ec699c48bf
commit 9b7337f67f
6 changed files with 154 additions and 33 deletions
+19 -11
View File
@@ -14,9 +14,10 @@ const MAX_TOKENS_INPUT = config?.OCO_TOKENS_MAX_INPUT || DEFAULT_TOKEN_LIMITS.DE
const MAX_TOKENS_OUTPUT = config?.OCO_TOKENS_MAX_OUTPUT || DEFAULT_TOKEN_LIMITS.DEFAULT_MAX_TOKENS_OUTPUT;
const generateCommitMessageChatCompletionPrompt = async (
diff: string
diff: string,
fullGitMojiSpec: boolean
): Promise<Array<ChatCompletionRequestMessage>> => {
const INIT_MESSAGES_PROMPT = await getMainCommitPrompt();
const INIT_MESSAGES_PROMPT = await getMainCommitPrompt(fullGitMojiSpec);
const chatContextAsCompletionRequest = [...INIT_MESSAGES_PROMPT];
@@ -38,10 +39,11 @@ export enum GenerateCommitMessageErrorEnum {
const ADJUSTMENT_FACTOR = 20;
export const generateCommitMessageByDiff = async (
diff: string
diff: string,
fullGitMojiSpec: boolean
): Promise<string> => {
try {
const INIT_MESSAGES_PROMPT = await getMainCommitPrompt();
const INIT_MESSAGES_PROMPT = await getMainCommitPrompt(fullGitMojiSpec);
const INIT_MESSAGES_PROMPT_LENGTH = INIT_MESSAGES_PROMPT.map(
(msg) => tokenCount(msg.content) + 4
@@ -56,7 +58,8 @@ export const generateCommitMessageByDiff = async (
if (tokenCount(diff) >= MAX_REQUEST_TOKENS) {
const commitMessagePromises = await getCommitMsgsPromisesFromFileDiffs(
diff,
MAX_REQUEST_TOKENS
MAX_REQUEST_TOKENS,
fullGitMojiSpec
);
const commitMessages = [];
@@ -68,7 +71,7 @@ export const generateCommitMessageByDiff = async (
return commitMessages.join('\n\n');
}
const messages = await generateCommitMessageChatCompletionPrompt(diff);
const messages = await generateCommitMessageChatCompletionPrompt(diff, fullGitMojiSpec);
const engine = getEngine()
const commitMessage = await engine.generateCommitMessage(messages);
@@ -85,7 +88,8 @@ export const generateCommitMessageByDiff = async (
function getMessagesPromisesByChangesInFile(
fileDiff: string,
separator: string,
maxChangeLength: number
maxChangeLength: number,
fullGitMojiSpec: boolean
) {
const hunkHeaderSeparator = '@@ ';
const [fileHeader, ...fileDiffByLines] = fileDiff.split(hunkHeaderSeparator);
@@ -112,7 +116,8 @@ function getMessagesPromisesByChangesInFile(
const commitMsgsFromFileLineDiffs = lineDiffsWithHeader.map(
async (lineDiff) => {
const messages = await generateCommitMessageChatCompletionPrompt(
separator + lineDiff
separator + lineDiff,
fullGitMojiSpec
);
return engine.generateCommitMessage(messages);
@@ -160,7 +165,8 @@ function splitDiff(diff: string, maxChangeLength: number) {
export const getCommitMsgsPromisesFromFileDiffs = async (
diff: string,
maxDiffLength: number
maxDiffLength: number,
fullGitMojiSpec: boolean
) => {
const separator = 'diff --git ';
@@ -177,13 +183,15 @@ export const getCommitMsgsPromisesFromFileDiffs = async (
const messagesPromises = getMessagesPromisesByChangesInFile(
fileDiff,
separator,
maxDiffLength
maxDiffLength,
fullGitMojiSpec
);
commitMessagePromises.push(...messagesPromises);
} else {
const messages = await generateCommitMessageChatCompletionPrompt(
separator + fileDiff
separator + fileDiff,
fullGitMojiSpec
);
const engine = getEngine()