@untools/commitgen 0.0.5 → 0.1.0
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/README.md +331 -0
- package/dist/commands/configure.d.ts +1 -0
- package/dist/commands/configure.js +96 -0
- package/dist/commands/configure.js.map +1 -0
- package/dist/config.d.ts +15 -0
- package/dist/config.js +56 -0
- package/dist/config.js.map +1 -0
- package/dist/index.js +156 -165
- package/dist/index.js.map +1 -1
- package/dist/providers/base.d.ts +9 -0
- package/dist/providers/base.js +107 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/index.d.ts +4 -0
- package/dist/providers/index.js +41 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/vercel-google.d.ts +10 -0
- package/dist/providers/vercel-google.js +93 -0
- package/dist/providers/vercel-google.js.map +1 -0
- package/dist/types.d.ts +25 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/package.json +12 -2
package/README.md
ADDED
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
# @untools/commitgen
|
|
2
|
+
|
|
3
|
+
🚀 AI-powered commit message generator for Git with modular AI provider support.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
✨ **AI-Powered Generation**: Leverages advanced AI models to analyze your git changes and generate meaningful commit messages
|
|
8
|
+
|
|
9
|
+
🎯 **Conventional Commits**: Follows the [Conventional Commits](https://www.conventionalcommits.org/) specification
|
|
10
|
+
|
|
11
|
+
🔌 **Modular Providers**: Support for multiple AI providers:
|
|
12
|
+
|
|
13
|
+
- ✅ Vercel AI SDK (Google Gemini)
|
|
14
|
+
- 🔜 Vercel AI SDK (OpenAI)
|
|
15
|
+
- 🔜 Groq
|
|
16
|
+
- 🔜 OpenAI Direct
|
|
17
|
+
- 🔜 Google Direct
|
|
18
|
+
- 🔜 Local LLMs (Ollama, LM Studio, etc.)
|
|
19
|
+
|
|
20
|
+
🎨 **Beautiful CLI**: Colorized output with interactive prompts using Inquirer
|
|
21
|
+
|
|
22
|
+
📊 **Smart Analysis**: Analyzes file patterns, additions/deletions, and git diffs
|
|
23
|
+
|
|
24
|
+
⚡ **Fast**: Efficient processing with fallback to rule-based suggestions
|
|
25
|
+
|
|
26
|
+
## Installation
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
# Global installation (recommended)
|
|
30
|
+
npm install -g @untools/commitgen
|
|
31
|
+
|
|
32
|
+
# Or use with npx
|
|
33
|
+
npx @untools/commitgen
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Quick Start
|
|
37
|
+
|
|
38
|
+
1. **Stage your changes**:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
git add .
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
2. **Generate commit message**:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
commitgen
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
That's it! If it's your first time, CommitGen will automatically prompt you to configure your API key. The tool will then analyze your changes and suggest commit messages.
|
|
51
|
+
|
|
52
|
+
### First-Time Setup
|
|
53
|
+
|
|
54
|
+
When you run `commitgen` for the first time without an API key, you'll see:
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
⚠️ API key not found for the selected provider.
|
|
58
|
+
? Would you like to configure your API key now? (Y/n)
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Choose "Yes" to set up your configuration, or run `commitgen config` manually anytime.
|
|
62
|
+
|
|
63
|
+
## Usage
|
|
64
|
+
|
|
65
|
+
### Basic Commands
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
# Generate commit message (interactive)
|
|
69
|
+
commitgen
|
|
70
|
+
|
|
71
|
+
# Commit and push in one command
|
|
72
|
+
commitgen --push
|
|
73
|
+
|
|
74
|
+
# Skip git hooks
|
|
75
|
+
commitgen --noverify
|
|
76
|
+
|
|
77
|
+
# Use rule-based suggestions (no AI)
|
|
78
|
+
commitgen --no-ai
|
|
79
|
+
|
|
80
|
+
# Configure AI provider
|
|
81
|
+
commitgen config
|
|
82
|
+
|
|
83
|
+
# Show help
|
|
84
|
+
commitgen --help
|
|
85
|
+
|
|
86
|
+
# Show version
|
|
87
|
+
commitgen --version
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Configuration
|
|
91
|
+
|
|
92
|
+
The configuration file is stored at `~/.commitgenrc.json`:
|
|
93
|
+
|
|
94
|
+
```json
|
|
95
|
+
{
|
|
96
|
+
"provider": {
|
|
97
|
+
"provider": "vercel-google",
|
|
98
|
+
"model": "gemini-2.5-flash",
|
|
99
|
+
"apiKey": "optional-if-using-env-var"
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Environment Variables
|
|
105
|
+
|
|
106
|
+
You can use environment variables instead of storing API keys in the config:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
# For Google Gemini (via Vercel AI SDK)
|
|
110
|
+
export GOOGLE_GENERATIVE_AI_API_KEY="your-api-key"
|
|
111
|
+
|
|
112
|
+
# Then run without configuring
|
|
113
|
+
commitgen
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## AI Providers
|
|
117
|
+
|
|
118
|
+
### Vercel AI SDK - Google Gemini (Available Now)
|
|
119
|
+
|
|
120
|
+
Uses the [Vercel AI SDK](https://sdk.vercel.ai/) with Google's Gemini models.
|
|
121
|
+
|
|
122
|
+
**Setup:**
|
|
123
|
+
|
|
124
|
+
1. Get a free API key from [Google AI Studio](https://aistudio.google.com/app/apikey)
|
|
125
|
+
2. Run `commitgen config` and select "Vercel AI SDK - Google Gemini"
|
|
126
|
+
3. Enter your API key or set `GOOGLE_GENERATIVE_AI_API_KEY` environment variable
|
|
127
|
+
|
|
128
|
+
**Available Models:**
|
|
129
|
+
|
|
130
|
+
- `gemini-2.5-flash` (Recommended - Fast and efficient)
|
|
131
|
+
- `gemini-2.5-pro` (More capable, higher quality)
|
|
132
|
+
- `gemini-1.5-flash`
|
|
133
|
+
- `gemini-1.5-pro`
|
|
134
|
+
|
|
135
|
+
### Coming Soon
|
|
136
|
+
|
|
137
|
+
- **Vercel AI SDK - OpenAI**: GPT-4o, GPT-4o-mini
|
|
138
|
+
- **Groq**: Ultra-fast inference with Llama models
|
|
139
|
+
- **OpenAI Direct**: Direct OpenAI API integration
|
|
140
|
+
- **Google Direct**: Direct Google Generative AI integration
|
|
141
|
+
- **Local LLMs**: Ollama, LM Studio, LocalAI support
|
|
142
|
+
|
|
143
|
+
## How It Works
|
|
144
|
+
|
|
145
|
+
1. **Analysis**: Scans your staged git changes
|
|
146
|
+
|
|
147
|
+
- File patterns (tests, docs, configs, components)
|
|
148
|
+
- Addition/deletion statistics
|
|
149
|
+
- Git diff content
|
|
150
|
+
|
|
151
|
+
2. **AI Generation**: Sends analysis to your configured AI provider
|
|
152
|
+
|
|
153
|
+
- Uses a specialized prompt for commit message generation
|
|
154
|
+
- Follows Conventional Commits specification
|
|
155
|
+
- Returns 3-5 contextual suggestions
|
|
156
|
+
|
|
157
|
+
3. **Selection**: Interactive prompt to choose or customize
|
|
158
|
+
|
|
159
|
+
- Select from AI-generated suggestions
|
|
160
|
+
- Write a custom message
|
|
161
|
+
- Confirm before committing
|
|
162
|
+
|
|
163
|
+
4. **Commit**: Executes git commit with your chosen message
|
|
164
|
+
- Optional: Push to remote with `--push` flag
|
|
165
|
+
- Optional: Skip hooks with `--noverify` flag
|
|
166
|
+
|
|
167
|
+
## Examples
|
|
168
|
+
|
|
169
|
+
### Typical Workflow
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
# Make some changes
|
|
173
|
+
vim src/components/Button.tsx
|
|
174
|
+
|
|
175
|
+
# Stage changes
|
|
176
|
+
git add src/components/Button.tsx
|
|
177
|
+
|
|
178
|
+
# Generate and commit
|
|
179
|
+
commitgen
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
Output:
|
|
183
|
+
|
|
184
|
+
```
|
|
185
|
+
🚀 CommitGen - AI-Powered Commit Message Generator
|
|
186
|
+
|
|
187
|
+
📊 Analysis:
|
|
188
|
+
Files changed: 1
|
|
189
|
+
Additions: +45
|
|
190
|
+
Deletions: -12
|
|
191
|
+
|
|
192
|
+
📝 Changed files:
|
|
193
|
+
⚛️ src/components/Button.tsx
|
|
194
|
+
|
|
195
|
+
🤖 Generating commit messages using vercel-google...
|
|
196
|
+
|
|
197
|
+
💡 Suggested commit messages:
|
|
198
|
+
|
|
199
|
+
1. feat(components): add variant prop to Button component
|
|
200
|
+
2. feat(Button): implement new button styles and variants
|
|
201
|
+
3. refactor(components): restructure Button component props
|
|
202
|
+
4. style(Button): update button styling system
|
|
203
|
+
✏️ Write custom message
|
|
204
|
+
|
|
205
|
+
? Choose a commit message: (Use arrow keys)
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### Configuration Example
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
$ commitgen config
|
|
212
|
+
|
|
213
|
+
⚙️ Configure CommitGen
|
|
214
|
+
|
|
215
|
+
? Select AI provider: Vercel AI SDK - Google Gemini
|
|
216
|
+
? Enter your Google AI API key: **********************
|
|
217
|
+
? Select model: Gemini 2.5 Flash (Fast, Recommended)
|
|
218
|
+
|
|
219
|
+
✅ Configuration saved successfully!
|
|
220
|
+
Config file: /Users/you/.commitgenrc.json
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
## Commit Message Format
|
|
224
|
+
|
|
225
|
+
Generated messages follow the Conventional Commits specification:
|
|
226
|
+
|
|
227
|
+
```
|
|
228
|
+
<type>(<scope>): <subject>
|
|
229
|
+
|
|
230
|
+
<body>
|
|
231
|
+
|
|
232
|
+
<footer>
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
**Types:**
|
|
236
|
+
|
|
237
|
+
- `feat`: New feature
|
|
238
|
+
- `fix`: Bug fix
|
|
239
|
+
- `docs`: Documentation changes
|
|
240
|
+
- `style`: Code style changes
|
|
241
|
+
- `refactor`: Code refactoring
|
|
242
|
+
- `perf`: Performance improvements
|
|
243
|
+
- `test`: Test updates
|
|
244
|
+
- `build`: Build system changes
|
|
245
|
+
- `ci`: CI/CD changes
|
|
246
|
+
- `chore`: Maintenance tasks
|
|
247
|
+
- `revert`: Revert previous commit
|
|
248
|
+
|
|
249
|
+
**Example:**
|
|
250
|
+
|
|
251
|
+
```
|
|
252
|
+
feat(auth): add OAuth2 authentication
|
|
253
|
+
|
|
254
|
+
Implemented OAuth2 flow with Google and GitHub providers.
|
|
255
|
+
Added JWT token management and refresh logic.
|
|
256
|
+
|
|
257
|
+
BREAKING CHANGE: Authentication API has changed
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
## Troubleshooting
|
|
261
|
+
|
|
262
|
+
### "No staged changes found"
|
|
263
|
+
|
|
264
|
+
Make sure you've staged your changes:
|
|
265
|
+
|
|
266
|
+
```bash
|
|
267
|
+
git add <files>
|
|
268
|
+
# or
|
|
269
|
+
git add .
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
### "API key is required"
|
|
273
|
+
|
|
274
|
+
Set your API key either:
|
|
275
|
+
|
|
276
|
+
1. Run `commitgen config` to save it in config file
|
|
277
|
+
2. Set environment variable: `export GOOGLE_GENERATIVE_AI_API_KEY="your-key"`
|
|
278
|
+
|
|
279
|
+
### AI generation fails
|
|
280
|
+
|
|
281
|
+
The tool will automatically fall back to rule-based suggestions if AI generation fails. You can also force rule-based mode with `--no-ai`.
|
|
282
|
+
|
|
283
|
+
## Development
|
|
284
|
+
|
|
285
|
+
```bash
|
|
286
|
+
# Clone the repository
|
|
287
|
+
git clone https://github.com/aevrHQ/untools-commitgen.git
|
|
288
|
+
cd untools-commitgen
|
|
289
|
+
|
|
290
|
+
# Install dependencies
|
|
291
|
+
npm install
|
|
292
|
+
|
|
293
|
+
# Build
|
|
294
|
+
npm run build
|
|
295
|
+
|
|
296
|
+
# Link for local testing
|
|
297
|
+
npm link
|
|
298
|
+
|
|
299
|
+
# Run
|
|
300
|
+
commitgen
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
## Dependencies
|
|
304
|
+
|
|
305
|
+
```json
|
|
306
|
+
{
|
|
307
|
+
"@ai-sdk/google": "^1.x.x",
|
|
308
|
+
"ai": "^4.x.x",
|
|
309
|
+
"chalk": "^4.1.2",
|
|
310
|
+
"commander": "^13.1.0",
|
|
311
|
+
"inquirer": "^12.5.2"
|
|
312
|
+
}
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
## Contributing
|
|
316
|
+
|
|
317
|
+
Contributions are welcome! Please feel free to submit a Pull Request.
|
|
318
|
+
|
|
319
|
+
## License
|
|
320
|
+
|
|
321
|
+
MIT © Miracle Onyenma
|
|
322
|
+
|
|
323
|
+
## Links
|
|
324
|
+
|
|
325
|
+
- [GitHub Repository](https://github.com/aevrHQ/untools-commitgen)
|
|
326
|
+
- [npm Package](https://www.npmjs.com/package/@untools/commitgen)
|
|
327
|
+
- [Issue Tracker](https://github.com/aevrHQ/untools-commitgen/issues)
|
|
328
|
+
|
|
329
|
+
---
|
|
330
|
+
|
|
331
|
+
Made with ❤️ by [Miracle Onyenma](https://github.com/miracleonyenma)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function configureCommand(): Promise<void>;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ./src/commands/configure.ts
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.configureCommand = configureCommand;
|
|
8
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
9
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
10
|
+
const config_1 = require("../config");
|
|
11
|
+
async function configureCommand() {
|
|
12
|
+
console.log(chalk_1.default.cyan.bold("\n⚙️ Configure CommitGen\n"));
|
|
13
|
+
const configManager = new config_1.ConfigManager();
|
|
14
|
+
const currentConfig = configManager.getProviderConfig();
|
|
15
|
+
// Show current configuration if it exists
|
|
16
|
+
if (currentConfig.provider) {
|
|
17
|
+
console.log(chalk_1.default.gray("Current configuration:"));
|
|
18
|
+
console.log(chalk_1.default.gray(` Provider: ${currentConfig.provider}`));
|
|
19
|
+
console.log(chalk_1.default.gray(` Model: ${currentConfig.model || "default"}`));
|
|
20
|
+
console.log(chalk_1.default.gray(` API Key: ${currentConfig.apiKey ? "***configured***" : "not set"}`));
|
|
21
|
+
console.log();
|
|
22
|
+
}
|
|
23
|
+
const { provider } = await inquirer_1.default.prompt([
|
|
24
|
+
{
|
|
25
|
+
type: "list",
|
|
26
|
+
name: "provider",
|
|
27
|
+
message: "Select AI provider:",
|
|
28
|
+
choices: [
|
|
29
|
+
{ name: "Vercel AI SDK - Google Gemini", value: "vercel-google" },
|
|
30
|
+
{
|
|
31
|
+
name: "Vercel AI SDK - OpenAI (Coming Soon)",
|
|
32
|
+
value: "vercel-openai",
|
|
33
|
+
disabled: true,
|
|
34
|
+
},
|
|
35
|
+
{ name: "Groq (Coming Soon)", value: "groq", disabled: true },
|
|
36
|
+
{
|
|
37
|
+
name: "OpenAI Direct (Coming Soon)",
|
|
38
|
+
value: "openai",
|
|
39
|
+
disabled: true,
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: "Google Direct (Coming Soon)",
|
|
43
|
+
value: "google",
|
|
44
|
+
disabled: true,
|
|
45
|
+
},
|
|
46
|
+
{ name: "Local LLM (Coming Soon)", value: "local", disabled: true },
|
|
47
|
+
],
|
|
48
|
+
default: currentConfig.provider || "vercel-google",
|
|
49
|
+
},
|
|
50
|
+
]);
|
|
51
|
+
let config = { provider };
|
|
52
|
+
// Provider-specific configuration
|
|
53
|
+
if (provider === "vercel-google") {
|
|
54
|
+
const hasEnvKey = !!process.env.GOOGLE_GENERATIVE_AI_API_KEY;
|
|
55
|
+
const { apiKey, model } = await inquirer_1.default.prompt([
|
|
56
|
+
{
|
|
57
|
+
type: "password",
|
|
58
|
+
name: "apiKey",
|
|
59
|
+
message: hasEnvKey
|
|
60
|
+
? "Enter your Google AI API key (or press Enter to use GOOGLE_GENERATIVE_AI_API_KEY env var):"
|
|
61
|
+
: "Enter your Google AI API key (get one at https://aistudio.google.com/app/apikey):",
|
|
62
|
+
mask: "*",
|
|
63
|
+
validate: (input) => {
|
|
64
|
+
if (!input.trim() && !hasEnvKey) {
|
|
65
|
+
return "API key is required. Get one at https://aistudio.google.com/app/apikey";
|
|
66
|
+
}
|
|
67
|
+
return true;
|
|
68
|
+
},
|
|
69
|
+
default: currentConfig.provider === provider
|
|
70
|
+
? currentConfig.apiKey
|
|
71
|
+
: undefined,
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
type: "list",
|
|
75
|
+
name: "model",
|
|
76
|
+
message: "Select model:",
|
|
77
|
+
choices: [
|
|
78
|
+
{
|
|
79
|
+
name: "Gemini 2.5 Flash (Fast, Recommended)",
|
|
80
|
+
value: "gemini-2.5-flash",
|
|
81
|
+
},
|
|
82
|
+
{ name: "Gemini 2.5 Pro (More Capable)", value: "gemini-2.5-pro" },
|
|
83
|
+
{ name: "Gemini 1.5 Flash", value: "gemini-1.5-flash" },
|
|
84
|
+
{ name: "Gemini 1.5 Pro", value: "gemini-1.5-pro" },
|
|
85
|
+
],
|
|
86
|
+
default: currentConfig.model || "gemini-2.5-flash",
|
|
87
|
+
},
|
|
88
|
+
]);
|
|
89
|
+
config.apiKey = apiKey || undefined;
|
|
90
|
+
config.model = model;
|
|
91
|
+
}
|
|
92
|
+
configManager.setProvider(config);
|
|
93
|
+
console.log(chalk_1.default.green("\n✅ Configuration saved successfully!"));
|
|
94
|
+
console.log(chalk_1.default.gray(`Config file: ${require("os").homedir()}/.commitgenrc.json`));
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=configure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configure.js","sourceRoot":"","sources":["../../src/commands/configure.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ProviderConfig } from "./types";
|
|
2
|
+
interface CommitGenConfig {
|
|
3
|
+
provider?: ProviderConfig;
|
|
4
|
+
defaultProvider?: "vercel-google" | "vercel-openai" | "groq" | "openai" | "google" | "local";
|
|
5
|
+
}
|
|
6
|
+
export declare class ConfigManager {
|
|
7
|
+
private configPath;
|
|
8
|
+
private config;
|
|
9
|
+
constructor();
|
|
10
|
+
private loadConfig;
|
|
11
|
+
saveConfig(config: CommitGenConfig): void;
|
|
12
|
+
getProviderConfig(): ProviderConfig;
|
|
13
|
+
setProvider(config: ProviderConfig): void;
|
|
14
|
+
}
|
|
15
|
+
export {};
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ./src/config.ts
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.ConfigManager = void 0;
|
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const os_1 = __importDefault(require("os"));
|
|
11
|
+
class ConfigManager {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.configPath = path_1.default.join(os_1.default.homedir(), ".commitgenrc.json");
|
|
14
|
+
this.config = this.loadConfig();
|
|
15
|
+
}
|
|
16
|
+
loadConfig() {
|
|
17
|
+
try {
|
|
18
|
+
if (fs_1.default.existsSync(this.configPath)) {
|
|
19
|
+
const content = fs_1.default.readFileSync(this.configPath, "utf8");
|
|
20
|
+
return JSON.parse(content);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
console.warn("Failed to load config file:", error);
|
|
25
|
+
}
|
|
26
|
+
return {};
|
|
27
|
+
}
|
|
28
|
+
saveConfig(config) {
|
|
29
|
+
try {
|
|
30
|
+
fs_1.default.writeFileSync(this.configPath, JSON.stringify(config, null, 2), "utf8");
|
|
31
|
+
this.config = config;
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
console.error("Failed to save config:", error);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
getProviderConfig() {
|
|
38
|
+
if (this.config.provider) {
|
|
39
|
+
return this.config.provider;
|
|
40
|
+
}
|
|
41
|
+
// Default to vercel-google
|
|
42
|
+
return {
|
|
43
|
+
provider: this.config.defaultProvider || "vercel-google",
|
|
44
|
+
apiKey: process.env.GOOGLE_GENERATIVE_AI_API_KEY,
|
|
45
|
+
model: "gemini-2.5-flash",
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
setProvider(config) {
|
|
49
|
+
this.saveConfig({
|
|
50
|
+
...this.config,
|
|
51
|
+
provider: config,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.ConfigManager = ConfigManager;
|
|
56
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";AAAA,kBAAkB;;;;;;AAElB,4CAAoB;AACpB,gDAAwB;AACxB,4CAAoB;AAcpB,MAAa,aAAa;IAIxB;QACE,IAAI,CAAC,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,mBAAmB,CAAC,CAAC;QAC/D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;IAClC,CAAC;IAEO,UAAU;QAChB,IAAI,CAAC;YACH,IAAI,YAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBACnC,MAAM,OAAO,GAAG,YAAE,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;gBACzD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,UAAU,CAAC,MAAuB;QAChC,IAAI,CAAC;YACH,YAAE,CAAC,aAAa,CACd,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAC/B,MAAM,CACP,CAAC;YACF,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,iBAAiB;QACf,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC9B,CAAC;QAED,2BAA2B;QAC3B,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,eAAe;YACxD,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,4BAA4B;YAChD,KAAK,EAAE,kBAAkB;SAC1B,CAAC;IACJ,CAAC;IAED,WAAW,CAAC,MAAsB;QAChC,IAAI,CAAC,UAAU,CAAC;YACd,GAAG,IAAI,CAAC,MAAM;YACd,QAAQ,EAAE,MAAM;SACjB,CAAC,CAAC;IACL,CAAC;CACF;AArDD,sCAqDC"}
|
package/dist/index.js
CHANGED
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
"use strict";
|
|
3
|
-
// ./src/index.ts
|
|
4
3
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
4
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
6
5
|
};
|
|
7
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
// ./src/index.ts
|
|
8
8
|
const child_process_1 = require("child_process");
|
|
9
9
|
const chalk_1 = __importDefault(require("chalk"));
|
|
10
10
|
const commander_1 = require("commander");
|
|
11
11
|
const inquirer_1 = __importDefault(require("inquirer"));
|
|
12
|
+
const config_1 = require("./config");
|
|
13
|
+
const configure_1 = require("./commands/configure");
|
|
14
|
+
const providers_1 = require("./providers");
|
|
12
15
|
class CommitGen {
|
|
13
16
|
exec(cmd) {
|
|
14
17
|
try {
|
|
@@ -57,166 +60,6 @@ class CommitGen {
|
|
|
57
60
|
diff,
|
|
58
61
|
};
|
|
59
62
|
}
|
|
60
|
-
generateCommitMessage(analysis) {
|
|
61
|
-
const { filesChanged, additions, deletions, diff } = analysis;
|
|
62
|
-
const suggestions = [];
|
|
63
|
-
// Analyze file patterns
|
|
64
|
-
const hasTests = filesChanged.some((f) => f.includes("test") || f.includes("spec") || f.includes("__tests__"));
|
|
65
|
-
const hasDocs = filesChanged.some((f) => f.includes("README") ||
|
|
66
|
-
f.includes(".md") ||
|
|
67
|
-
f.toLowerCase().includes("doc"));
|
|
68
|
-
const hasConfig = filesChanged.some((f) => f.includes("config") ||
|
|
69
|
-
f.includes(".json") ||
|
|
70
|
-
f.includes(".yml") ||
|
|
71
|
-
f.includes(".yaml") ||
|
|
72
|
-
f.includes(".toml") ||
|
|
73
|
-
f.includes("package.json") ||
|
|
74
|
-
f.includes("tsconfig"));
|
|
75
|
-
const hasStyles = filesChanged.some((f) => f.includes(".css") ||
|
|
76
|
-
f.includes(".scss") ||
|
|
77
|
-
f.includes(".sass") ||
|
|
78
|
-
f.includes(".less"));
|
|
79
|
-
const hasComponents = filesChanged.some((f) => f.includes("component") ||
|
|
80
|
-
f.includes(".tsx") ||
|
|
81
|
-
f.includes(".jsx") ||
|
|
82
|
-
f.includes("Component"));
|
|
83
|
-
const hasDependencies = filesChanged.some((f) => f.includes("package.json") ||
|
|
84
|
-
f.includes("package-lock.json") ||
|
|
85
|
-
f.includes("yarn.lock"));
|
|
86
|
-
const hasCI = filesChanged.some((f) => f.includes(".github") ||
|
|
87
|
-
f.includes("gitlab-ci") ||
|
|
88
|
-
f.includes("Jenkinsfile"));
|
|
89
|
-
const hasBuild = filesChanged.some((f) => f.includes("webpack") ||
|
|
90
|
-
f.includes("vite") ||
|
|
91
|
-
f.includes("rollup") ||
|
|
92
|
-
f.includes("build"));
|
|
93
|
-
// Check for breaking changes
|
|
94
|
-
const hasBreaking = diff.toLowerCase().includes("breaking change") ||
|
|
95
|
-
diff.includes("BREAKING CHANGE");
|
|
96
|
-
// Generate contextual suggestions
|
|
97
|
-
if (additions > deletions * 2 && additions > 20) {
|
|
98
|
-
suggestions.push({
|
|
99
|
-
type: "feat",
|
|
100
|
-
subject: `add ${this.inferFeatureType(filesChanged)}`,
|
|
101
|
-
body: `Added ${filesChanged.length} file(s) with ${additions} lines`,
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
if (deletions > additions * 2 && deletions > 20) {
|
|
105
|
-
suggestions.push({
|
|
106
|
-
type: "refactor",
|
|
107
|
-
subject: `remove unused ${this.inferFeatureType(filesChanged)}`,
|
|
108
|
-
body: `Removed ${deletions} lines from ${filesChanged.length} file(s)`,
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
if (hasTests) {
|
|
112
|
-
suggestions.push({
|
|
113
|
-
type: "test",
|
|
114
|
-
subject: `add tests for ${this.inferScope(filesChanged)}`,
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
if (hasDocs) {
|
|
118
|
-
suggestions.push({
|
|
119
|
-
type: "docs",
|
|
120
|
-
subject: "update documentation",
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
if (hasConfig && !hasDependencies) {
|
|
124
|
-
suggestions.push({
|
|
125
|
-
type: "chore",
|
|
126
|
-
subject: "update configuration",
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
if (hasDependencies) {
|
|
130
|
-
suggestions.push({
|
|
131
|
-
type: "chore",
|
|
132
|
-
subject: "update dependencies",
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
if (hasStyles) {
|
|
136
|
-
suggestions.push({
|
|
137
|
-
type: "style",
|
|
138
|
-
subject: `update ${this.inferScope(filesChanged)} styling`,
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
if (hasComponents) {
|
|
142
|
-
suggestions.push({
|
|
143
|
-
type: "feat",
|
|
144
|
-
subject: `update ${this.inferScope(filesChanged)} component`,
|
|
145
|
-
});
|
|
146
|
-
}
|
|
147
|
-
if (hasCI) {
|
|
148
|
-
suggestions.push({
|
|
149
|
-
type: "ci",
|
|
150
|
-
subject: "update CI/CD configuration",
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
if (hasBuild) {
|
|
154
|
-
suggestions.push({
|
|
155
|
-
type: "build",
|
|
156
|
-
subject: "update build configuration",
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
// Default suggestions
|
|
160
|
-
if (suggestions.length === 0) {
|
|
161
|
-
const scope = this.inferScope(filesChanged);
|
|
162
|
-
suggestions.push({
|
|
163
|
-
type: "feat",
|
|
164
|
-
subject: `add ${this.inferFeatureType(filesChanged)}`,
|
|
165
|
-
scope: scope !== "project" && scope !== "multiple modules"
|
|
166
|
-
? scope
|
|
167
|
-
: undefined,
|
|
168
|
-
}, {
|
|
169
|
-
type: "fix",
|
|
170
|
-
subject: `resolve issue in ${scope}`,
|
|
171
|
-
}, {
|
|
172
|
-
type: "refactor",
|
|
173
|
-
subject: `improve ${scope}`,
|
|
174
|
-
});
|
|
175
|
-
}
|
|
176
|
-
// Mark breaking if detected
|
|
177
|
-
if (hasBreaking) {
|
|
178
|
-
suggestions.forEach((s) => (s.breaking = true));
|
|
179
|
-
}
|
|
180
|
-
return suggestions.slice(0, 5);
|
|
181
|
-
}
|
|
182
|
-
inferFeatureType(files) {
|
|
183
|
-
if (files.some((f) => f.includes("component") || f.includes("Component")))
|
|
184
|
-
return "component";
|
|
185
|
-
if (files.some((f) => f.includes("util") || f.includes("helper")))
|
|
186
|
-
return "utility";
|
|
187
|
-
if (files.some((f) => f.includes("api") || f.includes("endpoint")))
|
|
188
|
-
return "API endpoint";
|
|
189
|
-
if (files.some((f) => f.includes("model") || f.includes("schema")))
|
|
190
|
-
return "model";
|
|
191
|
-
if (files.some((f) => f.includes("service")))
|
|
192
|
-
return "service";
|
|
193
|
-
if (files.some((f) => f.includes("hook")))
|
|
194
|
-
return "hook";
|
|
195
|
-
if (files.some((f) => f.includes("type") || f.includes("interface")))
|
|
196
|
-
return "types";
|
|
197
|
-
return "feature";
|
|
198
|
-
}
|
|
199
|
-
inferScope(files) {
|
|
200
|
-
if (files.length === 0)
|
|
201
|
-
return "project";
|
|
202
|
-
// Extract first directory from each file
|
|
203
|
-
const dirs = files
|
|
204
|
-
.map((f) => f.split("/")[0])
|
|
205
|
-
.filter((d) => d && !d.startsWith("."));
|
|
206
|
-
if (dirs.length === 0)
|
|
207
|
-
return "root";
|
|
208
|
-
// Find most common directory
|
|
209
|
-
const dirCount = dirs.reduce((acc, d) => {
|
|
210
|
-
acc[d] = (acc[d] || 0) + 1;
|
|
211
|
-
return acc;
|
|
212
|
-
}, {});
|
|
213
|
-
const mostCommon = Object.entries(dirCount).sort((a, b) => b[1] - a[1])[0][0];
|
|
214
|
-
// If most common directory covers most files, use it
|
|
215
|
-
if (dirCount[mostCommon] >= files.length * 0.6) {
|
|
216
|
-
return mostCommon;
|
|
217
|
-
}
|
|
218
|
-
return "multiple modules";
|
|
219
|
-
}
|
|
220
63
|
formatCommitMessage(msg) {
|
|
221
64
|
let result = `${msg.type}`;
|
|
222
65
|
if (msg.scope)
|
|
@@ -261,6 +104,22 @@ class CommitGen {
|
|
|
261
104
|
};
|
|
262
105
|
return icons[ext] || "📄";
|
|
263
106
|
}
|
|
107
|
+
hasEnvironmentApiKey(provider) {
|
|
108
|
+
switch (provider) {
|
|
109
|
+
case "vercel-google":
|
|
110
|
+
return !!process.env.GOOGLE_GENERATIVE_AI_API_KEY;
|
|
111
|
+
case "vercel-openai":
|
|
112
|
+
return !!process.env.OPENAI_API_KEY;
|
|
113
|
+
case "groq":
|
|
114
|
+
return !!process.env.GROQ_API_KEY;
|
|
115
|
+
case "openai":
|
|
116
|
+
return !!process.env.OPENAI_API_KEY;
|
|
117
|
+
case "google":
|
|
118
|
+
return !!process.env.GOOGLE_GENERATIVE_AI_API_KEY;
|
|
119
|
+
default:
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
264
123
|
async run(options) {
|
|
265
124
|
console.log(chalk_1.default.bold.cyan("\n🚀 CommitGen") +
|
|
266
125
|
chalk_1.default.gray(" - AI-Powered Commit Message Generator\n"));
|
|
@@ -278,11 +137,72 @@ class CommitGen {
|
|
|
278
137
|
process.exit(0);
|
|
279
138
|
}
|
|
280
139
|
this.displayAnalysis(analysis);
|
|
281
|
-
|
|
282
|
-
|
|
140
|
+
let suggestions;
|
|
141
|
+
if (options.useAi !== false) {
|
|
142
|
+
try {
|
|
143
|
+
// Load provider configuration
|
|
144
|
+
const configManager = new config_1.ConfigManager();
|
|
145
|
+
let providerConfig = configManager.getProviderConfig();
|
|
146
|
+
// Check if API key is missing and prompt for configuration
|
|
147
|
+
if (!providerConfig.apiKey &&
|
|
148
|
+
!this.hasEnvironmentApiKey(providerConfig.provider)) {
|
|
149
|
+
console.log(chalk_1.default.yellow("\n⚠️ API key not found for the selected provider."));
|
|
150
|
+
const { shouldConfigure } = await inquirer_1.default.prompt([
|
|
151
|
+
{
|
|
152
|
+
type: "confirm",
|
|
153
|
+
name: "shouldConfigure",
|
|
154
|
+
message: "Would you like to configure your API key now?",
|
|
155
|
+
default: true,
|
|
156
|
+
},
|
|
157
|
+
]);
|
|
158
|
+
if (shouldConfigure) {
|
|
159
|
+
await (0, configure_1.configureCommand)();
|
|
160
|
+
// Reload config after configuration
|
|
161
|
+
providerConfig = configManager.getProviderConfig();
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
console.log(chalk_1.default.gray("Falling back to rule-based suggestions...\n"));
|
|
165
|
+
suggestions = this.getFallbackSuggestions(analysis);
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
console.log(chalk_1.default.blue(`\n🤖 Generating commit messages using ${providerConfig.provider}...\n`));
|
|
170
|
+
// Create provider and generate suggestions
|
|
171
|
+
const provider = (0, providers_1.createProvider)(providerConfig);
|
|
172
|
+
suggestions = await provider.generateCommitMessage(analysis);
|
|
173
|
+
if (!suggestions || suggestions.length === 0) {
|
|
174
|
+
throw new Error("No suggestions generated");
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
console.warn(chalk_1.default.yellow(`⚠️ AI generation failed: ${error instanceof Error ? error.message : "Unknown error"}`));
|
|
179
|
+
// If it's an API key error, offer to reconfigure
|
|
180
|
+
if (error instanceof Error && error.message.includes("API key")) {
|
|
181
|
+
const { shouldReconfigure } = await inquirer_1.default.prompt([
|
|
182
|
+
{
|
|
183
|
+
type: "confirm",
|
|
184
|
+
name: "shouldReconfigure",
|
|
185
|
+
message: "Would you like to reconfigure your API key?",
|
|
186
|
+
default: true,
|
|
187
|
+
},
|
|
188
|
+
]);
|
|
189
|
+
if (shouldReconfigure) {
|
|
190
|
+
await (0, configure_1.configureCommand)();
|
|
191
|
+
console.log(chalk_1.default.blue("\n🔄 Please run the command again with your new configuration."));
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
console.log(chalk_1.default.gray("Falling back to rule-based suggestions...\n"));
|
|
196
|
+
suggestions = this.getFallbackSuggestions(analysis);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
suggestions = this.getFallbackSuggestions(analysis);
|
|
201
|
+
}
|
|
202
|
+
console.log(chalk_1.default.cyan.bold("💡 Suggested commit messages:\n"));
|
|
283
203
|
const choices = suggestions.map((s, i) => {
|
|
284
204
|
const formatted = this.formatCommitMessage(s);
|
|
285
|
-
const preview = formatted.split("\n")[0];
|
|
205
|
+
const preview = formatted.split("\n")[0];
|
|
286
206
|
return {
|
|
287
207
|
name: `${chalk_1.default.gray(`${i + 1}.`)} ${preview}`,
|
|
288
208
|
value: formatted,
|
|
@@ -370,18 +290,89 @@ class CommitGen {
|
|
|
370
290
|
process.exit(1);
|
|
371
291
|
}
|
|
372
292
|
}
|
|
293
|
+
getFallbackSuggestions(analysis) {
|
|
294
|
+
const { filesChanged, additions, deletions } = analysis;
|
|
295
|
+
const suggestions = [];
|
|
296
|
+
const hasTests = filesChanged.some((f) => f.includes("test") || f.includes("spec") || f.includes("__tests__"));
|
|
297
|
+
const hasDocs = filesChanged.some((f) => f.includes("README") || f.includes(".md"));
|
|
298
|
+
const hasConfig = filesChanged.some((f) => f.includes("config") ||
|
|
299
|
+
f.includes(".json") ||
|
|
300
|
+
f.includes("package.json"));
|
|
301
|
+
if (additions > deletions * 2 && additions > 20) {
|
|
302
|
+
suggestions.push({
|
|
303
|
+
type: "feat",
|
|
304
|
+
subject: `add new feature`,
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
if (deletions > additions * 2 && deletions > 20) {
|
|
308
|
+
suggestions.push({
|
|
309
|
+
type: "refactor",
|
|
310
|
+
subject: `remove unused code`,
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
if (hasTests) {
|
|
314
|
+
suggestions.push({
|
|
315
|
+
type: "test",
|
|
316
|
+
subject: `add tests`,
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
if (hasDocs) {
|
|
320
|
+
suggestions.push({
|
|
321
|
+
type: "docs",
|
|
322
|
+
subject: "update documentation",
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
if (hasConfig) {
|
|
326
|
+
suggestions.push({
|
|
327
|
+
type: "chore",
|
|
328
|
+
subject: "update configuration",
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
if (suggestions.length === 0) {
|
|
332
|
+
suggestions.push({
|
|
333
|
+
type: "feat",
|
|
334
|
+
subject: `add feature`,
|
|
335
|
+
}, {
|
|
336
|
+
type: "fix",
|
|
337
|
+
subject: `fix issue`,
|
|
338
|
+
}, {
|
|
339
|
+
type: "refactor",
|
|
340
|
+
subject: `refactor code`,
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
return suggestions.slice(0, 5);
|
|
344
|
+
}
|
|
373
345
|
}
|
|
374
346
|
// CLI setup
|
|
375
347
|
const program = new commander_1.Command();
|
|
376
348
|
program
|
|
377
349
|
.name("commitgen")
|
|
378
350
|
.description("AI-powered commit message generator for Git")
|
|
379
|
-
.version("0.0.
|
|
351
|
+
.version("0.0.4")
|
|
380
352
|
.option("-p, --push", "Push changes after committing")
|
|
381
353
|
.option("-n, --noverify", "Skip git hooks (--no-verify)")
|
|
354
|
+
.option("--no-ai", "Disable AI generation and use rule-based suggestions")
|
|
382
355
|
.action(async (options) => {
|
|
383
356
|
const commitGen = new CommitGen();
|
|
384
357
|
await commitGen.run(options);
|
|
385
358
|
});
|
|
359
|
+
program
|
|
360
|
+
.command("config")
|
|
361
|
+
.description("Configure AI provider and settings")
|
|
362
|
+
.action(configure_1.configureCommand);
|
|
363
|
+
program
|
|
364
|
+
.command("show-config")
|
|
365
|
+
.description("Show current configuration")
|
|
366
|
+
.action(() => {
|
|
367
|
+
const configManager = new config_1.ConfigManager();
|
|
368
|
+
const config = configManager.getProviderConfig();
|
|
369
|
+
console.log(chalk_1.default.cyan.bold("\n⚙️ Current Configuration\n"));
|
|
370
|
+
console.log(chalk_1.default.gray(`Provider: ${chalk_1.default.white(config.provider)}`));
|
|
371
|
+
console.log(chalk_1.default.gray(`Model: ${chalk_1.default.white(config.model || "default")}`));
|
|
372
|
+
console.log(chalk_1.default.gray(`API Key: ${config.apiKey ? chalk_1.default.green("configured") : chalk_1.default.red("not set")}`));
|
|
373
|
+
if (!config.apiKey) {
|
|
374
|
+
console.log(chalk_1.default.yellow("\n💡 Run 'commitgen config' to set up your API key"));
|
|
375
|
+
}
|
|
376
|
+
});
|
|
386
377
|
program.parse();
|
|
387
378
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { CommitMessage, GitAnalysis } from "../types";
|
|
2
|
+
export declare abstract class BaseProvider {
|
|
3
|
+
protected analysis: GitAnalysis | null;
|
|
4
|
+
abstract generateCommitMessage(analysis: GitAnalysis): Promise<CommitMessage[]>;
|
|
5
|
+
protected inferFeatureType(files: string[]): string;
|
|
6
|
+
protected inferScope(files: string[]): string;
|
|
7
|
+
protected buildSystemPrompt(): string;
|
|
8
|
+
protected buildAnalysisPrompt(analysis: GitAnalysis): string;
|
|
9
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ./src/providers/base.ts
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.BaseProvider = void 0;
|
|
5
|
+
class BaseProvider {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.analysis = null;
|
|
8
|
+
}
|
|
9
|
+
inferFeatureType(files) {
|
|
10
|
+
if (files.some((f) => f.includes("component") || f.includes("Component")))
|
|
11
|
+
return "component";
|
|
12
|
+
if (files.some((f) => f.includes("util") || f.includes("helper")))
|
|
13
|
+
return "utility";
|
|
14
|
+
if (files.some((f) => f.includes("api") || f.includes("endpoint")))
|
|
15
|
+
return "API endpoint";
|
|
16
|
+
if (files.some((f) => f.includes("model") || f.includes("schema")))
|
|
17
|
+
return "model";
|
|
18
|
+
if (files.some((f) => f.includes("service")))
|
|
19
|
+
return "service";
|
|
20
|
+
if (files.some((f) => f.includes("hook")))
|
|
21
|
+
return "hook";
|
|
22
|
+
if (files.some((f) => f.includes("type") || f.includes("interface")))
|
|
23
|
+
return "types";
|
|
24
|
+
return "feature";
|
|
25
|
+
}
|
|
26
|
+
inferScope(files) {
|
|
27
|
+
if (files.length === 0)
|
|
28
|
+
return "project";
|
|
29
|
+
const dirs = files
|
|
30
|
+
.map((f) => f.split("/")[0])
|
|
31
|
+
.filter((d) => d && !d.startsWith("."));
|
|
32
|
+
if (dirs.length === 0)
|
|
33
|
+
return "root";
|
|
34
|
+
const dirCount = dirs.reduce((acc, d) => {
|
|
35
|
+
acc[d] = (acc[d] || 0) + 1;
|
|
36
|
+
return acc;
|
|
37
|
+
}, {});
|
|
38
|
+
const mostCommon = Object.entries(dirCount).sort((a, b) => b[1] - a[1])[0][0];
|
|
39
|
+
if (dirCount[mostCommon] >= files.length * 0.6) {
|
|
40
|
+
return mostCommon;
|
|
41
|
+
}
|
|
42
|
+
return "multiple modules";
|
|
43
|
+
}
|
|
44
|
+
buildSystemPrompt() {
|
|
45
|
+
return `You are an expert at writing conventional commit messages.
|
|
46
|
+
Your task is to analyze git changes and generate clear, concise commit messages following the Conventional Commits specification.
|
|
47
|
+
|
|
48
|
+
Commit types:
|
|
49
|
+
- feat: A new feature
|
|
50
|
+
- fix: A bug fix
|
|
51
|
+
- docs: Documentation changes
|
|
52
|
+
- style: Code style changes (formatting, missing semi-colons, etc)
|
|
53
|
+
- refactor: Code changes that neither fix a bug nor add a feature
|
|
54
|
+
- perf: Performance improvements
|
|
55
|
+
- test: Adding or updating tests
|
|
56
|
+
- build: Changes to build system or dependencies
|
|
57
|
+
- ci: Changes to CI configuration
|
|
58
|
+
- chore: Other changes that don't modify src or test files
|
|
59
|
+
- revert: Reverts a previous commit
|
|
60
|
+
|
|
61
|
+
Format: type(scope): subject
|
|
62
|
+
|
|
63
|
+
Rules:
|
|
64
|
+
- Use imperative mood ("add" not "added" or "adds")
|
|
65
|
+
- Don't capitalize first letter of subject
|
|
66
|
+
- No period at the end of subject
|
|
67
|
+
- Keep subject under 50 characters
|
|
68
|
+
- Be specific but concise
|
|
69
|
+
- Include scope when relevant
|
|
70
|
+
- Add breaking change marker (!) when applicable`;
|
|
71
|
+
}
|
|
72
|
+
buildAnalysisPrompt(analysis) {
|
|
73
|
+
const { filesChanged, additions, deletions, diff } = analysis;
|
|
74
|
+
return `Analyze these git changes and generate 3-5 commit message suggestions:
|
|
75
|
+
|
|
76
|
+
Files changed (${filesChanged.length}):
|
|
77
|
+
${filesChanged
|
|
78
|
+
.slice(0, 20)
|
|
79
|
+
.map((f) => `- ${f}`)
|
|
80
|
+
.join("\n")}
|
|
81
|
+
${filesChanged.length > 20 ? `... and ${filesChanged.length - 20} more files` : ""}
|
|
82
|
+
|
|
83
|
+
Statistics:
|
|
84
|
+
- Additions: +${additions}
|
|
85
|
+
- Deletions: -${deletions}
|
|
86
|
+
|
|
87
|
+
Git diff (first 2000 characters):
|
|
88
|
+
\`\`\`
|
|
89
|
+
${diff.slice(0, 2000)}
|
|
90
|
+
\`\`\`
|
|
91
|
+
|
|
92
|
+
Return your response as a JSON array of commit messages:
|
|
93
|
+
[
|
|
94
|
+
{
|
|
95
|
+
"type": "feat",
|
|
96
|
+
"scope": "auth",
|
|
97
|
+
"subject": "add OAuth2 authentication",
|
|
98
|
+
"body": "Optional detailed description",
|
|
99
|
+
"breaking": false
|
|
100
|
+
}
|
|
101
|
+
]
|
|
102
|
+
|
|
103
|
+
Generate 3-5 suggestions, ordered from most to least relevant.`;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
exports.BaseProvider = BaseProvider;
|
|
107
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ./src/providers/index.ts
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
15
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
16
|
+
};
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.createProvider = createProvider;
|
|
19
|
+
const vercel_google_1 = require("./vercel-google");
|
|
20
|
+
function createProvider(config) {
|
|
21
|
+
switch (config.provider) {
|
|
22
|
+
case "vercel-google":
|
|
23
|
+
return new vercel_google_1.VercelGoogleProvider(config.apiKey, config.model);
|
|
24
|
+
// Future providers
|
|
25
|
+
// case 'vercel-openai':
|
|
26
|
+
// return new VercelOpenAIProvider(config.apiKey, config.model);
|
|
27
|
+
// case 'groq':
|
|
28
|
+
// return new GroqProvider(config.apiKey, config.model);
|
|
29
|
+
// case 'openai':
|
|
30
|
+
// return new OpenAIProvider(config.apiKey, config.model);
|
|
31
|
+
// case 'google':
|
|
32
|
+
// return new GoogleProvider(config.apiKey, config.model);
|
|
33
|
+
// case 'local':
|
|
34
|
+
// return new LocalProvider(config.baseUrl, config.model);
|
|
35
|
+
default:
|
|
36
|
+
throw new Error(`Unsupported provider: ${config.provider}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
__exportStar(require("./vercel-google"), exports);
|
|
40
|
+
__exportStar(require("./base"), exports);
|
|
41
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":";AAAA,2BAA2B;;;;;;;;;;;;;;;;AAK3B,wCAoBC;AAvBD,mDAAuD;AAGvD,SAAgB,cAAc,CAAC,MAAsB;IACnD,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,eAAe;YAClB,OAAO,IAAI,oCAAoB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAE/D,mBAAmB;QACnB,wBAAwB;QACxB,kEAAkE;QAClE,eAAe;QACf,0DAA0D;QAC1D,iBAAiB;QACjB,4DAA4D;QAC5D,iBAAiB;QACjB,4DAA4D;QAC5D,gBAAgB;QAChB,4DAA4D;QAE5D;YACE,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,kDAAgC;AAChC,yCAAuB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { BaseProvider } from "./base";
|
|
2
|
+
import { GitAnalysis, CommitMessage, AIProvider } from "../types";
|
|
3
|
+
export declare class VercelGoogleProvider extends BaseProvider implements AIProvider {
|
|
4
|
+
name: string;
|
|
5
|
+
private apiKey;
|
|
6
|
+
private model;
|
|
7
|
+
constructor(apiKey?: string, model?: string);
|
|
8
|
+
generateCommitMessage(analysis: GitAnalysis): Promise<CommitMessage[]>;
|
|
9
|
+
private getFallbackSuggestions;
|
|
10
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ./src/providers/vercel-google.ts
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.VercelGoogleProvider = void 0;
|
|
5
|
+
const google_1 = require("@ai-sdk/google");
|
|
6
|
+
const ai_1 = require("ai");
|
|
7
|
+
const base_1 = require("./base");
|
|
8
|
+
class VercelGoogleProvider extends base_1.BaseProvider {
|
|
9
|
+
constructor(apiKey, model = "gemini-2.5-flash") {
|
|
10
|
+
super();
|
|
11
|
+
this.name = "vercel-google";
|
|
12
|
+
this.apiKey = apiKey || process.env.GOOGLE_GENERATIVE_AI_API_KEY || "";
|
|
13
|
+
this.model = model;
|
|
14
|
+
if (!this.apiKey) {
|
|
15
|
+
throw new Error("Google API key is required. Set GOOGLE_GENERATIVE_AI_API_KEY environment variable or pass it in config.");
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
async generateCommitMessage(analysis) {
|
|
19
|
+
this.analysis = analysis;
|
|
20
|
+
try {
|
|
21
|
+
const google = (0, google_1.createGoogleGenerativeAI)({
|
|
22
|
+
apiKey: this.apiKey,
|
|
23
|
+
});
|
|
24
|
+
const { text } = await (0, ai_1.generateText)({
|
|
25
|
+
model: google(this.model),
|
|
26
|
+
system: this.buildSystemPrompt(),
|
|
27
|
+
prompt: this.buildAnalysisPrompt(analysis),
|
|
28
|
+
temperature: 0.7,
|
|
29
|
+
});
|
|
30
|
+
// Parse JSON response
|
|
31
|
+
const jsonMatch = text.match(/\[[\s\S]*\]/);
|
|
32
|
+
if (!jsonMatch) {
|
|
33
|
+
throw new Error("Failed to parse AI response");
|
|
34
|
+
}
|
|
35
|
+
const suggestions = JSON.parse(jsonMatch[0]);
|
|
36
|
+
return suggestions.slice(0, 5);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
console.error("Error generating commit message:", error);
|
|
40
|
+
// Fallback to rule-based suggestions
|
|
41
|
+
return this.getFallbackSuggestions(analysis);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
getFallbackSuggestions(analysis) {
|
|
45
|
+
const { filesChanged, additions, deletions } = analysis;
|
|
46
|
+
const suggestions = [];
|
|
47
|
+
const hasTests = filesChanged.some((f) => f.includes("test") || f.includes("spec") || f.includes("__tests__"));
|
|
48
|
+
const hasDocs = filesChanged.some((f) => f.includes("README") || f.includes(".md"));
|
|
49
|
+
const hasConfig = filesChanged.some((f) => f.includes("config") ||
|
|
50
|
+
f.includes(".json") ||
|
|
51
|
+
f.includes("package.json"));
|
|
52
|
+
if (additions > deletions * 2 && additions > 20) {
|
|
53
|
+
suggestions.push({
|
|
54
|
+
type: "feat",
|
|
55
|
+
subject: `add ${this.inferFeatureType(filesChanged)}`,
|
|
56
|
+
scope: this.inferScope(filesChanged),
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
if (deletions > additions * 2 && deletions > 20) {
|
|
60
|
+
suggestions.push({
|
|
61
|
+
type: "refactor",
|
|
62
|
+
subject: `remove unused ${this.inferFeatureType(filesChanged)}`,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
if (hasTests) {
|
|
66
|
+
suggestions.push({
|
|
67
|
+
type: "test",
|
|
68
|
+
subject: `add tests for ${this.inferScope(filesChanged)}`,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
if (hasDocs) {
|
|
72
|
+
suggestions.push({
|
|
73
|
+
type: "docs",
|
|
74
|
+
subject: "update documentation",
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
if (hasConfig) {
|
|
78
|
+
suggestions.push({
|
|
79
|
+
type: "chore",
|
|
80
|
+
subject: "update configuration",
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
if (suggestions.length === 0) {
|
|
84
|
+
suggestions.push({
|
|
85
|
+
type: "feat",
|
|
86
|
+
subject: `update ${this.inferScope(filesChanged)}`,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
return suggestions;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
exports.VercelGoogleProvider = VercelGoogleProvider;
|
|
93
|
+
//# sourceMappingURL=vercel-google.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vercel-google.js","sourceRoot":"","sources":["../../src/providers/vercel-google.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface CommitMessage {
|
|
2
|
+
type: string;
|
|
3
|
+
scope?: string;
|
|
4
|
+
subject: string;
|
|
5
|
+
body?: string;
|
|
6
|
+
breaking?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface GitAnalysis {
|
|
9
|
+
filesChanged: string[];
|
|
10
|
+
additions: number;
|
|
11
|
+
deletions: number;
|
|
12
|
+
hasStaged: boolean;
|
|
13
|
+
hasUnstaged: boolean;
|
|
14
|
+
diff: string;
|
|
15
|
+
}
|
|
16
|
+
export interface AIProvider {
|
|
17
|
+
name: string;
|
|
18
|
+
generateCommitMessage(analysis: GitAnalysis): Promise<CommitMessage[]>;
|
|
19
|
+
}
|
|
20
|
+
export interface ProviderConfig {
|
|
21
|
+
provider: "vercel-google" | "vercel-openai" | "groq" | "openai" | "google" | "local";
|
|
22
|
+
apiKey?: string;
|
|
23
|
+
model?: string;
|
|
24
|
+
baseUrl?: string;
|
|
25
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA,iBAAiB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@untools/commitgen",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"description": "CLI to create generate commit messages",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -17,7 +17,15 @@
|
|
|
17
17
|
"release:patch": "standard-version --release-as patch"
|
|
18
18
|
},
|
|
19
19
|
"keywords": [
|
|
20
|
-
"
|
|
20
|
+
"git",
|
|
21
|
+
"commit",
|
|
22
|
+
"conventional-commits",
|
|
23
|
+
"ai",
|
|
24
|
+
"cli",
|
|
25
|
+
"typescript",
|
|
26
|
+
"commitizen",
|
|
27
|
+
"gemini",
|
|
28
|
+
"openai"
|
|
21
29
|
],
|
|
22
30
|
"files": [
|
|
23
31
|
"dist"
|
|
@@ -39,7 +47,9 @@
|
|
|
39
47
|
},
|
|
40
48
|
"homepage": "https://github.com/aevrHQ/untools-commitgen#readme",
|
|
41
49
|
"dependencies": {
|
|
50
|
+
"@ai-sdk/google": "^2.0.26",
|
|
42
51
|
"@untools/port-gen": "^0.0.2",
|
|
52
|
+
"ai": "^5.0.86",
|
|
43
53
|
"chalk": "^4.1.2",
|
|
44
54
|
"commander": "^13.1.0",
|
|
45
55
|
"degit": "^2.8.4",
|