git-aicommit 1.3.1 → 2.0.2

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.
package/.env.example CHANGED
@@ -1,2 +1,2 @@
1
1
  OPENAI_API_KEY=
2
- GIT_AI_AUTOCOMMIT=
2
+ GIT_AI_COMMIT_CONFIG_NAME=.git-ai-commit-config.js
package/README.md CHANGED
@@ -4,7 +4,7 @@ Tired of writing commit messages? Let the computer do it for you!
4
4
 
5
5
  [![asciicast](demo.svg)](https://asciinema.org/a/fpL5Dkd74xO8yRTM15O49zOF9)
6
6
 
7
- > Not the best, but better than "WIP"!
7
+ > It's shit, but better than "WIP"!
8
8
 
9
9
  ## Installation
10
10
 
@@ -12,42 +12,26 @@ Tired of writing commit messages? Let the computer do it for you!
12
12
  npm install -g git-aicommit
13
13
  ```
14
14
 
15
- ## Usage
16
-
17
- For now this cli tool uses env variables to pass params, because this is simple PoC.
18
- - `OPENAI_API_KEY` - your OpenAI API key
19
- - `GIT_AI_AUTOCOMMIT` - If this env is present and not empty,
20
- the commit will be made automatically.
21
- Otherwise, you will just see the suggested commit.
22
-
23
- ```bash
15
+ ## Configuration
24
16
 
25
- ```bash
26
- OPENAI_API_KEY=YOUR_OPEN_API_KEY GIT_AI_AUTOCOMMIT=1 git-aicommit
27
- ```
17
+ This cli tool uses configuration file located where `GIT_AI_COMMIT_CONFIG_NAME` points at,
18
+ defaults to `~/.git-ai-commit-config.js`.
28
19
 
29
- Or make an alias:
20
+ Or [default config](config.js) is used if no config file is found.
30
21
 
31
- ```bash
32
- alias gai='OPENAI_API_KEY=YOUR_OPEN_API_KEY GIT_AI_AUTOCOMMIT=1 git-aicommit'
33
- ```
34
-
35
- Or export envs first:
22
+ ## Usage
36
23
 
37
24
  ```bash
38
- export OPENAI_API_KEY=YOUR_OPEN_API_KEY
39
- export GIT_AI_AUTOCOMMIT=1
25
+ export OPENAI_API_KEY=sk-YOUR_API_KEY
40
26
  git-aicommit
41
27
  ```
42
28
 
43
- Or even better: make an alias and export envs:
29
+ Or make an alias:
44
30
 
45
31
  ```bash
46
32
  alias gai='git-aicommit'
47
- export OPENAI_API_KEY=YOUR_OPEN_API_KEY
48
- export GIT_AI_AUTOCOMMIT=1
49
33
 
50
- # And run it:
34
+ ## And run it:
51
35
  gai
52
36
  ```
53
37
 
package/autocommit.js CHANGED
@@ -2,7 +2,23 @@
2
2
 
3
3
  require('dotenv').config();
4
4
  const {Configuration, OpenAIApi} = require("openai");
5
- const {execSync} = require("child_process");
5
+ const {execSync, spawn} = require("child_process");
6
+
7
+ const os = require('os');
8
+ const fs = require('fs');
9
+
10
+ const configFilename = process.env.GIT_AI_COMMIT_CONFIG_NAME || '.git-ai-commit-config.js';
11
+ const configPath = os.homedir() + '/' + configFilename;
12
+
13
+ // if (!fs.existsSync(configPath)) {
14
+ // TODO: param to create default config file
15
+ // const { defaultConfig } = require('./config.js');
16
+ //
17
+ // fs.writeFileSync(configPath, `module.exports = ${JSON.stringify(defaultConfig, null, 4)}`);
18
+ // console.log(`Created default config file at ${configPath}`);
19
+ // }
20
+
21
+ const config = !fs.existsSync(configPath) ? require('./config.js') : require(configPath);
6
22
 
7
23
  try {
8
24
  execSync(
@@ -14,60 +30,67 @@ try {
14
30
  process.exit(1);
15
31
  }
16
32
 
17
- if (!process.env.OPENAI_API_KEY) {
33
+ if (!config.openAiKey) {
18
34
  console.error("Please set OPENAI_API_KEY");
19
35
  process.exit(1);
20
36
  }
21
37
 
22
- const diff = execSync(
23
- `git diff -- . ':(exclude)*.lock' 2>/dev/null`,
24
- {encoding: 'utf8'}
25
- );
38
+ const excludeFromDiff = config.excludeFromDiff || [];
39
+ const diffFilter = config.diffFilter || 'ACMRTUXB';
40
+ const diffCommand = `git diff \
41
+ --diff-filter=${diffFilter} \
42
+ ${excludeFromDiff.map((pattern) => `-- ':(exclude)${pattern}'`).join(' ')} \
43
+ 2>/dev/null
44
+ `;
45
+
46
+ const diff = execSync(diffCommand, {encoding: 'utf8'});
26
47
 
27
48
  if (!diff) {
28
49
  console.error("Diff seems empty. Please commit manually.");
29
50
  process.exit(1);
30
51
  }
31
52
 
32
-
33
- const configuration = new Configuration({
34
- apiKey: process.env.OPENAI_API_KEY,
35
- });
36
-
37
- const openai = new OpenAIApi(configuration);
53
+ const openai = new OpenAIApi(new Configuration({
54
+ apiKey: config.openAiKey,
55
+ }));
38
56
 
39
57
  // create a prompt
40
- const prompt = `Read the following git diff for a multiple files:
58
+ const prompt = `${config.promptBeforeDiff}
41
59
 
42
60
  ${diff}
43
61
 
44
- Generate a commit message to explain diff in each file:
62
+ ${config.promptAfterDiff}
45
63
 
46
64
  `;
47
65
 
48
66
  openai
49
67
  .createCompletion({
50
68
  prompt,
51
- model: "text-davinci-002",
52
- max_tokens: 500,
53
- temperature: 0.2,
54
- top_p: 1,
55
- presence_penalty: 0,
56
- frequency_penalty: 0,
57
- best_of: 1,
58
- n: 1,
59
- stream: false,
60
- stop: ["\n\n\n"],
69
+ ...config.completionPromptParams
61
70
  })
62
71
  .then((data) => {
63
72
  const commitMessage = data.data.choices[0].text;
64
- const command = `git add --all && git commit -m "${commitMessage.replace(/"/g, '\\"')}"`;
65
73
 
66
- if (!process.env.GIT_AI_AUTOCOMMIT) {
67
- console.log(`Please set GIT_AI_AUTOCOMMIT to commit with following command:\n ${command}`);
74
+ if (!config.addAllChangesBeforeCommit) {
75
+ console.log('addAllChangesBeforeCommit is false. Skipping git add --all');
76
+ } else {
77
+ execSync('git add --all', {encoding: 'utf8'});
78
+ }
79
+
80
+ if (!config.autocommit) {
81
+ console.log(`Autocommit is disabled. Here is the message:\n ${commitMessage}`);
68
82
  } else {
69
- console.log(`Committing with following command:\n ${command}`);
70
- execSync(command, {encoding: 'utf8'});
83
+ console.log(`Committing with following message:\n ${commitMessage}`);
84
+ execSync(
85
+ `git commit -m "${commitMessage.replace(/"/g, '')}"`,
86
+ {encoding: 'utf8'}
87
+ );
88
+
89
+ if (config.openCommitTextEditor) {
90
+ spawn('git', ['commit', '--amend'], {
91
+ stdio: 'inherit'
92
+ });
93
+ }
71
94
  }
72
95
  });
73
96
 
package/config.js ADDED
@@ -0,0 +1,24 @@
1
+ module.exports = {
2
+ openAiKey: process.env.OPENAI_API_KEY,
3
+ addAllChangesBeforeCommit: true,
4
+ autocommit: true,
5
+ openCommitTextEditor: false,
6
+ promptBeforeDiff: 'Read the following git diff for a multiple files:',
7
+ promptAfterDiff: 'Generate 1 to 3 paragraphs to explain this diff to a human without mentioning changes themselves:',
8
+ excludeFromDiff: [
9
+ '*.lock'
10
+ ],
11
+ diffFilter: 'ACMRTUXB',
12
+ completionPromptParams: {
13
+ model: "text-davinci-002",
14
+ max_tokens: 500,
15
+ temperature: 0.2,
16
+ top_p: 1,
17
+ presence_penalty: 0,
18
+ frequency_penalty: 0,
19
+ best_of: 1,
20
+ n: 1,
21
+ stream: false,
22
+ stop: ["\n\n\n"],
23
+ }
24
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "git-aicommit",
3
- "version": "1.3.1",
3
+ "version": "2.0.2",
4
4
  "description": "Generates auto commit messages with OpenAI GPT3 model",
5
5
  "main": "autocommit.js",
6
6
  "repository": "https://github.com/shanginn/autocommit",
package/yarn-error.log ADDED
@@ -0,0 +1,36 @@
1
+ Arguments:
2
+ /Users/shanginn/.nvm/versions/node/v16.16.0/bin/node /usr/local/Cellar/yarn/1.22.19/libexec/bin/yarn.js init
3
+
4
+ PATH:
5
+ /Users/shanginn/.nvm/versions/node/v16.16.0/bin:/Users/shanginn/.bun/bin:/Users/shanginn/bin:/usr/local/bin:/Users/shanginn/go/bin:/Users/shanginn/.composer/vendor/bin/:/Users/shanginn/.local/share/solana/install/active_release/bin:/Users/shanginn/.bun/bin/:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin:/Applications/Wireshark.app/Contents/MacOS:/Users/shanginn/.cargo/bin
6
+
7
+ Yarn version:
8
+ 1.22.19
9
+
10
+ Node version:
11
+ 16.16.0
12
+
13
+ Platform:
14
+ darwin x64
15
+
16
+ Trace:
17
+ Error: canceled
18
+ at Interface.<anonymous> (/usr/local/Cellar/yarn/1.22.19/libexec/lib/cli.js:137150:13)
19
+ at Interface.emit (node:events:527:28)
20
+ at Interface._ttyWrite (node:readline:1081:16)
21
+ at ReadStream.onkeypress (node:readline:288:10)
22
+ at ReadStream.emit (node:events:527:28)
23
+ at emitKeys (node:internal/readline/utils:358:14)
24
+ at emitKeys.next (<anonymous>)
25
+ at ReadStream.onData (node:internal/readline/emitKeypressEvents:61:36)
26
+ at ReadStream.emit (node:events:527:28)
27
+ at addChunk (node:internal/streams/readable:315:12)
28
+
29
+ npm manifest:
30
+ No manifest
31
+
32
+ yarn manifest:
33
+ No manifest
34
+
35
+ Lockfile:
36
+ No lockfile