@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
JavaScript
/**
* 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