@untools/commitgen 0.0.4 → 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 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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"}
@@ -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
- const suggestions = this.generateCommitMessage(analysis);
282
- console.log(chalk_1.default.cyan.bold("\n💡 Suggested commit messages:\n"));
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]; // First line only
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.3")
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,4 @@
1
+ import { ProviderConfig, AIProvider } from "../types";
2
+ export declare function createProvider(config: ProviderConfig): AIProvider;
3
+ export * from "./vercel-google";
4
+ export * from "./base";
@@ -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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"}
@@ -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,4 @@
1
+ "use strict";
2
+ // ./src/types.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA,iBAAiB"}
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@untools/commitgen",
3
- "version": "0.0.4",
3
+ "version": "0.1.0",
4
4
  "description": "CLI to create generate commit messages",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
7
- "@untools/commitgen": "./dist/index.js"
7
+ "commitgen": "./dist/index.js"
8
8
  },
9
9
  "scripts": {
10
- "build": "tsc",
10
+ "build": "tsc && chmod +x dist/index.js",
11
11
  "prepublishOnly": "npm run build",
12
12
  "dev": "ts-node src/index.ts",
13
13
  "test": "jest",
@@ -17,7 +17,15 @@
17
17
  "release:patch": "standard-version --release-as patch"
18
18
  },
19
19
  "keywords": [
20
- "typescript"
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",