snow-flow 1.3.23 → 1.3.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/intelligence/multi-pass-requirements-analyzer.js +477 -0
- package/dist/intelligence/performance-recommendations-engine.js +485 -0
- package/dist/mcp/base-mcp-server.js +183 -15
- package/dist/mcp/servicenow-flow-composer-mcp.js +696 -46
- package/dist/mcp/servicenow-intelligent-mcp.js +354 -25
- package/dist/mcp/servicenow-security-compliance-mcp-refactored.js +9 -9
- package/dist/memory/memory-system.js +89 -17
- package/dist/utils/servicenow-client.js +79 -18
- package/dist/utils/xml-first-flow-generator.js +29 -8
- package/npm-publish-summary.txt +35 -0
- package/package.json +1 -1
|
@@ -0,0 +1,477 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 🚀 BUG-006 FIX: Multi-Pass Requirements Analyzer
|
|
4
|
+
*
|
|
5
|
+
* Advanced requirements analysis with multiple passes to ensure
|
|
6
|
+
* comprehensive coverage and no missed dependencies.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.MultiPassRequirementsAnalyzer = void 0;
|
|
10
|
+
const logger_js_1 = require("../utils/logger.js");
|
|
11
|
+
class MultiPassRequirementsAnalyzer {
|
|
12
|
+
constructor() {
|
|
13
|
+
// 🎯 Enhanced pattern matching with context awareness
|
|
14
|
+
this.CONTEXT_PATTERNS = {
|
|
15
|
+
// Security Context Implications
|
|
16
|
+
security_implications: {
|
|
17
|
+
triggers: ['authentication', 'login', 'secure', 'role', 'permission', 'access'],
|
|
18
|
+
additional_requirements: ['audit_rule', 'security_policy', 'acl_rule', 'encryption_context', 'session_management']
|
|
19
|
+
},
|
|
20
|
+
// Data Integration Context
|
|
21
|
+
data_integration_context: {
|
|
22
|
+
triggers: ['import', 'export', 'sync', 'api', 'external', 'integration'],
|
|
23
|
+
additional_requirements: ['error_handling', 'data_validation', 'logging', 'monitoring', 'backup_recovery']
|
|
24
|
+
},
|
|
25
|
+
// User Experience Context
|
|
26
|
+
user_experience_context: {
|
|
27
|
+
triggers: ['dashboard', 'portal', 'mobile', 'user interface', 'ui'],
|
|
28
|
+
additional_requirements: ['responsive_design', 'accessibility', 'performance_optimization', 'user_training']
|
|
29
|
+
},
|
|
30
|
+
// Process Automation Context
|
|
31
|
+
process_automation_context: {
|
|
32
|
+
triggers: ['workflow', 'approval', 'automation', 'flow', 'process'],
|
|
33
|
+
additional_requirements: ['error_recovery', 'monitoring', 'audit_trail', 'performance_tracking']
|
|
34
|
+
},
|
|
35
|
+
// Compliance Context
|
|
36
|
+
compliance_context: {
|
|
37
|
+
triggers: ['audit', 'compliance', 'gdpr', 'sox', 'hipaa', 'regulation'],
|
|
38
|
+
additional_requirements: ['data_retention', 'audit_logging', 'data_encryption', 'access_logging', 'compliance_reporting']
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
// 🔍 Dependency mapping for implicit requirements
|
|
42
|
+
this.DEPENDENCY_MATRIX = {
|
|
43
|
+
// When you create a widget, you typically also need...
|
|
44
|
+
widget: ['css_include', 'client_script', 'data_source', 'ui_policy'],
|
|
45
|
+
// When you create a flow, you typically also need...
|
|
46
|
+
flow: ['business_rule', 'notification', 'error_handling', 'audit_rule'],
|
|
47
|
+
// When you create user management, you typically also need...
|
|
48
|
+
user_role: ['acl_rule', 'group_membership', 'audit_rule', 'security_policy'],
|
|
49
|
+
// When you create API integration, you typically also need...
|
|
50
|
+
rest_message: ['oauth_provider', 'error_handling', 'logging', 'monitoring'],
|
|
51
|
+
// When you create approval process, you typically also need...
|
|
52
|
+
approval_rule: ['notification', 'email_template', 'escalation_rule', 'sla_definition'],
|
|
53
|
+
// When you create reporting, you typically also need...
|
|
54
|
+
report: ['data_source', 'scheduled_report', 'dashboard', 'performance_analytics'],
|
|
55
|
+
// Additional dependencies
|
|
56
|
+
table: ['dictionary_entry', 'acl_rule', 'ui_policy', 'client_script'],
|
|
57
|
+
import_set: ['transform_map', 'field_map', 'error_handling', 'data_validation'],
|
|
58
|
+
workflow: ['notification', 'approval_rule', 'audit_rule', 'error_recovery'],
|
|
59
|
+
dashboard: ['widget', 'data_source', 'performance_analytics', 'scheduled_refresh']
|
|
60
|
+
};
|
|
61
|
+
// 🎯 Cross-domain impact analysis
|
|
62
|
+
this.CROSS_DOMAIN_IMPACTS = {
|
|
63
|
+
security_changes: {
|
|
64
|
+
affects: ['user_interface', 'data_integration', 'process_automation'],
|
|
65
|
+
considerations: ['Role updates', 'Permission cascades', 'Authentication flows']
|
|
66
|
+
},
|
|
67
|
+
data_structure_changes: {
|
|
68
|
+
affects: ['reporting_analytics', 'user_interface', 'process_automation'],
|
|
69
|
+
considerations: ['Report updates', 'Form modifications', 'Workflow adjustments']
|
|
70
|
+
},
|
|
71
|
+
process_changes: {
|
|
72
|
+
affects: ['user_interface', 'reporting_analytics', 'security_compliance'],
|
|
73
|
+
considerations: ['UI updates', 'Metrics tracking', 'Audit requirements']
|
|
74
|
+
},
|
|
75
|
+
integration_changes: {
|
|
76
|
+
affects: ['security_compliance', 'monitoring_operations', 'data_integration'],
|
|
77
|
+
considerations: ['Security protocols', 'Error monitoring', 'Data validation']
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
this.logger = new logger_js_1.Logger('MultiPassRequirementsAnalyzer');
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 🔍 Run comprehensive multi-pass analysis
|
|
84
|
+
*/
|
|
85
|
+
async analyzeRequirements(objective) {
|
|
86
|
+
this.logger.info('🚀 BUG-006: Starting multi-pass requirements analysis', { objective });
|
|
87
|
+
const startTime = Date.now();
|
|
88
|
+
let allRequirements = [];
|
|
89
|
+
// PASS 1: Initial Pattern Matching
|
|
90
|
+
const pass1Start = Date.now();
|
|
91
|
+
const pass1Result = await this.pass1_InitialAnalysis(objective);
|
|
92
|
+
allRequirements.push(...pass1Result.requirements);
|
|
93
|
+
// PASS 2: Dependency Analysis
|
|
94
|
+
const pass2Start = Date.now();
|
|
95
|
+
const pass2Result = await this.pass2_DependencyAnalysis(objective, allRequirements);
|
|
96
|
+
allRequirements.push(...pass2Result.newRequirements);
|
|
97
|
+
// PASS 3: Context & Implication Analysis
|
|
98
|
+
const pass3Start = Date.now();
|
|
99
|
+
const pass3Result = await this.pass3_ContextAnalysis(objective, allRequirements);
|
|
100
|
+
allRequirements.push(...pass3Result.newRequirements);
|
|
101
|
+
// PASS 4: Validation & Completeness Check
|
|
102
|
+
const pass4Start = Date.now();
|
|
103
|
+
const pass4Result = await this.pass4_ValidationAnalysis(objective, allRequirements);
|
|
104
|
+
allRequirements.push(...pass4Result.newRequirements);
|
|
105
|
+
// Remove duplicates and finalize
|
|
106
|
+
const finalRequirements = this.deduplicateRequirements(allRequirements);
|
|
107
|
+
// Calculate metrics
|
|
108
|
+
const mcpCoveredCount = finalRequirements.filter(req => req.mcpCoverage).length;
|
|
109
|
+
const gapCount = finalRequirements.length - mcpCoveredCount;
|
|
110
|
+
const mcpCoveragePercentage = Math.round((mcpCoveredCount / finalRequirements.length) * 100);
|
|
111
|
+
// Calculate completeness score based on multi-pass findings
|
|
112
|
+
const completenessScore = this.calculateCompletenessScore(pass1Result, pass2Result, pass3Result, pass4Result);
|
|
113
|
+
const confidenceLevel = this.determineConfidenceLevel(completenessScore);
|
|
114
|
+
// Detect cross-domain impacts
|
|
115
|
+
const crossDomainImpacts = this.analyzeCrossDomainImpacts(finalRequirements);
|
|
116
|
+
const totalTime = Date.now() - startTime;
|
|
117
|
+
this.logger.info(`✅ Multi-pass analysis complete in ${totalTime}ms`, {
|
|
118
|
+
totalRequirements: finalRequirements.length,
|
|
119
|
+
mcpCoverage: mcpCoveragePercentage,
|
|
120
|
+
completenessScore,
|
|
121
|
+
confidenceLevel
|
|
122
|
+
});
|
|
123
|
+
return {
|
|
124
|
+
objective,
|
|
125
|
+
requirements: finalRequirements,
|
|
126
|
+
totalRequirements: finalRequirements.length,
|
|
127
|
+
mcpCoveredCount,
|
|
128
|
+
gapCount,
|
|
129
|
+
mcpCoveragePercentage,
|
|
130
|
+
estimatedComplexity: this.calculateComplexity(finalRequirements),
|
|
131
|
+
riskAssessment: this.calculateRiskAssessment(finalRequirements),
|
|
132
|
+
categories: this.extractCategories(finalRequirements),
|
|
133
|
+
criticalPath: this.identifyCriticalPath(finalRequirements),
|
|
134
|
+
estimatedDuration: this.estimateDuration(finalRequirements),
|
|
135
|
+
// Multi-pass specific data
|
|
136
|
+
analysisPassesData: {
|
|
137
|
+
pass1_initial: {
|
|
138
|
+
passNumber: 1,
|
|
139
|
+
passName: 'Initial Pattern Matching',
|
|
140
|
+
requirementsFound: pass1Result.requirements.length,
|
|
141
|
+
newRequirementsAdded: pass1Result.requirements.length,
|
|
142
|
+
analysisMethod: 'Pattern matching and keyword analysis',
|
|
143
|
+
keyFindings: pass1Result.keyFindings,
|
|
144
|
+
confidence: pass1Result.confidence,
|
|
145
|
+
processingTime: pass2Start - pass1Start
|
|
146
|
+
},
|
|
147
|
+
pass2_dependencies: {
|
|
148
|
+
passNumber: 2,
|
|
149
|
+
passName: 'Dependency Analysis',
|
|
150
|
+
requirementsFound: pass2Result.newRequirements.length,
|
|
151
|
+
newRequirementsAdded: pass2Result.newRequirements.length,
|
|
152
|
+
analysisMethod: 'Dependency matrix and prerequisite analysis',
|
|
153
|
+
keyFindings: pass2Result.keyFindings,
|
|
154
|
+
confidence: pass2Result.confidence,
|
|
155
|
+
processingTime: pass3Start - pass2Start
|
|
156
|
+
},
|
|
157
|
+
pass3_context: {
|
|
158
|
+
passNumber: 3,
|
|
159
|
+
passName: 'Context & Implications',
|
|
160
|
+
requirementsFound: pass3Result.newRequirements.length,
|
|
161
|
+
newRequirementsAdded: pass3Result.newRequirements.length,
|
|
162
|
+
analysisMethod: 'Context pattern matching and implication analysis',
|
|
163
|
+
keyFindings: pass3Result.keyFindings,
|
|
164
|
+
confidence: pass3Result.confidence,
|
|
165
|
+
processingTime: pass4Start - pass3Start
|
|
166
|
+
},
|
|
167
|
+
pass4_validation: {
|
|
168
|
+
passNumber: 4,
|
|
169
|
+
passName: 'Validation & Completeness',
|
|
170
|
+
requirementsFound: finalRequirements.length,
|
|
171
|
+
newRequirementsAdded: pass4Result.newRequirements.length,
|
|
172
|
+
analysisMethod: 'Gap analysis and completeness validation',
|
|
173
|
+
keyFindings: pass4Result.keyFindings,
|
|
174
|
+
confidence: pass4Result.confidence,
|
|
175
|
+
processingTime: Date.now() - pass4Start
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
completenessScore,
|
|
179
|
+
confidenceLevel,
|
|
180
|
+
missingRequirementsDetected: pass4Result.newRequirements,
|
|
181
|
+
implicitDependencies: this.extractImplicitDependencies(finalRequirements),
|
|
182
|
+
crossDomainImpacts
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* 🎯 PASS 1: Initial Pattern Matching Analysis
|
|
187
|
+
*/
|
|
188
|
+
async pass1_InitialAnalysis(objective) {
|
|
189
|
+
this.logger.info('🔍 Pass 1: Initial pattern matching analysis');
|
|
190
|
+
const requirements = [];
|
|
191
|
+
const keyFindings = [];
|
|
192
|
+
const objectiveLower = objective.toLowerCase();
|
|
193
|
+
// Basic keyword matching (existing logic enhanced)
|
|
194
|
+
const patterns = [
|
|
195
|
+
// Core Development
|
|
196
|
+
{ keywords: ['widget', 'portal', 'service portal'], type: 'widget' },
|
|
197
|
+
{ keywords: ['flow', 'workflow', 'process', 'automation'], type: 'flow' },
|
|
198
|
+
{ keywords: ['business rule', 'validation', 'server logic'], type: 'business_rule' },
|
|
199
|
+
{ keywords: ['script include', 'utility', 'function', 'library'], type: 'script_include' },
|
|
200
|
+
{ keywords: ['table', 'record', 'data structure'], type: 'table' },
|
|
201
|
+
// User Interface
|
|
202
|
+
{ keywords: ['dashboard', 'overview', 'summary'], type: 'dashboard' },
|
|
203
|
+
{ keywords: ['form', 'ui', 'interface'], type: 'ui_policy' },
|
|
204
|
+
{ keywords: ['navigation', 'menu', 'module'], type: 'navigator_module' },
|
|
205
|
+
// Security & Access
|
|
206
|
+
{ keywords: ['role', 'permission', 'access control'], type: 'user_role' },
|
|
207
|
+
{ keywords: ['security', 'acl', 'access list'], type: 'acl_rule' },
|
|
208
|
+
{ keywords: ['authentication', 'login', 'oauth'], type: 'oauth_provider' },
|
|
209
|
+
// Integration
|
|
210
|
+
{ keywords: ['api', 'rest', 'web service'], type: 'rest_message' },
|
|
211
|
+
{ keywords: ['import', 'csv', 'excel', 'data load'], type: 'import_set' },
|
|
212
|
+
{ keywords: ['email', 'notification', 'alert'], type: 'notification' },
|
|
213
|
+
// Process & Automation
|
|
214
|
+
{ keywords: ['approval', 'review', 'authorize'], type: 'approval_rule' },
|
|
215
|
+
{ keywords: ['schedule', 'cron', 'batch'], type: 'scheduled_job' },
|
|
216
|
+
{ keywords: ['sla', 'service level', 'performance'], type: 'sla_definition' },
|
|
217
|
+
// Reporting
|
|
218
|
+
{ keywords: ['report', 'analytics', 'metrics'], type: 'report' },
|
|
219
|
+
{ keywords: ['kpi', 'performance indicator'], type: 'kpi' },
|
|
220
|
+
{ keywords: ['chart', 'graph', 'visualization'], type: 'chart_configuration' }
|
|
221
|
+
];
|
|
222
|
+
for (const pattern of patterns) {
|
|
223
|
+
if (pattern.keywords.some(keyword => objectiveLower.includes(keyword))) {
|
|
224
|
+
const requirement = this.createRequirement(pattern.type, objective);
|
|
225
|
+
requirements.push(requirement);
|
|
226
|
+
keyFindings.push(`Detected ${pattern.type} requirement from keywords: ${pattern.keywords.join(', ')}`);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
// Advanced pattern detection for complex scenarios
|
|
230
|
+
const complexPatterns = this.detectComplexPatterns(objective);
|
|
231
|
+
requirements.push(...complexPatterns.requirements);
|
|
232
|
+
keyFindings.push(...complexPatterns.findings);
|
|
233
|
+
const confidence = Math.min(0.9, 0.3 + (requirements.length * 0.1));
|
|
234
|
+
this.logger.info(`Pass 1 complete: ${requirements.length} requirements found`);
|
|
235
|
+
return { requirements, keyFindings, confidence };
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* 🔗 PASS 2: Dependency Analysis
|
|
239
|
+
*/
|
|
240
|
+
async pass2_DependencyAnalysis(objective, existingRequirements) {
|
|
241
|
+
this.logger.info('🔍 Pass 2: Dependency analysis');
|
|
242
|
+
const newRequirements = [];
|
|
243
|
+
const keyFindings = [];
|
|
244
|
+
const existingTypes = new Set(existingRequirements.map(req => req.type));
|
|
245
|
+
// Analyze dependencies for each existing requirement
|
|
246
|
+
for (const requirement of existingRequirements) {
|
|
247
|
+
const dependencies = this.DEPENDENCY_MATRIX[requirement.type] || [];
|
|
248
|
+
for (const depType of dependencies) {
|
|
249
|
+
if (!existingTypes.has(depType)) {
|
|
250
|
+
const depRequirement = this.createRequirement(depType, objective);
|
|
251
|
+
depRequirement.dependencies = [requirement.id];
|
|
252
|
+
depRequirement.description += ` (Required by ${requirement.name})`;
|
|
253
|
+
newRequirements.push(depRequirement);
|
|
254
|
+
existingTypes.add(depType);
|
|
255
|
+
keyFindings.push(`Added ${depType} as dependency of ${requirement.type}`);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
// Analyze prerequisite chains
|
|
260
|
+
const prerequisiteAnalysis = this.analyzePrerequisiteChains(existingRequirements);
|
|
261
|
+
newRequirements.push(...prerequisiteAnalysis.requirements);
|
|
262
|
+
keyFindings.push(...prerequisiteAnalysis.findings);
|
|
263
|
+
// Analyze common co-requirements
|
|
264
|
+
const coRequirementAnalysis = this.analyzeCoRequirements(objective, existingRequirements);
|
|
265
|
+
newRequirements.push(...coRequirementAnalysis.requirements);
|
|
266
|
+
keyFindings.push(...coRequirementAnalysis.findings);
|
|
267
|
+
const confidence = newRequirements.length > 0 ? 0.8 : 0.6;
|
|
268
|
+
this.logger.info(`Pass 2 complete: ${newRequirements.length} new requirements found`);
|
|
269
|
+
return { newRequirements, keyFindings, confidence };
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* 🌐 PASS 3: Context & Implication Analysis
|
|
273
|
+
*/
|
|
274
|
+
async pass3_ContextAnalysis(objective, existingRequirements) {
|
|
275
|
+
this.logger.info('🔍 Pass 3: Context and implication analysis');
|
|
276
|
+
const newRequirements = [];
|
|
277
|
+
const keyFindings = [];
|
|
278
|
+
const objectiveLower = objective.toLowerCase();
|
|
279
|
+
// Analyze context patterns
|
|
280
|
+
for (const [contextName, contextData] of Object.entries(this.CONTEXT_PATTERNS)) {
|
|
281
|
+
const hasContextTrigger = contextData.triggers.some(trigger => objectiveLower.includes(trigger));
|
|
282
|
+
if (hasContextTrigger) {
|
|
283
|
+
keyFindings.push(`Detected ${contextName} context`);
|
|
284
|
+
for (const additionalReq of contextData.additional_requirements) {
|
|
285
|
+
if (!existingRequirements.some(req => req.type === additionalReq)) {
|
|
286
|
+
const requirement = this.createRequirement(additionalReq, objective);
|
|
287
|
+
requirement.description += ` (Context implication: ${contextName})`;
|
|
288
|
+
newRequirements.push(requirement);
|
|
289
|
+
keyFindings.push(`Added ${additionalReq} from ${contextName} context`);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
// Analyze enterprise vs department scope implications
|
|
295
|
+
const scopeAnalysis = this.analyzeScopeImplications(objective, existingRequirements);
|
|
296
|
+
newRequirements.push(...scopeAnalysis.requirements);
|
|
297
|
+
keyFindings.push(...scopeAnalysis.findings);
|
|
298
|
+
// Analyze compliance and regulatory implications
|
|
299
|
+
const complianceAnalysis = this.analyzeComplianceImplications(objective);
|
|
300
|
+
newRequirements.push(...complianceAnalysis.requirements);
|
|
301
|
+
keyFindings.push(...complianceAnalysis.findings);
|
|
302
|
+
const confidence = 0.7;
|
|
303
|
+
this.logger.info(`Pass 3 complete: ${newRequirements.length} contextual requirements found`);
|
|
304
|
+
return { newRequirements, keyFindings, confidence };
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* ✅ PASS 4: Validation & Completeness Check
|
|
308
|
+
*/
|
|
309
|
+
async pass4_ValidationAnalysis(objective, existingRequirements) {
|
|
310
|
+
this.logger.info('🔍 Pass 4: Validation and completeness check');
|
|
311
|
+
const newRequirements = [];
|
|
312
|
+
const keyFindings = [];
|
|
313
|
+
// Gap analysis - check for common missing pieces
|
|
314
|
+
const gapAnalysis = this.performGapAnalysis(objective, existingRequirements);
|
|
315
|
+
newRequirements.push(...gapAnalysis.requirements);
|
|
316
|
+
keyFindings.push(...gapAnalysis.findings);
|
|
317
|
+
// Validation of requirement completeness
|
|
318
|
+
const completenessCheck = this.validateRequirementCompleteness(existingRequirements);
|
|
319
|
+
keyFindings.push(...completenessCheck.findings);
|
|
320
|
+
// Final quality check
|
|
321
|
+
const qualityCheck = this.performQualityCheck(existingRequirements);
|
|
322
|
+
keyFindings.push(...qualityCheck.findings);
|
|
323
|
+
const confidence = 0.95;
|
|
324
|
+
this.logger.info(`Pass 4 complete: ${newRequirements.length} validation requirements added`);
|
|
325
|
+
return { newRequirements, keyFindings, confidence };
|
|
326
|
+
}
|
|
327
|
+
// Helper methods (implementations would follow similar patterns)
|
|
328
|
+
createRequirement(type, objective) {
|
|
329
|
+
return {
|
|
330
|
+
id: `req_${type}_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
|
|
331
|
+
type,
|
|
332
|
+
name: `${type.replace(/_/g, ' ').toUpperCase()} for ${objective.substring(0, 50)}...`,
|
|
333
|
+
description: `ServiceNow ${type} component required for: ${objective}`,
|
|
334
|
+
priority: 'medium',
|
|
335
|
+
dependencies: [],
|
|
336
|
+
estimatedEffort: 'medium',
|
|
337
|
+
automatable: true,
|
|
338
|
+
mcpCoverage: ['widget', 'flow', 'business_rule', 'script_include', 'table', 'application'].includes(type),
|
|
339
|
+
category: this.getCategoryForType(type),
|
|
340
|
+
riskLevel: 'medium'
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
getCategoryForType(type) {
|
|
344
|
+
// Mapping logic for requirement categories
|
|
345
|
+
const categoryMap = {
|
|
346
|
+
widget: 'core_development',
|
|
347
|
+
flow: 'core_development',
|
|
348
|
+
user_role: 'security_compliance',
|
|
349
|
+
dashboard: 'reporting_analytics',
|
|
350
|
+
// ... more mappings
|
|
351
|
+
};
|
|
352
|
+
return categoryMap[type] || 'core_development';
|
|
353
|
+
}
|
|
354
|
+
// Additional helper methods would be implemented here...
|
|
355
|
+
detectComplexPatterns(objective) {
|
|
356
|
+
// Implementation for complex pattern detection
|
|
357
|
+
return { requirements: [], findings: [] };
|
|
358
|
+
}
|
|
359
|
+
analyzePrerequisiteChains(requirements) {
|
|
360
|
+
// Implementation for prerequisite analysis
|
|
361
|
+
return { requirements: [], findings: [] };
|
|
362
|
+
}
|
|
363
|
+
analyzeCoRequirements(objective, requirements) {
|
|
364
|
+
// Implementation for co-requirement analysis
|
|
365
|
+
return { requirements: [], findings: [] };
|
|
366
|
+
}
|
|
367
|
+
analyzeScopeImplications(objective, requirements) {
|
|
368
|
+
// Implementation for scope analysis
|
|
369
|
+
return { requirements: [], findings: [] };
|
|
370
|
+
}
|
|
371
|
+
analyzeComplianceImplications(objective) {
|
|
372
|
+
// Implementation for compliance analysis
|
|
373
|
+
return { requirements: [], findings: [] };
|
|
374
|
+
}
|
|
375
|
+
performGapAnalysis(objective, requirements) {
|
|
376
|
+
// Implementation for gap analysis
|
|
377
|
+
return { requirements: [], findings: [] };
|
|
378
|
+
}
|
|
379
|
+
validateRequirementCompleteness(requirements) {
|
|
380
|
+
// Implementation for completeness validation
|
|
381
|
+
return { findings: [] };
|
|
382
|
+
}
|
|
383
|
+
performQualityCheck(requirements) {
|
|
384
|
+
// Implementation for quality check
|
|
385
|
+
return { findings: [] };
|
|
386
|
+
}
|
|
387
|
+
deduplicateRequirements(requirements) {
|
|
388
|
+
const seen = new Set();
|
|
389
|
+
return requirements.filter(req => {
|
|
390
|
+
const key = `${req.type}_${req.name}`;
|
|
391
|
+
if (seen.has(key))
|
|
392
|
+
return false;
|
|
393
|
+
seen.add(key);
|
|
394
|
+
return true;
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
calculateCompletenessScore(pass1, pass2, pass3, pass4) {
|
|
398
|
+
// Calculate completeness based on multiple passes
|
|
399
|
+
const baseScore = 40;
|
|
400
|
+
const pass2Bonus = Math.min(30, pass2.newRequirements.length * 5);
|
|
401
|
+
const pass3Bonus = Math.min(20, pass3.newRequirements.length * 3);
|
|
402
|
+
const pass4Bonus = Math.min(10, pass4.newRequirements.length * 2);
|
|
403
|
+
return Math.min(100, baseScore + pass2Bonus + pass3Bonus + pass4Bonus);
|
|
404
|
+
}
|
|
405
|
+
determineConfidenceLevel(completenessScore) {
|
|
406
|
+
if (completenessScore >= 90)
|
|
407
|
+
return 'very_high';
|
|
408
|
+
if (completenessScore >= 75)
|
|
409
|
+
return 'high';
|
|
410
|
+
if (completenessScore >= 60)
|
|
411
|
+
return 'medium';
|
|
412
|
+
return 'low';
|
|
413
|
+
}
|
|
414
|
+
analyzeCrossDomainImpacts(requirements) {
|
|
415
|
+
const impacts = [];
|
|
416
|
+
const categories = new Set(requirements.map(req => req.category));
|
|
417
|
+
if (categories.has('security_compliance') && categories.has('user_interface')) {
|
|
418
|
+
impacts.push('Security changes will require UI permission updates');
|
|
419
|
+
}
|
|
420
|
+
if (categories.has('data_integration') && categories.has('reporting_analytics')) {
|
|
421
|
+
impacts.push('Data changes will impact existing reports and dashboards');
|
|
422
|
+
}
|
|
423
|
+
return impacts;
|
|
424
|
+
}
|
|
425
|
+
extractImplicitDependencies(requirements) {
|
|
426
|
+
return requirements
|
|
427
|
+
.filter(req => req.dependencies.length > 0)
|
|
428
|
+
.map(req => `${req.name} depends on ${req.dependencies.join(', ')}`)
|
|
429
|
+
.slice(0, 10); // Limit to top 10
|
|
430
|
+
}
|
|
431
|
+
calculateComplexity(requirements) {
|
|
432
|
+
const totalEffort = requirements.reduce((sum, req) => {
|
|
433
|
+
const effortMap = { low: 1, medium: 3, high: 5 };
|
|
434
|
+
return sum + effortMap[req.estimatedEffort];
|
|
435
|
+
}, 0);
|
|
436
|
+
if (totalEffort > 50)
|
|
437
|
+
return 'enterprise';
|
|
438
|
+
if (totalEffort > 30)
|
|
439
|
+
return 'high';
|
|
440
|
+
if (totalEffort > 15)
|
|
441
|
+
return 'medium';
|
|
442
|
+
return 'low';
|
|
443
|
+
}
|
|
444
|
+
calculateRiskAssessment(requirements) {
|
|
445
|
+
const highRiskCount = requirements.filter(req => req.riskLevel === 'high').length;
|
|
446
|
+
const totalCount = requirements.length;
|
|
447
|
+
if (highRiskCount / totalCount > 0.3)
|
|
448
|
+
return 'high';
|
|
449
|
+
if (highRiskCount / totalCount > 0.1)
|
|
450
|
+
return 'medium';
|
|
451
|
+
return 'low';
|
|
452
|
+
}
|
|
453
|
+
extractCategories(requirements) {
|
|
454
|
+
return Array.from(new Set(requirements.map(req => req.category)));
|
|
455
|
+
}
|
|
456
|
+
identifyCriticalPath(requirements) {
|
|
457
|
+
return requirements
|
|
458
|
+
.filter(req => req.priority === 'high')
|
|
459
|
+
.map(req => req.name)
|
|
460
|
+
.slice(0, 5);
|
|
461
|
+
}
|
|
462
|
+
estimateDuration(requirements) {
|
|
463
|
+
const totalDays = requirements.reduce((sum, req) => {
|
|
464
|
+
const effortDays = { low: 1, medium: 3, high: 7 };
|
|
465
|
+
return sum + effortDays[req.estimatedEffort];
|
|
466
|
+
}, 0);
|
|
467
|
+
if (totalDays > 90)
|
|
468
|
+
return '3+ months';
|
|
469
|
+
if (totalDays > 30)
|
|
470
|
+
return '1-3 months';
|
|
471
|
+
if (totalDays > 7)
|
|
472
|
+
return '1-4 weeks';
|
|
473
|
+
return '1-7 days';
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
exports.MultiPassRequirementsAnalyzer = MultiPassRequirementsAnalyzer;
|
|
477
|
+
exports.default = MultiPassRequirementsAnalyzer;
|