UNPKG

agile-planner-mcp-server

Version:

Serveur MCP pour la génération d'artefacts agiles (backlogs, features, user stories) avec IA - compatible Windsurf, Claude et Cursor

68 lines (58 loc) 2.1 kB
const { SchemaValidatorStrategy } = require('./schema-validator-strategy'); const { UserStoryValidator } = require('./user-story-validator'); class FeatureValidator extends SchemaValidatorStrategy { constructor() { super(); this.userStoryValidator = new UserStoryValidator(); this.schema = this.createFeatureSchema(); } createFeatureSchema() { return { required: ['id', 'title'], properties: { id: { type: 'string' }, title: { type: 'string' }, description: { type: 'string' }, acceptance_criteria: { type: 'array', items: { type: 'string' } }, stories: { type: 'array', items: this.userStoryValidator.schema }, priority: { type: 'string' }, businessValue: { type: 'string' } } }; } validate(feature) { // Vérification de la structure de base de la feature const baseResult = this.validateAgainstSchema(feature, this.schema); if (!baseResult.valid) { return baseResult; } // Si la feature est valide, on vérifie chaque user story individuellement if (feature.stories && Array.isArray(feature.stories)) { const errors = []; for (let i = 0; i < feature.stories.length; i++) { const story = feature.stories[i]; const storyResult = this.userStoryValidator.validate(story); if (!storyResult.valid && storyResult.errors) { // Ajouter le préfixe du chemin pour chaque erreur const prefixedErrors = storyResult.errors.map( err => err.replace('à /', `à /stories[${i}]/`) ); errors.push(...prefixedErrors); } } if (errors.length > 0) { // Formatage des erreurs pour compatibilité const formattedErrors = this.formatErrorsForCompatibility(errors, 'stories'); return { valid: false, errors: formattedErrors }; } } return { valid: true }; } } module.exports = { FeatureValidator };