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 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.3.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;
@@ -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;CACvB;AAmDD,wBAAgB,UAAU,IAAI,MAAM,CAenC;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"}
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) {
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
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
@@ -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.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.3.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
+ });