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