UNPKG

gemini-code-flow

Version:

AI-powered development orchestration for Gemini CLI - adapted from Claude Code Flow by ruvnet

140 lines (136 loc) β€’ 6.83 kB
"use strict"; /** * SPARC Command for Gemini Code Flow * Adapted from Claude Code Flow by ruvnet */ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.SparcCommand = void 0; const chalk_1 = __importDefault(require("chalk")); const ora_1 = __importDefault(require("ora")); const fs_extra_1 = __importDefault(require("fs-extra")); const gemini_client_1 = require("../core/gemini-client"); class SparcCommand { async execute(mode, task, options) { if (!mode || !task) { console.log(chalk_1.default.red('Usage: gemini-flow sparc <mode> <task>')); console.log(chalk_1.default.yellow('Example: gemini-flow sparc architect "Design a REST API"')); return; } const validModes = [ 'architect', 'coder', 'tester', 'debugger', 'security', 'documentation', 'integrator', 'monitor', 'optimizer', 'ask', 'devops', 'tutorial', 'database', 'specification', 'mcp', 'orchestrator', 'designer' ]; if (!validModes.includes(mode)) { console.log(chalk_1.default.red(`Invalid mode: ${mode}`)); console.log(chalk_1.default.yellow('Run "gemini-flow list" to see available modes')); return; } const spinner = (0, ora_1.default)(`${this.getModeIcon(mode)} Running ${mode} mode...`).start(); try { const apiKey = process.env.GEMINI_API_KEY; if (!apiKey) { throw new Error('GEMINI_API_KEY environment variable is required'); } const client = new gemini_client_1.GeminiClient({ apiKey }); const prompt = this.buildSparcPrompt(mode, task); let result; if (options.file) { // Multimodal processing const fileBuffer = await fs_extra_1.default.readFile(options.file); const mimeType = this.getMimeType(options.file); result = await client.executeMultimodal(prompt, [{ mimeType, data: fileBuffer }], mode); } else { result = await client.execute(prompt, mode); } spinner.succeed(`${this.getModeIcon(mode)} ${mode} completed successfully`); console.log(chalk_1.default.cyan('\nπŸ“‹ Result:\n')); console.log(result); // Save result to file const outputPath = `.gemini-flow/${mode}-${Date.now()}.md`; await fs_extra_1.default.ensureDir('.gemini-flow'); await fs_extra_1.default.writeFile(outputPath, `# ${mode.toUpperCase()} Mode Result\n\n${result}`); console.log(chalk_1.default.gray(`\nπŸ’Ύ Result saved to: ${outputPath}`)); } catch (error) { spinner.fail(`${mode} mode failed`); console.error(chalk_1.default.red('Error:'), error instanceof Error ? error.message : 'Unknown error'); } } buildSparcPrompt(mode, task) { const modePrompts = { architect: `You are an expert system architect. Design scalable, maintainable solutions using best practices and design patterns.`, coder: `You are an expert programmer. Write clean, efficient, and well-documented code following best practices.`, tester: `You are a testing specialist. Create comprehensive test cases and implement test-driven development practices.`, debugger: `You are a debugging expert. Identify and fix issues systematically, considering root causes and edge cases.`, security: `You are a security specialist. Identify vulnerabilities and implement secure coding practices.`, documentation: `You are a technical writer. Create clear, comprehensive documentation for developers and users.`, integrator: `You are a system integration expert. Connect components and ensure seamless interoperability.`, monitor: `You are a monitoring specialist. Implement observability and performance tracking solutions.`, optimizer: `You are a performance optimization expert. Improve efficiency and resource utilization.`, ask: `You are a task formulation expert. Help clarify requirements and break down complex problems.`, devops: `You are a DevOps engineer. Implement deployment, infrastructure, and automation solutions.`, tutorial: `You are an educational expert. Create step-by-step learning materials and tutorials.`, database: `You are a database administrator. Design and optimize data storage and retrieval systems.`, specification: `You are a requirements analyst. Write clear specifications and pseudocode.`, mcp: `You are an integration specialist. Connect external services and APIs using MCP protocols.`, orchestrator: `You are a workflow orchestrator. Coordinate complex multi-step processes.`, designer: `You are a UI/UX designer. Create intuitive and visually appealing user interfaces.`, }; const basePrompt = modePrompts[mode] || modePrompts.coder; return `${basePrompt} ## Task Description ${task} ## SPARC Methodology Please follow the SPARC methodology in your response: 1. **Specification**: Define what needs to be done 2. **Pseudocode**: Outline the approach 3. **Architecture**: Design the solution 4. **Refinement**: Iterate and improve 5. **Completion**: Deliver the final result Be thorough, systematic, and consider edge cases. Provide practical, actionable solutions.`; } getModeIcon(mode) { const icons = { architect: 'πŸ—οΈ', coder: '🧠', tester: 'πŸ§ͺ', debugger: 'πŸͺ²', security: 'πŸ›‘οΈ', documentation: 'πŸ“š', integrator: 'πŸ”—', monitor: 'πŸ“ˆ', optimizer: '🧹', ask: '❓', devops: 'πŸš€', tutorial: 'πŸ“˜', database: 'πŸ”', specification: 'πŸ“‹', mcp: '♾️', orchestrator: '⚑', designer: '🎨', }; return icons[mode] || 'πŸ€–'; } getMimeType(filename) { const ext = filename.split('.').pop()?.toLowerCase(); const mimeTypes = { png: 'image/png', jpg: 'image/jpeg', jpeg: 'image/jpeg', gif: 'image/gif', webp: 'image/webp', pdf: 'application/pdf', txt: 'text/plain', md: 'text/markdown', }; return mimeTypes[ext || ''] || 'application/octet-stream'; } } exports.SparcCommand = SparcCommand; //# sourceMappingURL=sparc.js.map