bodhi-commit-genius-js
Version:
🚀 Smart commit message generator with AI - supports local LLMs and cloud APIs
109 lines (108 loc) • 3.9 kB
JavaScript
#!/usr/bin/env node
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const commander_1 = require("commander");
const generator_1 = require("./core/generator");
const git_1 = require("./services/git");
const config_1 = require("./config");
const chalk_1 = __importDefault(require("chalk"));
const inquirer_1 = __importDefault(require("inquirer"));
const ora_1 = __importDefault(require("ora"));
const git = new git_1.GitService();
const config = new config_1.Config();
commander_1.program
.name('cmg')
.description('AI-powered commit message generator')
.version('1.0.0');
commander_1.program
.command('commit [files...]')
.description('Generate commit message and commit changes')
.option('-m, --message <message>', 'Use a custom commit message')
.option('-p, --provider <provider>', 'AI provider (ollama/openai)')
.option('-i, --interactive', 'Interactive mode')
.action(async (files, options) => {
const spinner = (0, ora_1.default)('Analyzing changes...').start();
try {
// Stage files if provided
if (files.length > 0) {
await git.stageFiles(files);
}
// Get diff of staged changes
const diff = await git.getStagedDiff();
if (!diff) {
spinner.fail('No staged changes found');
return;
}
spinner.text = 'Generating commit message...';
// Generate commit message
const message = options.message || await (0, generator_1.generateCommitMessage)(diff, {
provider: options.provider || config.get('provider'),
model: config.get('model'),
apiKey: config.get('apiKey')
});
spinner.stop();
// Interactive mode
if (options.interactive) {
const { confirmed, editedMessage } = await inquirer_1.default.prompt([
{
type: 'confirm',
name: 'confirmed',
message: `Commit message:\n\n${message}\n\nDo you want to use this message?`,
default: true
},
{
type: 'editor',
name: 'editedMessage',
message: 'Edit the commit message:',
default: message,
when: (answers) => !answers.confirmed
}
]);
if (!confirmed && !editedMessage) {
console.log(chalk_1.default.yellow('Commit aborted'));
return;
}
await git.commit(confirmed ? message : editedMessage);
}
else {
await git.commit(message);
}
console.log(chalk_1.default.green('✨ Successfully committed changes!'));
}
catch (error) {
spinner.fail('Error: ' + error.message);
process.exit(1);
}
});
commander_1.program
.command('config')
.description('Configure commit-genius-js')
.action(async () => {
const answers = await inquirer_1.default.prompt([
{
type: 'list',
name: 'provider',
message: 'Select AI provider:',
choices: ['ollama', 'openai']
},
{
type: 'input',
name: 'apiKey',
message: 'Enter OpenAI API key:',
when: (answers) => answers.provider === 'openai'
},
{
type: 'input',
name: 'model',
message: 'Enter Ollama model name:',
default: 'codellama',
when: (answers) => answers.provider === 'ollama'
}
]);
config.set(answers);
console.log(chalk_1.default.green('Configuration saved successfully!'));
});
commander_1.program.parse();