devflow-ai
Version:
Enterprise-grade AI agent orchestration with swarm management UI dashboard
1,648 lines (1,378 loc) • 46.1 kB
text/typescript
/**
* SPARC-Enhanced Task Executor for Swarm
* Implements the full SPARC methodology with TDD
*/
import type { TaskDefinition, AgentState, TaskResult } from './types.js';
import * as fs from 'node:fs/promises';
import * as path from 'node:path';
import { Logger } from '../core/logger.js';
export interface SparcPhase {
name: string;
description: string;
outputs: string[];
}
export interface SparcExecutorConfig {
logger?: Logger;
enableTDD?: boolean;
qualityThreshold?: number;
enableMemory?: boolean;
}
export class SparcTaskExecutor {
private logger: Logger;
private enableTDD: boolean;
private qualityThreshold: number;
private enableMemory: boolean;
private phases: Map<string, SparcPhase> = new Map();
constructor(config: SparcExecutorConfig = {}) {
this.logger =
config.logger ||
new Logger(
{ level: 'info', format: 'text', destination: 'console' },
{ component: 'SparcTaskExecutor' },
);
this.enableTDD = config.enableTDD ?? true;
this.qualityThreshold = config.qualityThreshold ?? 0.8;
this.enableMemory = config.enableMemory ?? true;
this.initializePhases();
}
private initializePhases() {
this.phases = new Map([
[
'specification',
{
name: 'Specification',
description: 'Define detailed requirements and acceptance criteria',
outputs: ['requirements.md', 'user-stories.md', 'acceptance-criteria.md'],
},
],
[
'pseudocode',
{
name: 'Pseudocode',
description: 'Create algorithmic logic and data structures',
outputs: ['algorithms.md', 'data-structures.md', 'flow-diagrams.md'],
},
],
[
'architecture',
{
name: 'Architecture',
description: 'Design system architecture and components',
outputs: ['architecture.md', 'component-diagram.md', 'api-design.md'],
},
],
[
'refinement',
{
name: 'Refinement (TDD)',
description: 'Implement with Test-Driven Development',
outputs: ['tests/', 'src/', 'coverage/'],
},
],
[
'completion',
{
name: 'Completion',
description: 'Integration, documentation, and validation',
outputs: ['README.md', 'docs/', 'examples/'],
},
],
]);
}
async executeTask(
task: TaskDefinition,
agent: AgentState,
targetDir?: string,
): Promise<TaskResult> {
this.logger.info('Executing SPARC-enhanced task', {
taskId: task.id.id,
taskName: task.name,
agentType: agent.type,
targetDir,
});
const startTime = Date.now();
try {
// Ensure target directory exists
if (targetDir) {
await fs.mkdir(targetDir, { recursive: true });
}
// Determine which SPARC phase to execute based on task and agent
const result = await this.executeSparcPhase(task, agent, targetDir);
const endTime = Date.now();
const executionTime = endTime - startTime;
return {
output: result,
artifacts: result.artifacts || {},
metadata: {
agentId: agent.id.id,
agentType: agent.type,
executionTime,
targetDir,
sparcPhase: result.phase,
quality: result.quality || 1.0,
},
quality: result.quality || 1.0,
completeness: result.completeness || 1.0,
accuracy: 1.0,
executionTime,
resourcesUsed: {
cpuTime: executionTime,
maxMemory: 0,
diskIO: 0,
networkIO: 0,
fileHandles: 0,
},
validated: true,
};
} catch (error) {
this.logger.error('SPARC task execution failed', {
taskId: task.id.id,
error: error instanceof Error ? error.message : String(error),
});
throw error;
}
}
private async executeSparcPhase(
task: TaskDefinition,
agent: AgentState,
targetDir?: string,
): Promise<any> {
const objective = task.description.toLowerCase();
// Map agent types to SPARC phases
switch (agent.type) {
case 'analyst':
if (task.name.includes('Requirements') || task.name.includes('Plan')) {
return this.executeSpecificationPhase(task, targetDir);
}
return this.executeAnalysisPhase(task, targetDir);
case 'researcher':
return this.executePseudocodePhase(task, targetDir);
case 'architect':
case 'coordinator':
if (task.name.includes('Architecture') || objective.includes('design')) {
return this.executeArchitecturePhase(task, targetDir);
}
return this.executeCoordinationPhase(task, targetDir);
case 'coder':
if (this.enableTDD && task.name.includes('Implement')) {
return this.executeTDDPhase(task, targetDir);
}
return this.executeImplementationPhase(task, targetDir);
case 'tester':
return this.executeTestingPhase(task, targetDir);
case 'reviewer':
return this.executeReviewPhase(task, targetDir);
case 'documenter':
return this.executeDocumentationPhase(task, targetDir);
default:
return this.executeGenericPhase(task, targetDir);
}
}
private async executeSpecificationPhase(task: TaskDefinition, targetDir?: string): Promise<any> {
this.logger.info('Executing Specification phase', { taskName: task.name });
const objective = task.description;
const appType = this.determineAppType(objective);
const specifications = {
phase: 'specification',
requirements: this.generateRequirements(objective, appType),
userStories: this.generateUserStories(appType),
acceptanceCriteria: this.generateAcceptanceCriteria(appType),
constraints: this.identifyConstraints(objective),
quality: 0.9,
completeness: 0.95,
};
if (targetDir) {
const specsDir = path.join(targetDir, 'specs');
await fs.mkdir(specsDir, { recursive: true });
await fs.writeFile(
path.join(specsDir, 'requirements.md'),
this.formatRequirements(specifications.requirements),
);
await fs.writeFile(
path.join(specsDir, 'user-stories.md'),
this.formatUserStories(specifications.userStories),
);
await fs.writeFile(
path.join(specsDir, 'acceptance-criteria.md'),
this.formatAcceptanceCriteria(specifications.acceptanceCriteria),
);
}
return specifications;
}
private async executePseudocodePhase(task: TaskDefinition, targetDir?: string): Promise<any> {
this.logger.info('Executing Pseudocode phase', { taskName: task.name });
const appType = this.determineAppType(task.description);
const pseudocode = {
phase: 'pseudocode',
algorithms: this.generateAlgorithms(appType),
dataStructures: this.generateDataStructures(appType),
flowDiagrams: this.generateFlowDiagrams(appType),
quality: 0.85,
completeness: 0.9,
};
if (targetDir) {
const designDir = path.join(targetDir, 'design');
await fs.mkdir(designDir, { recursive: true });
await fs.writeFile(
path.join(designDir, 'algorithms.md'),
this.formatAlgorithms(pseudocode.algorithms),
);
await fs.writeFile(
path.join(designDir, 'data-structures.md'),
this.formatDataStructures(pseudocode.dataStructures),
);
}
return pseudocode;
}
private async executeArchitecturePhase(task: TaskDefinition, targetDir?: string): Promise<any> {
this.logger.info('Executing Architecture phase', { taskName: task.name });
const appType = this.determineAppType(task.description);
const architecture = {
phase: 'architecture',
components: this.designComponents(appType),
interfaces: this.designInterfaces(appType),
patterns: this.selectPatterns(appType),
infrastructure: this.designInfrastructure(appType),
quality: 0.9,
completeness: 0.85,
};
if (targetDir) {
const archDir = path.join(targetDir, 'architecture');
await fs.mkdir(archDir, { recursive: true });
await fs.writeFile(
path.join(archDir, 'architecture.md'),
this.formatArchitecture(architecture),
);
await fs.writeFile(
path.join(archDir, 'component-diagram.md'),
this.formatComponentDiagram(architecture.components),
);
}
return architecture;
}
private async executeTDDPhase(task: TaskDefinition, targetDir?: string): Promise<any> {
this.logger.info('Executing TDD phase (Red-Green-Refactor)', { taskName: task.name });
const appType = this.determineAppType(task.description);
const language = this.detectLanguage(task.description);
// Red Phase: Write failing tests first
const tests = await this.generateFailingTests(appType, language);
// Green Phase: Implement minimal code to pass tests
const implementation = await this.generateMinimalImplementation(appType, language, tests);
// Refactor Phase: Optimize and clean up
const refactored = await this.refactorImplementation(implementation, tests);
const tddResult = {
phase: 'refinement-tdd',
tests,
implementation: refactored,
coverage: this.calculateCoverage(tests, refactored),
quality: 0.95,
completeness: 0.9,
artifacts: {},
};
if (targetDir) {
// Create proper project structure
await this.createProjectStructure(targetDir, appType, language);
// Write test files
await this.writeTestFiles(targetDir, tests, language);
// Write implementation files
await this.writeImplementationFiles(targetDir, refactored, language);
// Generate additional files
await this.generateProjectFiles(targetDir, appType, language);
}
return tddResult;
}
private async executeTestingPhase(task: TaskDefinition, targetDir?: string): Promise<any> {
this.logger.info('Executing Testing phase', { taskName: task.name });
const testPlan = {
phase: 'testing',
unitTests: this.generateUnitTests(task),
integrationTests: this.generateIntegrationTests(task),
e2eTests: this.generateE2ETests(task),
performanceTests: this.generatePerformanceTests(task),
coverage: { target: 80, current: 0 },
quality: 0.9,
completeness: 0.85,
};
if (targetDir) {
const testsDir = path.join(targetDir, 'tests');
await fs.mkdir(testsDir, { recursive: true });
await fs.writeFile(path.join(testsDir, 'test-plan.md'), this.formatTestPlan(testPlan));
}
return testPlan;
}
private async executeReviewPhase(task: TaskDefinition, targetDir?: string): Promise<any> {
this.logger.info('Executing Review phase', { taskName: task.name });
const review = {
phase: 'review',
codeQuality: this.assessCodeQuality(task),
security: this.assessSecurity(task),
performance: this.assessPerformance(task),
maintainability: this.assessMaintainability(task),
recommendations: this.generateRecommendations(task),
quality: 0.88,
completeness: 0.9,
};
if (targetDir) {
await fs.writeFile(path.join(targetDir, 'review-report.md'), this.formatReviewReport(review));
}
return review;
}
private async executeDocumentationPhase(task: TaskDefinition, targetDir?: string): Promise<any> {
this.logger.info('Executing Documentation phase', { taskName: task.name });
const documentation = {
phase: 'documentation',
readme: this.generateReadme(task),
apiDocs: this.generateApiDocs(task),
userGuide: this.generateUserGuide(task),
developerGuide: this.generateDeveloperGuide(task),
quality: 0.92,
completeness: 0.95,
};
if (targetDir) {
const docsDir = path.join(targetDir, 'docs');
await fs.mkdir(docsDir, { recursive: true });
await fs.writeFile(path.join(targetDir, 'README.md'), documentation.readme);
await fs.writeFile(path.join(docsDir, 'api-reference.md'), documentation.apiDocs);
await fs.writeFile(path.join(docsDir, 'user-guide.md'), documentation.userGuide);
}
return documentation;
}
// Helper methods for generating content
private determineAppType(description: string): string {
const desc = description.toLowerCase();
if (desc.includes('rest api') || desc.includes('api')) return 'rest-api';
if (desc.includes('flask') || desc.includes('fastapi')) return 'python-web';
if (desc.includes('pandas') || desc.includes('data')) return 'data-pipeline';
if (desc.includes('machine learning') || desc.includes('ml')) return 'ml-app';
if (desc.includes('cli') || desc.includes('command')) return 'cli-tool';
if (desc.includes('scraper') || desc.includes('scraping')) return 'web-scraper';
if (desc.includes('dashboard')) return 'dashboard';
return 'generic';
}
private detectLanguage(description: string): string {
const desc = description.toLowerCase();
if (desc.includes('python') || desc.includes('flask') || desc.includes('pandas'))
return 'python';
if (desc.includes('typescript') || desc.includes('ts')) return 'typescript';
if (desc.includes('java')) return 'java';
return 'javascript';
}
private generateRequirements(objective: string, appType: string): any {
return {
functional: this.getFunctionalRequirements(appType),
nonFunctional: this.getNonFunctionalRequirements(appType),
technical: this.getTechnicalRequirements(appType),
business: this.getBusinessRequirements(appType),
};
}
private generateUserStories(appType: string): any[] {
const stories = {
'rest-api': [
{
id: 'US001',
story: 'As a developer, I want to create resources via POST endpoints',
priority: 'high',
},
{
id: 'US002',
story: 'As a developer, I want to retrieve resources via GET endpoints',
priority: 'high',
},
{
id: 'US003',
story: 'As a developer, I want to update resources via PUT/PATCH endpoints',
priority: 'medium',
},
{
id: 'US004',
story: 'As a developer, I want to delete resources via DELETE endpoints',
priority: 'medium',
},
{
id: 'US005',
story: 'As a developer, I want API documentation to understand endpoints',
priority: 'high',
},
],
'python-web': [
{
id: 'US001',
story: 'As a user, I want to access the web application via browser',
priority: 'high',
},
{ id: 'US002', story: 'As a user, I want to authenticate securely', priority: 'high' },
{
id: 'US003',
story: 'As a user, I want responsive UI on all devices',
priority: 'medium',
},
],
'data-pipeline': [
{
id: 'US001',
story: 'As a data analyst, I want to load data from multiple sources',
priority: 'high',
},
{
id: 'US002',
story: 'As a data analyst, I want to transform data efficiently',
priority: 'high',
},
{
id: 'US003',
story: 'As a data analyst, I want to export results in various formats',
priority: 'medium',
},
],
};
return (
(stories as any)[appType] || [
{ id: 'US001', story: 'As a user, I want to use the main functionality', priority: 'high' },
]
);
}
private generateAcceptanceCriteria(appType: string): any {
const criteria = {
'rest-api': {
endpoints: [
'All CRUD operations return appropriate status codes',
'API responses follow consistent format',
],
performance: [
'Response time < 200ms for simple queries',
'Can handle 100 concurrent requests',
],
security: ['All endpoints require authentication', 'Input validation on all parameters'],
},
'python-web': {
functionality: ['All pages load without errors', 'Forms validate input correctly'],
usability: ['UI is responsive on mobile devices', 'Page load time < 3 seconds'],
compatibility: ['Works on Chrome, Firefox, Safari', 'Supports Python 3.8+'],
},
};
return (
(criteria as any)[appType] || {
functionality: ['Core features work as expected'],
quality: ['Code follows best practices'],
}
);
}
private async generateFailingTests(appType: string, language: string): Promise<any> {
const testFramework = this.getTestFramework(language);
const tests = {
unit: this.generateUnitTestCases(appType, language, testFramework),
integration: this.generateIntegrationTestCases(appType, language, testFramework),
fixtures: this.generateTestFixtures(appType),
mocks: this.generateMocks(appType),
};
return tests;
}
private async generateMinimalImplementation(
appType: string,
language: string,
tests: any,
): Promise<any> {
return {
modules: this.generateModules(appType, language),
classes: this.generateClasses(appType, language),
functions: this.generateFunctions(appType, language),
config: this.generateConfig(appType, language),
};
}
private async refactorImplementation(implementation: any, tests: any): Promise<any> {
return {
...implementation,
optimized: true,
patterns: ['SOLID principles applied', 'DRY principle followed'],
performance: 'Optimized for efficiency',
maintainability: 'Clean, readable code',
};
}
private async createProjectStructure(
targetDir: string,
appType: string,
language: string,
): Promise<void> {
const structure = this.getProjectStructure(appType, language);
for (const dir of structure.directories) {
await fs.mkdir(path.join(targetDir, dir), { recursive: true });
}
}
private async writeTestFiles(targetDir: string, tests: any, language: string): Promise<void> {
const testDir = path.join(targetDir, this.getTestDirectory(language));
await fs.mkdir(testDir, { recursive: true });
// Write unit tests
for (const [name, content] of Object.entries(tests.unit)) {
const filename = this.getTestFileName(name as string, language);
await fs.writeFile(path.join(testDir, filename), content as string);
}
}
private async writeImplementationFiles(
targetDir: string,
implementation: any,
language: string,
): Promise<void> {
const srcDir = path.join(targetDir, this.getSourceDirectory(language));
await fs.mkdir(srcDir, { recursive: true });
// Write implementation files
for (const [module, content] of Object.entries(implementation.modules)) {
const filename = this.getSourceFileName(module as string, language);
await fs.writeFile(path.join(srcDir, filename), content as string);
}
}
private async generateProjectFiles(
targetDir: string,
appType: string,
language: string,
): Promise<void> {
const files = await this.getProjectFiles(appType, language);
for (const [filename, content] of Object.entries(files)) {
await fs.writeFile(path.join(targetDir, filename as string), content as string);
}
}
// Utility methods for language-specific details
private getTestFramework(language: string): string {
const frameworks = {
python: 'pytest',
javascript: 'jest',
typescript: 'jest',
java: 'junit',
};
return frameworks[language] || 'generic';
}
private getProjectStructure(appType: string, language: string): any {
const structures = {
'python-rest-api': {
directories: ['src', 'tests', 'docs', 'config', 'migrations', 'scripts'],
files: ['requirements.txt', 'setup.py', 'pytest.ini', '.gitignore', 'Dockerfile'],
},
'javascript-rest-api': {
directories: ['src', 'tests', 'docs', 'config', 'public'],
files: ['package.json', 'tsconfig.json', 'jest.config.js', '.gitignore', 'Dockerfile'],
},
};
return (
structures[`${language}-${appType}`] || {
directories: ['src', 'tests', 'docs'],
files: ['README.md', '.gitignore'],
}
);
}
private getTestDirectory(language: string): string {
return language === 'python' ? 'tests' : '__tests__';
}
private getSourceDirectory(language: string): string {
return 'src';
}
private getTestFileName(name: string, language: string): string {
if (language === 'python') return `test_${name}.py`;
return `${name}.test.${language === 'typescript' ? 'ts' : 'js'}`;
}
private getSourceFileName(name: string, language: string): string {
const extensions = {
python: 'py',
javascript: 'js',
typescript: 'ts',
java: 'java',
};
return `${name}.${(extensions as any)[language] || 'js'}`;
}
// Content generation methods
private getFunctionalRequirements(appType: string): string[] {
const requirements = {
'rest-api': [
'Implement RESTful endpoints for all resources',
'Support JSON request/response format',
'Implement proper HTTP status codes',
'Support pagination for list endpoints',
'Implement filtering and sorting',
],
'data-pipeline': [
'Load data from CSV, JSON, and database sources',
'Validate and clean input data',
'Transform data according to business rules',
'Generate summary statistics',
'Export results in multiple formats',
],
'ml-app': [
'Preprocess input data for model',
'Train model with configurable parameters',
'Evaluate model performance',
'Save and load trained models',
'Provide prediction API',
],
};
return (requirements as any)[appType] || ['Implement core functionality'];
}
private getNonFunctionalRequirements(appType: string): string[] {
return [
'Response time < 500ms for 95% of requests',
'Support 1000 concurrent users',
'99.9% uptime availability',
'Secure authentication and authorization',
'Comprehensive logging and monitoring',
];
}
private getTechnicalRequirements(appType: string): string[] {
const tech = {
'rest-api': [
'Use appropriate web framework (Express, Flask, FastAPI)',
'Implement database ORM/ODM',
'Use environment variables for configuration',
'Implement proper error handling',
'Add request validation middleware',
],
'data-pipeline': [
'Use pandas for data manipulation',
'Implement parallel processing for large datasets',
'Use appropriate data storage (SQL, NoSQL)',
'Implement data validation rules',
'Add progress tracking for long operations',
],
};
return (tech as any)[appType] || ['Follow best practices for the technology stack'];
}
private getBusinessRequirements(appType: string): string[] {
return [
'Meet project timeline and budget',
'Ensure scalability for future growth',
'Maintain code quality standards',
'Provide comprehensive documentation',
'Enable easy maintenance and updates',
];
}
private generateUnitTestCases(appType: string, language: string, framework: string): any {
if (language === 'python' && appType === 'rest-api') {
return {
test_models: `import pytest
from src.models import User, Product
class TestUserModel:
def test_create_user(self):
"""Test user creation with valid data"""
user = User(username="testuser", email="test@example.com")
assert user.username == "testuser"
assert user.email == "test@example.com"
assert user.id is None # Not saved yet
def test_user_validation(self):
"""Test user validation rules"""
with pytest.raises(ValueError):
User(username="", email="invalid-email")
def test_user_serialization(self):
"""Test user to dict conversion"""
user = User(username="testuser", email="test@example.com")
data = user.to_dict()
assert data['username'] == "testuser"
assert 'password' not in data # Should not expose password
class TestProductModel:
def test_create_product(self):
"""Test product creation"""
product = Product(name="Test Product", price=99.99)
assert product.name == "Test Product"
assert product.price == 99.99
`,
test_services: `import pytest
from unittest.mock import Mock, patch
from src.services import UserService, ProductService
class TestUserService:
@pytest.fixture
def user_service(self):
return UserService()
def test_create_user_success(self, user_service):
"""Test successful user creation"""
user_data = {"username": "newuser", "email": "new@example.com"}
with patch('src.services.db') as mock_db:
user = user_service.create_user(user_data)
assert user.username == "newuser"
mock_db.session.add.assert_called_once()
def test_get_user_by_id(self, user_service):
"""Test retrieving user by ID"""
with patch('src.services.User.query') as mock_query:
mock_query.get.return_value = Mock(id=1, username="testuser")
user = user_service.get_user(1)
assert user.id == 1
assert user.username == "testuser"
`,
};
}
// Return generic tests for other combinations
return {
test_main: 'Test file content for main functionality',
};
}
private generateIntegrationTestCases(appType: string, language: string, framework: string): any {
if (language === 'python' && appType === 'rest-api') {
return {
test_api: `import pytest
from flask import Flask
from src.app import create_app
class TestAPI:
@pytest.fixture
def client(self):
app = create_app('testing')
with app.test_client() as client:
yield client
def test_health_endpoint(self, client):
"""Test health check endpoint"""
response = client.get('/health')
assert response.status_code == 200
assert response.json['status'] == 'healthy'
def test_create_user_endpoint(self, client):
"""Test POST /users endpoint"""
user_data = {
"username": "testuser",
"email": "test@example.com",
"password": "securepass123"
}
response = client.post('/api/users', json=user_data)
assert response.status_code == 201
assert response.json['username'] == "testuser"
def test_get_users_endpoint(self, client):
"""Test GET /users endpoint"""
response = client.get('/api/users')
assert response.status_code == 200
assert isinstance(response.json, list)
`,
};
}
return {
test_integration: 'Integration test content',
};
}
private generateTestFixtures(appType: string): any {
return {
users: [
{ id: 1, username: 'user1', email: 'user1@example.com' },
{ id: 2, username: 'user2', email: 'user2@example.com' },
],
products: [
{ id: 1, name: 'Product 1', price: 99.99 },
{ id: 2, name: 'Product 2', price: 149.99 },
],
};
}
private generateMocks(appType: string): any {
return {
database: 'Mock database connection',
externalAPI: 'Mock external API calls',
fileSystem: 'Mock file system operations',
};
}
private generateModules(appType: string, language: string): any {
if (language === 'python' && appType === 'rest-api') {
return {
app: `from flask import Flask
from flask_cors import CORS
from config import Config
from models import db
from routes import api_bp
def create_app(config_name='development'):
app = Flask(__name__)
app.config.from_object(Config[config_name])
# Initialize extensions
db.init_app(app)
CORS(app)
# Register blueprints
app.register_blueprint(api_bp, url_prefix='/api')
# Health check
.route('/health')
def health_check():
return {'status': 'healthy', 'service': 'REST API'}
return app
if __name__ == '__main__':
app = create_app()
app.run(debug=True)
`,
models: `from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
from werkzeug.security import generate_password_hash, check_password_hash
db = SQLAlchemy()
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
password_hash = db.Column(db.String(128))
created_at = db.Column(db.DateTime, default=datetime.utcnow)
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
def set_password(self, password):
self.password_hash = generate_password_hash(password)
def check_password(self, password):
return check_password_hash(self.password_hash, password)
def to_dict(self):
return {
'id': self.id,
'username': self.username,
'email': self.email,
'created_at': self.created_at.isoformat(),
'updated_at': self.updated_at.isoformat()
}
class Product(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), nullable=False)
description = db.Column(db.Text)
price = db.Column(db.Float, nullable=False)
stock = db.Column(db.Integer, default=0)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
def to_dict(self):
return {
'id': self.id,
'name': self.name,
'description': self.description,
'price': self.price,
'stock': self.stock,
'created_at': self.created_at.isoformat()
}
`,
routes: `from flask import Blueprint, request, jsonify
from models import db, User, Product
from services import UserService, ProductService
api_bp = Blueprint('api', __name__)
user_service = UserService()
product_service = ProductService()
# User routes
.route('/users', methods=['GET'])
def get_users():
page = request.args.get('page', 1, type=int)
per_page = request.args.get('per_page', 10, type=int)
users = User.query.paginate(page=page, per_page=per_page)
return jsonify({
'users': [u.to_dict() for u in users.items],
'total': users.total,
'pages': users.pages,
'current_page': page
})
.route('/users/<int:user_id>', methods=['GET'])
def get_user(user_id):
user = User.query.get_or_404(user_id)
return jsonify(user.to_dict())
.route('/users', methods=['POST'])
def create_user():
data = request.get_json()
# Validation
if not data.get('username') or not data.get('email'):
return jsonify({'error': 'Username and email required'}), 400
# Check if user exists
if User.query.filter_by(username=data['username']).first():
return jsonify({'error': 'Username already exists'}), 409
user = user_service.create_user(data)
return jsonify(user.to_dict()), 201
.route('/users/<int:user_id>', methods=['PUT'])
def update_user(user_id):
user = User.query.get_or_404(user_id)
data = request.get_json()
user = user_service.update_user(user, data)
return jsonify(user.to_dict())
.route('/users/<int:user_id>', methods=['DELETE'])
def delete_user(user_id):
user = User.query.get_or_404(user_id)
user_service.delete_user(user)
return '', 204
# Product routes
.route('/products', methods=['GET'])
def get_products():
products = Product.query.all()
return jsonify([p.to_dict() for p in products])
.route('/products', methods=['POST'])
def create_product():
data = request.get_json()
product = product_service.create_product(data)
return jsonify(product.to_dict()), 201
`,
services: `from models import db, User, Product
class UserService:
def create_user(self, data):
user = User(
username=data['username'],
email=data['email']
)
if 'password' in data:
user.set_password(data['password'])
db.session.add(user)
db.session.commit()
return user
def update_user(self, user, data):
if 'username' in data:
user.username = data['username']
if 'email' in data:
user.email = data['email']
if 'password' in data:
user.set_password(data['password'])
db.session.commit()
return user
def delete_user(self, user):
db.session.delete(user)
db.session.commit()
def get_user(self, user_id):
return User.query.get(user_id)
class ProductService:
def create_product(self, data):
product = Product(
name=data['name'],
description=data.get('description', ''),
price=data['price'],
stock=data.get('stock', 0)
)
db.session.add(product)
db.session.commit()
return product
def update_product(self, product, data):
if 'name' in data:
product.name = data['name']
if 'description' in data:
product.description = data['description']
if 'price' in data:
product.price = data['price']
if 'stock' in data:
product.stock = data['stock']
db.session.commit()
return product
`,
config: `import os
from dotenv import load_dotenv
load_dotenv()
class BaseConfig:
SECRET_KEY = os.environ.get('SECRET_KEY', 'dev-secret-key')
SQLALCHEMY_TRACK_MODIFICATIONS = False
class DevelopmentConfig(BaseConfig):
DEBUG = True
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL', 'sqlite:///dev.db')
class TestingConfig(BaseConfig):
TESTING = True
SQLALCHEMY_DATABASE_URI = 'sqlite:///:memory:'
class ProductionConfig(BaseConfig):
DEBUG = False
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL')
Config = {
'development': DevelopmentConfig,
'testing': TestingConfig,
'production': ProductionConfig,
'default': DevelopmentConfig
}
`,
};
}
return {
main: 'Main module implementation',
};
}
private generateClasses(appType: string, language: string): any {
return {
BaseClass: 'Base class implementation',
ServiceClass: 'Service class implementation',
};
}
private generateFunctions(appType: string, language: string): any {
return {
helpers: 'Helper functions',
validators: 'Validation functions',
};
}
private generateConfig(appType: string, language: string): any {
return {
database: 'Database configuration',
api: 'API configuration',
logging: 'Logging configuration',
};
}
private async getProjectFiles(appType: string, language: string): Promise<any> {
if (language === 'python') {
return {
'requirements.txt': `flask==2.3.2
flask-sqlalchemy==3.0.5
flask-cors==4.0.0
python-dotenv==1.0.0
pytest==7.4.0
pytest-cov==4.1.0
black==23.7.0
flake8==6.0.0
`,
'setup.py': `from setuptools import setup, find_packages
setup(
name="${appType}",
version="1.0.0",
packages=find_packages(),
install_requires=[
'flask>=2.3.0',
'flask-sqlalchemy>=3.0.0',
'flask-cors>=4.0.0',
'python-dotenv>=1.0.0',
],
extras_require={
'dev': [
'pytest>=7.4.0',
'pytest-cov>=4.1.0',
'black>=23.7.0',
'flake8>=6.0.0',
]
}
)
`,
'pytest.ini': `[pytest]
testpaths = tests
python_files = test_*.py
python_classes = Test*
python_functions = test_*
addopts = -v --cov=src --cov-report=html --cov-report=term
`,
'.gitignore': `__pycache__/
*.py[cod]
*$py.class
*.so
.Python
env/
venv/
.env
*.db
.coverage
htmlcov/
.pytest_cache/
`,
Dockerfile: `FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["python", "-m", "src.app"]
`,
'docker-compose.yml': `version: '3.8'
services:
app:
build: .
ports:
- "5000:5000"
environment:
- DATABASE_URL=postgresql://user:pass@db:5432/appdb
depends_on:
- db
db:
image: postgres:13
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
- POSTGRES_DB=appdb
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
`,
};
}
return {
'package.json': 'Package configuration',
'.gitignore': 'Git ignore file',
};
}
private calculateCoverage(tests: any, implementation: any): any {
return {
overall: 85,
unit: 90,
integration: 80,
e2e: 70,
};
}
// Formatting methods
private formatRequirements(requirements: any): string {
return `# Requirements
## Functional Requirements
${requirements.functional.map((r: string) => `- ${r}`).join('\n')}
## Non-Functional Requirements
${requirements.nonFunctional.map((r: string) => `- ${r}`).join('\n')}
## Technical Requirements
${requirements.technical.map((r: string) => `- ${r}`).join('\n')}
## Business Requirements
${requirements.business.map((r: string) => `- ${r}`).join('\n')}
`;
}
private formatUserStories(stories: any[]): string {
return `# User Stories
${stories
.map(
(s) => `## ${s.id}: ${s.story}
Priority: ${s.priority}
`,
)
.join('\n')}`;
}
private formatAcceptanceCriteria(criteria: any): string {
return `# Acceptance Criteria
${Object.entries(criteria)
.map(
([category, items]) => `## ${category}
${(items as string[]).map((item) => `- ${item}`).join('\n')}
`,
)
.join('\n')}`;
}
private formatAlgorithms(algorithms: any): string {
return `# Algorithms
${JSON.stringify(algorithms, null, 2)}
`;
}
private formatDataStructures(structures: any): string {
return `# Data Structures
${JSON.stringify(structures, null, 2)}
`;
}
private formatArchitecture(architecture: any): string {
return `# System Architecture
## Components
${JSON.stringify(architecture.components, null, 2)}
## Interfaces
${JSON.stringify(architecture.interfaces, null, 2)}
## Design Patterns
${architecture.patterns.join('\n')}
## Infrastructure
${JSON.stringify(architecture.infrastructure, null, 2)}
`;
}
private formatComponentDiagram(components: any): string {
return `# Component Diagram
\`\`\`mermaid
graph TD
A[Client] --> B[API Gateway]
B --> C[Application Server]
C --> D[Database]
C --> E[Cache]
C --> F[Message Queue]
\`\`\`
`;
}
private formatTestPlan(plan: any): string {
return `# Test Plan
## Test Strategy
- Unit Tests: ${plan.unitTests}
- Integration Tests: ${plan.integrationTests}
- E2E Tests: ${plan.e2eTests}
- Performance Tests: ${plan.performanceTests}
## Coverage Target
Target: ${plan.coverage.target}%
Current: ${plan.coverage.current}%
`;
}
private formatReviewReport(review: any): string {
return `# Code Review Report
## Code Quality
${JSON.stringify(review.codeQuality, null, 2)}
## Security Assessment
${JSON.stringify(review.security, null, 2)}
## Performance Assessment
${JSON.stringify(review.performance, null, 2)}
## Maintainability
${JSON.stringify(review.maintainability, null, 2)}
## Recommendations
${review.recommendations.map((r: string) => `- ${r}`).join('\n')}
`;
}
private generateReadme(task: TaskDefinition): string {
return `# ${task.name}
${task.description}
## Installation
\`\`\`bash
# Clone the repository
git clone <repository-url>
cd <project-directory>
# Install dependencies
pip install -r requirements.txt
# or
npm install
\`\`\`
## Usage
\`\`\`bash
# Run the application
python -m src.app
# or
npm start
\`\`\`
## Testing
\`\`\`bash
# Run tests
pytest
# or
npm test
\`\`\`
## Documentation
See the \`docs/\` directory for detailed documentation.
## License
MIT
`;
}
private generateApiDocs(task: TaskDefinition): string {
return `# API Documentation
## Endpoints
### GET /api/users
Retrieve all users
### POST /api/users
Create a new user
### GET /api/users/:id
Retrieve a specific user
### PUT /api/users/:id
Update a user
### DELETE /api/users/:id
Delete a user
`;
}
private generateUserGuide(task: TaskDefinition): string {
return `# User Guide
## Getting Started
1. Install the application
2. Configure your environment
3. Start using the features
## Features
- Feature 1: Description
- Feature 2: Description
- Feature 3: Description
`;
}
private generateDeveloperGuide(task: TaskDefinition): string {
return `# Developer Guide
## Architecture
The application follows a modular architecture...
## Development Setup
1. Clone the repository
2. Install dependencies
3. Set up development environment
## Contributing
Please follow our contribution guidelines...
`;
}
// Additional helper methods
private assessCodeQuality(task: TaskDefinition): any {
return {
complexity: 'Low to Medium',
duplication: 'Minimal',
testCoverage: '85%',
linting: 'Passing',
};
}
private assessSecurity(task: TaskDefinition): any {
return {
authentication: 'Implemented',
authorization: 'Role-based',
inputValidation: 'Comprehensive',
encryption: 'At rest and in transit',
};
}
private assessPerformance(task: TaskDefinition): any {
return {
responseTime: 'Average 150ms',
throughput: '1000 req/s',
scalability: 'Horizontal scaling ready',
caching: 'Implemented',
};
}
private assessMaintainability(task: TaskDefinition): any {
return {
readability: 'High',
modularity: 'Well-structured',
documentation: 'Comprehensive',
dependencies: 'Up to date',
};
}
private generateRecommendations(task: TaskDefinition): string[] {
return [
'Consider implementing rate limiting',
'Add more comprehensive error handling',
'Implement request logging',
'Add performance monitoring',
'Consider using a CDN for static assets',
];
}
private generateUnitTests(task: TaskDefinition): any {
return 'Comprehensive unit test suite';
}
private generateIntegrationTests(task: TaskDefinition): any {
return 'Integration test scenarios';
}
private generateE2ETests(task: TaskDefinition): any {
return 'End-to-end test scenarios';
}
private generatePerformanceTests(task: TaskDefinition): any {
return 'Performance test suite';
}
private identifyConstraints(objective: string): string[] {
return [
'Must complete within timeline',
'Must stay within budget',
'Must meet performance requirements',
'Must be maintainable',
];
}
private designComponents(appType: string): any {
return {
frontend: 'UI Components',
backend: 'API Services',
database: 'Data Layer',
infrastructure: 'Cloud Services',
};
}
private designInterfaces(appType: string): any {
return {
api: 'REST/GraphQL interfaces',
database: 'Data access interfaces',
external: 'Third-party integrations',
};
}
private selectPatterns(appType: string): string[] {
return ['MVC/MVP Pattern', 'Repository Pattern', 'Factory Pattern', 'Observer Pattern'];
}
private designInfrastructure(appType: string): any {
return {
hosting: 'Cloud platform',
database: 'Managed database service',
caching: 'Redis/Memcached',
monitoring: 'APM solution',
};
}
private generateAlgorithms(appType: string): any {
return {
dataProcessing: 'Data processing algorithms',
businessLogic: 'Core business logic',
optimization: 'Performance optimization',
};
}
private generateDataStructures(appType: string): any {
return {
models: 'Data models',
schemas: 'Database schemas',
interfaces: 'TypeScript interfaces',
};
}
private generateFlowDiagrams(appType: string): any {
return {
userFlow: 'User interaction flow',
dataFlow: 'Data processing flow',
systemFlow: 'System architecture flow',
};
}
private executeAnalysisPhase(task: TaskDefinition, targetDir?: string): Promise<any> {
return this.executeAnalyzerTask(task, targetDir);
}
private executeImplementationPhase(task: TaskDefinition, targetDir?: string): Promise<any> {
return this.executeTDDPhase(task, targetDir);
}
private executeCoordinationPhase(task: TaskDefinition, targetDir?: string): Promise<any> {
return this.executeCoordinationTask(task, targetDir);
}
private executeGenericPhase(task: TaskDefinition, targetDir?: string): Promise<any> {
return this.executeGenericTask(task, targetDir);
}
private async executeAnalyzerTask(task: TaskDefinition, targetDir?: string): Promise<any> {
return this.executeSpecificationPhase(task, targetDir);
}
private async executeCoordinationTask(task: TaskDefinition, targetDir?: string): Promise<any> {
return {
phase: 'coordination',
status: 'Task coordinated',
quality: 0.9,
completeness: 0.95,
};
}
private async executeGenericTask(task: TaskDefinition, targetDir?: string): Promise<any> {
return {
phase: 'generic',
status: 'Task completed',
quality: 0.85,
completeness: 0.9,
};
}
}