Skip to content

Commit eca4083

Browse files
Feat/add user input code context (#420)
* feat(cli): add context flag for providing additional commit message input
1 parent 0f315ae commit eca4083

File tree

6 files changed

+111
-43
lines changed

6 files changed

+111
-43
lines changed

out/cli.cjs

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -44931,7 +44931,14 @@ var CONVENTIONAL_COMMIT_KEYWORDS = "Do not preface the commit with anything, exc
4493144931
var getCommitConvention = (fullGitMojiSpec) => config4.OCO_EMOJI ? fullGitMojiSpec ? FULL_GITMOJI_SPEC : GITMOJI_HELP : CONVENTIONAL_COMMIT_KEYWORDS;
4493244932
var getDescriptionInstruction = () => config4.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.";
4493344933
var getOneLineCommitInstruction = () => config4.OCO_ONE_LINE_COMMIT ? "Craft a concise commit message that encapsulates all changes made, with an emphasis on the primary updates. If the modifications share a common theme or scope, mention it succinctly; otherwise, leave the scope out to maintain focus. The goal is to provide a clear and unified overview of the changes in a one single message, without diverging into a list of commit per file change." : "";
44934-
var INIT_MAIN_PROMPT2 = (language, fullGitMojiSpec) => ({
44934+
var userInputCodeContext = (context) => {
44935+
if (context !== "" && context !== " ") {
44936+
return `Additional context provided by the user: <context>${context}</context>
44937+
Consider this context when generating the commit message, incorporating relevant information when appropriate.`;
44938+
}
44939+
return "";
44940+
};
44941+
var INIT_MAIN_PROMPT2 = (language, fullGitMojiSpec, context) => ({
4493544942
role: "system",
4493644943
content: (() => {
4493744944
const commitConvention = fullGitMojiSpec ? "GitMoji specification" : "Conventional Commit Convention";
@@ -44941,12 +44948,14 @@ var INIT_MAIN_PROMPT2 = (language, fullGitMojiSpec) => ({
4494144948
const descriptionGuideline = getDescriptionInstruction();
4494244949
const oneLineCommitGuideline = getOneLineCommitInstruction();
4494344950
const generalGuidelines = `Use the present tense. Lines must not be longer than 74 characters. Use ${language} for the commit message.`;
44951+
const userInputContext = userInputCodeContext(context);
4494444952
return `${missionStatement}
4494544953
${diffInstruction}
4494644954
${conventionGuidelines}
4494744955
${descriptionGuideline}
4494844956
${oneLineCommitGuideline}
44949-
${generalGuidelines}`;
44957+
${generalGuidelines}
44958+
${userInputContext}`;
4495044959
})()
4495144960
});
4495244961
var INIT_DIFF_PROMPT = {
@@ -44988,7 +44997,7 @@ var INIT_CONSISTENCY_PROMPT = (translation4) => ({
4498844997
role: "assistant",
4498944998
content: getContent(translation4)
4499044999
});
44991-
var getMainCommitPrompt = async (fullGitMojiSpec) => {
45000+
var getMainCommitPrompt = async (fullGitMojiSpec, context) => {
4499245001
switch (config4.OCO_PROMPT_MODULE) {
4499345002
case "@commitlint":
4499445003
if (!await commitlintLLMConfigExists()) {
@@ -45010,7 +45019,7 @@ var getMainCommitPrompt = async (fullGitMojiSpec) => {
4501045019
];
4501145020
default:
4501245021
return [
45013-
INIT_MAIN_PROMPT2(translation3.localLanguage, fullGitMojiSpec),
45022+
INIT_MAIN_PROMPT2(translation3.localLanguage, fullGitMojiSpec, context),
4501445023
INIT_DIFF_PROMPT,
4501545024
INIT_CONSISTENCY_PROMPT(translation3)
4501645025
];
@@ -45037,8 +45046,8 @@ function mergeDiffs(arr, maxStringLength) {
4503745046
var config5 = getConfig();
4503845047
var MAX_TOKENS_INPUT = config5.OCO_TOKENS_MAX_INPUT;
4503945048
var MAX_TOKENS_OUTPUT = config5.OCO_TOKENS_MAX_OUTPUT;
45040-
var generateCommitMessageChatCompletionPrompt = async (diff, fullGitMojiSpec) => {
45041-
const INIT_MESSAGES_PROMPT = await getMainCommitPrompt(fullGitMojiSpec);
45049+
var generateCommitMessageChatCompletionPrompt = async (diff, fullGitMojiSpec, context) => {
45050+
const INIT_MESSAGES_PROMPT = await getMainCommitPrompt(fullGitMojiSpec, context);
4504245051
const chatContextAsCompletionRequest = [...INIT_MESSAGES_PROMPT];
4504345052
chatContextAsCompletionRequest.push({
4504445053
role: "user",
@@ -45054,9 +45063,12 @@ var GenerateCommitMessageErrorEnum = ((GenerateCommitMessageErrorEnum2) => {
4505445063
return GenerateCommitMessageErrorEnum2;
4505545064
})(GenerateCommitMessageErrorEnum || {});
4505645065
var ADJUSTMENT_FACTOR = 20;
45057-
var generateCommitMessageByDiff = async (diff, fullGitMojiSpec = false) => {
45066+
var generateCommitMessageByDiff = async (diff, fullGitMojiSpec = false, context = "") => {
4505845067
try {
45059-
const INIT_MESSAGES_PROMPT = await getMainCommitPrompt(fullGitMojiSpec);
45068+
const INIT_MESSAGES_PROMPT = await getMainCommitPrompt(
45069+
fullGitMojiSpec,
45070+
context
45071+
);
4506045072
const INIT_MESSAGES_PROMPT_LENGTH = INIT_MESSAGES_PROMPT.map(
4506145073
(msg) => tokenCount(msg.content) + 4
4506245074
).reduce((a4, b7) => a4 + b7, 0);
@@ -45076,7 +45088,8 @@ var generateCommitMessageByDiff = async (diff, fullGitMojiSpec = false) => {
4507645088
}
4507745089
const messages = await generateCommitMessageChatCompletionPrompt(
4507845090
diff,
45079-
fullGitMojiSpec
45091+
fullGitMojiSpec,
45092+
context
4508045093
);
4508145094
const engine = getEngine();
4508245095
const commitMessage = await engine.generateCommitMessage(messages);
@@ -45283,6 +45296,7 @@ var checkMessageTemplate = (extraArgs2) => {
4528345296
var generateCommitMessageFromGitDiff = async ({
4528445297
diff,
4528545298
extraArgs: extraArgs2,
45299+
context = "",
4528645300
fullGitMojiSpec = false,
4528745301
skipCommitConfirmation = false
4528845302
}) => {
@@ -45292,7 +45306,8 @@ var generateCommitMessageFromGitDiff = async ({
4529245306
try {
4529345307
let commitMessage = await generateCommitMessageByDiff(
4529445308
diff,
45295-
fullGitMojiSpec
45309+
fullGitMojiSpec,
45310+
context
4529645311
);
4529745312
const messageTemplate = checkMessageTemplate(extraArgs2);
4529845313
if (config6.OCO_MESSAGE_TEMPLATE_PLACEHOLDER && typeof messageTemplate === "string") {
@@ -45402,7 +45417,7 @@ ${source_default.grey("\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2
4540245417
process.exit(1);
4540345418
}
4540445419
};
45405-
async function commit(extraArgs2 = [], isStageAllFlag = false, fullGitMojiSpec = false, skipCommitConfirmation = false) {
45420+
async function commit(extraArgs2 = [], context = "", isStageAllFlag = false, fullGitMojiSpec = false, skipCommitConfirmation = false) {
4540645421
if (isStageAllFlag) {
4540745422
const changedFiles2 = await getChangedFiles();
4540845423
if (changedFiles2)
@@ -45433,7 +45448,7 @@ async function commit(extraArgs2 = [], isStageAllFlag = false, fullGitMojiSpec =
4543345448
if (hD2(isStageAllAndCommitConfirmedByUser))
4543445449
process.exit(1);
4543545450
if (isStageAllAndCommitConfirmedByUser) {
45436-
await commit(extraArgs2, true, fullGitMojiSpec);
45451+
await commit(extraArgs2, context, true, fullGitMojiSpec);
4543745452
process.exit(1);
4543845453
}
4543945454
if (stagedFiles.length === 0 && changedFiles.length > 0) {
@@ -45448,7 +45463,7 @@ async function commit(extraArgs2 = [], isStageAllFlag = false, fullGitMojiSpec =
4544845463
process.exit(1);
4544945464
await gitAdd({ files });
4545045465
}
45451-
await commit(extraArgs2, false, fullGitMojiSpec);
45466+
await commit(extraArgs2, context, false, fullGitMojiSpec);
4545245467
process.exit(1);
4545345468
}
4545445469
stagedFilesSpinner.stop(
@@ -45459,6 +45474,7 @@ ${stagedFiles.map((file) => ` ${file}`).join("\n")}`
4545945474
generateCommitMessageFromGitDiff({
4546045475
diff: await getDiff({ files: stagedFiles }),
4546145476
extraArgs: extraArgs2,
45477+
context,
4546245478
fullGitMojiSpec,
4546345479
skipCommitConfirmation
4546445480
})
@@ -45817,6 +45833,12 @@ Z2(
4581745833
commands: [configCommand, hookCommand, commitlintConfigCommand],
4581845834
flags: {
4581945835
fgm: Boolean,
45836+
context: {
45837+
type: String,
45838+
alias: "c",
45839+
description: "Additional user input context for the commit message",
45840+
default: ""
45841+
},
4582045842
yes: {
4582145843
type: Boolean,
4582245844
alias: "y",
@@ -45833,7 +45855,7 @@ Z2(
4583345855
if (await isHookCalled()) {
4583445856
prepareCommitMessageHook();
4583545857
} else {
45836-
commit(extraArgs, false, flags.fgm, flags.yes);
45858+
commit(extraArgs, flags.context, false, flags.fgm, flags.yes);
4583745859
}
4583845860
},
4583945861
extraArgs

out/github-action.cjs

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -63732,7 +63732,14 @@ var CONVENTIONAL_COMMIT_KEYWORDS = "Do not preface the commit with anything, exc
6373263732
var getCommitConvention = (fullGitMojiSpec) => config4.OCO_EMOJI ? fullGitMojiSpec ? FULL_GITMOJI_SPEC : GITMOJI_HELP : CONVENTIONAL_COMMIT_KEYWORDS;
6373363733
var getDescriptionInstruction = () => config4.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.";
6373463734
var getOneLineCommitInstruction = () => config4.OCO_ONE_LINE_COMMIT ? "Craft a concise commit message that encapsulates all changes made, with an emphasis on the primary updates. If the modifications share a common theme or scope, mention it succinctly; otherwise, leave the scope out to maintain focus. The goal is to provide a clear and unified overview of the changes in a one single message, without diverging into a list of commit per file change." : "";
63735-
var INIT_MAIN_PROMPT2 = (language, fullGitMojiSpec) => ({
63735+
var userInputCodeContext = (context2) => {
63736+
if (context2 !== "" && context2 !== " ") {
63737+
return `Additional context provided by the user: <context>${context2}</context>
63738+
Consider this context when generating the commit message, incorporating relevant information when appropriate.`;
63739+
}
63740+
return "";
63741+
};
63742+
var INIT_MAIN_PROMPT2 = (language, fullGitMojiSpec, context2) => ({
6373663743
role: "system",
6373763744
content: (() => {
6373863745
const commitConvention = fullGitMojiSpec ? "GitMoji specification" : "Conventional Commit Convention";
@@ -63742,12 +63749,14 @@ var INIT_MAIN_PROMPT2 = (language, fullGitMojiSpec) => ({
6374263749
const descriptionGuideline = getDescriptionInstruction();
6374363750
const oneLineCommitGuideline = getOneLineCommitInstruction();
6374463751
const generalGuidelines = `Use the present tense. Lines must not be longer than 74 characters. Use ${language} for the commit message.`;
63752+
const userInputContext = userInputCodeContext(context2);
6374563753
return `${missionStatement}
6374663754
${diffInstruction}
6374763755
${conventionGuidelines}
6374863756
${descriptionGuideline}
6374963757
${oneLineCommitGuideline}
63750-
${generalGuidelines}`;
63758+
${generalGuidelines}
63759+
${userInputContext}`;
6375163760
})()
6375263761
});
6375363762
var INIT_DIFF_PROMPT = {
@@ -63789,7 +63798,7 @@ var INIT_CONSISTENCY_PROMPT = (translation4) => ({
6378963798
role: "assistant",
6379063799
content: getContent(translation4)
6379163800
});
63792-
var getMainCommitPrompt = async (fullGitMojiSpec) => {
63801+
var getMainCommitPrompt = async (fullGitMojiSpec, context2) => {
6379363802
switch (config4.OCO_PROMPT_MODULE) {
6379463803
case "@commitlint":
6379563804
if (!await commitlintLLMConfigExists()) {
@@ -63811,7 +63820,7 @@ var getMainCommitPrompt = async (fullGitMojiSpec) => {
6381163820
];
6381263821
default:
6381363822
return [
63814-
INIT_MAIN_PROMPT2(translation3.localLanguage, fullGitMojiSpec),
63823+
INIT_MAIN_PROMPT2(translation3.localLanguage, fullGitMojiSpec, context2),
6381563824
INIT_DIFF_PROMPT,
6381663825
INIT_CONSISTENCY_PROMPT(translation3)
6381763826
];
@@ -63838,8 +63847,8 @@ function mergeDiffs(arr, maxStringLength) {
6383863847
var config5 = getConfig();
6383963848
var MAX_TOKENS_INPUT = config5.OCO_TOKENS_MAX_INPUT;
6384063849
var MAX_TOKENS_OUTPUT = config5.OCO_TOKENS_MAX_OUTPUT;
63841-
var generateCommitMessageChatCompletionPrompt = async (diff, fullGitMojiSpec) => {
63842-
const INIT_MESSAGES_PROMPT = await getMainCommitPrompt(fullGitMojiSpec);
63850+
var generateCommitMessageChatCompletionPrompt = async (diff, fullGitMojiSpec, context2) => {
63851+
const INIT_MESSAGES_PROMPT = await getMainCommitPrompt(fullGitMojiSpec, context2);
6384363852
const chatContextAsCompletionRequest = [...INIT_MESSAGES_PROMPT];
6384463853
chatContextAsCompletionRequest.push({
6384563854
role: "user",
@@ -63855,9 +63864,12 @@ var GenerateCommitMessageErrorEnum = ((GenerateCommitMessageErrorEnum2) => {
6385563864
return GenerateCommitMessageErrorEnum2;
6385663865
})(GenerateCommitMessageErrorEnum || {});
6385763866
var ADJUSTMENT_FACTOR = 20;
63858-
var generateCommitMessageByDiff = async (diff, fullGitMojiSpec = false) => {
63867+
var generateCommitMessageByDiff = async (diff, fullGitMojiSpec = false, context2 = "") => {
6385963868
try {
63860-
const INIT_MESSAGES_PROMPT = await getMainCommitPrompt(fullGitMojiSpec);
63869+
const INIT_MESSAGES_PROMPT = await getMainCommitPrompt(
63870+
fullGitMojiSpec,
63871+
context2
63872+
);
6386163873
const INIT_MESSAGES_PROMPT_LENGTH = INIT_MESSAGES_PROMPT.map(
6386263874
(msg) => tokenCount(msg.content) + 4
6386363875
).reduce((a3, b3) => a3 + b3, 0);
@@ -63877,7 +63889,8 @@ var generateCommitMessageByDiff = async (diff, fullGitMojiSpec = false) => {
6387763889
}
6387863890
const messages = await generateCommitMessageChatCompletionPrompt(
6387963891
diff,
63880-
fullGitMojiSpec
63892+
fullGitMojiSpec,
63893+
context2
6388163894
);
6388263895
const engine = getEngine();
6388363896
const commitMessage = await engine.generateCommitMessage(messages);

src/cli.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,12 @@ cli(
2020
commands: [configCommand, hookCommand, commitlintConfigCommand],
2121
flags: {
2222
fgm: Boolean,
23+
context: {
24+
type: String,
25+
alias: 'c',
26+
description: 'Additional user input context for the commit message',
27+
default: ''
28+
},
2329
yes: {
2430
type: Boolean,
2531
alias: 'y',
@@ -37,7 +43,7 @@ cli(
3743
if (await isHookCalled()) {
3844
prepareCommitMessageHook();
3945
} else {
40-
commit(extraArgs, false, flags.fgm, flags.yes);
46+
commit(extraArgs, flags.context, false, flags.fgm, flags.yes);
4147
}
4248
},
4349
extraArgs

src/commands/commit.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,15 @@ const checkMessageTemplate = (extraArgs: string[]): string | false => {
3939
interface GenerateCommitMessageFromGitDiffParams {
4040
diff: string;
4141
extraArgs: string[];
42+
context?: string;
4243
fullGitMojiSpec?: boolean;
4344
skipCommitConfirmation?: boolean;
4445
}
4546

4647
const generateCommitMessageFromGitDiff = async ({
4748
diff,
4849
extraArgs,
50+
context = '',
4951
fullGitMojiSpec = false,
5052
skipCommitConfirmation = false
5153
}: GenerateCommitMessageFromGitDiffParams): Promise<void> => {
@@ -56,7 +58,8 @@ const generateCommitMessageFromGitDiff = async ({
5658
try {
5759
let commitMessage = await generateCommitMessageByDiff(
5860
diff,
59-
fullGitMojiSpec
61+
fullGitMojiSpec,
62+
context
6063
);
6164

6265
const messageTemplate = checkMessageTemplate(extraArgs);
@@ -135,8 +138,7 @@ ${chalk.grey('——————————————————')}`
135138
]);
136139

137140
pushSpinner.stop(
138-
`${chalk.green('✔')} Successfully pushed all commits to ${
139-
remotes[0]
141+
`${chalk.green('✔')} Successfully pushed all commits to ${remotes[0]
140142
}`
141143
);
142144

@@ -197,6 +199,7 @@ ${chalk.grey('——————————————————')}`
197199

198200
export async function commit(
199201
extraArgs: string[] = [],
202+
context: string = '',
200203
isStageAllFlag: Boolean = false,
201204
fullGitMojiSpec: boolean = false,
202205
skipCommitConfirmation: boolean = false
@@ -238,7 +241,7 @@ export async function commit(
238241
if (isCancel(isStageAllAndCommitConfirmedByUser)) process.exit(1);
239242

240243
if (isStageAllAndCommitConfirmedByUser) {
241-
await commit(extraArgs, true, fullGitMojiSpec);
244+
await commit(extraArgs, context, true, fullGitMojiSpec);
242245
process.exit(1);
243246
}
244247

@@ -256,7 +259,7 @@ export async function commit(
256259
await gitAdd({ files });
257260
}
258261

259-
await commit(extraArgs, false, fullGitMojiSpec);
262+
await commit(extraArgs, context, false, fullGitMojiSpec);
260263
process.exit(1);
261264
}
262265

@@ -270,6 +273,7 @@ export async function commit(
270273
generateCommitMessageFromGitDiff({
271274
diff: await getDiff({ files: stagedFiles }),
272275
extraArgs,
276+
context,
273277
fullGitMojiSpec,
274278
skipCommitConfirmation
275279
})

src/generateCommitMessageFromGitDiff.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@ const MAX_TOKENS_OUTPUT = config.OCO_TOKENS_MAX_OUTPUT;
1111

1212
const generateCommitMessageChatCompletionPrompt = async (
1313
diff: string,
14-
fullGitMojiSpec: boolean
14+
fullGitMojiSpec: boolean,
15+
context: string
1516
): Promise<Array<OpenAI.Chat.Completions.ChatCompletionMessageParam>> => {
16-
const INIT_MESSAGES_PROMPT = await getMainCommitPrompt(fullGitMojiSpec);
17+
const INIT_MESSAGES_PROMPT = await getMainCommitPrompt(fullGitMojiSpec, context);
1718

1819
const chatContextAsCompletionRequest = [...INIT_MESSAGES_PROMPT];
1920

@@ -36,10 +37,14 @@ const ADJUSTMENT_FACTOR = 20;
3637

3738
export const generateCommitMessageByDiff = async (
3839
diff: string,
39-
fullGitMojiSpec: boolean = false
40+
fullGitMojiSpec: boolean = false,
41+
context: string = ""
4042
): Promise<string> => {
4143
try {
42-
const INIT_MESSAGES_PROMPT = await getMainCommitPrompt(fullGitMojiSpec);
44+
const INIT_MESSAGES_PROMPT = await getMainCommitPrompt(
45+
fullGitMojiSpec,
46+
context
47+
);
4348

4449
const INIT_MESSAGES_PROMPT_LENGTH = INIT_MESSAGES_PROMPT.map(
4550
(msg) => tokenCount(msg.content as string) + 4
@@ -69,7 +74,8 @@ export const generateCommitMessageByDiff = async (
6974

7075
const messages = await generateCommitMessageChatCompletionPrompt(
7176
diff,
72-
fullGitMojiSpec
77+
fullGitMojiSpec,
78+
context,
7379
);
7480

7581
const engine = getEngine();

0 commit comments

Comments
 (0)