@taizo-pro/github-discussions-cli
Version:
A powerful command-line tool for interacting with GitHub Discussions without opening a browser
72 lines • 3.2 kB
JavaScript
import { Command } from 'commander';
import chalk from 'chalk';
import inquirer from 'inquirer';
import { GitHubClient, FileAuthManager, FileConfigManager } from '../../core/index.js';
import { handleError } from '../utils/error-handler.js';
export const createCommand = new Command('create')
.description('Create a new discussion')
.argument('[title]', 'Discussion title')
.argument('[body]', 'Discussion body')
.argument('[repo]', 'Repository in owner/name format')
.option('-c, --category <category>', 'Discussion category ID')
.option('-e, --editor', 'Open editor for body input')
.action(async (title, body, repo, options) => {
try {
const authManager = new FileAuthManager();
const configManager = new FileConfigManager();
const token = await authManager.getToken();
if (!token) {
console.error(chalk.red('No GitHub token found. Run "gh-discussions config" to set up authentication.'));
process.exit(1);
}
const targetRepo = repo || (await configManager.getDefaultRepo());
if (!targetRepo) {
console.error(chalk.red('No repository specified. Provide a repo argument or set a default repo with "gh-discussions config".'));
process.exit(1);
}
let discussionTitle = title;
let discussionBody = body;
// Prompt for title if not provided
if (!discussionTitle) {
const titleAnswer = await inquirer.prompt([
{
type: 'input',
name: 'title',
message: 'Enter discussion title:',
validate: (input) => input.trim().length > 0 || 'Title cannot be empty',
},
]);
discussionTitle = titleAnswer.title;
}
// Prompt for body if not provided or editor option is used
if (!discussionBody || options.editor) {
const bodyAnswer = await inquirer.prompt([
{
type: 'editor',
name: 'body',
message: 'Enter discussion body (will open in your default editor):',
default: discussionBody || '',
},
]);
discussionBody = bodyAnswer.body;
}
if (!discussionBody || discussionBody.trim().length === 0) {
console.error(chalk.red('Discussion body cannot be empty.'));
process.exit(1);
}
const client = new GitHubClient(token);
const discussion = await client.createDiscussion(targetRepo, discussionTitle.trim(), discussionBody.trim(), options.category);
console.log(chalk.green('✓ Discussion created successfully!'));
console.log(chalk.gray(`URL: ${discussion.url}`));
console.log();
console.log(chalk.bold(`Title: ${discussion.title}`));
console.log(chalk.gray(`Category: ${discussion.category?.name || 'N/A'}`));
console.log();
console.log(chalk.bold('Description:'));
console.log(discussionBody.trim());
}
catch (error) {
handleError(error);
}
});
//# sourceMappingURL=create.js.map