craftcommit-cli 0.3.0 → 0.4.1
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 +47 -0
- package/dist/cli.js +132 -1
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +3 -1
- package/dist/config.js.map +1 -1
- package/dist/hook.d.ts +14 -0
- package/dist/hook.d.ts.map +1 -0
- package/dist/hook.js +162 -0
- package/dist/hook.js.map +1 -0
- package/package.json +3 -2
- package/src/cli.ts +158 -1
- package/src/config.ts +5 -1
- package/src/hook.ts +194 -0
package/README.md
CHANGED
|
@@ -115,6 +115,53 @@ COMMITCRAFT_PROVIDER=openai
|
|
|
115
115
|
COMMITCRAFT_LANGUAGE=english
|
|
116
116
|
```
|
|
117
117
|
|
|
118
|
+
## Git Hook Integration
|
|
119
|
+
|
|
120
|
+
Auto-generate commit messages on every `git commit`:
|
|
121
|
+
|
|
122
|
+
### Install hook
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
commitcraft hook install
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Uninstall hook
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
commitcraft hook uninstall
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Check status
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
commitcraft hook status
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### How it works
|
|
141
|
+
|
|
142
|
+
Once installed, CommitCraft will automatically generate a commit message when you run `git commit`. The hook:
|
|
143
|
+
|
|
144
|
+
1. Detects staged changes
|
|
145
|
+
2. Calls the AI provider to generate a message
|
|
146
|
+
3. Pre-fills the commit message editor
|
|
147
|
+
|
|
148
|
+
You can still edit the message before confirming.
|
|
149
|
+
|
|
150
|
+
### Skip auto-generation
|
|
151
|
+
|
|
152
|
+
The hook automatically skips when:
|
|
153
|
+
- You provide a message with `-m` flag
|
|
154
|
+
- It's a merge, squash, or amend commit
|
|
155
|
+
- There's already a commit message
|
|
156
|
+
|
|
157
|
+
### Debug mode
|
|
158
|
+
|
|
159
|
+
To see hook logs, set the environment variable:
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
export COMMITCRAFT_HOOK_DEBUG=1
|
|
163
|
+
```
|
|
164
|
+
|
|
118
165
|
## Issue Linking
|
|
119
166
|
|
|
120
167
|
Extract issue numbers from branch names:
|
package/dist/cli.js
CHANGED
|
@@ -5,9 +5,11 @@ import ora from 'ora';
|
|
|
5
5
|
import inquirer from 'inquirer';
|
|
6
6
|
import clipboardy from 'clipboardy';
|
|
7
7
|
import { simpleGit } from 'simple-git';
|
|
8
|
+
import fs from 'fs';
|
|
9
|
+
import path from 'path';
|
|
8
10
|
import { loadConfig, saveConfig, getApiKey, getDefaultModel } from './config.js';
|
|
9
11
|
import { generateCommitMessages, formatCommitMessage } from './ai.js';
|
|
10
|
-
const VERSION = '0.
|
|
12
|
+
const VERSION = '0.4.1';
|
|
11
13
|
const git = simpleGit();
|
|
12
14
|
async function getStagedDiff() {
|
|
13
15
|
const [diff, fileSummary] = await Promise.all([
|
|
@@ -258,5 +260,134 @@ program
|
|
|
258
260
|
.command('config')
|
|
259
261
|
.description('Configure API keys and preferences')
|
|
260
262
|
.action(configCommand);
|
|
263
|
+
// Hook commands
|
|
264
|
+
const hookCommand = program
|
|
265
|
+
.command('hook')
|
|
266
|
+
.description('Manage Git hook integration');
|
|
267
|
+
async function getGitHooksPath() {
|
|
268
|
+
try {
|
|
269
|
+
const gitDir = await git.revparse(['--git-dir']);
|
|
270
|
+
return path.join(gitDir.trim(), 'hooks');
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
return null;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
function getHookScript() {
|
|
277
|
+
return `#!/bin/sh
|
|
278
|
+
# CommitCraft AI - prepare-commit-msg hook
|
|
279
|
+
# Auto-generates commit messages using AI
|
|
280
|
+
|
|
281
|
+
# Run commitcraft-hook
|
|
282
|
+
commitcraft-hook "$1" "$2" "$3"
|
|
283
|
+
`;
|
|
284
|
+
}
|
|
285
|
+
hookCommand
|
|
286
|
+
.command('install')
|
|
287
|
+
.description('Install Git hook for automatic commit message generation')
|
|
288
|
+
.option('-f, --force', 'Overwrite existing hook')
|
|
289
|
+
.action(async (options) => {
|
|
290
|
+
const hooksPath = await getGitHooksPath();
|
|
291
|
+
if (!hooksPath) {
|
|
292
|
+
console.error(chalk.red('\nNot a Git repository.'));
|
|
293
|
+
console.log(chalk.gray('Run this command from a Git repository.\\n'));
|
|
294
|
+
process.exit(1);
|
|
295
|
+
}
|
|
296
|
+
const hookPath = path.join(hooksPath, 'prepare-commit-msg');
|
|
297
|
+
// Check if hook already exists
|
|
298
|
+
if (fs.existsSync(hookPath) && !options.force) {
|
|
299
|
+
const existingContent = fs.readFileSync(hookPath, 'utf-8');
|
|
300
|
+
if (existingContent.includes('commitcraft')) {
|
|
301
|
+
console.log(chalk.yellow('\nCommitCraft hook is already installed.'));
|
|
302
|
+
console.log(chalk.gray('Use --force to reinstall.\\n'));
|
|
303
|
+
process.exit(0);
|
|
304
|
+
}
|
|
305
|
+
console.error(chalk.red('\nA prepare-commit-msg hook already exists.'));
|
|
306
|
+
console.log(chalk.gray('Use --force to overwrite, or manually edit the hook.\\n'));
|
|
307
|
+
process.exit(1);
|
|
308
|
+
}
|
|
309
|
+
// Ensure hooks directory exists
|
|
310
|
+
if (!fs.existsSync(hooksPath)) {
|
|
311
|
+
fs.mkdirSync(hooksPath, { recursive: true });
|
|
312
|
+
}
|
|
313
|
+
// Write the hook script
|
|
314
|
+
const hookScript = getHookScript();
|
|
315
|
+
fs.writeFileSync(hookPath, hookScript, { mode: 0o755 });
|
|
316
|
+
console.log(chalk.green('\n✓ Git hook installed successfully!'));
|
|
317
|
+
console.log(chalk.gray(` Location: ${hookPath}`));
|
|
318
|
+
console.log(chalk.blue('\nNow when you run "git commit", CommitCraft will auto-generate a message.'));
|
|
319
|
+
console.log(chalk.gray('To disable, run: commitcraft hook uninstall\\n'));
|
|
320
|
+
});
|
|
321
|
+
hookCommand
|
|
322
|
+
.command('uninstall')
|
|
323
|
+
.description('Remove Git hook')
|
|
324
|
+
.action(async () => {
|
|
325
|
+
const hooksPath = await getGitHooksPath();
|
|
326
|
+
if (!hooksPath) {
|
|
327
|
+
console.error(chalk.red('\nNot a Git repository.\\n'));
|
|
328
|
+
process.exit(1);
|
|
329
|
+
}
|
|
330
|
+
const hookPath = path.join(hooksPath, 'prepare-commit-msg');
|
|
331
|
+
if (!fs.existsSync(hookPath)) {
|
|
332
|
+
console.log(chalk.yellow('\nNo prepare-commit-msg hook found.\\n'));
|
|
333
|
+
process.exit(0);
|
|
334
|
+
}
|
|
335
|
+
const content = fs.readFileSync(hookPath, 'utf-8');
|
|
336
|
+
if (!content.includes('commitcraft')) {
|
|
337
|
+
console.error(chalk.red('\nThe existing hook was not installed by CommitCraft.'));
|
|
338
|
+
console.log(chalk.gray('Manually remove it if needed.\\n'));
|
|
339
|
+
process.exit(1);
|
|
340
|
+
}
|
|
341
|
+
fs.unlinkSync(hookPath);
|
|
342
|
+
console.log(chalk.green('\n✓ Git hook uninstalled successfully!\\n'));
|
|
343
|
+
});
|
|
344
|
+
hookCommand
|
|
345
|
+
.command('status')
|
|
346
|
+
.description('Check Git hook status')
|
|
347
|
+
.action(async () => {
|
|
348
|
+
const hooksPath = await getGitHooksPath();
|
|
349
|
+
if (!hooksPath) {
|
|
350
|
+
console.error(chalk.red('\nNot a Git repository.\\n'));
|
|
351
|
+
process.exit(1);
|
|
352
|
+
}
|
|
353
|
+
const hookPath = path.join(hooksPath, 'prepare-commit-msg');
|
|
354
|
+
console.log(chalk.bold('\nCommitCraft Git Hook Status\\n'));
|
|
355
|
+
if (!fs.existsSync(hookPath)) {
|
|
356
|
+
console.log(chalk.yellow('Status: Not installed'));
|
|
357
|
+
console.log(chalk.gray('Run "commitcraft hook install" to enable.\\n'));
|
|
358
|
+
process.exit(0);
|
|
359
|
+
}
|
|
360
|
+
const content = fs.readFileSync(hookPath, 'utf-8');
|
|
361
|
+
if (content.includes('commitcraft')) {
|
|
362
|
+
console.log(chalk.green('Status: Installed ✓'));
|
|
363
|
+
console.log(chalk.gray(`Location: ${hookPath}`));
|
|
364
|
+
// Check if hook is executable (Unix-like systems)
|
|
365
|
+
if (process.platform !== 'win32') {
|
|
366
|
+
try {
|
|
367
|
+
fs.accessSync(hookPath, fs.constants.X_OK);
|
|
368
|
+
console.log(chalk.gray('Executable: Yes'));
|
|
369
|
+
}
|
|
370
|
+
catch {
|
|
371
|
+
console.log(chalk.yellow('Executable: No (may need: chmod +x)'));
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
// Show config status
|
|
375
|
+
const config = loadConfig();
|
|
376
|
+
console.log(chalk.gray(`Provider: ${config.provider}`));
|
|
377
|
+
console.log(chalk.gray(`Model: ${config.model || getDefaultModel(config.provider)}`));
|
|
378
|
+
const apiKey = getApiKey(config);
|
|
379
|
+
if (apiKey) {
|
|
380
|
+
console.log(chalk.gray('API Key: Configured'));
|
|
381
|
+
}
|
|
382
|
+
else {
|
|
383
|
+
console.log(chalk.yellow('API Key: Not configured'));
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
else {
|
|
387
|
+
console.log(chalk.yellow('Status: Different hook installed'));
|
|
388
|
+
console.log(chalk.gray('A non-CommitCraft hook exists at this location.'));
|
|
389
|
+
}
|
|
390
|
+
console.log();
|
|
391
|
+
});
|
|
261
392
|
program.parse();
|
|
262
393
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,SAAS,EAAa,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAgC,MAAM,aAAa,CAAC;AAC/G,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAsB,MAAM,SAAS,CAAC;AAE1F,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,MAAM,GAAG,GAAc,SAAS,EAAE,CAAC;AAEnC,KAAK,UAAU,aAAa;IAC1B,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC5C,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC;QACtB,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;KACxC,CAAC,CAAC;IAEH,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;AAC/B,CAAC;AAED,KAAK,UAAU,gBAAgB;IAC7B,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC;IACzD,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAChC,CAAC;AAED,KAAK,UAAU,gBAAgB;IAC7B,MAAM,aAAa,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;IACzC,OAAO,aAAa,CAAC,OAAO,CAAC;AAC/B,CAAC;AAED,SAAS,sBAAsB,CAAC,UAAkB,EAAE,OAAgB;IAClE,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACtC,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,OAO9B;IACC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,mCAAmC;IACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC;IACrD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC;IAErD,oBAAoB;IACpB,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IAClD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,QAAQ,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC,CAAC;QAC1F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,2BAA2B;IAC3B,MAAM,UAAU,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAC5C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,WAAW;IACX,MAAM,OAAO,GAAG,GAAG,CAAC,2BAA2B,CAAC,CAAC,KAAK,EAAE,CAAC;IACzD,IAAI,IAAY,CAAC;IACjB,IAAI,WAAmB,CAAC;IAExB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;QACrC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACnB,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QAEjC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,uBAAuB;QACvB,MAAM,SAAS,GAAG,KAAK,CAAC;QACxB,IAAI,IAAI,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;YAC5B,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,mBAAmB,CAAC;QAC5D,CAAC;QAED,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAC7C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,qDAAqD;IACrD,IAAI,cAAkC,CAAC;IACvC,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,gBAAgB,EAAE,CAAC;YAC5C,MAAM,KAAK,GAAG,sBAAsB,CAAC,UAAU,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;YACvE,IAAI,KAAK,EAAE,CAAC;gBACV,cAAc,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC;gBACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,cAAc,EAAE,CAAC,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,iCAAiC;QACnC,CAAC;IACH,CAAC;IAED,2BAA2B;IAC3B,MAAM,eAAe,GAAG,GAAG,CAAC,kCAAkC,QAAQ,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;IACrF,IAAI,UAA2B,CAAC;IAEhC,IAAI,CAAC;QACH,UAAU,GAAG,MAAM,sBAAsB,CACvC,QAAQ,EACR,MAAM,EACN,IAAI,EACJ,WAAW,EACX,KAAK,EACL,QAAQ,EACR,MAAM,CAAC,SAAS,EAChB,cAAc,CACf,CAAC;QACF,eAAe,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,eAAe,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEvE,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAChE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,QAAQ,WAAW,CAAC,CAAC,CAAC;QAC7D,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAC5C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,iCAAiC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAChF,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,8BAA8B;IAC9B,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QACjD,IAAI,EAAE,GAAG,KAAK,GAAG,CAAC,KAAK,mBAAmB,CAAC,MAAM,CAAC,EAAE;QACpD,KAAK,EAAE,MAAM;KACd,CAAC,CAAC,CAAC;IAEJ,OAAO,CAAC,IAAI,CAAC;QACX,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC1B,KAAK,EAAE,IAAgC;KACxC,CAAC,CAAC;IAEH,4BAA4B;IAC5B,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAqC;QAC7E;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,0BAA0B;YACnC,OAAO;SACR;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,aAAa,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAEpD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,cAAc;QACd,MAAM,aAAa,GAAG,GAAG,CAAC,eAAe,CAAC,CAAC,KAAK,EAAE,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YAChC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,aAAa,EAAE,CAAC,CAAC,CAAC;QACpE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,aAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YACvC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,oBAAoB;QACpB,IAAI,CAAC;YACH,MAAM,UAAU,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,4BAA4B,aAAa,EAAE,CAAC,CAAC,CAAC;QACxE,CAAC;QAAC,MAAM,CAAC;YACP,+CAA+C;YAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,aAAa,EAAE,CAAC,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa;IAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC;IAE7D,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAyB;QACjE;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,qBAAqB;YAC9B,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;gBACnC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;gBAC/B,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;gBACnC,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,QAAQ,EAAE;aAC5C;SACF;KACF,CAAC,CAAC;IAEH,IAAI,MAA0B,CAAC;IAE/B,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAkB;YACrD;gBACE,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,KAAK;gBACX,OAAO,EAAE,cAAc,QAAQ,WAAW;gBAC1C,IAAI,EAAE,GAAG;aACV;SACF,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,CAAC;IACf,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAyB;QACjE;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,sCAAsC;YAC/C,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;gBACrC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;aACpC;SACF;KACF,CAAC,CAAC;IAEH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAoB;QACzD;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,kCAAkC;YAC3C,OAAO,EAAE,eAAe,CAAC,QAAQ,CAAC;SACnC;KACF,CAAC,CAAC;IAEH,MAAM,YAAY,GAA2B;QAC3C,QAAQ;QACR,QAAQ;QACR,KAAK;KACN,CAAC;IAEF,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,OAAO,GAAG,GAAG,QAAQ,QAAQ,CAAC;QACpC,YAAY,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC;IACjC,CAAC;IAED,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAwB;YACjE;gBACE,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,aAAa;gBACtB,OAAO,EAAE,wBAAwB;aAClC;SACF,CAAC,CAAC;QACH,YAAY,CAAC,SAAS,GAAG,SAAS,CAAC;IACrC,CAAC;IAED,UAAU,CAAC,YAAY,CAAC,CAAC;IACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,WAAW;AACX,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,aAAa,CAAC;KACnB,WAAW,CAAC,qCAAqC,CAAC;KAClD,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;KACxC,WAAW,CAAC,6CAA6C,CAAC;KAC1D,MAAM,CAAC,2BAA2B,EAAE,4CAA4C,CAAC;KACjF,MAAM,CAAC,qBAAqB,EAAE,cAAc,CAAC;KAC7C,MAAM,CAAC,2BAA2B,EAAE,4BAA4B,CAAC;KACjE,MAAM,CAAC,cAAc,EAAE,mCAAmC,CAAC;KAC3D,MAAM,CAAC,2BAA2B,EAAE,yCAAyC,CAAC;KAC9E,MAAM,CAAC,yBAAyB,EAAE,sCAAsC,CAAC;KACzE,MAAM,CAAC,eAAe,CAAC,CAAC;AAE3B,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,oCAAoC,CAAC;KACjD,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -8,6 +8,8 @@ export interface Config {
|
|
|
8
8
|
openaiApiKey?: string;
|
|
9
9
|
groqApiKey?: string;
|
|
10
10
|
geminiApiKey?: string;
|
|
11
|
+
issuePattern?: string;
|
|
12
|
+
issuePrefix?: string;
|
|
11
13
|
}
|
|
12
14
|
export declare function loadConfig(): Config;
|
|
13
15
|
export declare function saveConfig(config: Partial<Config>): void;
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAC/D,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE5C,MAAM,WAAW,MAAM;IACrB,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAC/D,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE5C,MAAM,WAAW,MAAM;IACrB,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAmDD,wBAAgB,UAAU,IAAI,MAAM,CAiBnC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAcxD;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAa5D;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAE1D"}
|
package/dist/config.js
CHANGED
|
@@ -57,7 +57,9 @@ export function loadConfig() {
|
|
|
57
57
|
ollamaUrl: process.env.OLLAMA_URL || fileConfig.ollamaUrl || 'http://localhost:11434',
|
|
58
58
|
openaiApiKey: process.env.OPENAI_API_KEY || fileConfig.openaiApiKey,
|
|
59
59
|
groqApiKey: process.env.GROQ_API_KEY || fileConfig.groqApiKey,
|
|
60
|
-
geminiApiKey: process.env.GEMINI_API_KEY || fileConfig.geminiApiKey
|
|
60
|
+
geminiApiKey: process.env.GEMINI_API_KEY || fileConfig.geminiApiKey,
|
|
61
|
+
issuePattern: process.env.COMMITCRAFT_ISSUE_PATTERN || fileConfig.issuePattern,
|
|
62
|
+
issuePrefix: process.env.COMMITCRAFT_ISSUE_PREFIX || fileConfig.issuePrefix
|
|
61
63
|
};
|
|
62
64
|
}
|
|
63
65
|
export function saveConfig(config) {
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,MAAM,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/hook.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Git prepare-commit-msg hook script
|
|
4
|
+
* This script is called by Git before the commit message editor is opened.
|
|
5
|
+
*
|
|
6
|
+
* Usage: commitcraft-hook <commit-msg-file> [<commit-source>] [<sha1>]
|
|
7
|
+
*
|
|
8
|
+
* Arguments:
|
|
9
|
+
* - commit-msg-file: Path to the file containing the commit message
|
|
10
|
+
* - commit-source: Source of the commit (message, template, merge, squash, commit)
|
|
11
|
+
* - sha1: SHA-1 hash (only for --amend)
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=hook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../src/hook.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;GAUG"}
|
package/dist/hook.js
ADDED
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Git prepare-commit-msg hook script
|
|
4
|
+
* This script is called by Git before the commit message editor is opened.
|
|
5
|
+
*
|
|
6
|
+
* Usage: commitcraft-hook <commit-msg-file> [<commit-source>] [<sha1>]
|
|
7
|
+
*
|
|
8
|
+
* Arguments:
|
|
9
|
+
* - commit-msg-file: Path to the file containing the commit message
|
|
10
|
+
* - commit-source: Source of the commit (message, template, merge, squash, commit)
|
|
11
|
+
* - sha1: SHA-1 hash (only for --amend)
|
|
12
|
+
*/
|
|
13
|
+
import fs from 'fs';
|
|
14
|
+
import { simpleGit } from 'simple-git';
|
|
15
|
+
import { loadConfig, getApiKey, getDefaultModel } from './config.js';
|
|
16
|
+
import { generateCommitMessages, formatCommitMessage } from './ai.js';
|
|
17
|
+
const git = simpleGit();
|
|
18
|
+
async function getStagedDiff() {
|
|
19
|
+
const [diff, fileSummary] = await Promise.all([
|
|
20
|
+
git.diff(['--cached']),
|
|
21
|
+
git.diff(['--cached', '--name-status'])
|
|
22
|
+
]);
|
|
23
|
+
return { diff, fileSummary };
|
|
24
|
+
}
|
|
25
|
+
async function getCurrentBranch() {
|
|
26
|
+
const branchSummary = await git.branch();
|
|
27
|
+
return branchSummary.current;
|
|
28
|
+
}
|
|
29
|
+
function extractIssueFromBranch(branchName, pattern) {
|
|
30
|
+
if (!pattern)
|
|
31
|
+
return null;
|
|
32
|
+
try {
|
|
33
|
+
const regex = new RegExp(pattern);
|
|
34
|
+
const match = branchName.match(regex);
|
|
35
|
+
return match?.[1] || match?.[0] || null;
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function log(message) {
|
|
42
|
+
// Only log if COMMITCRAFT_HOOK_DEBUG is set
|
|
43
|
+
if (process.env.COMMITCRAFT_HOOK_DEBUG) {
|
|
44
|
+
console.error(`[commitcraft-hook] ${message}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async function main() {
|
|
48
|
+
const args = process.argv.slice(2);
|
|
49
|
+
const commitMsgFile = args[0];
|
|
50
|
+
const commitSource = args[1];
|
|
51
|
+
// Validate arguments
|
|
52
|
+
if (!commitMsgFile) {
|
|
53
|
+
log('No commit message file provided');
|
|
54
|
+
process.exit(0);
|
|
55
|
+
}
|
|
56
|
+
// Skip if commit has a source (merge, squash, message, etc.)
|
|
57
|
+
// This means user is providing their own message or it's a special commit
|
|
58
|
+
if (commitSource && commitSource !== 'template') {
|
|
59
|
+
log(`Skipping - commit source is "${commitSource}"`);
|
|
60
|
+
process.exit(0);
|
|
61
|
+
}
|
|
62
|
+
// Read existing commit message
|
|
63
|
+
let existingMessage = '';
|
|
64
|
+
try {
|
|
65
|
+
existingMessage = fs.readFileSync(commitMsgFile, 'utf-8').trim();
|
|
66
|
+
// Remove comment lines (lines starting with #)
|
|
67
|
+
const nonCommentLines = existingMessage
|
|
68
|
+
.split('\n')
|
|
69
|
+
.filter(line => !line.startsWith('#'))
|
|
70
|
+
.join('\n')
|
|
71
|
+
.trim();
|
|
72
|
+
// Skip if there's already a non-empty message
|
|
73
|
+
if (nonCommentLines.length > 0) {
|
|
74
|
+
log('Skipping - commit message already exists');
|
|
75
|
+
process.exit(0);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// File doesn't exist or can't be read - continue
|
|
80
|
+
}
|
|
81
|
+
// Load configuration
|
|
82
|
+
const config = loadConfig();
|
|
83
|
+
const provider = config.provider;
|
|
84
|
+
const model = config.model || getDefaultModel(provider);
|
|
85
|
+
const language = config.language;
|
|
86
|
+
// Check for API key
|
|
87
|
+
const apiKey = getApiKey(config);
|
|
88
|
+
if (!apiKey) {
|
|
89
|
+
log(`No API key found for ${provider}`);
|
|
90
|
+
process.exit(0);
|
|
91
|
+
}
|
|
92
|
+
// Get staged diff
|
|
93
|
+
let diff;
|
|
94
|
+
let fileSummary;
|
|
95
|
+
try {
|
|
96
|
+
const result = await getStagedDiff();
|
|
97
|
+
diff = result.diff;
|
|
98
|
+
fileSummary = result.fileSummary;
|
|
99
|
+
if (!diff.trim()) {
|
|
100
|
+
log('No staged changes found');
|
|
101
|
+
process.exit(0);
|
|
102
|
+
}
|
|
103
|
+
// Truncate large diffs
|
|
104
|
+
const MAX_CHARS = 12000;
|
|
105
|
+
if (diff.length > MAX_CHARS) {
|
|
106
|
+
diff = diff.substring(0, MAX_CHARS) + '\n... [truncated]';
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
log(`Failed to get staged changes: ${error}`);
|
|
111
|
+
process.exit(0);
|
|
112
|
+
}
|
|
113
|
+
// Extract issue from branch if pattern is configured
|
|
114
|
+
let issueReference;
|
|
115
|
+
const issuePattern = process.env.COMMITCRAFT_ISSUE_PATTERN || config.issuePattern;
|
|
116
|
+
const issuePrefix = process.env.COMMITCRAFT_ISSUE_PREFIX || config.issuePrefix || '';
|
|
117
|
+
if (issuePattern) {
|
|
118
|
+
try {
|
|
119
|
+
const branchName = await getCurrentBranch();
|
|
120
|
+
const issue = extractIssueFromBranch(branchName, issuePattern);
|
|
121
|
+
if (issue) {
|
|
122
|
+
issueReference = issuePrefix + issue;
|
|
123
|
+
log(`Detected issue: ${issueReference}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
// Ignore branch detection errors
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Generate commit message
|
|
131
|
+
log(`Generating commit message via ${provider}...`);
|
|
132
|
+
try {
|
|
133
|
+
const candidates = await generateCommitMessages(provider, apiKey, diff, fileSummary, model, language, config.ollamaUrl, issueReference);
|
|
134
|
+
if (candidates.length === 0) {
|
|
135
|
+
log('No commit message candidates generated');
|
|
136
|
+
process.exit(0);
|
|
137
|
+
}
|
|
138
|
+
// Use the first candidate
|
|
139
|
+
const commitMessage = formatCommitMessage(candidates[0]);
|
|
140
|
+
// Write the commit message to the file
|
|
141
|
+
// Preserve any existing comments (like the git status summary)
|
|
142
|
+
const comments = existingMessage
|
|
143
|
+
.split('\n')
|
|
144
|
+
.filter(line => line.startsWith('#'))
|
|
145
|
+
.join('\n');
|
|
146
|
+
const newContent = comments
|
|
147
|
+
? `${commitMessage}\n\n${comments}`
|
|
148
|
+
: commitMessage;
|
|
149
|
+
fs.writeFileSync(commitMsgFile, newContent);
|
|
150
|
+
log(`Generated: ${commitMessage}`);
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
log(`Failed to generate commit message: ${error}`);
|
|
154
|
+
// Don't fail the commit, just let user write their own message
|
|
155
|
+
process.exit(0);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
main().catch((error) => {
|
|
159
|
+
log(`Unexpected error: ${error}`);
|
|
160
|
+
process.exit(0);
|
|
161
|
+
});
|
|
162
|
+
//# sourceMappingURL=hook.js.map
|
package/dist/hook.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../src/hook.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "craftcommit-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "Generate AI-powered commit messages from terminal",
|
|
5
5
|
"author": "youngsikkk",
|
|
6
6
|
"license": "MIT",
|
|
@@ -20,7 +20,8 @@
|
|
|
20
20
|
"cli"
|
|
21
21
|
],
|
|
22
22
|
"bin": {
|
|
23
|
-
"commitcraft": "./dist/cli.js"
|
|
23
|
+
"commitcraft": "./dist/cli.js",
|
|
24
|
+
"commitcraft-hook": "./dist/hook.js"
|
|
24
25
|
},
|
|
25
26
|
"main": "./dist/cli.js",
|
|
26
27
|
"type": "module",
|
package/src/cli.ts
CHANGED
|
@@ -6,10 +6,12 @@ import ora from 'ora';
|
|
|
6
6
|
import inquirer from 'inquirer';
|
|
7
7
|
import clipboardy from 'clipboardy';
|
|
8
8
|
import { simpleGit, SimpleGit } from 'simple-git';
|
|
9
|
+
import fs from 'fs';
|
|
10
|
+
import path from 'path';
|
|
9
11
|
import { loadConfig, saveConfig, getApiKey, getDefaultModel, type Provider, type Language } from './config.js';
|
|
10
12
|
import { generateCommitMessages, formatCommitMessage, type CommitMessage } from './ai.js';
|
|
11
13
|
|
|
12
|
-
const VERSION = '0.
|
|
14
|
+
const VERSION = '0.4.1';
|
|
13
15
|
|
|
14
16
|
const git: SimpleGit = simpleGit();
|
|
15
17
|
|
|
@@ -307,4 +309,159 @@ program
|
|
|
307
309
|
.description('Configure API keys and preferences')
|
|
308
310
|
.action(configCommand);
|
|
309
311
|
|
|
312
|
+
// Hook commands
|
|
313
|
+
const hookCommand = program
|
|
314
|
+
.command('hook')
|
|
315
|
+
.description('Manage Git hook integration');
|
|
316
|
+
|
|
317
|
+
async function getGitHooksPath(): Promise<string | null> {
|
|
318
|
+
try {
|
|
319
|
+
const gitDir = await git.revparse(['--git-dir']);
|
|
320
|
+
return path.join(gitDir.trim(), 'hooks');
|
|
321
|
+
} catch {
|
|
322
|
+
return null;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
function getHookScript(): string {
|
|
327
|
+
return `#!/bin/sh
|
|
328
|
+
# CommitCraft AI - prepare-commit-msg hook
|
|
329
|
+
# Auto-generates commit messages using AI
|
|
330
|
+
|
|
331
|
+
# Run commitcraft-hook
|
|
332
|
+
commitcraft-hook "$1" "$2" "$3"
|
|
333
|
+
`;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
hookCommand
|
|
337
|
+
.command('install')
|
|
338
|
+
.description('Install Git hook for automatic commit message generation')
|
|
339
|
+
.option('-f, --force', 'Overwrite existing hook')
|
|
340
|
+
.action(async (options: { force?: boolean }) => {
|
|
341
|
+
const hooksPath = await getGitHooksPath();
|
|
342
|
+
|
|
343
|
+
if (!hooksPath) {
|
|
344
|
+
console.error(chalk.red('\nNot a Git repository.'));
|
|
345
|
+
console.log(chalk.gray('Run this command from a Git repository.\\n'));
|
|
346
|
+
process.exit(1);
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
const hookPath = path.join(hooksPath, 'prepare-commit-msg');
|
|
350
|
+
|
|
351
|
+
// Check if hook already exists
|
|
352
|
+
if (fs.existsSync(hookPath) && !options.force) {
|
|
353
|
+
const existingContent = fs.readFileSync(hookPath, 'utf-8');
|
|
354
|
+
|
|
355
|
+
if (existingContent.includes('commitcraft')) {
|
|
356
|
+
console.log(chalk.yellow('\nCommitCraft hook is already installed.'));
|
|
357
|
+
console.log(chalk.gray('Use --force to reinstall.\\n'));
|
|
358
|
+
process.exit(0);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
console.error(chalk.red('\nA prepare-commit-msg hook already exists.'));
|
|
362
|
+
console.log(chalk.gray('Use --force to overwrite, or manually edit the hook.\\n'));
|
|
363
|
+
process.exit(1);
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
// Ensure hooks directory exists
|
|
367
|
+
if (!fs.existsSync(hooksPath)) {
|
|
368
|
+
fs.mkdirSync(hooksPath, { recursive: true });
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// Write the hook script
|
|
372
|
+
const hookScript = getHookScript();
|
|
373
|
+
fs.writeFileSync(hookPath, hookScript, { mode: 0o755 });
|
|
374
|
+
|
|
375
|
+
console.log(chalk.green('\n✓ Git hook installed successfully!'));
|
|
376
|
+
console.log(chalk.gray(` Location: ${hookPath}`));
|
|
377
|
+
console.log(chalk.blue('\nNow when you run "git commit", CommitCraft will auto-generate a message.'));
|
|
378
|
+
console.log(chalk.gray('To disable, run: commitcraft hook uninstall\\n'));
|
|
379
|
+
});
|
|
380
|
+
|
|
381
|
+
hookCommand
|
|
382
|
+
.command('uninstall')
|
|
383
|
+
.description('Remove Git hook')
|
|
384
|
+
.action(async () => {
|
|
385
|
+
const hooksPath = await getGitHooksPath();
|
|
386
|
+
|
|
387
|
+
if (!hooksPath) {
|
|
388
|
+
console.error(chalk.red('\nNot a Git repository.\\n'));
|
|
389
|
+
process.exit(1);
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
const hookPath = path.join(hooksPath, 'prepare-commit-msg');
|
|
393
|
+
|
|
394
|
+
if (!fs.existsSync(hookPath)) {
|
|
395
|
+
console.log(chalk.yellow('\nNo prepare-commit-msg hook found.\\n'));
|
|
396
|
+
process.exit(0);
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
const content = fs.readFileSync(hookPath, 'utf-8');
|
|
400
|
+
|
|
401
|
+
if (!content.includes('commitcraft')) {
|
|
402
|
+
console.error(chalk.red('\nThe existing hook was not installed by CommitCraft.'));
|
|
403
|
+
console.log(chalk.gray('Manually remove it if needed.\\n'));
|
|
404
|
+
process.exit(1);
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
fs.unlinkSync(hookPath);
|
|
408
|
+
console.log(chalk.green('\n✓ Git hook uninstalled successfully!\\n'));
|
|
409
|
+
});
|
|
410
|
+
|
|
411
|
+
hookCommand
|
|
412
|
+
.command('status')
|
|
413
|
+
.description('Check Git hook status')
|
|
414
|
+
.action(async () => {
|
|
415
|
+
const hooksPath = await getGitHooksPath();
|
|
416
|
+
|
|
417
|
+
if (!hooksPath) {
|
|
418
|
+
console.error(chalk.red('\nNot a Git repository.\\n'));
|
|
419
|
+
process.exit(1);
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
const hookPath = path.join(hooksPath, 'prepare-commit-msg');
|
|
423
|
+
|
|
424
|
+
console.log(chalk.bold('\nCommitCraft Git Hook Status\\n'));
|
|
425
|
+
|
|
426
|
+
if (!fs.existsSync(hookPath)) {
|
|
427
|
+
console.log(chalk.yellow('Status: Not installed'));
|
|
428
|
+
console.log(chalk.gray('Run "commitcraft hook install" to enable.\\n'));
|
|
429
|
+
process.exit(0);
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
const content = fs.readFileSync(hookPath, 'utf-8');
|
|
433
|
+
|
|
434
|
+
if (content.includes('commitcraft')) {
|
|
435
|
+
console.log(chalk.green('Status: Installed ✓'));
|
|
436
|
+
console.log(chalk.gray(`Location: ${hookPath}`));
|
|
437
|
+
|
|
438
|
+
// Check if hook is executable (Unix-like systems)
|
|
439
|
+
if (process.platform !== 'win32') {
|
|
440
|
+
try {
|
|
441
|
+
fs.accessSync(hookPath, fs.constants.X_OK);
|
|
442
|
+
console.log(chalk.gray('Executable: Yes'));
|
|
443
|
+
} catch {
|
|
444
|
+
console.log(chalk.yellow('Executable: No (may need: chmod +x)'));
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
// Show config status
|
|
449
|
+
const config = loadConfig();
|
|
450
|
+
console.log(chalk.gray(`Provider: ${config.provider}`));
|
|
451
|
+
console.log(chalk.gray(`Model: ${config.model || getDefaultModel(config.provider)}`));
|
|
452
|
+
|
|
453
|
+
const apiKey = getApiKey(config);
|
|
454
|
+
if (apiKey) {
|
|
455
|
+
console.log(chalk.gray('API Key: Configured'));
|
|
456
|
+
} else {
|
|
457
|
+
console.log(chalk.yellow('API Key: Not configured'));
|
|
458
|
+
}
|
|
459
|
+
} else {
|
|
460
|
+
console.log(chalk.yellow('Status: Different hook installed'));
|
|
461
|
+
console.log(chalk.gray('A non-CommitCraft hook exists at this location.'));
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
console.log();
|
|
465
|
+
});
|
|
466
|
+
|
|
310
467
|
program.parse();
|
package/src/config.ts
CHANGED
|
@@ -14,6 +14,8 @@ export interface Config {
|
|
|
14
14
|
openaiApiKey?: string;
|
|
15
15
|
groqApiKey?: string;
|
|
16
16
|
geminiApiKey?: string;
|
|
17
|
+
issuePattern?: string;
|
|
18
|
+
issuePrefix?: string;
|
|
17
19
|
}
|
|
18
20
|
|
|
19
21
|
const CONFIG_FILE = '.commitcraftrc';
|
|
@@ -78,7 +80,9 @@ export function loadConfig(): Config {
|
|
|
78
80
|
ollamaUrl: process.env.OLLAMA_URL || fileConfig.ollamaUrl || 'http://localhost:11434',
|
|
79
81
|
openaiApiKey: process.env.OPENAI_API_KEY || fileConfig.openaiApiKey,
|
|
80
82
|
groqApiKey: process.env.GROQ_API_KEY || fileConfig.groqApiKey,
|
|
81
|
-
geminiApiKey: process.env.GEMINI_API_KEY || fileConfig.geminiApiKey
|
|
83
|
+
geminiApiKey: process.env.GEMINI_API_KEY || fileConfig.geminiApiKey,
|
|
84
|
+
issuePattern: process.env.COMMITCRAFT_ISSUE_PATTERN || fileConfig.issuePattern,
|
|
85
|
+
issuePrefix: process.env.COMMITCRAFT_ISSUE_PREFIX || fileConfig.issuePrefix
|
|
82
86
|
};
|
|
83
87
|
}
|
|
84
88
|
|
package/src/hook.ts
ADDED
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Git prepare-commit-msg hook script
|
|
5
|
+
* This script is called by Git before the commit message editor is opened.
|
|
6
|
+
*
|
|
7
|
+
* Usage: commitcraft-hook <commit-msg-file> [<commit-source>] [<sha1>]
|
|
8
|
+
*
|
|
9
|
+
* Arguments:
|
|
10
|
+
* - commit-msg-file: Path to the file containing the commit message
|
|
11
|
+
* - commit-source: Source of the commit (message, template, merge, squash, commit)
|
|
12
|
+
* - sha1: SHA-1 hash (only for --amend)
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import fs from 'fs';
|
|
16
|
+
import { simpleGit, SimpleGit } from 'simple-git';
|
|
17
|
+
import { loadConfig, getApiKey, getDefaultModel } from './config.js';
|
|
18
|
+
import { generateCommitMessages, formatCommitMessage } from './ai.js';
|
|
19
|
+
|
|
20
|
+
const git: SimpleGit = simpleGit();
|
|
21
|
+
|
|
22
|
+
async function getStagedDiff(): Promise<{ diff: string; fileSummary: string }> {
|
|
23
|
+
const [diff, fileSummary] = await Promise.all([
|
|
24
|
+
git.diff(['--cached']),
|
|
25
|
+
git.diff(['--cached', '--name-status'])
|
|
26
|
+
]);
|
|
27
|
+
|
|
28
|
+
return { diff, fileSummary };
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async function getCurrentBranch(): Promise<string> {
|
|
32
|
+
const branchSummary = await git.branch();
|
|
33
|
+
return branchSummary.current;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function extractIssueFromBranch(branchName: string, pattern?: string): string | null {
|
|
37
|
+
if (!pattern) return null;
|
|
38
|
+
|
|
39
|
+
try {
|
|
40
|
+
const regex = new RegExp(pattern);
|
|
41
|
+
const match = branchName.match(regex);
|
|
42
|
+
return match?.[1] || match?.[0] || null;
|
|
43
|
+
} catch {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function log(message: string): void {
|
|
49
|
+
// Only log if COMMITCRAFT_HOOK_DEBUG is set
|
|
50
|
+
if (process.env.COMMITCRAFT_HOOK_DEBUG) {
|
|
51
|
+
console.error(`[commitcraft-hook] ${message}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async function main(): Promise<void> {
|
|
56
|
+
const args = process.argv.slice(2);
|
|
57
|
+
const commitMsgFile = args[0];
|
|
58
|
+
const commitSource = args[1];
|
|
59
|
+
|
|
60
|
+
// Validate arguments
|
|
61
|
+
if (!commitMsgFile) {
|
|
62
|
+
log('No commit message file provided');
|
|
63
|
+
process.exit(0);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Skip if commit has a source (merge, squash, message, etc.)
|
|
67
|
+
// This means user is providing their own message or it's a special commit
|
|
68
|
+
if (commitSource && commitSource !== 'template') {
|
|
69
|
+
log(`Skipping - commit source is "${commitSource}"`);
|
|
70
|
+
process.exit(0);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Read existing commit message
|
|
74
|
+
let existingMessage = '';
|
|
75
|
+
try {
|
|
76
|
+
existingMessage = fs.readFileSync(commitMsgFile, 'utf-8').trim();
|
|
77
|
+
// Remove comment lines (lines starting with #)
|
|
78
|
+
const nonCommentLines = existingMessage
|
|
79
|
+
.split('\n')
|
|
80
|
+
.filter(line => !line.startsWith('#'))
|
|
81
|
+
.join('\n')
|
|
82
|
+
.trim();
|
|
83
|
+
|
|
84
|
+
// Skip if there's already a non-empty message
|
|
85
|
+
if (nonCommentLines.length > 0) {
|
|
86
|
+
log('Skipping - commit message already exists');
|
|
87
|
+
process.exit(0);
|
|
88
|
+
}
|
|
89
|
+
} catch {
|
|
90
|
+
// File doesn't exist or can't be read - continue
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Load configuration
|
|
94
|
+
const config = loadConfig();
|
|
95
|
+
const provider = config.provider;
|
|
96
|
+
const model = config.model || getDefaultModel(provider);
|
|
97
|
+
const language = config.language;
|
|
98
|
+
|
|
99
|
+
// Check for API key
|
|
100
|
+
const apiKey = getApiKey(config);
|
|
101
|
+
if (!apiKey) {
|
|
102
|
+
log(`No API key found for ${provider}`);
|
|
103
|
+
process.exit(0);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Get staged diff
|
|
107
|
+
let diff: string;
|
|
108
|
+
let fileSummary: string;
|
|
109
|
+
|
|
110
|
+
try {
|
|
111
|
+
const result = await getStagedDiff();
|
|
112
|
+
diff = result.diff;
|
|
113
|
+
fileSummary = result.fileSummary;
|
|
114
|
+
|
|
115
|
+
if (!diff.trim()) {
|
|
116
|
+
log('No staged changes found');
|
|
117
|
+
process.exit(0);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Truncate large diffs
|
|
121
|
+
const MAX_CHARS = 12000;
|
|
122
|
+
if (diff.length > MAX_CHARS) {
|
|
123
|
+
diff = diff.substring(0, MAX_CHARS) + '\n... [truncated]';
|
|
124
|
+
}
|
|
125
|
+
} catch (error) {
|
|
126
|
+
log(`Failed to get staged changes: ${error}`);
|
|
127
|
+
process.exit(0);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Extract issue from branch if pattern is configured
|
|
131
|
+
let issueReference: string | undefined;
|
|
132
|
+
const issuePattern = process.env.COMMITCRAFT_ISSUE_PATTERN || config.issuePattern;
|
|
133
|
+
const issuePrefix = process.env.COMMITCRAFT_ISSUE_PREFIX || config.issuePrefix || '';
|
|
134
|
+
|
|
135
|
+
if (issuePattern) {
|
|
136
|
+
try {
|
|
137
|
+
const branchName = await getCurrentBranch();
|
|
138
|
+
const issue = extractIssueFromBranch(branchName, issuePattern);
|
|
139
|
+
if (issue) {
|
|
140
|
+
issueReference = issuePrefix + issue;
|
|
141
|
+
log(`Detected issue: ${issueReference}`);
|
|
142
|
+
}
|
|
143
|
+
} catch {
|
|
144
|
+
// Ignore branch detection errors
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Generate commit message
|
|
149
|
+
log(`Generating commit message via ${provider}...`);
|
|
150
|
+
|
|
151
|
+
try {
|
|
152
|
+
const candidates = await generateCommitMessages(
|
|
153
|
+
provider,
|
|
154
|
+
apiKey,
|
|
155
|
+
diff,
|
|
156
|
+
fileSummary,
|
|
157
|
+
model,
|
|
158
|
+
language,
|
|
159
|
+
config.ollamaUrl,
|
|
160
|
+
issueReference
|
|
161
|
+
);
|
|
162
|
+
|
|
163
|
+
if (candidates.length === 0) {
|
|
164
|
+
log('No commit message candidates generated');
|
|
165
|
+
process.exit(0);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Use the first candidate
|
|
169
|
+
const commitMessage = formatCommitMessage(candidates[0]);
|
|
170
|
+
|
|
171
|
+
// Write the commit message to the file
|
|
172
|
+
// Preserve any existing comments (like the git status summary)
|
|
173
|
+
const comments = existingMessage
|
|
174
|
+
.split('\n')
|
|
175
|
+
.filter(line => line.startsWith('#'))
|
|
176
|
+
.join('\n');
|
|
177
|
+
|
|
178
|
+
const newContent = comments
|
|
179
|
+
? `${commitMessage}\n\n${comments}`
|
|
180
|
+
: commitMessage;
|
|
181
|
+
|
|
182
|
+
fs.writeFileSync(commitMsgFile, newContent);
|
|
183
|
+
log(`Generated: ${commitMessage}`);
|
|
184
|
+
} catch (error) {
|
|
185
|
+
log(`Failed to generate commit message: ${error}`);
|
|
186
|
+
// Don't fail the commit, just let user write their own message
|
|
187
|
+
process.exit(0);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
main().catch((error) => {
|
|
192
|
+
log(`Unexpected error: ${error}`);
|
|
193
|
+
process.exit(0);
|
|
194
|
+
});
|