diff --git a/README.md b/README.md index 0964ba90..5c656973 100644 --- a/README.md +++ b/README.md @@ -124,6 +124,7 @@ OCO_DESCRIPTION= OCO_EMOJI= OCO_MODEL= OCO_LANGUAGE= +OCO_MESSAGE_TEMPLATE_PLACEHOLDER= ``` ### Global config for all repos @@ -193,6 +194,14 @@ is translated to : git commit -m "${generatedMessage}" --no-verify ``` +To include a message in the generated message, you can utilize the template function! For instance: + +```sh +oco '$msg #205’ +``` + +> opencommit examines placeholders in the parameters, allowing you to append additional information before and after the placeholders, such as the relevant Issue or Pull Request. Similarly, you have the option to customize the OCO_MESSAGE_TEMPLATE_PLACEHOLDER configuration item, for example, simplifying it to $m!" + ### Ignore files You can ignore files from submission to OpenAI by creating a `.opencommitignore` file. For example: diff --git a/src/commands/commit.ts b/src/commands/commit.ts index 15760f7f..567f47b6 100644 --- a/src/commands/commit.ts +++ b/src/commands/commit.ts @@ -18,25 +18,42 @@ import { multiselect, select } from '@clack/prompts'; +import { + getConfig +} from '../commands/config'; import chalk from 'chalk'; import { trytm } from '../utils/trytm'; +const config = getConfig(); + const getGitRemotes = async () => { const { stdout } = await execa('git', ['remote']); return stdout.split('\n').filter((remote) => Boolean(remote.trim())); }; +// Check for the presence of message templates +const checkMessageTemplate = (extraArgs: string[]): string | false => { + for(const key in extraArgs){ + if(extraArgs[key].includes(config?.OCO_MESSAGE_TEMPLATE_PLACEHOLDER)) return extraArgs[key]; + } + return false; +}; + const generateCommitMessageFromGitDiff = async ( diff: string, extraArgs: string[] ): Promise => { + const messageTemplate = checkMessageTemplate(extraArgs); await assertGitRepo(); const commitSpinner = spinner(); commitSpinner.start('Generating the commit message'); try { - const commitMessage = await generateCommitMessageByDiff(diff); + let commitMessage = await generateCommitMessageByDiff(diff); + if(typeof messageTemplate === 'string'){ + commitMessage = messageTemplate.replace(config?.OCO_MESSAGE_TEMPLATE_PLACEHOLDER, commitMessage); + } commitSpinner.stop('📝 Commit message generated'); outro( diff --git a/src/commands/config.ts b/src/commands/config.ts index 9ccf5c2b..33934a4f 100644 --- a/src/commands/config.ts +++ b/src/commands/config.ts @@ -19,7 +19,8 @@ export enum CONFIG_KEYS { OCO_DESCRIPTION = 'OCO_DESCRIPTION', OCO_EMOJI = 'OCO_EMOJI', OCO_MODEL = 'OCO_MODEL', - OCO_LANGUAGE = 'OCO_LANGUAGE' + OCO_LANGUAGE = 'OCO_LANGUAGE', + OCO_MESSAGE_TEMPLATE_PLACEHOLDER = 'OCO_MESSAGE_TEMPLATE_PLACEHOLDER', } export const DEFAULT_MODEL_TOKEN_LIMIT = 4096; @@ -124,6 +125,14 @@ export const configValidators = { `${value} is not supported yet, use 'gpt-4' or 'gpt-3.5-turbo' (default)` ); return value; + }, + [CONFIG_KEYS.OCO_MESSAGE_TEMPLATE_PLACEHOLDER](value: any) { + validateConfig( + CONFIG_KEYS.OCO_MESSAGE_TEMPLATE_PLACEHOLDER, + value.startsWith('$'), + `${value} must start with $, for example: '$msg'` + ); + return value; } }; @@ -141,7 +150,8 @@ export const getConfig = (): ConfigType | null => { OCO_DESCRIPTION: process.env.OCO_DESCRIPTION === 'true' ? true : false, OCO_EMOJI: process.env.OCO_EMOJI === 'true' ? true : false, OCO_MODEL: process.env.OCO_MODEL || 'gpt-3.5-turbo', - OCO_LANGUAGE: process.env.OCO_LANGUAGE || 'en' + OCO_LANGUAGE: process.env.OCO_LANGUAGE || 'en', + OCO_MESSAGE_TEMPLATE_PLACEHOLDER: process.env.OCO_MESSAGE_TEMPLATE_PLACEHOLDER || '$msg' }; const configExists = existsSync(configPath);