ctrlshiftleft
Version:
AI-powered toolkit for embedding QA and security testing into development workflows
68 lines (58 loc) • 2.81 kB
text/typescript
import { Command } from 'commander';
import chalk from 'chalk';
import ora from 'ora';
import path from 'path';
import fs from 'fs/promises';
import { ChecklistGenerator } from '../core/checklistGenerator';
import { isValidSourcePath, ensureDirectoryExists } from '../utils/fileUtils';
export function checklistCommand(program: Command): void {
program
.command('checklist')
.description('Generate QA and security checklists from source code')
.argument('<source>', 'Source file or directory to analyze')
.option('-o, --output <file>', 'Output JSON file for generated checklist', './checklist.json')
.option('-t, --type <type>', 'Type of checklist to generate (qa, security, all)', 'all')
.option('--format <format>', 'Output format (json, markdown)', 'json')
.action(async (source: string, options) => {
const spinner = ora('Analyzing source code for checklist generation...').start();
try {
// Validate source path
if (!await isValidSourcePath(source)) {
spinner.fail(`Invalid source path: ${source}`);
return;
}
const absoluteSourcePath = path.resolve(process.cwd(), source);
const outputFile = path.resolve(process.cwd(), options.output);
const outputDir = path.dirname(outputFile);
// Ensure output directory exists
await ensureDirectoryExists(outputDir);
// Initialize checklist generator
const generator = new ChecklistGenerator({
type: options.type,
format: options.format
});
spinner.text = 'Generating checklist...';
const checklist = await generator.generateChecklist(absoluteSourcePath);
// Write to output file
await fs.writeFile(outputFile, JSON.stringify(checklist, null, 2), 'utf8');
spinner.succeed(`Successfully generated checklist in ${outputFile}`);
console.log(`\n${chalk.green('✓')} Checklist contains ${checklist.items.length} items`);
console.log(`${chalk.blue('Categories:')} ${checklist.categories.join(', ')}`);
// Display sample items
if (checklist.items.length > 0) {
console.log(chalk.yellow('\nSample checklist items:'));
const sampleItems = checklist.items.slice(0, 3);
for (const item of sampleItems) {
console.log(`${chalk.green('•')} ${item.title}`);
}
if (checklist.items.length > 3) {
console.log(chalk.gray(`... and ${checklist.items.length - 3} more items`));
}
}
} catch (error) {
spinner.fail(`Checklist generation failed: ${(error as Error).message}`);
console.error(chalk.red((error as Error).stack));
process.exit(1);
}
});
}