UNPKG

@jmkim85/dev-flow-mcp

Version:

MCP-based Dev Flow - AI-powered development workflow management with 13 essential tools for TDD and context management

118 lines • 4.24 kB
#!/usr/bin/env node /** * Dev Flow CLI * Command-line interface for Dev Flow MCP */ import { Command } from 'commander'; import { StateManager } from './state-manager.js'; import chalk from 'chalk'; import { table } from 'table'; import { getDisplayVersion } from './version-manager.js'; const program = new Command(); // Initialize CLI with dynamic version async function initializeCLI() { const version = await getDisplayVersion(); program .name('devflow') .description('Dev Flow CLI - Simplified read-only monitoring') .version(version); } // Show current status program .command('status') .description('Show current project status') .action(async () => { try { const projectRoot = process.cwd(); const stateManager = new StateManager(projectRoot); const state = await stateManager.getCurrentState(); const tasks = await stateManager.loadTasks(); console.log(chalk.bold('\nšŸ“Š Project Status\n')); console.log(`Project: ${chalk.blue(projectRoot)}`); console.log(`Current Task: ${state.current_task ? chalk.yellow(state.current_task) : chalk.gray('None')}`); console.log(`Current Stage: ${chalk.cyan(state.current_stage)}`); console.log(`Context Files: ${state.context_files.length}`); // Task summary const pending = tasks.filter(t => t.status === 'pending').length; const inProgress = tasks.filter(t => t.status === 'in_progress').length; const completed = tasks.filter(t => t.status === 'completed').length; console.log(chalk.bold('\nšŸ“‹ Tasks Summary\n')); const taskData = [ ['Status', 'Count'], ['Pending', chalk.yellow(pending.toString())], ['In Progress', chalk.blue(inProgress.toString())], ['Completed', chalk.green(completed.toString())], ['Total', chalk.bold((pending + inProgress + completed).toString())] ]; console.log(table(taskData)); } catch (error) { console.error(chalk.red(`āŒ Error: ${error.message}`)); process.exit(1); } }); // List tasks (simplified) program .command('tasks') .description('List all tasks') .action(async () => { try { const projectRoot = process.cwd(); const stateManager = new StateManager(projectRoot); const tasks = await stateManager.loadTasks(); if (tasks.length === 0) { console.log(chalk.gray('No tasks found')); return; } console.log(chalk.bold('\nšŸ“‹ Tasks\n')); tasks.forEach(task => { const statusColor = { pending: chalk.yellow, in_progress: chalk.blue, completed: chalk.green, failed: chalk.red, blocked: chalk.gray }[task.status] || chalk.white; console.log(`${statusColor('ā—')} ${task.title} (${task.status})`); }); } catch (error) { console.error(chalk.red(`āŒ Error: ${error.message}`)); process.exit(1); } }); // Clean temporary files program .command('clean-tmp') .description('Remove accumulated temporary files under .devflow/tmp') .action(async () => { try { // Direct execution of clean-temp script const { spawn } = await import('child_process'); const { fileURLToPath } = await import('url'); const { dirname, join } = await import('path'); const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); const cleanTempPath = join(__dirname, 'clean-temp.js'); const child = spawn('node', [cleanTempPath], { stdio: 'inherit' }); child.on('close', (code) => { if (code !== 0) { process.exit(code || 1); } }); } catch (error) { console.error(chalk.red(`āŒ Error: ${error.message}`)); process.exit(1); } }); // Main execution async function main() { await initializeCLI(); program.parse(); } main().catch((error) => { console.error(chalk.red(`āŒ CLI Error: ${error.message}`)); process.exit(1); }); //# sourceMappingURL=cli.js.map