craftcommit-cli 0.3.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,222 @@
1
+ # CommitCraft CLI
2
+
3
+ Generate AI-powered commit messages from your terminal.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install -g commitcraft-cli
9
+ ```
10
+
11
+ Or use with npx:
12
+
13
+ ```bash
14
+ npx commitcraft-cli
15
+ ```
16
+
17
+ ## Quick Start
18
+
19
+ 1. Stage your changes:
20
+ ```bash
21
+ git add .
22
+ ```
23
+
24
+ 2. Generate commit message:
25
+ ```bash
26
+ commitcraft
27
+ ```
28
+
29
+ 3. Select from 3 AI-generated options:
30
+ ```
31
+ ? Select a commit message:
32
+ ❯ 1. feat(auth): add OAuth2 login support
33
+ 2. feat(auth): implement authentication flow
34
+ 3. feat: add social login feature
35
+ Cancel
36
+ ```
37
+
38
+ 4. The selected message is copied to your clipboard!
39
+
40
+ ## Usage
41
+
42
+ ### Generate commit message (default command)
43
+
44
+ ```bash
45
+ commitcraft
46
+ # or
47
+ commitcraft generate
48
+ ```
49
+
50
+ ### Auto-commit with selected message
51
+
52
+ ```bash
53
+ commitcraft --commit
54
+ # or
55
+ commitcraft -c
56
+ ```
57
+
58
+ ### Specify provider and options
59
+
60
+ ```bash
61
+ commitcraft -p openai -m gpt-4 -l english
62
+ commitcraft -p groq
63
+ commitcraft -p ollama -m llama3.2
64
+ ```
65
+
66
+ ### Configure API keys
67
+
68
+ ```bash
69
+ commitcraft config
70
+ ```
71
+
72
+ ## Options
73
+
74
+ | Option | Alias | Description |
75
+ |--------|-------|-------------|
76
+ | `--provider` | `-p` | AI provider: `openai`, `groq`, `gemini`, `ollama` |
77
+ | `--model` | `-m` | Specific model to use |
78
+ | `--language` | `-l` | Language: `english` or `korean` |
79
+ | `--commit` | `-c` | Auto-commit with selected message |
80
+ | `--issue-pattern` | | Regex to extract issue from branch |
81
+ | `--issue-prefix` | | Prefix for issue (e.g., `#`) |
82
+
83
+ ## Configuration
84
+
85
+ ### Environment Variables
86
+
87
+ ```bash
88
+ export OPENAI_API_KEY="sk-..."
89
+ export GROQ_API_KEY="gsk_..."
90
+ export GEMINI_API_KEY="AI..."
91
+ export OLLAMA_URL="http://localhost:11434"
92
+ ```
93
+
94
+ ### Config File (~/.commitcraftrc)
95
+
96
+ ```json
97
+ {
98
+ "provider": "openai",
99
+ "model": "gpt-4o-mini",
100
+ "language": "english",
101
+ "openaiApiKey": "sk-...",
102
+ "groqApiKey": "gsk_...",
103
+ "geminiApiKey": "AI..."
104
+ }
105
+ ```
106
+
107
+ ### .env File
108
+
109
+ You can also use a `.env` file in your project or home directory:
110
+
111
+ ```
112
+ OPENAI_API_KEY=sk-...
113
+ GROQ_API_KEY=gsk_...
114
+ COMMITCRAFT_PROVIDER=openai
115
+ COMMITCRAFT_LANGUAGE=english
116
+ ```
117
+
118
+ ## Issue Linking
119
+
120
+ Extract issue numbers from branch names:
121
+
122
+ ```bash
123
+ # Branch: feature/123-add-login
124
+ commitcraft --issue-pattern "feature/(\d+)" --issue-prefix "#"
125
+ # Result: feat(auth): add login validation #123
126
+ ```
127
+
128
+ ```bash
129
+ # Branch: JIRA-456-fix-bug
130
+ commitcraft --issue-pattern "(JIRA-\d+)"
131
+ # Result: fix(api): resolve null pointer JIRA-456
132
+ ```
133
+
134
+ ## Providers
135
+
136
+ ### OpenAI (default)
137
+ - Default model: `gpt-4o-mini`
138
+ - Requires: `OPENAI_API_KEY`
139
+ - Get key: https://platform.openai.com/api-keys
140
+
141
+ ### Groq
142
+ - Default model: `llama-3.1-8b-instant`
143
+ - Requires: `GROQ_API_KEY`
144
+ - Get key: https://console.groq.com/keys
145
+ - Fast and free tier available
146
+
147
+ ### Gemini
148
+ - Default model: `gemini-1.5-flash`
149
+ - Requires: `GEMINI_API_KEY`
150
+ - Get key: https://aistudio.google.com/app/apikey
151
+
152
+ ### Ollama (Local/Offline)
153
+ - Default model: `llama3.2`
154
+ - No API key required
155
+ - Install: https://ollama.ai/
156
+ - Run: `ollama pull llama3.2`
157
+
158
+ ## Examples
159
+
160
+ ### Basic usage
161
+
162
+ ```bash
163
+ $ git add src/auth.ts
164
+ $ commitcraft
165
+
166
+ ✓ Got staged changes
167
+ ✓ Generated commit messages
168
+
169
+ ? Select a commit message:
170
+ ❯ 1. feat(auth): add password validation
171
+ 2. feat(auth): implement input validation for login
172
+ 3. feat: add authentication validation
173
+ Cancel
174
+
175
+ ✓ Copied to clipboard: feat(auth): add password validation
176
+ ```
177
+
178
+ ### Auto-commit
179
+
180
+ ```bash
181
+ $ commitcraft --commit
182
+
183
+ ✓ Got staged changes
184
+ ✓ Generated commit messages
185
+
186
+ ? Select a commit message: 1. feat(auth): add password validation
187
+ ✓ Committed: feat(auth): add password validation
188
+ ```
189
+
190
+ ### Korean language
191
+
192
+ ```bash
193
+ $ commitcraft -l korean
194
+
195
+ ✓ Got staged changes
196
+ ✓ Generated commit messages
197
+
198
+ ? Select a commit message:
199
+ ❯ 1. feat(auth): 비밀번호 유효성 검사 추가
200
+ 2. feat(auth): 로그인 입력값 검증 구현
201
+ 3. feat: 인증 유효성 검사 추가
202
+ Cancel
203
+ ```
204
+
205
+ ## Supported Commit Types
206
+
207
+ | Type | Description |
208
+ |------|-------------|
209
+ | `feat` | New feature |
210
+ | `fix` | Bug fix |
211
+ | `docs` | Documentation |
212
+ | `style` | Formatting |
213
+ | `refactor` | Code refactoring |
214
+ | `perf` | Performance |
215
+ | `test` | Tests |
216
+ | `build` | Build system |
217
+ | `ci` | CI/CD |
218
+ | `chore` | Maintenance |
219
+
220
+ ## License
221
+
222
+ MIT
package/dist/ai.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ import type { Provider, Language } from './config.js';
2
+ export interface CommitMessage {
3
+ type: string;
4
+ scope?: string;
5
+ subject: string;
6
+ }
7
+ export declare function generateCommitMessages(provider: Provider, apiKey: string, diff: string, fileSummary: string, model: string, language: Language, ollamaUrl?: string, issueReference?: string): Promise<CommitMessage[]>;
8
+ export declare function formatCommitMessage(commit: CommitMessage): string;
9
+ //# sourceMappingURL=ai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../src/ai.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAsOD,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,QAAQ,EAClB,SAAS,CAAC,EAAE,MAAM,EAClB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,aAAa,EAAE,CAAC,CAa1B;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAKjE"}
package/dist/ai.js ADDED
@@ -0,0 +1,189 @@
1
+ import OpenAI from 'openai';
2
+ import { GoogleGenerativeAI } from '@google/generative-ai';
3
+ const SYSTEM_PROMPT_EN = `You are a commit message generator. Analyze the git diff and generate 3 different commit message suggestions following Conventional Commits format.
4
+
5
+ Output JSON only: { "candidates": [{ "type": "...", "scope": "...", "subject": "..." }, ...] }
6
+
7
+ Rules:
8
+ - type: one of feat, fix, docs, style, refactor, perf, test, build, ci, chore
9
+ - scope: optional, short identifier for affected area (e.g., "auth", "api", "ui"). Omit if changes span multiple areas
10
+ - subject: imperative mood (e.g., "add", "fix", "update"), max 72 chars, no period at end, lowercase first letter
11
+ - Provide 3 different variations with different wording or focus
12
+
13
+ Example output:
14
+ { "candidates": [
15
+ { "type": "feat", "scope": "auth", "subject": "add OAuth2 login support" },
16
+ { "type": "feat", "scope": "auth", "subject": "implement OAuth2 authentication flow" },
17
+ { "type": "feat", "subject": "add social login via OAuth2" }
18
+ ]}`;
19
+ const SYSTEM_PROMPT_KO = `You are a commit message generator. Analyze the git diff and generate 3 different commit message suggestions following Conventional Commits format.
20
+
21
+ Output JSON only: { "candidates": [{ "type": "...", "scope": "...", "subject": "..." }, ...] }
22
+
23
+ Rules:
24
+ - type: one of feat, fix, docs, style, refactor, perf, test, build, ci, chore (MUST be in English)
25
+ - scope: optional, short identifier for affected area (MUST be in English)
26
+ - subject: MUST be written in Korean, max 72 chars, no period at end
27
+ - Provide 3 different variations with different wording or focus
28
+
29
+ Example output:
30
+ { "candidates": [
31
+ { "type": "feat", "scope": "auth", "subject": "OAuth2 로그인 지원 추가" },
32
+ { "type": "feat", "scope": "auth", "subject": "OAuth2 인증 흐름 구현" },
33
+ { "type": "feat", "subject": "OAuth2를 통한 소셜 로그인 추가" }
34
+ ]}`;
35
+ function getSystemPrompt(language, issueReference) {
36
+ let prompt = language === 'korean' ? SYSTEM_PROMPT_KO : SYSTEM_PROMPT_EN;
37
+ if (issueReference) {
38
+ prompt += `\n\nIMPORTANT: Include "${issueReference}" at the end of each subject.`;
39
+ }
40
+ return prompt;
41
+ }
42
+ function buildUserPrompt(diff, fileSummary) {
43
+ return `Generate 3 commit message candidates for the following changes:
44
+
45
+ ## Files Changed:
46
+ ${fileSummary || 'No files changed'}
47
+
48
+ ## Diff:
49
+ ${diff || 'No diff available'}`;
50
+ }
51
+ function parseJsonFromText(text) {
52
+ const jsonMatch = text.match(/```(?:json)?\s*([\s\S]*?)```/) ||
53
+ text.match(/(\{[\s\S]*\})/);
54
+ if (jsonMatch) {
55
+ return JSON.parse(jsonMatch[1].trim());
56
+ }
57
+ return JSON.parse(text);
58
+ }
59
+ function validateCandidates(data) {
60
+ if (typeof data !== 'object' || data === null) {
61
+ throw new Error('Response is not an object');
62
+ }
63
+ const obj = data;
64
+ if (!Array.isArray(obj.candidates)) {
65
+ throw new Error('Missing candidates array');
66
+ }
67
+ return obj.candidates.slice(0, 3).map((candidate) => {
68
+ const c = candidate;
69
+ let subject = String(c.subject || '').trim();
70
+ if (subject.endsWith('.')) {
71
+ subject = subject.slice(0, -1);
72
+ }
73
+ if (subject.length > 72) {
74
+ subject = subject.substring(0, 69) + '...';
75
+ }
76
+ return {
77
+ type: String(c.type || 'chore'),
78
+ scope: c.scope ? String(c.scope).trim() : undefined,
79
+ subject
80
+ };
81
+ });
82
+ }
83
+ async function callOpenAI(apiKey, model, diff, fileSummary, language, issueReference) {
84
+ const client = new OpenAI({ apiKey });
85
+ const response = await client.chat.completions.create({
86
+ model,
87
+ messages: [
88
+ { role: 'system', content: getSystemPrompt(language, issueReference) },
89
+ { role: 'user', content: buildUserPrompt(diff, fileSummary) }
90
+ ],
91
+ response_format: { type: 'json_object' },
92
+ temperature: 0.7,
93
+ max_tokens: 500
94
+ });
95
+ const content = response.choices[0]?.message?.content;
96
+ if (!content) {
97
+ throw new Error('Empty response from OpenAI');
98
+ }
99
+ return validateCandidates(JSON.parse(content));
100
+ }
101
+ async function callGroq(apiKey, model, diff, fileSummary, language, issueReference) {
102
+ const client = new OpenAI({
103
+ apiKey,
104
+ baseURL: 'https://api.groq.com/openai/v1'
105
+ });
106
+ const response = await client.chat.completions.create({
107
+ model,
108
+ messages: [
109
+ { role: 'system', content: getSystemPrompt(language, issueReference) },
110
+ { role: 'user', content: buildUserPrompt(diff, fileSummary) }
111
+ ],
112
+ response_format: { type: 'json_object' },
113
+ temperature: 0.7,
114
+ max_tokens: 500
115
+ });
116
+ const content = response.choices[0]?.message?.content;
117
+ if (!content) {
118
+ throw new Error('Empty response from Groq');
119
+ }
120
+ return validateCandidates(JSON.parse(content));
121
+ }
122
+ async function callGemini(apiKey, model, diff, fileSummary, language, issueReference) {
123
+ const genAI = new GoogleGenerativeAI(apiKey);
124
+ const geminiModel = genAI.getGenerativeModel({
125
+ model,
126
+ generationConfig: {
127
+ temperature: 0.7,
128
+ maxOutputTokens: 500,
129
+ responseMimeType: 'application/json'
130
+ }
131
+ });
132
+ const prompt = `${getSystemPrompt(language, issueReference)}
133
+
134
+ ${buildUserPrompt(diff, fileSummary)}`;
135
+ const result = await geminiModel.generateContent(prompt);
136
+ const text = result.response.text();
137
+ if (!text) {
138
+ throw new Error('Empty response from Gemini');
139
+ }
140
+ return validateCandidates(parseJsonFromText(text));
141
+ }
142
+ async function callOllama(ollamaUrl, model, diff, fileSummary, language, issueReference) {
143
+ const response = await fetch(`${ollamaUrl}/api/chat`, {
144
+ method: 'POST',
145
+ headers: { 'Content-Type': 'application/json' },
146
+ body: JSON.stringify({
147
+ model,
148
+ messages: [
149
+ { role: 'system', content: getSystemPrompt(language, issueReference) },
150
+ { role: 'user', content: buildUserPrompt(diff, fileSummary) }
151
+ ],
152
+ format: 'json',
153
+ stream: false
154
+ })
155
+ });
156
+ if (!response.ok) {
157
+ if (response.status === 404) {
158
+ throw new Error(`Model "${model}" not found. Run: ollama pull ${model}`);
159
+ }
160
+ throw new Error(`Ollama request failed: ${response.status}`);
161
+ }
162
+ const data = await response.json();
163
+ const content = data.message?.content;
164
+ if (!content) {
165
+ throw new Error('Empty response from Ollama');
166
+ }
167
+ return validateCandidates(parseJsonFromText(content));
168
+ }
169
+ export async function generateCommitMessages(provider, apiKey, diff, fileSummary, model, language, ollamaUrl, issueReference) {
170
+ switch (provider) {
171
+ case 'openai':
172
+ return callOpenAI(apiKey, model, diff, fileSummary, language, issueReference);
173
+ case 'groq':
174
+ return callGroq(apiKey, model, diff, fileSummary, language, issueReference);
175
+ case 'gemini':
176
+ return callGemini(apiKey, model, diff, fileSummary, language, issueReference);
177
+ case 'ollama':
178
+ return callOllama(ollamaUrl || 'http://localhost:11434', model, diff, fileSummary, language, issueReference);
179
+ default:
180
+ throw new Error(`Unknown provider: ${provider}`);
181
+ }
182
+ }
183
+ export function formatCommitMessage(commit) {
184
+ if (commit.scope) {
185
+ return `${commit.type}(${commit.scope}): ${commit.subject}`;
186
+ }
187
+ return `${commit.type}: ${commit.subject}`;
188
+ }
189
+ //# sourceMappingURL=ai.js.map
package/dist/ai.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai.js","sourceRoot":"","sources":["../src/ai.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}