@godrix/flow
Version:
Context-Driven Development CLI: Create structured task contexts with AI-optimized templates for efficient software development workflow
1,333 lines (1,236 loc) • 131 kB
JavaScript
#!/usr/bin/env node
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
import { createTaskContext } from './services/taskService.js';
import fs from 'fs-extra';
import path from 'path';
const server = new Server({
name: 'flow-mcp-server',
version: '1.10.0',
}, {
capabilities: {
tools: {},
},
});
// Define available tools
const tools = [
{
name: 'create_task',
description: 'Create a new task with structured templates and auto-generated content',
inputSchema: {
type: 'object',
properties: {
taskName: {
type: 'string',
description: 'Name of the task (e.g., task-1234, FEATURE_AUTH)',
},
taskType: {
type: 'string',
enum: ['feature', 'bug', 'improvement', 'research'],
description: 'Type of task to create',
default: 'feature',
},
workingDirectory: {
type: 'string',
description: 'Working directory where the task should be created (defaults to current directory)',
},
description: {
type: 'string',
description: 'Description of the task for auto-generating content',
},
autoGenerate: {
type: 'boolean',
description: 'Whether to auto-generate BUSINESS_CONTEXT.md and APPROACH.md content (default: true)',
},
},
required: ['taskName'],
},
},
{
name: 'list_tasks',
description: 'List all existing tasks in the current project',
inputSchema: {
type: 'object',
properties: {
workingDirectory: {
type: 'string',
description: 'Working directory to list tasks from (defaults to current directory)',
},
},
},
},
{
name: 'validate_task',
description: 'Validate the structure of a specific task',
inputSchema: {
type: 'object',
properties: {
taskName: {
type: 'string',
description: 'Name of the task to validate',
},
workingDirectory: {
type: 'string',
description: 'Working directory to validate task from (defaults to current directory)',
},
},
required: ['taskName'],
},
},
{
name: 'get_task_info',
description: 'Get detailed information about a specific task',
inputSchema: {
type: 'object',
properties: {
taskName: {
type: 'string',
description: 'Name of the task to get information about',
},
workingDirectory: {
type: 'string',
description: 'Working directory to get task info from (defaults to current directory)',
},
},
required: ['taskName'],
},
},
{
name: 'get_project_status',
description: 'Get overall project status and statistics',
inputSchema: {
type: 'object',
properties: {
workingDirectory: {
type: 'string',
description: 'Working directory to get project status from (defaults to current directory)',
},
},
},
},
{
name: 'generate_business_context',
description: 'Generate BUSINESS_CONTEXT.md content based on task description',
inputSchema: {
type: 'object',
properties: {
taskName: {
type: 'string',
description: 'Name of the task',
},
description: {
type: 'string',
description: 'Detailed description of what needs to be implemented',
},
// Tag-specific parameters
context: {
type: 'string',
description: 'Context description to fill the <context> tag',
},
businessValue: {
type: 'string',
description: 'Business value to fill the <business_value> tag',
},
validationRules: {
type: 'string',
description: 'Validation rules to fill the <validation_rules> tag',
},
businessLogic: {
type: 'string',
description: 'Business logic to fill the <business_logic> tag',
},
dataConstraints: {
type: 'string',
description: 'Data constraints to fill the <data_constraints> tag',
},
positiveScenario: {
type: 'string',
description: 'Positive scenario to fill the <positive_scenario> tag',
},
negativeScenario: {
type: 'string',
description: 'Negative scenario to fill the <negative_scenario> tag',
},
edgeCaseScenario: {
type: 'string',
description: 'Edge case scenario to fill the <edge_case_scenario> tag',
},
functionalCriteria: {
type: 'string',
description: 'Functional criteria to fill the <functional_criteria> tag',
},
nonFunctionalCriteria: {
type: 'string',
description: 'Non-functional criteria to fill the <non_functional_criteria> tag',
},
apiEndpoints: {
type: 'string',
description: 'API endpoints to fill the <api_endpoints> tag',
},
externalServices: {
type: 'string',
description: 'External services to fill the <external_services> tag',
},
loggingRequirements: {
type: 'string',
description: 'Logging requirements to fill the <logging_requirements> tag',
},
analyticsRequirements: {
type: 'string',
description: 'Analytics requirements to fill the <analytics_requirements> tag',
},
// Generic parameters
priority: {
type: 'string',
description: 'Task priority',
},
estimate: {
type: 'string',
description: 'Task estimate',
},
stakeholder: {
type: 'string',
description: 'Task stakeholder',
},
deadline: {
type: 'string',
description: 'Task deadline',
},
responsible: {
type: 'string',
description: 'Task responsible',
},
taskType: {
type: 'string',
enum: ['feature', 'bug', 'improvement', 'research'],
description: 'Type of task',
default: 'feature',
},
},
required: ['taskName', 'description'],
},
},
{
name: 'generate_approach',
description: 'Generate APPROACH.md content based on business context and codebase analysis',
inputSchema: {
type: 'object',
properties: {
taskName: {
type: 'string',
description: 'Name of the task',
},
businessContext: {
type: 'string',
description: 'Business context content to base the approach on',
},
techStack: {
type: 'array',
items: { type: 'string' },
description: 'Technologies used in the project',
},
architecture: {
type: 'string',
description: 'Current architecture description',
},
},
required: ['taskName', 'businessContext'],
},
},
{
name: 'generate_completion_report',
description: 'Generate COMPLETION_REPORT.md content based on work done',
inputSchema: {
type: 'object',
properties: {
taskName: {
type: 'string',
description: 'Name of the task',
},
workDone: {
type: 'array',
items: { type: 'string' },
description: 'List of work items completed',
},
issuesFound: {
type: 'array',
items: { type: 'string' },
description: 'Issues or bugs found during implementation',
},
deviations: {
type: 'array',
items: { type: 'string' },
description: 'Deviations from original plan',
},
metrics: {
type: 'object',
properties: {
duration: { type: 'string' },
filesChanged: { type: 'number' },
linesAdded: { type: 'number' },
linesRemoved: { type: 'number' },
testCoverage: { type: 'number' },
},
description: 'Implementation metrics',
},
},
required: ['taskName', 'workDone'],
},
},
{
name: 'analyze_codebase',
description: 'Analyze the current codebase to understand structure and dependencies',
inputSchema: {
type: 'object',
properties: {
path: {
type: 'string',
description: 'Path to analyze (defaults to current directory)',
default: '.',
},
includePatterns: {
type: 'array',
items: { type: 'string' },
description: 'File patterns to include in analysis',
default: ['**/*.ts', '**/*.js', '**/*.tsx', '**/*.jsx', '**/*.py', '**/*.java', '**/*.go'],
},
excludePatterns: {
type: 'array',
items: { type: 'string' },
description: 'File patterns to exclude from analysis',
default: ['node_modules/**', 'dist/**', 'build/**', '.git/**'],
},
workingDirectory: {
type: 'string',
description: 'Working directory to analyze from (defaults to current directory)',
},
},
},
},
{
name: 'update_project_context',
description: 'Update PROJECT_CONTEXT.md with new information or create it if it does not exist',
inputSchema: {
type: 'object',
properties: {
mission: {
type: 'string',
description: 'Updated mission statement',
},
goals: {
type: 'array',
items: { type: 'string' },
description: 'Updated long-term goals',
},
techStack: {
type: 'array',
items: {
type: 'object',
properties: {
category: { type: 'string' },
technology: { type: 'string' },
version: { type: 'string' },
justification: { type: 'string' }
},
required: ['category', 'technology']
},
description: 'Updated technology stack',
},
architecture: {
type: 'object',
properties: {
principles: { type: 'array', items: { type: 'string' } },
patterns: { type: 'object' },
guidelines: { type: 'array', items: { type: 'string' } }
},
description: 'Updated architectural principles and patterns',
},
standards: {
type: 'object',
properties: {
coding: { type: 'array', items: { type: 'string' } },
quality: { type: 'array', items: { type: 'string' } },
git: { type: 'array', items: { type: 'string' } }
},
description: 'Updated development standards',
},
tools: {
type: 'object',
properties: {
development: { type: 'array', items: { type: 'string' } },
monitoring: { type: 'array', items: { type: 'string' } },
ci_cd: { type: 'array', items: { type: 'string' } }
},
description: 'Updated tools and configurations',
},
metrics: {
type: 'object',
properties: {
technical: { type: 'object' },
business: { type: 'object' }
},
description: 'Updated success metrics',
},
notes: {
type: 'string',
description: 'Additional notes or context about the project',
},
workingDirectory: {
type: 'string',
description: 'Working directory to update project context in (defaults to current directory)',
},
},
},
},
{
name: 'add_tech_instruction',
description: 'Add custom technical instruction to AGENTS.md development section',
inputSchema: {
type: 'object',
properties: {
instruction: {
type: 'string',
description: 'Technical instruction to add (e.g., specific commands, tools, or practices)',
},
section: {
type: 'string',
description: 'Section to add instruction to: development, pr, or both (default: development)',
enum: ['development', 'pr', 'both'],
},
workingDirectory: {
type: 'string',
description: 'Working directory containing AGENTS.md (defaults to current directory)',
},
},
required: ['instruction'],
},
},
{
name: 'update_agents_template',
description: 'Intelligently update AGENTS.md template while preserving user customizations',
inputSchema: {
type: 'object',
properties: {
workingDirectory: {
type: 'string',
description: 'Working directory where the AGENTS.md file is located',
},
forceUpdate: {
type: 'boolean',
description: 'Force update even if no version changes detected (default: false)',
default: false,
},
preserveCustomizations: {
type: 'boolean',
description: 'Preserve user customizations in development and PR sections (default: true)',
default: true,
},
backupOriginal: {
type: 'boolean',
description: 'Create backup of original file before updating (default: true)',
default: true,
},
},
},
},
{
name: 'check_agents_update',
description: 'Check if AGENTS.md template has updates available without applying them',
inputSchema: {
type: 'object',
properties: {
workingDirectory: {
type: 'string',
description: 'Working directory where the AGENTS.md file is located',
},
showDetails: {
type: 'boolean',
description: 'Show detailed comparison between current and template versions (default: false)',
default: false,
},
},
},
},
{
name: 'init_flow_project',
description: 'Initialize a new Flow project with .flow directory, PROJECT_CONTEXT.md, and AGENTS.md',
inputSchema: {
type: 'object',
properties: {
projectName: {
type: 'string',
description: 'Name of the project',
},
mission: {
type: 'string',
description: 'Project mission statement',
},
goals: {
type: 'array',
items: { type: 'string' },
description: 'Long-term project goals',
},
techStack: {
type: 'array',
items: {
type: 'object',
properties: {
category: { type: 'string' },
technology: { type: 'string' },
version: { type: 'string' },
justification: { type: 'string' }
},
required: ['category', 'technology']
},
description: 'Technology stack for the project',
},
architecture: {
type: 'object',
properties: {
principles: { type: 'array', items: { type: 'string' } },
patterns: { type: 'object' },
guidelines: { type: 'array', items: { type: 'string' } }
},
description: 'Architectural principles and patterns',
},
standards: {
type: 'object',
properties: {
coding: { type: 'array', items: { type: 'string' } },
quality: { type: 'array', items: { type: 'string' } },
git: { type: 'array', items: { type: 'string' } }
},
description: 'Development standards',
},
tools: {
type: 'object',
properties: {
development: { type: 'array', items: { type: 'string' } },
monitoring: { type: 'array', items: { type: 'string' } },
ci_cd: { type: 'array', items: { type: 'string' } }
},
description: 'Tools and configurations',
},
metrics: {
type: 'object',
properties: {
technical: { type: 'object' },
business: { type: 'object' }
},
description: 'Success metrics',
},
notes: {
type: 'string',
description: 'Additional project notes',
},
workingDirectory: {
type: 'string',
description: 'Working directory where the project should be initialized (defaults to current directory)',
},
agentsScoped: {
type: 'boolean',
description: 'If true, creates AGENTS.md inside .flow directory (legacy behavior). If false or not provided, creates AGENTS.md in project root (default)',
},
},
},
},
];
// List tools handler
server.setRequestHandler(ListToolsRequestSchema, async () => {
return { tools };
});
// Helper functions for auto-generating content
function generateBusinessContextContent(taskName, description, taskType) {
const typeConfig = {
feature: { icon: '✨', category: 'Feature', priority: 'Alta' },
bug: { icon: '🐛', category: 'Bug Fix', priority: 'Crítica' },
improvement: { icon: '🔧', category: 'Improvement', priority: 'Média' },
research: { icon: '🔬', category: 'Research', priority: 'Baixa' }
};
const config = typeConfig[taskType] || typeConfig.feature;
// Generate more specific content based on task name and description
const specificScenarios = generateSpecificScenarios(taskName, description, taskType);
const specificAcceptanceCriteria = generateSpecificAcceptanceCriteria(taskName, description, taskType);
const specificBusinessValue = generateSpecificBusinessValue(taskName, description, taskType);
return `# Contexto de Negócio: ${taskName}
## 🎯 Visão Geral da Feature
### User Story Principal
**Como** usuário do sistema
**Eu quero** ${description.toLowerCase()}
**Para que** possa ter uma melhor experiência e eficiência
### Descrição da Feature
${description}
### Valor de Negócio
${specificBusinessValue}
- **Prioridade**: ${config.priority} - ${config.category}
## 📋 Especificações Comportamentais (Gherkin)
${specificScenarios}
## ✅ Critérios de Aceitação
${specificAcceptanceCriteria}
## 📊 Métricas de Sucesso
### Técnicas
- **Performance**: Tempo de resposta < 2 segundos
- **Disponibilidade**: 99.9% de uptime
- **Taxa de Erro**: < 0.1%
### Negócio
- **Adoção**: 80% dos usuários utilizam a funcionalidade
- **Satisfação**: Score > 4.0/5.0
- **Eficiência**: Redução de 20% no tempo de execução
## 🔗 Dependências e Integrações
### Dependências Internas
- Sistema de autenticação
- Base de dados principal
- Sistema de logs
### Dependências Externas
- APIs de terceiros (se aplicável)
- Serviços de notificação (se aplicável)
## 📝 Notas Adicionais
### Considerações Especiais
- Esta funcionalidade deve ser compatível com versões anteriores
- Deve seguir os padrões de design estabelecidos
- Deve ser testada em ambiente de staging antes do deploy
### Riscos Identificados
- **Risco**: Possível impacto na performance
- **Mitigação**: Implementar cache e otimizações adequadas
---
**Última Atualização**: ${new Date().toISOString().split('T')[0]}
**Responsável**: A definir
**Status**: Em desenvolvimento`;
}
function generateSpecificScenarios(taskName, description, taskType) {
const scenarios = [];
if (taskType === 'bug') {
scenarios.push(`### Cenário 1: Reprodução do Bug
*Cenário que reproduz o problema*
**Given** o usuário está no sistema
**And** tem as condições que causam o bug
**When** executa a ação que desencadeia o problema
**Then** o sistema deve apresentar o comportamento correto
**And** não deve mais ocorrer o erro reportado`);
}
else if (taskType === 'feature') {
scenarios.push(`### Cenário 1: Funcionalidade Principal
*Cenário de sucesso principal*
**Given** o usuário está no sistema
**And** tem as permissões necessárias
**When** executa a ação principal
**Then** deve receber o resultado esperado
**And** o sistema deve registrar a ação`);
}
else if (taskType === 'improvement') {
scenarios.push(`### Cenário 1: Melhoria Implementada
*Cenário com a melhoria aplicada*
**Given** o usuário está no sistema
**And** tem acesso à funcionalidade melhorada
**When** utiliza a funcionalidade
**Then** deve ter uma experiência melhorada
**And** deve notar a diferença na performance/usabilidade`);
}
else {
scenarios.push(`### Cenário 1: Investigação Principal
*Cenário de pesquisa principal*
**Given** o pesquisador está no sistema
**And** tem acesso às ferramentas de análise
**When** executa a investigação
**Then** deve obter dados relevantes
**And** deve poder documentar os achados`);
}
scenarios.push(`### Cenário 2: Caso de Erro
*Cenário quando algo dá errado*
**Given** o usuário está no sistema
**And** não tem as permissões necessárias
**When** tenta executar a ação
**Then** deve receber uma mensagem de erro clara
**And** a ação não deve ser executada`);
scenarios.push(`### Cenário 3: Validação de Dados
*Cenário de validação de entrada*
**Given** o usuário está no sistema
**And** tem dados inválidos
**When** tenta executar a ação
**Then** deve receber feedback sobre os dados inválidos
**And** deve poder corrigir os dados`);
return scenarios.join('\n\n');
}
function generateSpecificAcceptanceCriteria(taskName, description, taskType) {
const criteria = [];
if (taskType === 'bug') {
criteria.push(`### Correção do Bug
- [ ] O bug reportado foi corrigido
- [ ] Não há regressões em funcionalidades relacionadas
- [ ] O comportamento está conforme especificado
- [ ] Testes de regressão passaram`);
}
else if (taskType === 'feature') {
criteria.push(`### Funcionalidade Principal
- [ ] A funcionalidade executa conforme especificado
- [ ] Retorna resultado esperado em tempo adequado
- [ ] Registra logs apropriados
- [ ] Funciona em diferentes navegadores/dispositivos`);
}
else if (taskType === 'improvement') {
criteria.push(`### Melhoria Implementada
- [ ] A melhoria está funcionando conforme esperado
- [ ] Performance/usabilidade foi melhorada
- [ ] Não há impacto negativo em funcionalidades existentes
- [ ] Métricas de melhoria foram atingidas`);
}
else {
criteria.push(`### Investigação Completa
- [ ] Pesquisa foi conduzida conforme metodologia
- [ ] Dados foram coletados e analisados
- [ ] Conclusões foram documentadas
- [ ] Recomendações foram formuladas`);
}
criteria.push(`### Segurança e Validação
- [ ] Valida permissões do usuário
- [ ] Sanitiza dados de entrada
- [ ] Trata erros graciosamente
- [ ] Segue padrões de segurança estabelecidos`);
criteria.push(`### Performance e Usabilidade
- [ ] Responde em menos de 2 segundos
- [ ] Tem interface intuitiva
- [ ] Fornece feedback visual adequado
- [ ] É acessível conforme padrões WCAG`);
return criteria.join('\n\n');
}
function generateSpecificBusinessValue(taskName, description, taskType) {
if (taskType === 'bug') {
return `- **Impacto**: Correção deste bug melhora a estabilidade do sistema e a confiança dos usuários
- **Métricas**: Redução de tickets de suporte relacionados e aumento na satisfação do usuário
- **Urgência**: Bug crítico que afeta funcionalidade principal`;
}
else if (taskType === 'feature') {
return `- **Impacto**: Esta funcionalidade melhora a experiência do usuário e aumenta a eficiência do sistema
- **Métricas**: Esperamos ver uma melhoria na satisfação do usuário e redução no tempo de execução
- **ROI**: Funcionalidade estratégica que agrega valor ao produto`;
}
else if (taskType === 'improvement') {
return `- **Impacto**: Esta melhoria otimiza processos existentes e aumenta a produtividade
- **Métricas**: Melhoria na performance, redução de tempo de execução e aumento na satisfação
- **Benefício**: Otimização incremental que gera valor contínuo`;
}
else {
return `- **Impacto**: Esta pesquisa fornece insights valiosos para tomada de decisões estratégicas
- **Métricas**: Qualidade dos dados coletados e relevância das conclusões obtidas
- **Valor**: Conhecimento que pode ser aplicado em futuras implementações`;
}
}
function generateApproachContent(taskName, businessContext, taskType) {
// Extract key information from business context
const hasGherkin = businessContext.includes('Given') && businessContext.includes('When') && businessContext.includes('Then');
const hasAcceptanceCriteria = businessContext.includes('Critérios de Aceitação');
const typeConfig = {
feature: { icon: '✨', focus: 'Nova funcionalidade', complexity: 'Média' },
bug: { icon: '🐛', focus: 'Correção de problema', complexity: 'Baixa' },
improvement: { icon: '🔧', focus: 'Melhoria existente', complexity: 'Média' },
research: { icon: '🔬', focus: 'Investigação', complexity: 'Alta' }
};
const config = typeConfig[taskType] || typeConfig.feature;
// Generate specific technical approach based on task type
const specificImplementation = generateSpecificImplementation(taskName, taskType);
const specificTesting = generateSpecificTesting(taskName, taskType);
const specificArchitecture = generateSpecificArchitecture(taskName, taskType);
return `# Abordagem Técnica: ${taskName}
## 🎯 Visão Geral da Solução
### Objetivo Técnico
${config.focus} para ${taskName.toLowerCase()}
### Complexidade Estimada
- **Nível**: ${config.complexity}
- **Tempo Estimado**: ${taskType === 'bug' ? '2-4 horas' : taskType === 'feature' ? '1-2 dias' : taskType === 'improvement' ? '4-8 horas' : '1-3 dias'}
- **Risco**: ${taskType === 'bug' ? 'Baixo' : 'Médio'}
## 🏗️ Arquitetura da Solução
${specificArchitecture}
## 🔧 Implementação Técnica
${specificImplementation}
## 🧪 Estratégia de Testes
${specificTesting}
## 📋 Checklist de Implementação
### Preparação
- [ ] Analisar requisitos detalhadamente
- [ ] Revisar arquitetura existente
- [ ] Identificar dependências
- [ ] Planejar estrutura de dados
### Desenvolvimento
- [ ] Implementar estrutura base
- [ ] Desenvolver lógica principal
- [ ] Implementar validações
- [ ] Adicionar tratamento de erros
### Testes
- [ ] Escrever testes unitários
- [ ] Executar testes de integração
- [ ] Validar cenários de aceitação
- [ ] Testar performance
### Deploy
- [ ] Revisar código
- [ ] Executar testes em staging
- [ ] Preparar documentação
- [ ] Deploy em produção
## 🔍 Validação e Qualidade
### Code Review
- [ ] Revisar lógica de implementação
- [ ] Verificar padrões de código
- [ ] Validar tratamento de erros
- [ ] Confirmar testes adequados
### Performance
- [ ] Medir tempo de resposta
- [ ] Verificar uso de memória
- [ ] Otimizar consultas se necessário
- [ ] Implementar cache se aplicável
### Segurança
- [ ] Validar entrada de dados
- [ ] Verificar permissões
- [ ] Implementar logging de auditoria
- [ ] Revisar vulnerabilidades
## 📚 Documentação
### Técnica
- [ ] Documentar APIs
- [ ] Explicar algoritmos complexos
- [ ] Criar diagramas de arquitetura
- [ ] Atualizar README se necessário
### Usuário
- [ ] Criar guia de uso
- [ ] Documentar funcionalidades
- [ ] Preparar exemplos práticos
- [ ] Atualizar documentação existente
## ⚠️ Riscos e Mitigações
### Riscos Técnicos
- **Risco**: Impacto na performance
- **Mitigação**: Implementar otimizações e monitoramento
- **Risco**: Quebra de funcionalidades existentes
- **Mitigação**: Testes extensivos e deploy gradual
### Riscos de Negócio
- **Risco**: Não atender expectativas do usuário
- **Mitigação**: Validação contínua e feedback
## 📈 Métricas de Sucesso
### Técnicas
- **Cobertura de Testes**: > 80%
- **Performance**: Tempo de resposta < 2s
- **Disponibilidade**: 99.9% uptime
### Qualidade
- **Bugs em Produção**: 0 bugs críticos
- **Code Review**: Aprovação de 2+ revisores
- **Documentação**: 100% das APIs documentadas
---
**Última Atualização**: ${new Date().toISOString().split('T')[0]}
**Responsável**: A definir
**Status**: Em desenvolvimento`;
}
function generateSpecificArchitecture(taskName, taskType) {
if (taskType === 'bug') {
return `### Componentes Afetados
1. **Root Cause**: Identificar componente que causa o bug
2. **Impact Analysis**: Analisar componentes relacionados
3. **Fix Implementation**: Implementar correção mínima
4. **Regression Testing**: Validar que não quebrou outras funcionalidades
### Fluxo de Correção
\`\`\`
1. Reproduzir o bug
2. Identificar causa raiz
3. Implementar correção
4. Testar cenários afetados
5. Validar regressões
6. Deploy da correção
\`\`\``;
}
else if (taskType === 'feature') {
return `### Componentes Principais
1. **Controller/Handler**: Gerencia requisições e validações
2. **Service Layer**: Contém lógica de negócio
3. **Repository/DAO**: Gerencia acesso a dados
4. **Model/Entity**: Representa estruturas de dados
### Fluxo de Execução
\`\`\`
1. Validação de entrada
2. Verificação de permissões
3. Processamento da lógica de negócio
4. Persistência de dados
5. Retorno de resposta
6. Logging de auditoria
\`\`\``;
}
else if (taskType === 'improvement') {
return `### Componentes a Otimizar
1. **Performance Layer**: Otimizar consultas e algoritmos
2. **UI/UX Layer**: Melhorar interface e experiência
3. **Data Layer**: Otimizar estrutura de dados
4. **Integration Layer**: Melhorar integrações
### Fluxo de Melhoria
\`\`\`
1. Baseline de performance atual
2. Identificar gargalos
3. Implementar otimizações
4. Medir melhorias
5. Validar impacto
6. Deploy das melhorias
\`\`\``;
}
else {
return `### Componentes de Pesquisa
1. **Data Collection**: Coleta de dados relevantes
2. **Analysis Layer**: Análise e processamento
3. **Reporting Layer**: Documentação de achados
4. **Recommendation Engine**: Geração de recomendações
### Fluxo de Investigação
\`\`\`
1. Definição de hipóteses
2. Coleta de dados
3. Análise estatística
4. Interpretação de resultados
5. Documentação de achados
6. Formulação de recomendações
\`\`\``;
}
}
function generateSpecificImplementation(taskName, taskType) {
if (taskType === 'bug') {
return `### 1. Análise do Problema
- **Reprodução**: Documentar passos para reproduzir o bug
- **Causa Raiz**: Identificar componente responsável
- **Impacto**: Avaliar funcionalidades afetadas
- **Priorização**: Definir urgência da correção
### 2. Correção Mínima
- **Fix**: Implementar correção com menor impacto
- **Validação**: Verificar que corrige o problema
- **Regressão**: Garantir que não quebra outras funcionalidades
- **Documentação**: Documentar a correção aplicada
### 3. Testes de Validação
- **Unit Tests**: Testar componente corrigido
- **Integration Tests**: Validar integração
- **Regression Tests**: Executar bateria de testes
- **Manual Testing**: Validação manual do cenário`;
}
else if (taskType === 'feature') {
return `### 1. Estrutura de Dados
- **Entidades**: Definir modelos de dados necessários
- **Validações**: Implementar regras de validação
- **Relacionamentos**: Estabelecer conexões entre entidades
### 2. API/Interface
- **Endpoints**: Definir rotas e métodos HTTP
- **Parâmetros**: Especificar entrada e saída
- **Respostas**: Padronizar formato de retorno
- **Tratamento de Erros**: Implementar códigos de status apropriados
### 3. Lógica de Negócio
- **Algoritmos**: Implementar processamento principal
- **Validações**: Verificar regras de negócio
- **Transformações**: Converter dados conforme necessário
- **Integrações**: Conectar com serviços externos
### 4. Persistência
- **Database**: Estruturar tabelas/coleções
- **Queries**: Otimizar consultas de dados
- **Transações**: Garantir consistência
- **Backup**: Implementar estratégias de backup`;
}
else if (taskType === 'improvement') {
return `### 1. Análise de Performance
- **Baseline**: Medir performance atual
- **Profiling**: Identificar gargalos
- **Bottlenecks**: Localizar pontos de melhoria
- **Targets**: Definir metas de melhoria
### 2. Otimizações
- **Algoritmos**: Otimizar lógica de processamento
- **Queries**: Melhorar consultas de banco
- **Cache**: Implementar estratégias de cache
- **UI/UX**: Melhorar experiência do usuário
### 3. Validação de Melhorias
- **Métricas**: Medir impacto das otimizações
- **Comparação**: Comparar antes/depois
- **A/B Testing**: Validar melhorias com usuários
- **Monitoring**: Implementar monitoramento contínuo`;
}
else {
return `### 1. Metodologia de Pesquisa
- **Hipóteses**: Definir hipóteses a testar
- **Metodologia**: Escolher abordagem de pesquisa
- **Dados**: Identificar fontes de dados
- **Análise**: Definir métodos de análise
### 2. Coleta de Dados
- **Instrumentos**: Desenvolver ferramentas de coleta
- **Amostragem**: Definir estratégia de amostragem
- **Qualidade**: Garantir qualidade dos dados
- **Ética**: Seguir princípios éticos
### 3. Análise e Interpretação
- **Estatística**: Aplicar métodos estatísticos
- **Visualização**: Criar visualizações dos dados
- **Interpretação**: Interpretar resultados
- **Validação**: Validar conclusões`;
}
}
function generateSpecificTesting(taskName, taskType) {
if (taskType === 'bug') {
return `### Testes de Correção
- [ ] Testar cenário que reproduz o bug
- [ ] Validar que o bug foi corrigido
- [ ] Executar testes de regressão
- [ ] Verificar funcionalidades relacionadas
### Testes de Validação
- [ ] Testar casos extremos
- [ ] Validar diferentes cenários de entrada
- [ ] Verificar performance após correção
- [ ] Confirmar que não há regressões`;
}
else if (taskType === 'feature') {
return `### Testes Unitários
- [ ] Testar funções individuais
- [ ] Validar lógica de negócio
- [ ] Verificar tratamento de erros
- [ ] Cobrir casos extremos
### Testes de Integração
- [ ] Testar comunicação entre componentes
- [ ] Validar fluxo completo
- [ ] Verificar integrações externas
- [ ] Testar cenários de falha
### Testes de Aceitação
- [ ] Implementar cenários Gherkin definidos
- [ ] Validar comportamento esperado
- [ ] Verificar interface do usuário
- [ ] Testar performance`;
}
else if (taskType === 'improvement') {
return `### Testes de Performance
- [ ] Medir baseline de performance
- [ ] Testar melhorias implementadas
- [ ] Comparar métricas antes/depois
- [ ] Validar metas de melhoria
### Testes de Regressão
- [ ] Executar bateria completa de testes
- [ ] Verificar funcionalidades existentes
- [ ] Validar integrações
- [ ] Confirmar estabilidade`;
}
else {
return `### Testes de Validação
- [ ] Validar metodologia de pesquisa
- [ ] Verificar qualidade dos dados
- [ ] Testar instrumentos de coleta
- [ ] Confirmar análise estatística
### Testes de Confiabilidade
- [ ] Repetir experimentos
- [ ] Validar resultados
- [ ] Verificar consistência
- [ ] Confirmar reprodutibilidade`;
}
}
function generateCompletionReportContent(taskName, taskType) {
const typeConfig = {
feature: { icon: '✨', status: 'Em Desenvolvimento', phase: 'Implementação' },
bug: { icon: '🐛', status: 'Em Correção', phase: 'Debug' },
improvement: { icon: '🔧', status: 'Em Otimização', phase: 'Melhoria' },
research: { icon: '🔬', status: 'Em Investigação', phase: 'Pesquisa' }
};
const config = typeConfig[taskType] || typeConfig.feature;
const currentDate = new Date().toISOString().split('T')[0];
return `# Relatório de Progresso: ${taskName}
## 📊 Status Atual
**Status**: ${config.status}
**Fase**: ${config.phase}
**Iniciado em**: ${currentDate}
**Última Atualização**: ${currentDate}
**Responsável**: A definir
## 🎯 Objetivos da Task
### Objetivo Principal
${taskType === 'bug' ? 'Corrigir o bug reportado e garantir que não há regressões' :
taskType === 'feature' ? 'Implementar nova funcionalidade conforme especificações' :
taskType === 'improvement' ? 'Otimizar funcionalidade existente para melhor performance' :
'Conduzir investigação e documentar achados'}
### Critérios de Sucesso
- [ ] Funcionalidade implementada/testada conforme especificações
- [ ] Todos os testes passando
- [ ] Documentação atualizada
- [ ] Code review aprovado
- [ ] Deploy realizado com sucesso
## 📋 Log de Atividades
### ${currentDate} - Início da Task
- [x] Task criada e contexto inicializado
- [x] Arquivos de documentação gerados
- [ ] Análise detalhada dos requisitos
- [ ] Planejamento técnico detalhado
- [ ] Início da implementação
### Próximas Atividades
- [ ] Implementar funcionalidade principal
- [ ] Escrever testes unitários
- [ ] Executar testes de integração
- [ ] Revisar código
- [ ] Preparar documentação
- [ ] Deploy em ambiente de staging
- [ ] Validação final
- [ ] Deploy em produção
## 🔍 Checkpoints de Qualidade
### Análise e Planejamento
- [ ] Requisitos claramente definidos
- [ ] Arquitetura planejada
- [ ] Dependências identificadas
- [ ] Riscos mapeados
### Desenvolvimento
- [ ] Código seguindo padrões estabelecidos
- [ ] Testes unitários implementados
- [ ] Tratamento de erros adequado
- [ ] Logs de auditoria implementados
### Testes
- [ ] Testes unitários passando
- [ ] Testes de integração executados
- [ ] Testes de aceitação validados
- [ ] Performance testada
### Deploy
- [ ] Ambiente de staging validado
- [ ] Documentação atualizada
- [ ] Rollback plan preparado
- [ ] Monitoramento configurado
## 📈 Métricas de Progresso
### Desenvolvimento
- **Progresso**: 0% (Iniciado)
- **Linhas de Código**: 0
- **Testes Escritos**: 0
- **Bugs Encontrados**: 0
### Qualidade
- **Cobertura de Testes**: 0%
- **Code Review**: Pendente
- **Performance**: A ser medida
- **Segurança**: A ser validada
## ⚠️ Riscos e Bloqueadores
### Riscos Identificados
- **Risco**: Complexidade técnica maior que esperada
- **Mitigação**: Revisar arquitetura e considerar simplificações
- **Risco**: Dependências externas não disponíveis
- **Mitigação**: Implementar mocks e fallbacks
### Bloqueadores Atuais
- Nenhum bloqueador identificado no momento
## 📝 Notas e Observações
### Decisões Técnicas
- A definir durante o desenvolvimento
### Lições Aprendidas
- A ser documentado durante o progresso
### Próximos Passos
1. Revisar documentação de requisitos
2. Implementar funcionalidade base
3. Escrever testes
4. Validar com stakeholders
5. Preparar para deploy
---
**Template gerado automaticamente em**: ${currentDate}
**Versão do Flow**: 1.4.0
**Próxima revisão**: A definir`;
}
function fillTemplateTags(templateContent, tagValues) {
let filledContent = templateContent;
// Substituir valores específicos das tags
for (const [tagName, value] of Object.entries(tagValues)) {
if (value && value.trim()) {
// Procurar pela tag específica e substituir o conteúdo
const tagRegex = new RegExp(`<${tagName}>[\\s\\S]*?</${tagName}>`, 'g');
const replacement = `<${tagName}>\n${value.trim()}\n</${tagName}>`;
filledContent = filledContent.replace(tagRegex, replacement);
}
}
// Substituir placeholders genéricos
filledContent = filledContent.replace(/\{\{TASK_NAME\}\}/g, tagValues.taskName || '{{TASK_NAME}}');
filledContent = filledContent.replace(/\{\{PRIORITY\}\}/g, tagValues.priority || '{{PRIORITY}}');
filledContent = filledContent.replace(/\{\{ESTIMATE\}\}/g, tagValues.estimate || '{{ESTIMATE}}');
filledContent = filledContent.replace(/\{\{STAKEHOLDER\}\}/g, tagValues.stakeholder || '{{STAKEHOLDER}}');
filledContent = filledContent.replace(/\{\{DEADLINE\}\}/g, tagValues.deadline || '{{DEADLINE}}');
filledContent = filledContent.replace(/\{\{LAST_UPDATE\}\}/g, new Date().toISOString().split('T')[0]);
filledContent = filledContent.replace(/\{\{RESPONSIBLE\}\}/g, tagValues.responsible || '{{RESPONSIBLE}}');
return filledContent;
}
// Call tool handler
server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name, arguments: args } = request.params;
try {
switch (name) {
case 'create_task': {
const { taskName, taskType = 'feature', workingDirectory, description, autoGenerate = true } = args;
const currentDir = workingDirectory ? path.resolve(workingDirectory) : process.cwd();
const result = await createTaskContext(taskName, currentDir, taskType);
if (result.success) {
// Se autoGenerate está habilitado, gerar conteúdo automático
if (autoGenerate && result.taskPath) {
try {
// Gerar BUSINESS_CONTEXT.md automaticamente
const businessContextPath = path.join(result.taskPath, 'BUSINESS_CONTEXT.md');
const businessContextContent = generateBusinessContextContent(taskName, description || taskName, taskType);
await fs.writeFile(businessContextPath, businessContextContent);
// Gerar APPROACH.md automaticamente
const approachPath = path.join(result.taskPath, 'APPROACH.md');
const approachContent = generateApproachContent(taskName, businessContextContent, taskType);
await fs.writeFile(approachPath, approachContent);
return {
content: [
{
type: 'text',
text: `✅ Task "${taskName}" created successfully with auto-generated content!\n` +
`📁 Location: ${result.taskPath}\n` +
`📄 Files created: ${result.filesCreated?.join(', ') || 'none'}\n` +
`🏷️ Type: ${taskType}\n` +
`🤖 Auto-generated: BUSINESS_CONTEXT.md, APPROACH.md\n` +
`📝 Description: ${description || taskName}`,
},
],
};
}
catch (error) {
return {
content: [
{
type: 'text',
text: `✅ Task "${taskName}" created successfully!\n` +
`📁 Location: ${result.taskPath}\n` +
`📄 Files created: ${result.filesCreated?.join(', ') || 'none'}\n` +
`🏷️ Type: ${taskType}\n` +
`⚠️ Auto-generation failed: ${error instanceof Error ? error.message : 'Unknown error'}`,
},
],
};
}
}
return {
content: [
{
type: 'text',
text: `✅ Task "${taskName}" created successfully!\n` +
`📁 Location: ${result.taskPath}\n` +
`📄 Files created: ${result.filesCreated?.join(', ') || 'none'}\n` +
`🏷️ Type: ${taskType}`,
},
],
};
}
else {
return {
content: [
{
type: 'text',
text: `❌ Error creating task: ${result.error}`,
},
],
isError: true,
};
}
}
case 'list_tasks': {
const { workingDirectory } = args;
const currentDir = workingDirectory ? path.resolve(workingDirectory) : process.cwd();
const flowDir = path.join(currentDir, '.flow');
if (!(await fs.pathExists(flowDir))) {
return {
content: [
{
type: 'text',
text: '⚠️ No .flow directory found. Run "create_task" to initialize.',
},
],
};
}
const items = await fs.readdir(flowDir);
const taskDirs = items.filter(item => {
return fs.statSync(path.join(flowDir, item)).isDirectory() && /^\d{2}_/.test(item);
});
if (taskDirs.length === 0) {
return {
content: [
{
type: 'text',
text: '📝 No tasks found. Create your first task with "create_task".',
},
],
};
}