Compare commits

..

10 Commits

Author SHA1 Message Date
di-sukharev
670a758bee 3.0.12 2024-03-18 15:22:13 +08:00
di-sukharev
bdc98c6fa8 docs(README.md): update description text for better readability
style(git.ts): add line breaks for better code readability
2024-03-18 15:21:38 +08:00
di-sukharev
f0251d14bb build 2024-03-18 15:19:59 +08:00
di-sukharev
61f1a27377 Merge remote-tracking branch 'origin/master' into dev 2024-03-18 15:19:45 +08:00
Takanori Matsumoto
c39181e5bd fix(cli.ts): fix the commit function call by passing the correct arguments to the commit function (#313) 2024-03-18 12:29:35 +08:00
Mouadh HSOUMI
45dc2c4535 feat: add OCO_ONE_LINE_COMMIT config for enabling one line commit message (#307) 2024-03-09 12:44:12 +08:00
digitalstudium
a192441f68 Switch ollama api endpoint from /api/generate to /api/chat (#304)
* 3.0.11

* build

* docs: update ollama usage readme (#301)

Signed-off-by: Albert Simon <albert.simon.sge@mango.com>
Co-authored-by: Albert Simon <albert.simon.sge@mango.com>

* 🚨 BREAKING CHANGES 🚨

- feat(engine/ollama): add support for local models and change prompt format to improve AI performance
+ fix(engine/ollama): fix issue with local model not responding correctly to requests

The commit message is now more concise, clear, and informative. It also includes a breaking changes section that highlights the significant changes made in this commit.

---------

Signed-off-by: Albert Simon <albert.simon.sge@mango.com>
Co-authored-by: di-sukharev <dim.sukharev@gmail.com>
Co-authored-by: Albert Simon <47634918+willyw0nka@users.noreply.github.com>
Co-authored-by: Albert Simon <albert.simon.sge@mango.com>
Co-authored-by: Константин Шуткин <shutkin-kn@mosmetro.ru>
2024-03-08 10:08:52 +08:00
Kuma Taro
744bb9b11d Feat: Update OCO_MODEL to Latest Version and Remove Legacy GPT-3.5 Turbo Models (#299)
* fix(config.ts): improve code formatting for better readability
feat(config.ts): add additional supported models for OCO_MODEL configuration
feat(config.ts): update default OCO_MODEL value to 'gpt-3.5-turbo' for better compatibility

* docs(README.md): update OCO_MODEL options to include new GPT-4 models and remove
mention of 'gpt-3.5-turbo-16k' model
docs(README.md): update default OCO_MODEL to 'gpt-3.5-turbo' and provide
instructions for switching to GPT-4 models, specifically 'gpt-4-0125-preview'
and 'gpt-4-turbo-preview'
docs(README.md): update OCO_MODEL configuration in CI/CD pipeline to 'gpt-3.5-turbo'
docs(README.md): update cost information related to default and GPT-4 models in
OpenCommit
2024-03-06 22:00:35 +08:00
Albert Simon
f3adc86693 docs: update ollama usage readme (#301)
Signed-off-by: Albert Simon <albert.simon.sge@mango.com>
Co-authored-by: Albert Simon <albert.simon.sge@mango.com>
2024-03-06 21:56:53 +08:00
di-sukharev
714fac0637 build 2024-03-03 20:02:23 +08:00
11 changed files with 116 additions and 55 deletions

View File

@@ -4,7 +4,7 @@
<h1 align="center">OpenCommit</h1>
<h4 align="center">Follow the bird <a href="https://twitter.com/_sukharev_"><img src="https://img.shields.io/twitter/follow/_sukharev_?style=flat&label=_sukharev_&logo=twitter&color=0bf&logoColor=fff" align="center"></a>
</div>
<h2>Auto-generate meaningful commits in 1 second</h2>
<h2>Auto-generate meaningful commits in a second</h2>
<p>Killing lame commits with AI 🤯🔫</p>
<a href="https://www.npmjs.com/package/opencommit"><img src="https://img.shields.io/npm/v/opencommit" alt="Current version"></a>
<h4 align="center">🪩 Winner of <a href="https://twitter.com/_sukharev_/status/1683448136973582336">GitHub 2023 hackathon</a> 🪩</h4>
@@ -68,20 +68,22 @@ You can also run it with local model through ollama:
```sh
git add <files...>
AI_PROVIDER='ollama' opencommit
OCO_AI_PROVIDER='ollama' opencommit
```
### Flags
There are multiple optional flags that can be used with the `oco` command:
#### Use Full GitMoji Specification
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 (🐛✨📝🚀✅♻️⬆️🔧🌐💡).
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.
```
oco --fgm
```
## Configuration
### Local per repo configuration
@@ -95,10 +97,11 @@ OCO_TOKENS_MAX_OUTPUT=<max response tokens (default: 500)>
OCO_OPENAI_BASE_PATH=<may be used to set proxy path to OpenAI api>
OCO_DESCRIPTION=<postface a message with ~3 sentences description of the changes>
OCO_EMOJI=<boolean, add GitMoji>
OCO_MODEL=<either 'gpt-4', 'gpt-3.5-turbo-16k' (default), 'gpt-3.5-turbo-0613' or 'gpt-3.5-turbo'>
OCO_MODEL=<either 'gpt-4', 'gpt-3.5-turbo' (default), 'gpt-3.5-turbo-0125', 'gpt-4-1106-preview', 'gpt-4-turbo-preview' or 'gpt-4-0125-preview'>
OCO_LANGUAGE=<locale, scroll to the bottom to see options>
OCO_MESSAGE_TEMPLATE_PLACEHOLDER=<message template placeholder, default: '$msg'>
OCO_PROMPT_MODULE=<either conventional-commit or @commitlint, default: conventional-commit>
OCO_ONE_LINE_COMMIT=<one line commit message, default: false>
```
### Global config for all repos
@@ -125,7 +128,7 @@ oco config set OCO_EMOJI=false
### Switch to GPT-4 or other models
By default, OpenCommit uses `gpt-3.5-turbo-16k` model.
By default, OpenCommit uses `gpt-3.5-turbo` model.
You may switch to GPT-4 which performs better, but costs ~x15 times more 🤠
@@ -142,7 +145,7 @@ oco config set OCO_MODEL=gpt-3.5-turbo
or for GPT-4 Turbo (Preview) which is more capable, has knowledge of world events up to April 2023, a 128k context window and 2-3x cheaper vs GPT-4:
```sh
oco config set OCO_MODEL=gpt-4-1106-preview
oco config set OCO_MODEL=gpt-4-0125-preview
```
Make sure that you spell it `gpt-4` (lowercase) and that you have API access to the 4th model. Even if you have ChatGPT+, that doesn't necessarily mean that you have API access to GPT-4.
@@ -348,7 +351,7 @@ jobs:
OCO_OPENAI_BASE_PATH: ''
OCO_DESCRIPTION: false
OCO_EMOJI: false
OCO_MODEL: gpt-3.5-turbo-16k
OCO_MODEL: gpt-3.5-turbo
OCO_LANGUAGE: en
OCO_PROMPT_MODULE: conventional-commit
```
@@ -365,6 +368,6 @@ You pay for your requests to OpenAI API on your own.
OpenCommit stores your key locally.
OpenCommit by default uses 3.5-turbo-16k model, it should not exceed $0.10 per casual working day.
OpenCommit by default uses 3.5-turbo model, it should not exceed $0.10 per casual working day.
You may switch to gpt-4, it's better, but more expensive.

View File

@@ -16384,7 +16384,7 @@ function G3(t, e2) {
// package.json
var package_default = {
name: "opencommit",
version: "3.0.10",
version: "3.0.11",
description: "Auto-generate impressive commits in 1 second. Killing lame commits with AI \u{1F92F}\u{1F52B}",
keywords: [
"git",
@@ -18660,7 +18660,11 @@ var validateConfig = (key, condition, validationMessage) => {
};
var configValidators = {
["OCO_OPENAI_API_KEY" /* OCO_OPENAI_API_KEY */](value, config8 = {}) {
validateConfig("API_KEY", value || config8.OCO_AI_PROVIDER == "ollama", "You need to provide an API key");
validateConfig(
"API_KEY",
value || config8.OCO_AI_PROVIDER == "ollama",
"You need to provide an API key"
);
validateConfig(
"OCO_OPENAI_API_KEY" /* OCO_OPENAI_API_KEY */,
value.startsWith("sk-"),
@@ -18742,12 +18746,13 @@ var configValidators = {
"OCO_MODEL" /* OCO_MODEL */,
[
"gpt-3.5-turbo",
"gpt-3.5-turbo-0125",
"gpt-4",
"gpt-3.5-turbo-16k",
"gpt-3.5-turbo-0613",
"gpt-4-1106-preview"
"gpt-4-1106-preview",
"gpt-4-turbo-preview",
"gpt-4-0125-preview"
].includes(value),
`${value} is not supported yet, use 'gpt-4', 'gpt-3.5-turbo-16k' (default), 'gpt-3.5-turbo-0613', 'gpt-3.5-turbo' or 'gpt-4-1106-preview'`
`${value} is not supported yet, use 'gpt-4', 'gpt-3.5-turbo' (default), 'gpt-3.5-turbo-0125', 'gpt-4-1106-preview', 'gpt-4-turbo-preview' or 'gpt-4-0125-preview'`
);
return value;
},
@@ -18778,6 +18783,14 @@ var configValidators = {
`${value} is not supported yet, use 'ollama' or 'openai' (default)`
);
return value;
},
["OCO_ONE_LINE_COMMIT" /* OCO_ONE_LINE_COMMIT */](value) {
validateConfig(
"OCO_ONE_LINE_COMMIT" /* OCO_ONE_LINE_COMMIT */,
typeof value === "boolean",
"Must be true or false"
);
return value;
}
};
var configPath = (0, import_path.join)((0, import_os.homedir)(), ".opencommit");
@@ -18789,11 +18802,12 @@ var getConfig = () => {
OCO_OPENAI_BASE_PATH: process.env.OCO_OPENAI_BASE_PATH,
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-16k",
OCO_MODEL: process.env.OCO_MODEL || "gpt-3.5-turbo",
OCO_LANGUAGE: process.env.OCO_LANGUAGE || "en",
OCO_MESSAGE_TEMPLATE_PLACEHOLDER: process.env.OCO_MESSAGE_TEMPLATE_PLACEHOLDER || "$msg",
OCO_PROMPT_MODULE: process.env.OCO_PROMPT_MODULE || "conventional-commit",
OCO_AI_PROVIDER: process.env.OCO_AI_PROVIDER || "openai"
OCO_AI_PROVIDER: process.env.OCO_AI_PROVIDER || "openai",
OCO_ONE_LINE_COMMIT: process.env.OCO_ONE_LINE_COMMIT === "true" ? true : false
};
const configExists = (0, import_fs.existsSync)(configPath);
if (!configExists)
@@ -19013,6 +19027,7 @@ var INIT_MAIN_PROMPT = (language, prompts) => ({
${config2?.OCO_EMOJI ? "Use GitMoji convention to preface the commit." : "Do not preface the commit with anything."}
${config2?.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."}
Use the present tense. Use ${language} to answer.
${config2?.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." : ""}
You will strictly follow the following conventions to generate the content of the commit message:
- ${prompts.join("\n- ")}
@@ -21991,12 +22006,11 @@ var api = new OpenAi();
var OllamaAi = class {
async generateCommitMessage(messages) {
const model = "mistral";
let prompt = messages.map((x4) => x4.content).join("\n");
prompt += "Summarize above git diff in 10 words or less";
const url3 = "http://localhost:11434/api/generate";
const url3 = "http://localhost:11434/api/chat";
const p4 = {
model,
prompt,
messages,
options: { temperature: 0, top_p: 0.1 },
stream: false
};
try {
@@ -22005,8 +22019,8 @@ var OllamaAi = class {
"Content-Type": "application/json"
}
});
const answer = response.data?.response;
return answer;
const message = response.data.message;
return message?.content;
} catch (err) {
const message = err.response?.data?.error ?? err.message;
throw new Error("local model issues. details: " + message);
@@ -22078,6 +22092,7 @@ var INIT_MAIN_PROMPT2 = (language, fullGitMojiSpec) => ({
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.
${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."}
${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."}
${config5?.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." : ""}
Use the present tense. Lines must not be longer than 74 characters. Use ${language} for the commit message.`
});
var INIT_DIFF_PROMPT = {
@@ -22661,7 +22676,7 @@ var hookCommand = G3(
return ce(`${source_default.green("\u2714")} Hook is removed`);
}
throw new Error(
`Unsupported mode: ${mode2}. Supported modes are: 'set' or 'unset'`
`Unsupported mode: ${mode2}. Supported modes are: 'set' or 'unset', do: \`oco hook set\``
);
} catch (error) {
ce(`${source_default.red("\u2716")} ${error}`);
@@ -22766,7 +22781,7 @@ Z2(
if (await isHookCalled()) {
prepareCommitMessageHook();
} else {
commit(extraArgs, flags.fgm);
commit(extraArgs, false, flags.fgm);
}
},
extraArgs

View File

@@ -24155,7 +24155,11 @@ var validateConfig = (key, condition, validationMessage) => {
};
var configValidators = {
["OCO_OPENAI_API_KEY" /* OCO_OPENAI_API_KEY */](value, config7 = {}) {
validateConfig("API_KEY", value || config7.OCO_AI_PROVIDER == "ollama", "You need to provide an API key");
validateConfig(
"API_KEY",
value || config7.OCO_AI_PROVIDER == "ollama",
"You need to provide an API key"
);
validateConfig(
"OCO_OPENAI_API_KEY" /* OCO_OPENAI_API_KEY */,
value.startsWith("sk-"),
@@ -24237,12 +24241,13 @@ var configValidators = {
"OCO_MODEL" /* OCO_MODEL */,
[
"gpt-3.5-turbo",
"gpt-3.5-turbo-0125",
"gpt-4",
"gpt-3.5-turbo-16k",
"gpt-3.5-turbo-0613",
"gpt-4-1106-preview"
"gpt-4-1106-preview",
"gpt-4-turbo-preview",
"gpt-4-0125-preview"
].includes(value),
`${value} is not supported yet, use 'gpt-4', 'gpt-3.5-turbo-16k' (default), 'gpt-3.5-turbo-0613', 'gpt-3.5-turbo' or 'gpt-4-1106-preview'`
`${value} is not supported yet, use 'gpt-4', 'gpt-3.5-turbo' (default), 'gpt-3.5-turbo-0125', 'gpt-4-1106-preview', 'gpt-4-turbo-preview' or 'gpt-4-0125-preview'`
);
return value;
},
@@ -24273,6 +24278,14 @@ var configValidators = {
`${value} is not supported yet, use 'ollama' or 'openai' (default)`
);
return value;
},
["OCO_ONE_LINE_COMMIT" /* OCO_ONE_LINE_COMMIT */](value) {
validateConfig(
"OCO_ONE_LINE_COMMIT" /* OCO_ONE_LINE_COMMIT */,
typeof value === "boolean",
"Must be true or false"
);
return value;
}
};
var configPath = (0, import_path.join)((0, import_os.homedir)(), ".opencommit");
@@ -24284,11 +24297,12 @@ var getConfig = () => {
OCO_OPENAI_BASE_PATH: process.env.OCO_OPENAI_BASE_PATH,
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-16k",
OCO_MODEL: process.env.OCO_MODEL || "gpt-3.5-turbo",
OCO_LANGUAGE: process.env.OCO_LANGUAGE || "en",
OCO_MESSAGE_TEMPLATE_PLACEHOLDER: process.env.OCO_MESSAGE_TEMPLATE_PLACEHOLDER || "$msg",
OCO_PROMPT_MODULE: process.env.OCO_PROMPT_MODULE || "conventional-commit",
OCO_AI_PROVIDER: process.env.OCO_AI_PROVIDER || "openai"
OCO_AI_PROVIDER: process.env.OCO_AI_PROVIDER || "openai",
OCO_ONE_LINE_COMMIT: process.env.OCO_ONE_LINE_COMMIT === "true" ? true : false
};
const configExists = (0, import_fs.existsSync)(configPath);
if (!configExists)
@@ -24508,6 +24522,7 @@ var INIT_MAIN_PROMPT = (language, prompts) => ({
${config2?.OCO_EMOJI ? "Use GitMoji convention to preface the commit." : "Do not preface the commit with anything."}
${config2?.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."}
Use the present tense. Use ${language} to answer.
${config2?.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." : ""}
You will strictly follow the following conventions to generate the content of the commit message:
- ${prompts.join("\n- ")}
@@ -27486,12 +27501,11 @@ var api = new OpenAi();
var OllamaAi = class {
async generateCommitMessage(messages) {
const model = "mistral";
let prompt = messages.map((x2) => x2.content).join("\n");
prompt += "Summarize above git diff in 10 words or less";
const url2 = "http://localhost:11434/api/generate";
const url2 = "http://localhost:11434/api/chat";
const p2 = {
model,
prompt,
messages,
options: { temperature: 0, top_p: 0.1 },
stream: false
};
try {
@@ -27500,8 +27514,8 @@ var OllamaAi = class {
"Content-Type": "application/json"
}
});
const answer = response.data?.response;
return answer;
const message = response.data.message;
return message?.content;
} catch (err) {
const message = err.response?.data?.error ?? err.message;
throw new Error("local model issues. details: " + message);
@@ -27573,6 +27587,7 @@ var INIT_MAIN_PROMPT2 = (language, fullGitMojiSpec) => ({
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.
${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."}
${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."}
${config5?.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." : ""}
Use the present tense. Lines must not be longer than 74 characters. Use ${language} for the commit message.`
});
var INIT_DIFF_PROMPT = {

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "opencommit",
"version": "3.0.11",
"version": "3.0.12",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "opencommit",
"version": "3.0.11",
"version": "3.0.12",
"license": "MIT",
"dependencies": {
"@actions/core": "^1.10.0",

View File

@@ -1,6 +1,6 @@
{
"name": "opencommit",
"version": "3.0.11",
"version": "3.0.12",
"description": "Auto-generate impressive commits in 1 second. Killing lame commits with AI 🤯🔫",
"keywords": [
"git",

View File

@@ -29,7 +29,7 @@ cli(
if (await isHookCalled()) {
prepareCommitMessageHook();
} else {
commit(extraArgs, flags.fgm);
commit(extraArgs, false, flags.fgm);
}
},
extraArgs

View File

@@ -25,6 +25,7 @@ export enum CONFIG_KEYS {
OCO_MESSAGE_TEMPLATE_PLACEHOLDER = 'OCO_MESSAGE_TEMPLATE_PLACEHOLDER',
OCO_PROMPT_MODULE = 'OCO_PROMPT_MODULE',
OCO_AI_PROVIDER = 'OCO_AI_PROVIDER',
OCO_ONE_LINE_COMMIT = 'OCO_ONE_LINE_COMMIT'
}
export enum CONFIG_MODES {
@@ -54,7 +55,11 @@ const validateConfig = (
export const configValidators = {
[CONFIG_KEYS.OCO_OPENAI_API_KEY](value: any, config: any = {}) {
//need api key unless running locally with ollama
validateConfig('API_KEY', value || config.OCO_AI_PROVIDER == 'ollama', 'You need to provide an API key');
validateConfig(
'API_KEY',
value || config.OCO_AI_PROVIDER == 'ollama',
'You need to provide an API key'
);
validateConfig(
CONFIG_KEYS.OCO_OPENAI_API_KEY,
value.startsWith('sk-'),
@@ -150,12 +155,13 @@ export const configValidators = {
CONFIG_KEYS.OCO_MODEL,
[
'gpt-3.5-turbo',
'gpt-3.5-turbo-0125',
'gpt-4',
'gpt-3.5-turbo-16k',
'gpt-3.5-turbo-0613',
'gpt-4-1106-preview'
'gpt-4-1106-preview',
'gpt-4-turbo-preview',
'gpt-4-0125-preview'
].includes(value),
`${value} is not supported yet, use 'gpt-4', 'gpt-3.5-turbo-16k' (default), 'gpt-3.5-turbo-0613', 'gpt-3.5-turbo' or 'gpt-4-1106-preview'`
`${value} is not supported yet, use 'gpt-4', 'gpt-3.5-turbo' (default), 'gpt-3.5-turbo-0125', 'gpt-4-1106-preview', 'gpt-4-turbo-preview' or 'gpt-4-0125-preview'`
);
return value;
},
@@ -190,6 +196,16 @@ export const configValidators = {
);
return value;
},
[CONFIG_KEYS.OCO_ONE_LINE_COMMIT](value: any) {
validateConfig(
CONFIG_KEYS.OCO_ONE_LINE_COMMIT,
typeof value === 'boolean',
'Must be true or false'
);
return value;
},
};
export type ConfigType = {
@@ -210,12 +226,13 @@ export const getConfig = (): ConfigType | null => {
OCO_OPENAI_BASE_PATH: process.env.OCO_OPENAI_BASE_PATH,
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-16k',
OCO_MODEL: process.env.OCO_MODEL || 'gpt-3.5-turbo',
OCO_LANGUAGE: process.env.OCO_LANGUAGE || 'en',
OCO_MESSAGE_TEMPLATE_PLACEHOLDER:
process.env.OCO_MESSAGE_TEMPLATE_PLACEHOLDER || '$msg',
OCO_PROMPT_MODULE: process.env.OCO_PROMPT_MODULE || 'conventional-commit',
OCO_AI_PROVIDER: process.env.OCO_AI_PROVIDER || 'openai'
OCO_AI_PROVIDER: process.env.OCO_AI_PROVIDER || 'openai',
OCO_ONE_LINE_COMMIT: process.env.OCO_ONE_LINE_COMMIT === 'true' ? true : false
};
const configExists = existsSync(configPath);

View File

@@ -8,14 +8,14 @@ export class OllamaAi implements AiEngine {
): Promise<string | undefined> {
const model = 'mistral'; // todo: allow other models
let prompt = messages.map((x) => x.content).join('\n');
//hoftix: local models are not so clever so im changing the prompt a bit...
prompt += 'Summarize above git diff in 10 words or less';
//console.log(messages);
//process.exit()
const url = 'http://localhost:11434/api/generate';
const url = 'http://localhost:11434/api/chat';
const p = {
model,
prompt,
messages,
options: {temperature: 0, top_p: 0.1},
stream: false
};
try {
@@ -24,8 +24,10 @@ export class OllamaAi implements AiEngine {
'Content-Type': 'application/json'
}
});
const answer = response.data?.response;
return answer;
const message = response.data.message;
return message?.content;
} catch (err: any) {
const message = err.response?.data?.error ?? err.message;
throw new Error('local model issues. details: ' + message);

View File

@@ -267,6 +267,7 @@ const INIT_MAIN_PROMPT = (
${config?.OCO_EMOJI ? 'Use GitMoji convention to preface the commit.' : 'Do not preface the commit with anything.'}
${config?.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."}
Use the present tense. Use ${language} to answer.
${ config?.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.' : ""}
You will strictly follow the following conventions to generate the content of the commit message:
- ${prompts.join('\n- ')}

View File

@@ -115,6 +115,11 @@ const INIT_MAIN_PROMPT = (
? '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."
}
${
config?.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.'
: ""
}
Use the present tense. Lines must not be longer than 74 characters. Use ${language} for the commit message.`
});

View File

@@ -75,8 +75,11 @@ export const getChangedFiles = async (): Promise<string[]> => {
export const gitAdd = async ({ files }: { files: string[] }) => {
const gitAddSpinner = spinner();
gitAddSpinner.start('Adding files to commit');
await execa('git', ['add', ...files]);
gitAddSpinner.stop('Done');
};