@vibelint/vibelint-commit 0.1.7
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 +36 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +549 -0
- package/dist/index.js.map +1 -0
- package/package.json +36 -0
package/README.md
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# @vibelint/vibelint-commit
|
|
2
|
+
|
|
3
|
+
AI-powered commit message generator using Ollama.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -D @vibelint/vibelint-commit
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```json
|
|
14
|
+
{
|
|
15
|
+
"scripts": {
|
|
16
|
+
"commit": "vibelint-commit"
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm run commit
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Requirements
|
|
26
|
+
|
|
27
|
+
- Ollama running locally
|
|
28
|
+
- Recommended model: `ollama pull deepseek-v3.1:671b-cloud`
|
|
29
|
+
- Staged git changes
|
|
30
|
+
|
|
31
|
+
## Config
|
|
32
|
+
|
|
33
|
+
- `VIBELINT_OLLAMA_URL` - Ollama URL (default: `http://127.0.0.1:11434`)
|
|
34
|
+
- Will automatically use `deepseek-v3.1:671b-cloud` if installed
|
|
35
|
+
- Otherwise, prompts to install it or select from available models
|
|
36
|
+
- Config and cache stored in `node_modules/.cache/vibelint/` (automatically gitignored)
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,549 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { spawn, spawnSync } from "node:child_process";
|
|
3
|
+
import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
|
|
4
|
+
import http from "node:http";
|
|
5
|
+
import { dirname, join } from "node:path";
|
|
6
|
+
import prompts from "prompts";
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
const OLLAMA_BASE_URL = process.env.VIBELINT_OLLAMA_URL || "http://127.0.0.1:11434";
|
|
9
|
+
const CONFIG_FILE = join(process.cwd(), "node_modules", ".cache", "vibelint", "commit-config.json");
|
|
10
|
+
const CACHE_FILE = join(process.cwd(), "node_modules", ".cache", "vibelint", "commit-message-cache.json");
|
|
11
|
+
const OllamaTagsSchema = z.object({
|
|
12
|
+
models: z.array(z
|
|
13
|
+
.object({
|
|
14
|
+
name: z.string(),
|
|
15
|
+
model: z.string()
|
|
16
|
+
})
|
|
17
|
+
.passthrough())
|
|
18
|
+
});
|
|
19
|
+
const ConfigSchema = z.object({
|
|
20
|
+
selectedModel: z.string()
|
|
21
|
+
});
|
|
22
|
+
async function getAvailableModels() {
|
|
23
|
+
return new Promise((resolve, reject) => {
|
|
24
|
+
const req = http.get(`${OLLAMA_BASE_URL}/api/tags`, (res) => {
|
|
25
|
+
let data = "";
|
|
26
|
+
res.on("data", (chunk) => {
|
|
27
|
+
data += chunk;
|
|
28
|
+
});
|
|
29
|
+
res.on("end", () => {
|
|
30
|
+
try {
|
|
31
|
+
const parsedData = OllamaTagsSchema.safeParse(JSON.parse(data));
|
|
32
|
+
if (!parsedData.success) {
|
|
33
|
+
reject(new Error("Failed to parse Ollama response"));
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const models = parsedData.data.models;
|
|
37
|
+
const modelNames = models.map((model) => model.name);
|
|
38
|
+
resolve(modelNames);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
reject(new Error("Failed to parse Ollama response"));
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
req.on("error", (error) => {
|
|
46
|
+
if (error && typeof error === "object" && "code" in error) {
|
|
47
|
+
if (error.code === "ECONNREFUSED") {
|
|
48
|
+
reject(new Error("Ollama is not running. Please start it and try again."));
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
reject(new Error(`Unexpected error checking Ollama: ${String(error)}`));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
reject(new Error(`Unexpected error checking Ollama: ${String(error)}`));
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
req.end();
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
function ensureCacheDir() {
|
|
62
|
+
const cacheDir = dirname(CONFIG_FILE);
|
|
63
|
+
if (!existsSync(cacheDir)) {
|
|
64
|
+
mkdirSync(cacheDir, { recursive: true });
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
function loadConfig() {
|
|
68
|
+
if (!existsSync(CONFIG_FILE)) {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
try {
|
|
72
|
+
const content = readFileSync(CONFIG_FILE, "utf-8");
|
|
73
|
+
const parsed = ConfigSchema.safeParse(JSON.parse(content));
|
|
74
|
+
if (!parsed.success) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
return parsed.data;
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function saveConfig(config) {
|
|
84
|
+
ensureCacheDir();
|
|
85
|
+
writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), "utf-8");
|
|
86
|
+
}
|
|
87
|
+
async function selectModel(availableModels) {
|
|
88
|
+
let initialIndex = 0;
|
|
89
|
+
const config = loadConfig();
|
|
90
|
+
if (config) {
|
|
91
|
+
const foundIndex = availableModels.findIndex((model) => model === config.selectedModel);
|
|
92
|
+
if (foundIndex >= 0) {
|
|
93
|
+
initialIndex = foundIndex;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
const { model } = await prompts({
|
|
97
|
+
type: "select",
|
|
98
|
+
name: "model",
|
|
99
|
+
message: "Select an Ollama model:",
|
|
100
|
+
choices: availableModels.map((name) => ({ title: name, value: name })),
|
|
101
|
+
initial: initialIndex,
|
|
102
|
+
stdin: process.stdin,
|
|
103
|
+
stdout: process.stdout
|
|
104
|
+
}, {
|
|
105
|
+
onCancel: () => {
|
|
106
|
+
console.log("\nCancelled by user. Exiting.");
|
|
107
|
+
process.exit(1);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
if (!model || typeof model !== "string") {
|
|
111
|
+
console.error("❌ No model selected.");
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
// Save the selected model
|
|
115
|
+
saveConfig({ selectedModel: model });
|
|
116
|
+
return model;
|
|
117
|
+
}
|
|
118
|
+
async function getStagedDiff() {
|
|
119
|
+
return new Promise((resolve, reject) => {
|
|
120
|
+
const child = spawn("git", ["diff", "--cached", "--ignore-all-space", "--ignore-blank-lines"], {
|
|
121
|
+
stdio: ["ignore", "pipe", "pipe"]
|
|
122
|
+
});
|
|
123
|
+
let stdout = "";
|
|
124
|
+
let stderr = "";
|
|
125
|
+
child.stdout.on("data", (data) => {
|
|
126
|
+
stdout += data.toString();
|
|
127
|
+
});
|
|
128
|
+
child.stderr.on("data", (data) => {
|
|
129
|
+
stderr += data.toString();
|
|
130
|
+
});
|
|
131
|
+
child.on("error", (error) => {
|
|
132
|
+
reject(error);
|
|
133
|
+
});
|
|
134
|
+
child.on("close", (code) => {
|
|
135
|
+
if (code !== 0) {
|
|
136
|
+
reject(new Error(`git diff --cached failed with code ${code}: ${stderr}`));
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
resolve(stdout);
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
function limitDiffPerFile(diff) {
|
|
144
|
+
const MAX_FILES = 100;
|
|
145
|
+
const INITIAL_PER_FILE_LINE_LIMIT = 100;
|
|
146
|
+
const TOTAL_CHAR_LIMIT = 50000;
|
|
147
|
+
// Split diff by file (each file starts with "diff --git")
|
|
148
|
+
const fileSections = diff.split(/\n(?=diff --git)/);
|
|
149
|
+
const limitedSections = [];
|
|
150
|
+
let totalChars = 0;
|
|
151
|
+
let fileCount = 0;
|
|
152
|
+
const truncatedFiles = [];
|
|
153
|
+
// Count original stats
|
|
154
|
+
const originalChars = diff.length;
|
|
155
|
+
const originalLines = diff.split("\n").length;
|
|
156
|
+
const originalFileCount = fileSections.length;
|
|
157
|
+
// Calculate per-file line limit based on number of files
|
|
158
|
+
// If we have many files, reduce per-file limit to fit more files
|
|
159
|
+
let perFileLineLimit = INITIAL_PER_FILE_LINE_LIMIT;
|
|
160
|
+
if (originalFileCount > MAX_FILES) {
|
|
161
|
+
// Reduce per-file limit proportionally to fit MAX_FILES
|
|
162
|
+
perFileLineLimit = Math.max(20, Math.floor((INITIAL_PER_FILE_LINE_LIMIT * MAX_FILES) / originalFileCount));
|
|
163
|
+
}
|
|
164
|
+
for (const section of fileSections) {
|
|
165
|
+
if (!section.trim())
|
|
166
|
+
continue;
|
|
167
|
+
// Stop if we've reached the file limit
|
|
168
|
+
if (fileCount >= MAX_FILES) {
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
fileCount++;
|
|
172
|
+
const lines = section.split("\n");
|
|
173
|
+
const headerLines = [];
|
|
174
|
+
const contentLines = [];
|
|
175
|
+
let inHeader = true;
|
|
176
|
+
// Separate header from content
|
|
177
|
+
for (const line of lines) {
|
|
178
|
+
if (inHeader &&
|
|
179
|
+
(line.startsWith("diff --git") ||
|
|
180
|
+
line.startsWith("index ") ||
|
|
181
|
+
line.startsWith("---") ||
|
|
182
|
+
line.startsWith("+++") ||
|
|
183
|
+
line.startsWith("@@") ||
|
|
184
|
+
line.trim() === "")) {
|
|
185
|
+
headerLines.push(line);
|
|
186
|
+
if (line.startsWith("@@")) {
|
|
187
|
+
inHeader = false;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
inHeader = false;
|
|
192
|
+
contentLines.push(line);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
// Filter out whitespace-only and context lines, keep only actual changes
|
|
196
|
+
const meaningfulLines = contentLines.filter((line) => {
|
|
197
|
+
const trimmed = line.trim();
|
|
198
|
+
// Keep lines that show actual changes (start with + or -)
|
|
199
|
+
if (trimmed.startsWith("+") || trimmed.startsWith("-")) {
|
|
200
|
+
// Filter out lines that are only whitespace changes
|
|
201
|
+
const withoutPrefix = trimmed.substring(1).trim();
|
|
202
|
+
// Keep if there's actual content (not just whitespace)
|
|
203
|
+
return withoutPrefix.length > 0;
|
|
204
|
+
}
|
|
205
|
+
// Skip context lines (starting with space) and empty lines
|
|
206
|
+
return false;
|
|
207
|
+
});
|
|
208
|
+
// Limit content lines (reduce if file is too big)
|
|
209
|
+
let limitedContent = meaningfulLines;
|
|
210
|
+
if (meaningfulLines.length > perFileLineLimit) {
|
|
211
|
+
limitedContent = meaningfulLines.slice(0, perFileLineLimit);
|
|
212
|
+
limitedContent.push(`... (truncated, showing first ${perFileLineLimit} of ${meaningfulLines.length} meaningful lines)`);
|
|
213
|
+
// Extract filename from header
|
|
214
|
+
const fileMatch = section.match(/diff --git a\/(.+?) b\//);
|
|
215
|
+
if (fileMatch) {
|
|
216
|
+
truncatedFiles.push(fileMatch[1]);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
const limitedSection = [...headerLines, ...limitedContent].join("\n");
|
|
220
|
+
const sectionChars = limitedSection.length;
|
|
221
|
+
// Check if adding this section would exceed total limit
|
|
222
|
+
if (totalChars + sectionChars > TOTAL_CHAR_LIMIT) {
|
|
223
|
+
// Try to fit at least part of this section
|
|
224
|
+
const remainingChars = TOTAL_CHAR_LIMIT - totalChars;
|
|
225
|
+
if (remainingChars > 100) {
|
|
226
|
+
// Include partial section
|
|
227
|
+
const partialSection = limitedSection.substring(0, remainingChars - 50);
|
|
228
|
+
limitedSections.push(partialSection + "\n... (diff truncated, total limit reached)");
|
|
229
|
+
totalChars = TOTAL_CHAR_LIMIT;
|
|
230
|
+
}
|
|
231
|
+
break;
|
|
232
|
+
}
|
|
233
|
+
limitedSections.push(limitedSection);
|
|
234
|
+
totalChars += sectionChars;
|
|
235
|
+
}
|
|
236
|
+
const result = limitedSections.join("\n");
|
|
237
|
+
const finalChars = result.length;
|
|
238
|
+
const finalLines = result.split("\n").length;
|
|
239
|
+
// Log stats
|
|
240
|
+
console.log(`📊 Diff stats: ${originalFileCount} files, ${originalLines} lines, ${originalChars} chars`);
|
|
241
|
+
if (truncatedFiles.length > 0) {
|
|
242
|
+
console.log(` Files truncated (per-file limit): ${truncatedFiles.join(", ")}`);
|
|
243
|
+
}
|
|
244
|
+
if (finalChars < originalChars) {
|
|
245
|
+
console.log(` → Limited to: ${fileCount} files, ${finalLines} lines, ${finalChars} chars`);
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
console.log(` → Final: ${fileCount} files, ${finalLines} lines, ${finalChars} chars`);
|
|
249
|
+
}
|
|
250
|
+
return result;
|
|
251
|
+
}
|
|
252
|
+
async function generateCommitMessage(diff, model) {
|
|
253
|
+
console.log(`🤖 Generating commit message using ${model}...`);
|
|
254
|
+
console.log("📝 Commit message: ");
|
|
255
|
+
const body = {
|
|
256
|
+
model,
|
|
257
|
+
stream: true,
|
|
258
|
+
prompt: `Write a git commit message. First line is a short title. Then add details. End with a sarcastic, roasting-style, witty, funny joke about the changes. No markdown, no formatting, just plain text.
|
|
259
|
+
|
|
260
|
+
${diff}`
|
|
261
|
+
};
|
|
262
|
+
const response = await fetch(`${OLLAMA_BASE_URL}/api/generate`, {
|
|
263
|
+
method: "POST",
|
|
264
|
+
body: JSON.stringify(body)
|
|
265
|
+
});
|
|
266
|
+
if (!response.ok) {
|
|
267
|
+
throw new Error(`Failed to generate commit message: ${response.statusText}`);
|
|
268
|
+
}
|
|
269
|
+
if (!response.body) {
|
|
270
|
+
throw new Error("No response body from Ollama");
|
|
271
|
+
}
|
|
272
|
+
const reader = response.body.getReader();
|
|
273
|
+
const decoder = new TextDecoder("utf-8");
|
|
274
|
+
let fullResponse = "";
|
|
275
|
+
let buffer = "";
|
|
276
|
+
try {
|
|
277
|
+
while (true) {
|
|
278
|
+
const { value, done } = await reader.read();
|
|
279
|
+
if (done)
|
|
280
|
+
break;
|
|
281
|
+
buffer += decoder.decode(value, { stream: true });
|
|
282
|
+
const lines = buffer.split("\n");
|
|
283
|
+
buffer = lines.pop() || "";
|
|
284
|
+
for (const line of lines) {
|
|
285
|
+
if (line.trim() === "")
|
|
286
|
+
continue;
|
|
287
|
+
try {
|
|
288
|
+
const json = JSON.parse(line);
|
|
289
|
+
if (json.response) {
|
|
290
|
+
process.stdout.write(json.response);
|
|
291
|
+
fullResponse += json.response;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
catch {
|
|
295
|
+
// Skip invalid JSON lines
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
// Process remaining buffer
|
|
300
|
+
if (buffer.trim()) {
|
|
301
|
+
try {
|
|
302
|
+
const json = JSON.parse(buffer);
|
|
303
|
+
if (json.response) {
|
|
304
|
+
process.stdout.write(json.response);
|
|
305
|
+
fullResponse += json.response;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
catch {
|
|
309
|
+
// Skip invalid JSON
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
console.log(); // New line after streaming
|
|
313
|
+
}
|
|
314
|
+
finally {
|
|
315
|
+
reader.releaseLock();
|
|
316
|
+
}
|
|
317
|
+
const result = fullResponse.trim();
|
|
318
|
+
if (!result) {
|
|
319
|
+
throw new Error("Empty response from Ollama");
|
|
320
|
+
}
|
|
321
|
+
return result;
|
|
322
|
+
}
|
|
323
|
+
function saveCachedMessage(message) {
|
|
324
|
+
ensureCacheDir();
|
|
325
|
+
writeFileSync(CACHE_FILE, JSON.stringify({ message, timestamp: Date.now() }, null, 2), "utf-8");
|
|
326
|
+
}
|
|
327
|
+
function loadCachedMessage() {
|
|
328
|
+
if (!existsSync(CACHE_FILE)) {
|
|
329
|
+
return null;
|
|
330
|
+
}
|
|
331
|
+
try {
|
|
332
|
+
const content = readFileSync(CACHE_FILE, "utf-8");
|
|
333
|
+
const parsed = JSON.parse(content);
|
|
334
|
+
if (parsed.message && typeof parsed.message === "string") {
|
|
335
|
+
return parsed.message;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
catch {
|
|
339
|
+
// Invalid cache file, ignore
|
|
340
|
+
}
|
|
341
|
+
return null;
|
|
342
|
+
}
|
|
343
|
+
function clearCachedMessage() {
|
|
344
|
+
if (existsSync(CACHE_FILE)) {
|
|
345
|
+
unlinkSync(CACHE_FILE);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
async function commitChanges(message, noVerify = false) {
|
|
349
|
+
// Split message into lines - first line is the title
|
|
350
|
+
const lines = message
|
|
351
|
+
.split("\n")
|
|
352
|
+
.map((line) => line.trim())
|
|
353
|
+
.filter((line) => line.length > 0);
|
|
354
|
+
if (lines.length === 0) {
|
|
355
|
+
throw new Error("Empty commit message");
|
|
356
|
+
}
|
|
357
|
+
const title = lines[0];
|
|
358
|
+
const body = lines.slice(1);
|
|
359
|
+
// Use first line as title, rest as body
|
|
360
|
+
const args = ["commit"];
|
|
361
|
+
if (noVerify) {
|
|
362
|
+
args.push("--no-verify");
|
|
363
|
+
}
|
|
364
|
+
args.push("-m", title);
|
|
365
|
+
for (const line of body) {
|
|
366
|
+
args.push("-m", line);
|
|
367
|
+
}
|
|
368
|
+
const result = spawnSync("git", args, {
|
|
369
|
+
stdio: "inherit"
|
|
370
|
+
});
|
|
371
|
+
if (result.error) {
|
|
372
|
+
throw result.error;
|
|
373
|
+
}
|
|
374
|
+
if (result.status !== 0) {
|
|
375
|
+
throw new Error(`Git commit failed with status ${result.status}`);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
async function main() {
|
|
379
|
+
// Ensure stdin is ready
|
|
380
|
+
if (process.stdin.isPaused()) {
|
|
381
|
+
process.stdin.resume();
|
|
382
|
+
}
|
|
383
|
+
if (!process.stdin.isTTY) {
|
|
384
|
+
console.error("\nERROR: stdin is not a TTY. Cannot prompt for confirmation.");
|
|
385
|
+
console.error("This script requires an interactive terminal.");
|
|
386
|
+
process.exit(1);
|
|
387
|
+
}
|
|
388
|
+
// Check for cached message from previous failed commit
|
|
389
|
+
const cachedMessage = loadCachedMessage();
|
|
390
|
+
if (cachedMessage) {
|
|
391
|
+
console.log("💾 Found cached commit message from previous run.");
|
|
392
|
+
console.log("\n" + cachedMessage + "\n");
|
|
393
|
+
const { action } = await prompts({
|
|
394
|
+
type: "select",
|
|
395
|
+
name: "action",
|
|
396
|
+
message: "What would you like to do?",
|
|
397
|
+
choices: [
|
|
398
|
+
{ title: "Rerun (generate new message)", value: "rerun" },
|
|
399
|
+
{ title: "Use cached message (normal)", value: "use-cached" },
|
|
400
|
+
{ title: "Use cached message with --no-verify", value: "no-verify" }
|
|
401
|
+
],
|
|
402
|
+
initial: 0,
|
|
403
|
+
stdin: process.stdin,
|
|
404
|
+
stdout: process.stdout
|
|
405
|
+
}, {
|
|
406
|
+
onCancel: () => {
|
|
407
|
+
console.log("\nCancelled by user. Exiting.");
|
|
408
|
+
process.exit(1);
|
|
409
|
+
}
|
|
410
|
+
});
|
|
411
|
+
if (!action) {
|
|
412
|
+
// User cancelled
|
|
413
|
+
clearCachedMessage();
|
|
414
|
+
process.exit(0);
|
|
415
|
+
}
|
|
416
|
+
if (action === "no-verify") {
|
|
417
|
+
try {
|
|
418
|
+
await commitChanges(cachedMessage, true);
|
|
419
|
+
clearCachedMessage();
|
|
420
|
+
console.log("✅ Changes committed with cached message (--no-verify).");
|
|
421
|
+
return;
|
|
422
|
+
}
|
|
423
|
+
catch (error) {
|
|
424
|
+
console.error(`❌ Commit failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
425
|
+
process.exit(1);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
else if (action === "use-cached") {
|
|
429
|
+
try {
|
|
430
|
+
await commitChanges(cachedMessage, false);
|
|
431
|
+
clearCachedMessage();
|
|
432
|
+
console.log("✅ Changes committed with cached message.");
|
|
433
|
+
return;
|
|
434
|
+
}
|
|
435
|
+
catch (error) {
|
|
436
|
+
// Keep cached message for retry
|
|
437
|
+
console.error(`❌ Commit failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
438
|
+
console.log("💾 Message saved to cache. Run the command again to retry with --no-verify.");
|
|
439
|
+
throw error;
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
else {
|
|
443
|
+
// action === "rerun" - clear cache and continue with normal flow
|
|
444
|
+
clearCachedMessage();
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
// Get available models and check if Ollama is running
|
|
448
|
+
const RECOMMENDED_MODEL = "deepseek-v3.1:671b-cloud";
|
|
449
|
+
let availableModels;
|
|
450
|
+
try {
|
|
451
|
+
availableModels = await getAvailableModels();
|
|
452
|
+
if (availableModels.length === 0) {
|
|
453
|
+
console.error("❌ No Ollama models found.");
|
|
454
|
+
console.log("\nTo install the recommended model, run:");
|
|
455
|
+
console.log(` ollama pull ${RECOMMENDED_MODEL}`);
|
|
456
|
+
process.exit(1);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
catch (error) {
|
|
460
|
+
console.error(`❌ ${error instanceof Error ? error.message : "Failed to connect to Ollama"}`);
|
|
461
|
+
process.exit(1);
|
|
462
|
+
}
|
|
463
|
+
// Check if recommended model is available
|
|
464
|
+
const hasRecommendedModel = availableModels.some((model) => model === RECOMMENDED_MODEL);
|
|
465
|
+
let selectedModel;
|
|
466
|
+
if (hasRecommendedModel) {
|
|
467
|
+
// Use recommended model without asking
|
|
468
|
+
selectedModel = RECOMMENDED_MODEL;
|
|
469
|
+
console.log(`⚡ Using ${selectedModel}`);
|
|
470
|
+
}
|
|
471
|
+
else {
|
|
472
|
+
// Show setup instructions for recommended model
|
|
473
|
+
console.log(`\n💡 Recommended model "${RECOMMENDED_MODEL}" not found.`);
|
|
474
|
+
console.log("To install it, run:");
|
|
475
|
+
console.log(` ollama pull ${RECOMMENDED_MODEL}`);
|
|
476
|
+
console.log("\nAvailable models on your system:");
|
|
477
|
+
availableModels.forEach((model) => console.log(` - ${model}`));
|
|
478
|
+
// Ask if user wants to use an available model or exit to install recommended
|
|
479
|
+
const { action } = await prompts({
|
|
480
|
+
type: "select",
|
|
481
|
+
name: "action",
|
|
482
|
+
message: "What would you like to do?",
|
|
483
|
+
choices: [
|
|
484
|
+
{ title: "Use an available model", value: "use-available" },
|
|
485
|
+
{ title: "Exit to install recommended model", value: "exit" }
|
|
486
|
+
],
|
|
487
|
+
initial: 0,
|
|
488
|
+
stdin: process.stdin,
|
|
489
|
+
stdout: process.stdout
|
|
490
|
+
}, {
|
|
491
|
+
onCancel: () => {
|
|
492
|
+
console.log("\nCancelled by user. Exiting.");
|
|
493
|
+
process.exit(1);
|
|
494
|
+
}
|
|
495
|
+
});
|
|
496
|
+
if (action === "exit") {
|
|
497
|
+
console.log(`\nRun: ollama pull ${RECOMMENDED_MODEL}`);
|
|
498
|
+
process.exit(0);
|
|
499
|
+
}
|
|
500
|
+
// Select from available models
|
|
501
|
+
selectedModel = await selectModel(availableModels);
|
|
502
|
+
}
|
|
503
|
+
// Get staged diff
|
|
504
|
+
const rawDiff = await getStagedDiff();
|
|
505
|
+
if (!rawDiff || rawDiff.trim().length === 0) {
|
|
506
|
+
throw new Error("No staged changes to commit");
|
|
507
|
+
}
|
|
508
|
+
// Limit diff per file and apply total limit
|
|
509
|
+
const diff = limitDiffPerFile(rawDiff);
|
|
510
|
+
// Generate commit message based on limited diff
|
|
511
|
+
const commitMessage = await generateCommitMessage(diff, selectedModel);
|
|
512
|
+
// Save message to cache
|
|
513
|
+
saveCachedMessage(commitMessage);
|
|
514
|
+
const { confirm } = await prompts({
|
|
515
|
+
type: "confirm",
|
|
516
|
+
name: "confirm",
|
|
517
|
+
message: "Looks good?",
|
|
518
|
+
initial: true,
|
|
519
|
+
stdin: process.stdin,
|
|
520
|
+
stdout: process.stdout
|
|
521
|
+
}, {
|
|
522
|
+
onCancel: () => {
|
|
523
|
+
console.log("\nCancelled by user. Exiting.");
|
|
524
|
+
process.exit(1);
|
|
525
|
+
}
|
|
526
|
+
});
|
|
527
|
+
if (confirm) {
|
|
528
|
+
try {
|
|
529
|
+
await commitChanges(commitMessage, false);
|
|
530
|
+
clearCachedMessage();
|
|
531
|
+
console.log("✅ Changes committed.");
|
|
532
|
+
}
|
|
533
|
+
catch (error) {
|
|
534
|
+
// Keep cached message for retry
|
|
535
|
+
console.error(`❌ Commit failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
536
|
+
console.log("💾 Message saved to cache. Run the command again to retry with --no-verify.");
|
|
537
|
+
throw error;
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
else {
|
|
541
|
+
clearCachedMessage();
|
|
542
|
+
console.log("🙅 Commit aborted.");
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
main().catch((error) => {
|
|
546
|
+
console.error("❌ An unexpected error occurred:", error);
|
|
547
|
+
process.exit(1);
|
|
548
|
+
});
|
|
549
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@vibelint/vibelint-commit",
|
|
3
|
+
"version": "0.1.7",
|
|
4
|
+
"description": "AI-powered commit message generator using Ollama",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"vibelint-commit": "./dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist"
|
|
13
|
+
],
|
|
14
|
+
"keywords": [
|
|
15
|
+
"git",
|
|
16
|
+
"commit",
|
|
17
|
+
"ai",
|
|
18
|
+
"ollama",
|
|
19
|
+
"commit-message"
|
|
20
|
+
],
|
|
21
|
+
"license": "MIT",
|
|
22
|
+
"engines": {
|
|
23
|
+
"node": ">=18"
|
|
24
|
+
},
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"prompts": "^2.4.2",
|
|
27
|
+
"zod": "^3.23.8"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@types/prompts": "^2.4.9"
|
|
31
|
+
},
|
|
32
|
+
"scripts": {
|
|
33
|
+
"build": "tsc",
|
|
34
|
+
"clean": "rm -rf dist"
|
|
35
|
+
}
|
|
36
|
+
}
|