@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 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)
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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
+ }