#
tokens: 49512/50000 16/252 files (page 5/18)
lines: on (toggle) GitHub
raw markdown copy reset
This is page 5 of 18. Use http://codebase.md/minipuft/claude-prompts-mcp?lines=true&page={x} to view the full context.

# Directory Structure

```
├── .actrc
├── .gitattributes
├── .github
│   └── workflows
│       ├── ci.yml
│       ├── mcp-compliance.yml
│       └── pr-validation.yml
├── .gitignore
├── agent.md
├── assets
│   └── logo.png
├── CLAUDE.md
├── config
│   └── framework-state.json
├── docs
│   ├── architecture.md
│   ├── chain-modification-examples.md
│   ├── contributing.md
│   ├── enhanced-gate-system.md
│   ├── execution-architecture-guide.md
│   ├── installation-guide.md
│   ├── mcp-tool-usage-guide.md
│   ├── mcp-tools-reference.md
│   ├── prompt-format-guide.md
│   ├── prompt-management.md
│   ├── prompt-vs-template-guide.md
│   ├── README.md
│   ├── template-development-guide.md
│   ├── TODO.md
│   ├── troubleshooting.md
│   └── version-history.md
├── LICENSE
├── local-test.sh
├── plans
│   ├── nunjucks-dynamic-chain-orchestration.md
│   ├── outputschema-realtime-progress-and-validation.md
│   ├── parallel-conditional-execution-analysis.md
│   ├── sqlite-storage-migration.md
│   └── symbolic-command-language-implementation.md
├── README.md
├── scripts
│   ├── setup-windows-testing.sh
│   ├── test_server.js
│   ├── test-all-platforms.sh
│   └── windows-tests
│       ├── test-windows-paths.js
│       ├── test-windows-startup.sh
│       └── windows-env.sh
└── server
    ├── config
    │   ├── framework-state.json
    │   └── tool-descriptions.json
    ├── config.json
    ├── jest.config.cjs
    ├── LICENSE
    ├── package-lock.json
    ├── package.json
    ├── prompts
    │   ├── analysis
    │   │   ├── advanced_analysis_engine.md
    │   │   ├── content_analysis.md
    │   │   ├── deep_analysis.md
    │   │   ├── deep_research.md
    │   │   ├── markdown_notebook.md
    │   │   ├── note_integration.md
    │   │   ├── note_refinement.md
    │   │   ├── notes.md
    │   │   ├── progressive_research.md
    │   │   ├── prompts.json
    │   │   ├── query_refinement.md
    │   │   └── review.md
    │   ├── architecture
    │   │   ├── prompts.json
    │   │   └── strategic-system-alignment.md
    │   ├── content_processing
    │   │   ├── format_enhancement.md
    │   │   ├── noteIntegration.md
    │   │   ├── obsidian_metadata_optimizer.md
    │   │   ├── prompts.json
    │   │   ├── vault_related_notes_finder.md
    │   │   └── video_notes_enhanced.md
    │   ├── debugging
    │   │   ├── analyze_logs.md
    │   │   └── prompts.json
    │   ├── development
    │   │   ├── analyze_code_structure.md
    │   │   ├── analyze_file_structure.md
    │   │   ├── code_review_optimization_chain.md
    │   │   ├── component_flow_analysis.md
    │   │   ├── create_modularization_plan.md
    │   │   ├── detect_code_issues.md
    │   │   ├── detect_project_commands.md
    │   │   ├── expert_code_implementation.md
    │   │   ├── generate_comprehensive_claude_md.md
    │   │   ├── prompts.json
    │   │   ├── strategicImplement.md
    │   │   ├── suggest_code_improvements.md
    │   │   └── transform_code_to_modules.md
    │   ├── documentation
    │   │   ├── create_docs_chain.md
    │   │   ├── docs-content-creation.md
    │   │   ├── docs-content-planning.md
    │   │   ├── docs-final-assembly.md
    │   │   ├── docs-project-analysis.md
    │   │   ├── docs-review-refinement.md
    │   │   └── prompts.json
    │   ├── education
    │   │   ├── prompts.json
    │   │   └── vault_integrated_notes.md
    │   ├── general
    │   │   ├── diagnose.md
    │   │   └── prompts.json
    │   ├── promptsConfig.json
    │   └── testing
    │       ├── final_verification_test.md
    │       └── prompts.json
    ├── README.md
    ├── scripts
    │   └── validate-dependencies.js
    ├── src
    │   ├── api
    │   │   └── index.ts
    │   ├── chain-session
    │   │   └── manager.ts
    │   ├── config
    │   │   └── index.ts
    │   ├── Dockerfile
    │   ├── execution
    │   │   ├── context
    │   │   │   ├── context-resolver.ts
    │   │   │   ├── framework-injector.ts
    │   │   │   └── index.ts
    │   │   ├── index.ts
    │   │   ├── parsers
    │   │   │   ├── argument-parser.ts
    │   │   │   ├── index.ts
    │   │   │   └── unified-command-parser.ts
    │   │   └── types.ts
    │   ├── frameworks
    │   │   ├── framework-manager.ts
    │   │   ├── framework-state-manager.ts
    │   │   ├── index.ts
    │   │   ├── integration
    │   │   │   ├── framework-semantic-integration.ts
    │   │   │   └── index.ts
    │   │   ├── methodology
    │   │   │   ├── guides
    │   │   │   │   ├── 5w1h-guide.ts
    │   │   │   │   ├── cageerf-guide.ts
    │   │   │   │   ├── react-guide.ts
    │   │   │   │   └── scamper-guide.ts
    │   │   │   ├── index.ts
    │   │   │   ├── interfaces.ts
    │   │   │   └── registry.ts
    │   │   ├── prompt-guidance
    │   │   │   ├── index.ts
    │   │   │   ├── methodology-tracker.ts
    │   │   │   ├── service.ts
    │   │   │   ├── system-prompt-injector.ts
    │   │   │   └── template-enhancer.ts
    │   │   └── types
    │   │       ├── index.ts
    │   │       ├── integration-types.ts
    │   │       ├── methodology-types.ts
    │   │       └── prompt-guidance-types.ts
    │   ├── gates
    │   │   ├── constants.ts
    │   │   ├── core
    │   │   │   ├── gate-definitions.ts
    │   │   │   ├── gate-loader.ts
    │   │   │   ├── gate-validator.ts
    │   │   │   ├── index.ts
    │   │   │   └── temporary-gate-registry.ts
    │   │   ├── definitions
    │   │   │   ├── code-quality.json
    │   │   │   ├── content-structure.json
    │   │   │   ├── educational-clarity.json
    │   │   │   ├── framework-compliance.json
    │   │   │   ├── research-quality.json
    │   │   │   ├── security-awareness.json
    │   │   │   └── technical-accuracy.json
    │   │   ├── gate-state-manager.ts
    │   │   ├── guidance
    │   │   │   ├── FrameworkGuidanceFilter.ts
    │   │   │   └── GateGuidanceRenderer.ts
    │   │   ├── index.ts
    │   │   ├── intelligence
    │   │   │   ├── GatePerformanceAnalyzer.ts
    │   │   │   └── GateSelectionEngine.ts
    │   │   ├── templates
    │   │   │   ├── code_quality_validation.md
    │   │   │   ├── educational_clarity_validation.md
    │   │   │   ├── framework_compliance_validation.md
    │   │   │   ├── research_self_validation.md
    │   │   │   ├── security_validation.md
    │   │   │   ├── structure_validation.md
    │   │   │   └── technical_accuracy_validation.md
    │   │   └── types.ts
    │   ├── index.ts
    │   ├── logging
    │   │   └── index.ts
    │   ├── mcp-tools
    │   │   ├── config-utils.ts
    │   │   ├── constants.ts
    │   │   ├── index.ts
    │   │   ├── prompt-engine
    │   │   │   ├── core
    │   │   │   │   ├── engine.ts
    │   │   │   │   ├── executor.ts
    │   │   │   │   ├── index.ts
    │   │   │   │   └── types.ts
    │   │   │   ├── index.ts
    │   │   │   ├── processors
    │   │   │   │   ├── response-formatter.ts
    │   │   │   │   └── template-processor.ts
    │   │   │   └── utils
    │   │   │       ├── category-extractor.ts
    │   │   │       ├── classification.ts
    │   │   │       ├── context-builder.ts
    │   │   │       └── validation.ts
    │   │   ├── prompt-manager
    │   │   │   ├── analysis
    │   │   │   │   ├── comparison-engine.ts
    │   │   │   │   ├── gate-analyzer.ts
    │   │   │   │   └── prompt-analyzer.ts
    │   │   │   ├── core
    │   │   │   │   ├── index.ts
    │   │   │   │   ├── manager.ts
    │   │   │   │   └── types.ts
    │   │   │   ├── index.ts
    │   │   │   ├── operations
    │   │   │   │   └── file-operations.ts
    │   │   │   ├── search
    │   │   │   │   ├── filter-parser.ts
    │   │   │   │   └── prompt-matcher.ts
    │   │   │   └── utils
    │   │   │       ├── category-manager.ts
    │   │   │       └── validation.ts
    │   │   ├── shared
    │   │   │   └── structured-response-builder.ts
    │   │   ├── system-control.ts
    │   │   ├── tool-description-manager.ts
    │   │   └── types
    │   │       └── shared-types.ts
    │   ├── metrics
    │   │   ├── analytics-service.ts
    │   │   ├── index.ts
    │   │   └── types.ts
    │   ├── performance
    │   │   ├── index.ts
    │   │   └── monitor.ts
    │   ├── prompts
    │   │   ├── category-manager.ts
    │   │   ├── converter.ts
    │   │   ├── file-observer.ts
    │   │   ├── hot-reload-manager.ts
    │   │   ├── index.ts
    │   │   ├── loader.ts
    │   │   ├── promptUtils.ts
    │   │   ├── registry.ts
    │   │   └── types.ts
    │   ├── runtime
    │   │   ├── application.ts
    │   │   └── startup.ts
    │   ├── semantic
    │   │   ├── configurable-semantic-analyzer.ts
    │   │   └── integrations
    │   │       ├── index.ts
    │   │       └── llm-clients.ts
    │   ├── server
    │   │   ├── index.ts
    │   │   └── transport
    │   │       └── index.ts
    │   ├── smithery.yaml
    │   ├── text-references
    │   │   ├── conversation.ts
    │   │   └── index.ts
    │   ├── types
    │   │   └── index.ts
    │   ├── types.ts
    │   └── utils
    │       ├── chainUtils.ts
    │       ├── errorHandling.ts
    │       ├── global-resource-tracker.ts
    │       ├── index.ts
    │       └── jsonUtils.ts
    ├── tests
    │   ├── ci-startup-validation.js
    │   ├── enhanced-validation
    │   │   ├── contract-validation
    │   │   │   ├── contract-test-suite.js
    │   │   │   ├── interface-contracts.js
    │   │   │   └── interface-contracts.ts
    │   │   ├── environment-validation
    │   │   │   ├── environment-parity-checker.js
    │   │   │   └── environment-test-suite.js
    │   │   ├── lifecycle-validation
    │   │   │   ├── lifecycle-test-suite.js
    │   │   │   └── process-lifecycle-validator.js
    │   │   └── validation-orchestrator.js
    │   ├── helpers
    │   │   └── test-helpers.js
    │   ├── integration
    │   │   ├── mcp-tools.test.ts
    │   │   ├── server-startup.test.ts
    │   │   └── unified-parsing-integration.test.ts
    │   ├── performance
    │   │   ├── parsing-system-benchmark.test.ts
    │   │   └── server-performance.test.ts
    │   ├── scripts
    │   │   ├── consolidated-tools.js
    │   │   ├── establish-performance-baselines.js
    │   │   ├── functional-mcp-validation.js
    │   │   ├── integration-mcp-tools.js
    │   │   ├── integration-routing-system.js
    │   │   ├── integration-server-startup.js
    │   │   ├── integration-unified-parsing.js
    │   │   ├── methodology-guides.js
    │   │   ├── performance-memory.js
    │   │   ├── runtime-integration.js
    │   │   ├── unit-conversation-manager.js
    │   │   ├── unit-semantic-analyzer.js
    │   │   └── unit-unified-parsing.js
    │   ├── setup.ts
    │   ├── test-enhanced-parsing.js
    │   └── unit
    │       ├── conversation-manager.test.ts
    │       ├── semantic-analyzer-three-tier.test.ts
    │       └── unified-parsing-system.test.ts
    ├── tsconfig.json
    └── tsconfig.test.json
```

# Files

--------------------------------------------------------------------------------
/server/tests/enhanced-validation/validation-orchestrator.js:
--------------------------------------------------------------------------------

```javascript
  1 | #!/usr/bin/env node
  2 | /**
  3 |  * Enhanced Validation Orchestrator
  4 |  *
  5 |  * Coordinates all three validation systems to prevent CI failures:
  6 |  * 1. Interface Contract Validation
  7 |  * 2. Process Lifecycle Testing
  8 |  * 3. Environment Parity Checks
  9 |  */
 10 | 
 11 | async function runEnhancedValidationSuite() {
 12 |   try {
 13 |     console.log('🚀 Running Enhanced Validation Suite...');
 14 |     console.log('🎯 Comprehensive testing to prevent GitHub Actions failures\n');
 15 | 
 16 |     const results = {
 17 |       contractValidation: { passed: false, duration: 0 },
 18 |       lifecycleValidation: { passed: false, duration: 0 },
 19 |       environmentValidation: { passed: false, duration: 0 },
 20 |       totalTests: 3,
 21 |       passedTests: 0,
 22 |       totalDuration: 0
 23 |     };
 24 | 
 25 |     const startTime = Date.now();
 26 | 
 27 |     // Phase 1: Interface Contract Validation
 28 |     console.log('🔍 Phase 1: Interface Contract Validation');
 29 |     console.log('   Preventing registerTool-type interface mismatches...\n');
 30 | 
 31 |     const contractStart = Date.now();
 32 |     try {
 33 |       // Import the contract test directly
 34 |       const contractModule = await import('./contract-validation/contract-test-suite.js');
 35 | 
 36 |       // Note: We can't easily call the test function directly since it uses process.exit,
 37 |       // so we'll run it as a subprocess for proper isolation
 38 |       const { spawn } = await import('child_process');
 39 |       const contractResult = await new Promise((resolve) => {
 40 |         const child = spawn('node', ['tests/enhanced-validation/contract-validation/contract-test-suite.js'], {
 41 |           stdio: 'pipe',
 42 |           cwd: process.cwd()
 43 |         });
 44 | 
 45 |         let output = '';
 46 |         child.stdout.on('data', (data) => {
 47 |           output += data.toString();
 48 |         });
 49 | 
 50 |         child.stderr.on('data', (data) => {
 51 |           output += data.toString();
 52 |         });
 53 | 
 54 |         child.on('close', (code) => {
 55 |           resolve({ success: code === 0, output });
 56 |         });
 57 |       });
 58 | 
 59 |       results.contractValidation.duration = Date.now() - contractStart;
 60 |       results.contractValidation.passed = contractResult.success;
 61 | 
 62 |       if (contractResult.success) {
 63 |         console.log('   ✅ Interface contract validation passed');
 64 |         results.passedTests++;
 65 |       } else {
 66 |         console.log('   ❌ Interface contract validation failed');
 67 |       }
 68 | 
 69 |     } catch (error) {
 70 |       results.contractValidation.duration = Date.now() - contractStart;
 71 |       console.log(`   ❌ Interface contract validation error: ${error.message}`);
 72 |     }
 73 | 
 74 |     // Phase 2: Process Lifecycle Testing
 75 |     console.log('\n🔄 Phase 2: Process Lifecycle Testing');
 76 |     console.log('   Eliminating emergency process.exit() usage...\n');
 77 | 
 78 |     const lifecycleStart = Date.now();
 79 |     try {
 80 |       const { spawn } = await import('child_process');
 81 |       const lifecycleResult = await new Promise((resolve) => {
 82 |         const child = spawn('node', ['tests/enhanced-validation/lifecycle-validation/lifecycle-test-suite.js'], {
 83 |           stdio: 'pipe',
 84 |           cwd: process.cwd()
 85 |         });
 86 | 
 87 |         let output = '';
 88 |         child.stdout.on('data', (data) => {
 89 |           output += data.toString();
 90 |         });
 91 | 
 92 |         child.stderr.on('data', (data) => {
 93 |           output += data.toString();
 94 |         });
 95 | 
 96 |         child.on('close', (code) => {
 97 |           resolve({ success: code === 0, output });
 98 |         });
 99 |       });
100 | 
101 |       results.lifecycleValidation.duration = Date.now() - lifecycleStart;
102 |       results.lifecycleValidation.passed = lifecycleResult.success;
103 | 
104 |       if (lifecycleResult.success) {
105 |         console.log('   ✅ Process lifecycle validation passed');
106 |         results.passedTests++;
107 |       } else {
108 |         console.log('   ❌ Process lifecycle validation failed');
109 |       }
110 | 
111 |     } catch (error) {
112 |       results.lifecycleValidation.duration = Date.now() - lifecycleStart;
113 |       console.log(`   ❌ Process lifecycle validation error: ${error.message}`);
114 |     }
115 | 
116 |     // Phase 3: Environment Parity Checks
117 |     console.log('\n🌍 Phase 3: Environment Parity Checks');
118 |     console.log('   Detecting local vs CI environment differences...\n');
119 | 
120 |     const envStart = Date.now();
121 |     try {
122 |       const { spawn } = await import('child_process');
123 |       const envResult = await new Promise((resolve) => {
124 |         const child = spawn('node', ['tests/enhanced-validation/environment-validation/environment-test-suite.js'], {
125 |           stdio: 'pipe',
126 |           cwd: process.cwd()
127 |         });
128 | 
129 |         let output = '';
130 |         child.stdout.on('data', (data) => {
131 |           output += data.toString();
132 |         });
133 | 
134 |         child.stderr.on('data', (data) => {
135 |           output += data.toString();
136 |         });
137 | 
138 |         child.on('close', (code) => {
139 |           resolve({ success: code === 0, output });
140 |         });
141 |       });
142 | 
143 |       results.environmentValidation.duration = Date.now() - envStart;
144 |       results.environmentValidation.passed = envResult.success;
145 | 
146 |       if (envResult.success) {
147 |         console.log('   ✅ Environment parity validation passed');
148 |         results.passedTests++;
149 |       } else {
150 |         console.log('   ❌ Environment parity validation failed');
151 |       }
152 | 
153 |     } catch (error) {
154 |       results.environmentValidation.duration = Date.now() - envStart;
155 |       console.log(`   ❌ Environment parity validation error: ${error.message}`);
156 |     }
157 | 
158 |     results.totalDuration = Date.now() - startTime;
159 | 
160 |     // Final Summary
161 |     console.log('\n' + '='.repeat(70));
162 |     console.log('📊 ENHANCED VALIDATION SUITE RESULTS');
163 |     console.log('='.repeat(70));
164 |     console.log(`📈 Validation Phases Passed: ${results.passedTests}/${results.totalTests}`);
165 |     console.log(`📊 Success Rate: ${((results.passedTests / results.totalTests) * 100).toFixed(1)}%`);
166 |     console.log(`⏱️  Total Duration: ${results.totalDuration}ms`);
167 |     console.log('');
168 |     console.log('🔧 Phase Results:');
169 |     console.log(`   Interface Contract Validation: ${results.contractValidation.passed ? '✅' : '❌'} (${results.contractValidation.duration}ms)`);
170 |     console.log(`   Process Lifecycle Testing: ${results.lifecycleValidation.passed ? '✅' : '❌'} (${results.lifecycleValidation.duration}ms)`);
171 |     console.log(`   Environment Parity Checks: ${results.environmentValidation.passed ? '✅' : '❌'} (${results.environmentValidation.duration}ms)`);
172 | 
173 |     console.log('\n🎯 Impact Assessment:');
174 |     if (results.contractValidation.passed) {
175 |       console.log('   ✅ Interface mismatches (like registerTool) will be caught locally');
176 |     } else {
177 |       console.log('   ⚠️  Interface mismatches may still cause CI failures');
178 |     }
179 | 
180 |     if (results.lifecycleValidation.passed) {
181 |       console.log('   ✅ Tests will complete naturally without emergency process.exit()');
182 |     } else {
183 |       console.log('   ⚠️  Tests may still need emergency process.exit() calls');
184 |     }
185 | 
186 |     if (results.environmentValidation.passed) {
187 |       console.log('   ✅ Environment differences will be detected before CI');
188 |     } else {
189 |       console.log('   ⚠️  Environment differences may still cause CI failures');
190 |     }
191 | 
192 |     if (results.passedTests === results.totalTests) {
193 |       console.log('\n🎉 All enhanced validation systems are working correctly!');
194 |       console.log('✅ The types of CI failures you experienced should now be prevented');
195 |       console.log('✅ Local testing with ACT should catch issues before GitHub Actions');
196 |       console.log('✅ Development workflow efficiency significantly improved');
197 |       return true;
198 |     } else {
199 |       console.log('\n⚠️  Some enhanced validation systems have issues');
200 |       console.log('❌ CI failures may still occur - investigate failed validation phases');
201 |       return false;
202 |     }
203 | 
204 |   } catch (error) {
205 |     console.error('❌ Enhanced validation suite execution failed:', error.message);
206 |     console.error('Stack trace:', error.stack);
207 |     return false;
208 |   }
209 | }
210 | 
211 | // Handle process cleanup gracefully
212 | process.on('uncaughtException', (error) => {
213 |   console.error('❌ Uncaught exception in enhanced validation:', error.message);
214 | });
215 | 
216 | process.on('unhandledRejection', (reason) => {
217 |   console.error('❌ Unhandled rejection in enhanced validation:', reason);
218 | });
219 | 
220 | // Run the enhanced validation suite
221 | if (import.meta.url === `file://${process.argv[1]}`) {
222 |   runEnhancedValidationSuite().then(success => {
223 |     if (success) {
224 |       console.log('\n🎯 Enhanced validation suite completed successfully!');
225 |       console.log('🚀 Your testing infrastructure is now significantly more robust');
226 |     } else {
227 |       console.log('\n⚠️  Enhanced validation suite completed with issues');
228 |       console.log('🔧 Review failed validation phases for improvement opportunities');
229 |     }
230 |     // Natural completion - demonstrating our improved lifecycle management
231 |   }).catch(error => {
232 |     console.error('❌ Suite execution failed:', error);
233 |     // Natural completion even on error
234 |   });
235 | }
236 | 
237 | export { runEnhancedValidationSuite };
```

--------------------------------------------------------------------------------
/server/src/frameworks/types/integration-types.ts:
--------------------------------------------------------------------------------

```typescript
  1 | /**
  2 |  * Integration Layer Type Definitions
  3 |  *
  4 |  * Contains all types related to cross-system integration, framework-semantic
  5 |  * coordination, and MCP tool integration. These types support the integration
  6 |  * layer that coordinates between different systems.
  7 |  */
  8 | 
  9 | import type { ConvertedPrompt } from '../../execution/types.js';
 10 | import type { ContentAnalysisResult } from '../../semantic/configurable-semantic-analyzer.js';
 11 | import type { FrameworkDefinition, FrameworkExecutionContext } from './methodology-types.js';
 12 | 
 13 | /**
 14 |  * Integrated analysis result combining semantic intelligence and framework methodology
 15 |  */
 16 | export interface IntegratedAnalysisResult {
 17 |   // Semantic analysis results - PROMPT INTELLIGENCE
 18 |   semanticAnalysis: ContentAnalysisResult;
 19 | 
 20 |   // Framework execution context - METHODOLOGY GUIDANCE
 21 |   frameworkContext: FrameworkExecutionContext | null;
 22 | 
 23 |   // Integration metadata
 24 |   integration: {
 25 |     frameworkSelectionReason: string;
 26 |     semanticFrameworkAlignment: number; // How well semantic criteria match selected framework
 27 |     alternativeFrameworks: FrameworkDefinition[];
 28 |     consensusMetrics: {
 29 |       confidenceAlignment: number;
 30 |       complexityMatch: number;
 31 |       executionTypeCompatibility: number;
 32 |     };
 33 |   };
 34 | 
 35 |   // Combined execution recommendations
 36 |   recommendations: {
 37 |     executionApproach: string;
 38 |     expectedPerformance: {
 39 |       processingTime: number;
 40 |       memoryUsage: string;
 41 |       cacheable: boolean;
 42 |     };
 43 |     qualityAssurance: string[];
 44 |     optimizations: string[];
 45 |   };
 46 | 
 47 |   // Phase 4: Prompt guidance coordination results
 48 |   promptGuidance?: {
 49 |     guidanceApplied: boolean;
 50 |     enhancedPrompt?: any;
 51 |     systemPromptInjection?: any;
 52 |     templateEnhancement?: any;
 53 |     processingTimeMs: number;
 54 |     confidenceScore: number;
 55 |   };
 56 | }
 57 | 
 58 | /**
 59 |  * Framework switching configuration
 60 |  */
 61 | export interface FrameworkSwitchingConfig {
 62 |   enableAutomaticSwitching: boolean;
 63 |   switchingThreshold: number; // Confidence threshold for switching
 64 |   preventThrashing: boolean; // Prevent rapid framework switches
 65 |   switchingCooldownMs: number;
 66 |   blacklistedFrameworks: string[];
 67 |   preferredFrameworks: string[];
 68 | }
 69 | 
 70 | /**
 71 |  * Framework alignment result
 72 |  */
 73 | export interface FrameworkAlignmentResult {
 74 |   overallAlignment: number;
 75 |   detailedMetrics: {
 76 |     confidenceAlignment: number;
 77 |     complexityMatch: number;
 78 |     executionTypeCompatibility: number;
 79 |   };
 80 | }
 81 | 
 82 | /**
 83 |  * Framework usage insights
 84 |  */
 85 | export interface FrameworkUsageInsights {
 86 |   totalAnalyses: number;
 87 |   frameworkUsage: Record<string, FrameworkUsageMetrics & { framework: FrameworkDefinition }>;
 88 |   recommendations: string[];
 89 | }
 90 | 
 91 | /**
 92 |  * Framework usage metrics
 93 |  */
 94 | export interface FrameworkUsageMetrics {
 95 |   usageCount: number;
 96 |   averageProcessingTime: number;
 97 |   averageAlignmentScore: number;
 98 |   lastUsed: Date;
 99 | }
100 | 
101 | /**
102 |  * Framework switch recommendation
103 |  */
104 | export interface FrameworkSwitchRecommendation {
105 |   currentFramework: FrameworkDefinition;
106 |   recommendedFramework: FrameworkDefinition;
107 |   reason: string;
108 |   expectedImprovement: number;
109 | }
110 | 
111 | /**
112 |  * MCP tool integration context
113 |  */
114 | export interface MCPToolIntegrationContext {
115 |   /** Active MCP tool making the request */
116 |   activeTool: 'prompt_engine' | 'prompt_manager' | 'system_control';
117 |   /** Request parameters from MCP tool */
118 |   requestParameters: Record<string, any>;
119 |   /** User preferences from MCP tool context */
120 |   userPreferences: {
121 |     preferredFramework?: string;
122 |     enableFrameworkGuidance?: boolean;
123 |     customConfiguration?: Record<string, any>;
124 |   };
125 |   /** Integration metadata */
126 |   metadata: {
127 |     requestId: string;
128 |     timestamp: Date;
129 |     clientType: 'stdio' | 'sse' | 'unknown';
130 |   };
131 | }
132 | 
133 | /**
134 |  * MCP tool integration result
135 |  */
136 | export interface MCPToolIntegrationResult {
137 |   /** Whether integration was successful */
138 |   success: boolean;
139 |   /** Integration result data */
140 |   result: any;
141 |   /** Framework context used in integration */
142 |   frameworkContext: FrameworkExecutionContext | null;
143 |   /** Integration metrics */
144 |   metrics: {
145 |     processingTime: number;
146 |     frameworkSwitchOccurred: boolean;
147 |     enhancementsApplied: number;
148 |   };
149 |   /** Any errors that occurred */
150 |   errors: string[];
151 |   /** Integration warnings */
152 |   warnings: string[];
153 | }
154 | 
155 | /**
156 |  * Semantic integration configuration
157 |  */
158 | export interface SemanticIntegrationConfig {
159 |   /** Whether to enable framework-semantic integration */
160 |   enabled: boolean;
161 |   /** Confidence threshold for framework recommendations */
162 |   confidenceThreshold: number;
163 |   /** Whether to use semantic analysis for framework selection */
164 |   useSemanticFrameworkSelection: boolean;
165 |   /** Integration mode */
166 |   mode: 'passive' | 'active' | 'intelligent';
167 | }
168 | 
169 | /**
170 |  * Cross-system integration status
171 |  */
172 | export interface CrossSystemIntegrationStatus {
173 |   /** Status of framework system integration */
174 |   frameworkSystem: {
175 |     status: 'healthy' | 'degraded' | 'error';
176 |     lastCheck: Date;
177 |     issues: string[];
178 |   };
179 |   /** Status of semantic analysis integration */
180 |   semanticAnalysis: {
181 |     status: 'healthy' | 'degraded' | 'error';
182 |     lastCheck: Date;
183 |     capabilities: string[];
184 |     limitations: string[];
185 |   };
186 |   /** Status of MCP tools integration */
187 |   mcpTools: {
188 |     status: 'healthy' | 'degraded' | 'error';
189 |     lastCheck: Date;
190 |     activeTool: string | null;
191 |     toolErrors: Record<string, string[]>;
192 |   };
193 |   /** Status of execution system integration */
194 |   executionSystem: {
195 |     status: 'healthy' | 'degraded' | 'error';
196 |     lastCheck: Date;
197 |     executionStrategies: string[];
198 |   };
199 | }
200 | 
201 | /**
202 |  * Integration performance metrics
203 |  */
204 | export interface IntegrationPerformanceMetrics {
205 |   /** Total number of integrations performed */
206 |   totalIntegrations: number;
207 |   /** Success rate of integrations */
208 |   successRate: number;
209 |   /** Average integration processing time */
210 |   averageProcessingTime: number;
211 |   /** Framework switching statistics */
212 |   frameworkSwitching: {
213 |     totalSwitches: number;
214 |     successfulSwitches: number;
215 |     averageSwitchTime: number;
216 |   };
217 |   /** Semantic analysis performance */
218 |   semanticAnalysis: {
219 |     totalAnalyses: number;
220 |     averageAnalysisTime: number;
221 |     cacheHitRate: number;
222 |   };
223 |   /** MCP tool integration performance */
224 |   mcpToolIntegration: {
225 |     toolUsage: Record<string, number>;
226 |     averageToolResponseTime: number;
227 |     errorRate: number;
228 |   };
229 | }
230 | 
231 | /**
232 |  * Integration event for monitoring and logging
233 |  */
234 | export interface IntegrationEvent {
235 |   /** Event type */
236 |   type: 'framework_switch' | 'semantic_analysis' | 'mcp_tool_call' | 'integration_error';
237 |   /** Event timestamp */
238 |   timestamp: Date;
239 |   /** Event source */
240 |   source: string;
241 |   /** Event data */
242 |   data: Record<string, any>;
243 |   /** Event severity */
244 |   severity: 'info' | 'warn' | 'error';
245 |   /** Correlation ID for tracking related events */
246 |   correlationId?: string;
247 | }
248 | 
249 | /**
250 |  * Framework-semantic integration service interface
251 |  */
252 | export interface IFrameworkSemanticIntegration {
253 |   /**
254 |    * Analyze prompt with framework integration
255 |    */
256 |   analyzeWithFrameworkIntegration(
257 |     prompt: ConvertedPrompt,
258 |     userFrameworkPreference?: string
259 |   ): Promise<IntegratedAnalysisResult>;
260 | 
261 |   /**
262 |    * Get framework usage insights
263 |    */
264 |   getFrameworkUsageInsights(): FrameworkUsageInsights;
265 | 
266 |   /**
267 |    * Evaluate framework switch recommendation
268 |    */
269 |   evaluateFrameworkSwitch(
270 |     prompt: ConvertedPrompt,
271 |     currentResult: IntegratedAnalysisResult
272 |   ): Promise<FrameworkSwitchRecommendation | null>;
273 | 
274 |   /**
275 |    * Get integration performance metrics
276 |    */
277 |   getPerformanceMetrics(): IntegrationPerformanceMetrics;
278 | 
279 |   /**
280 |    * Get cross-system integration status
281 |    */
282 |   getIntegrationStatus(): CrossSystemIntegrationStatus;
283 | }
284 | 
285 | /**
286 |  * MCP tool integration service interface
287 |  */
288 | export interface IMCPToolIntegration {
289 |   /**
290 |    * Handle MCP tool request with framework integration
291 |    */
292 |   handleToolRequest(
293 |     context: MCPToolIntegrationContext
294 |   ): Promise<MCPToolIntegrationResult>;
295 | 
296 |   /**
297 |    * Register MCP tool for integration
298 |    */
299 |   registerTool(
300 |     toolName: string,
301 |     integrationHandler: (context: MCPToolIntegrationContext) => Promise<any>
302 |   ): void;
303 | 
304 |   /**
305 |    * Get MCP tool integration metrics
306 |    */
307 |   getToolMetrics(): Record<string, {
308 |     callCount: number;
309 |     averageResponseTime: number;
310 |     errorRate: number;
311 |     lastUsed: Date;
312 |   }>;
313 | }
314 | 
315 | /**
316 |  * Integration configuration for the entire system
317 |  */
318 | export interface SystemIntegrationConfig {
319 |   /** Framework-semantic integration configuration */
320 |   semanticIntegration: SemanticIntegrationConfig;
321 |   /** Framework switching configuration */
322 |   frameworkSwitching: FrameworkSwitchingConfig;
323 |   /** MCP tool integration settings */
324 |   mcpToolIntegration: {
325 |     enabled: boolean;
326 |     timeoutMs: number;
327 |     retryAttempts: number;
328 |     enableMetrics: boolean;
329 |   };
330 |   /** Performance monitoring settings */
331 |   performanceMonitoring: {
332 |     enabled: boolean;
333 |     metricsRetentionDays: number;
334 |     alertThresholds: {
335 |       errorRate: number;
336 |       responseTime: number;
337 |       memoryUsage: number;
338 |     };
339 |   };
340 | }
```

--------------------------------------------------------------------------------
/server/tests/scripts/establish-performance-baselines.js:
--------------------------------------------------------------------------------

```javascript
  1 | #!/usr/bin/env node
  2 | /**
  3 |  * Performance Baseline Establishment
  4 |  *
  5 |  * Measures actual system performance to establish evidence-based baselines
  6 |  * instead of arbitrary thresholds.
  7 |  */
  8 | 
  9 | async function establishPerformanceBaselines() {
 10 |   try {
 11 |     console.log('📊 Establishing Evidence-Based Performance Baselines...');
 12 |     console.log('🎯 Measuring actual system performance for realistic thresholds\n');
 13 | 
 14 |     const measurements = {
 15 |       startup: [],
 16 |       routing: [],
 17 |       framework: [],
 18 |       memory: []
 19 |     };
 20 | 
 21 |     // Import performance measurement modules
 22 |     const { Application } = await import('../../dist/runtime/application.js');
 23 |     const { UnifiedCommandParser } = await import('../../dist/execution/parsers/unified-command-parser.js');
 24 |     const { FrameworkStateManager } = await import('../../dist/frameworks/framework-state-manager.js');
 25 |     const { createSimpleLogger } = await import('../../dist/logging/index.js');
 26 | 
 27 |     console.log('🚀 Measuring Startup Performance (5 iterations)...');
 28 | 
 29 |     // Measure startup performance multiple times for consistency
 30 |     for (let i = 0; i < 5; i++) {
 31 |       const logger = createSimpleLogger();
 32 |       const application = new Application(logger);
 33 | 
 34 |       const startupStart = performance.now();
 35 | 
 36 |       const configStart = performance.now();
 37 |       await application.loadConfiguration();
 38 |       const configDuration = performance.now() - configStart;
 39 | 
 40 |       const promptsStart = performance.now();
 41 |       await application.loadPromptsData();
 42 |       const promptsDuration = performance.now() - promptsStart;
 43 | 
 44 |       const modulesStart = performance.now();
 45 |       await application.initializeModules();
 46 |       const modulesDuration = performance.now() - modulesStart;
 47 | 
 48 |       const totalStartup = performance.now() - startupStart;
 49 | 
 50 |       measurements.startup.push({
 51 |         total: totalStartup,
 52 |         config: configDuration,
 53 |         prompts: promptsDuration,
 54 |         modules: modulesDuration
 55 |       });
 56 | 
 57 |       console.log(`   Run ${i + 1}: ${totalStartup.toFixed(0)}ms total (config: ${configDuration.toFixed(0)}ms, prompts: ${promptsDuration.toFixed(0)}ms, modules: ${modulesDuration.toFixed(0)}ms)`);
 58 |     }
 59 | 
 60 |     console.log('\n🧠 Measuring Command Routing Performance (100 iterations)...');
 61 | 
 62 |     // Measure command routing performance
 63 |     const parser = new UnifiedCommandParser();
 64 |     const testCommands = [
 65 |       '>>listprompts',
 66 |       '>>help',
 67 |       '>>status',
 68 |       '>>framework switch CAGEERF',
 69 |       '>>some_prompt_name'
 70 |     ];
 71 | 
 72 |     for (let i = 0; i < 100; i++) {
 73 |       for (const command of testCommands) {
 74 |         const start = performance.now();
 75 |         try {
 76 |           parser.parseCommand(command);
 77 |         } catch (error) {
 78 |           // Some commands expected to fail
 79 |         }
 80 |         const duration = performance.now() - start;
 81 |         measurements.routing.push(duration);
 82 |       }
 83 |     }
 84 | 
 85 |     console.log('\n🔄 Measuring Framework Switching Performance (10 iterations)...');
 86 | 
 87 |     // Measure framework switching performance
 88 |     const mockLogger = { debug: () => {}, info: () => {}, warn: () => {}, error: () => {} };
 89 |     const stateManager = new FrameworkStateManager(mockLogger);
 90 | 
 91 |     for (let i = 0; i < 10; i++) {
 92 |       const start = performance.now();
 93 |       try {
 94 |         await stateManager.switchFramework('CAGEERF', 'Performance baseline test');
 95 |       } catch (error) {
 96 |         // May fail in test environment, that's ok
 97 |       }
 98 |       const duration = performance.now() - start;
 99 |       measurements.framework.push(duration);
100 |     }
101 | 
102 |     console.log('\n💾 Measuring Memory Usage...');
103 | 
104 |     // Measure memory usage
105 |     const memoryBefore = process.memoryUsage();
106 | 
107 |     // Force garbage collection if available
108 |     if (global.gc) {
109 |       global.gc();
110 |     }
111 | 
112 |     const memoryAfter = process.memoryUsage();
113 |     measurements.memory.push({
114 |       heapUsed: memoryAfter.heapUsed,
115 |       heapTotal: memoryAfter.heapTotal,
116 |       external: memoryAfter.external,
117 |       rss: memoryAfter.rss
118 |     });
119 | 
120 |     // Calculate statistics
121 |     console.log('\n📈 Performance Baseline Analysis:');
122 | 
123 |     // Startup baselines
124 |     const startupStats = calculateStats(measurements.startup.map(m => m.total));
125 |     const configStats = calculateStats(measurements.startup.map(m => m.config));
126 |     const promptsStats = calculateStats(measurements.startup.map(m => m.prompts));
127 |     const modulesStats = calculateStats(measurements.startup.map(m => m.modules));
128 | 
129 |     console.log('\n🚀 Startup Performance Baselines:');
130 |     console.log(`   Total Startup: avg=${startupStats.avg.toFixed(0)}ms, max=${startupStats.max.toFixed(0)}ms, p95=${startupStats.p95.toFixed(0)}ms`);
131 |     console.log(`   Config Loading: avg=${configStats.avg.toFixed(0)}ms, max=${configStats.max.toFixed(0)}ms, p95=${configStats.p95.toFixed(0)}ms`);
132 |     console.log(`   Prompts Loading: avg=${promptsStats.avg.toFixed(0)}ms, max=${promptsStats.max.toFixed(0)}ms, p95=${promptsStats.p95.toFixed(0)}ms`);
133 |     console.log(`   Modules Init: avg=${modulesStats.avg.toFixed(0)}ms, max=${modulesStats.max.toFixed(0)}ms, p95=${modulesStats.p95.toFixed(0)}ms`);
134 | 
135 |     // Routing baselines
136 |     const routingStats = calculateStats(measurements.routing);
137 |     console.log('\n🧠 Command Routing Performance Baselines:');
138 |     console.log(`   Routing Detection: avg=${routingStats.avg.toFixed(2)}ms, max=${routingStats.max.toFixed(2)}ms, p95=${routingStats.p95.toFixed(2)}ms`);
139 | 
140 |     // Framework baselines
141 |     if (measurements.framework.length > 0) {
142 |       const frameworkStats = calculateStats(measurements.framework);
143 |       console.log('\n🔄 Framework Switching Performance Baselines:');
144 |       console.log(`   Framework Switch: avg=${frameworkStats.avg.toFixed(0)}ms, max=${frameworkStats.max.toFixed(0)}ms, p95=${frameworkStats.p95.toFixed(0)}ms`);
145 |     }
146 | 
147 |     // Memory baselines
148 |     const memUsage = measurements.memory[0];
149 |     console.log('\n💾 Memory Usage Baselines:');
150 |     console.log(`   Heap Used: ${(memUsage.heapUsed / 1024 / 1024).toFixed(1)}MB`);
151 |     console.log(`   RSS: ${(memUsage.rss / 1024 / 1024).toFixed(1)}MB`);
152 | 
153 |     // Generate recommended baselines (p95 + 20% margin)
154 |     console.log('\n🎯 Recommended Evidence-Based Baselines:');
155 | 
156 |     const RECOMMENDED_BASELINES = {
157 |       startup: Math.ceil(startupStats.p95 * 1.2),
158 |       config: Math.ceil(configStats.p95 * 1.2),
159 |       prompts: Math.ceil(promptsStats.p95 * 1.2),
160 |       modules: Math.ceil(modulesStats.p95 * 1.2),
161 |       routing: Math.ceil(routingStats.p95 * 1.2 * 100) / 100, // Round to 2 decimals
162 |       memory: Math.ceil((memUsage.rss / 1024 / 1024) * 1.5) // 50% margin for memory
163 |     };
164 | 
165 |     console.log(`   PERFORMANCE_BASELINES = {`);
166 |     console.log(`     startup: ${RECOMMENDED_BASELINES.startup},     // ${RECOMMENDED_BASELINES.startup}ms max total startup`);
167 |     console.log(`     config: ${RECOMMENDED_BASELINES.config},      // ${RECOMMENDED_BASELINES.config}ms config loading`);
168 |     console.log(`     prompts: ${RECOMMENDED_BASELINES.prompts},    // ${RECOMMENDED_BASELINES.prompts}ms prompts loading`);
169 |     console.log(`     modules: ${RECOMMENDED_BASELINES.modules},    // ${RECOMMENDED_BASELINES.modules}ms modules initialization`);
170 |     console.log(`     routing: ${RECOMMENDED_BASELINES.routing},     // ${RECOMMENDED_BASELINES.routing}ms command routing detection`);
171 |     console.log(`     memory: ${RECOMMENDED_BASELINES.memory}      // ${RECOMMENDED_BASELINES.memory}MB RSS memory usage`);
172 |     console.log(`   };`);
173 | 
174 |     console.log('\n✅ Evidence-based performance baselines established!');
175 |     console.log('   These baselines are based on actual measured performance with safety margins.');
176 | 
177 |     // Write baselines to a file for reference
178 |     const baselinesConfig = {
179 |       measured: new Date().toISOString(),
180 |       startup: RECOMMENDED_BASELINES.startup,
181 |       config: RECOMMENDED_BASELINES.config,
182 |       prompts: RECOMMENDED_BASELINES.prompts,
183 |       modules: RECOMMENDED_BASELINES.modules,
184 |       routing: RECOMMENDED_BASELINES.routing,
185 |       memory: RECOMMENDED_BASELINES.memory,
186 |       measurements: {
187 |         startup: measurements.startup,
188 |         routing: routingStats,
189 |         memory: memUsage
190 |       }
191 |     };
192 | 
193 |     require('fs').writeFileSync('performance-baselines.json', JSON.stringify(baselinesConfig, null, 2));
194 |     console.log('\n💾 Baselines saved to performance-baselines.json');
195 | 
196 |     process.exit(0);
197 | 
198 |   } catch (error) {
199 |     console.error('❌ Performance baseline establishment failed:', error.message);
200 |     console.error('Stack trace:', error.stack);
201 |     process.exit(1);
202 |   }
203 | }
204 | 
205 | function calculateStats(values) {
206 |   const sorted = values.slice().sort((a, b) => a - b);
207 |   const avg = values.reduce((a, b) => a + b, 0) / values.length;
208 |   const min = sorted[0];
209 |   const max = sorted[sorted.length - 1];
210 |   const p95Index = Math.floor(sorted.length * 0.95);
211 |   const p95 = sorted[p95Index];
212 | 
213 |   return { avg, min, max, p95 };
214 | }
215 | 
216 | // Only run if this script is executed directly
217 | if (import.meta.url === `file://${process.argv[1]}`) {
218 |   establishPerformanceBaselines();
219 | }
220 | 
221 | export { establishPerformanceBaselines };
```

--------------------------------------------------------------------------------
/server/src/prompts/category-manager.ts:
--------------------------------------------------------------------------------

```typescript
  1 | /**
  2 |  * Category Manager Module
  3 |  * Handles category management logic with validation, organization, and relationship tracking
  4 |  */
  5 | 
  6 | import { Logger } from "../logging/index.js";
  7 | import { Category, PromptData } from "../types/index.js";
  8 | 
  9 | // Import category interfaces from prompts/types.ts instead of redefining
 10 | import type {
 11 |   CategoryValidationResult,
 12 |   CategoryStatistics,
 13 |   CategoryPromptRelationship
 14 | } from './types.js';
 15 | 
 16 | /**
 17 |  * CategoryManager class
 18 |  * Centralizes all category-related operations with validation and consistency checking
 19 |  */
 20 | export class CategoryManager {
 21 |   private logger: Logger;
 22 |   private categories: Category[] = [];
 23 | 
 24 |   constructor(logger: Logger) {
 25 |     this.logger = logger;
 26 |   }
 27 | 
 28 |   /**
 29 |    * Load and validate categories from configuration
 30 |    */
 31 |   async loadCategories(categories: Category[]): Promise<CategoryValidationResult> {
 32 |     this.logger.debug(`CategoryManager: Loading ${categories.length} categories`);
 33 |     
 34 |     const result: CategoryValidationResult = {
 35 |       isValid: true,
 36 |       issues: [],
 37 |       warnings: []
 38 |     };
 39 | 
 40 |     // Validate categories
 41 |     const validatedCategories: Category[] = [];
 42 |     const seenIds = new Set<string>();
 43 |     const seenNames = new Set<string>();
 44 | 
 45 |     for (let i = 0; i < categories.length; i++) {
 46 |       const category = categories[i];
 47 |       
 48 |       // Validate required fields
 49 |       if (!category.id || typeof category.id !== 'string') {
 50 |         result.issues.push(`Category ${i + 1}: Missing or invalid 'id' field`);
 51 |         result.isValid = false;
 52 |         continue;
 53 |       }
 54 | 
 55 |       if (!category.name || typeof category.name !== 'string') {
 56 |         result.issues.push(`Category ${i + 1} (${category.id}): Missing or invalid 'name' field`);
 57 |         result.isValid = false;
 58 |         continue;
 59 |       }
 60 | 
 61 |       if (!category.description || typeof category.description !== 'string') {
 62 |         result.warnings.push(`Category ${category.id}: Missing or empty description`);
 63 |       }
 64 | 
 65 |       // Check for duplicates
 66 |       if (seenIds.has(category.id)) {
 67 |         result.issues.push(`Duplicate category ID found: ${category.id}`);
 68 |         result.isValid = false;
 69 |         continue;
 70 |       }
 71 | 
 72 |       if (seenNames.has(category.name)) {
 73 |         result.warnings.push(`Duplicate category name found: ${category.name}`);
 74 |       }
 75 | 
 76 |       seenIds.add(category.id);
 77 |       seenNames.add(category.name);
 78 | 
 79 |       // Clean and normalize category
 80 |       const normalizedCategory: Category = {
 81 |         id: category.id.trim(),
 82 |         name: category.name.trim(),
 83 |         description: (category.description || '').trim()
 84 |       };
 85 | 
 86 |       validatedCategories.push(normalizedCategory);
 87 |     }
 88 | 
 89 |     this.categories = validatedCategories;
 90 | 
 91 |     this.logger.info(`CategoryManager: Loaded ${this.categories.length} valid categories`);
 92 |     if (result.issues.length > 0) {
 93 |       this.logger.error(`CategoryManager: ${result.issues.length} validation issues found`);
 94 |       result.issues.forEach(issue => this.logger.error(`  - ${issue}`));
 95 |     }
 96 |     if (result.warnings.length > 0) {
 97 |       this.logger.warn(`CategoryManager: ${result.warnings.length} warnings found`);
 98 |       result.warnings.forEach(warning => this.logger.warn(`  - ${warning}`));
 99 |     }
100 | 
101 |     return result;
102 |   }
103 | 
104 |   /**
105 |    * Get all categories
106 |    */
107 |   getCategories(): Category[] {
108 |     return [...this.categories];
109 |   }
110 | 
111 |   /**
112 |    * Get category by ID
113 |    */
114 |   getCategoryById(id: string): Category | undefined {
115 |     return this.categories.find(cat => cat.id === id);
116 |   }
117 | 
118 |   /**
119 |    * Get category by name
120 |    */
121 |   getCategoryByName(name: string): Category | undefined {
122 |     return this.categories.find(cat => cat.name === name);
123 |   }
124 | 
125 |   /**
126 |    * Validate that all prompt categories exist
127 |    */
128 |   validatePromptCategories(prompts: PromptData[]): CategoryValidationResult {
129 |     const result: CategoryValidationResult = {
130 |       isValid: true,
131 |       issues: [],
132 |       warnings: []
133 |     };
134 | 
135 |     const categoryIds = new Set(this.categories.map(cat => cat.id));
136 |     const usedCategories = new Set<string>();
137 | 
138 |     for (const prompt of prompts) {
139 |       if (!prompt.category) {
140 |         result.issues.push(`Prompt '${prompt.id}' has no category assigned`);
141 |         result.isValid = false;
142 |         continue;
143 |       }
144 | 
145 |       if (!categoryIds.has(prompt.category)) {
146 |         result.issues.push(`Prompt '${prompt.id}' references non-existent category: ${prompt.category}`);
147 |         result.isValid = false;
148 |         continue;
149 |       }
150 | 
151 |       usedCategories.add(prompt.category);
152 |     }
153 | 
154 |     // Check for unused categories
155 |     for (const category of this.categories) {
156 |       if (!usedCategories.has(category.id)) {
157 |         result.warnings.push(`Category '${category.id}' (${category.name}) has no prompts assigned`);
158 |       }
159 |     }
160 | 
161 |     return result;
162 |   }
163 | 
164 |   /**
165 |    * Get prompts by category
166 |    */
167 |   getPromptsByCategory(prompts: PromptData[], categoryId: string): PromptData[] {
168 |     return prompts.filter(prompt => prompt.category === categoryId);
169 |   }
170 | 
171 |   /**
172 |    * Get category statistics
173 |    */
174 |   getCategoryStatistics(prompts: PromptData[]): CategoryStatistics {
175 |     const categoryBreakdown: Array<{ category: Category; promptCount: number }> = [];
176 |     let totalPrompts = 0;
177 | 
178 |     for (const category of this.categories) {
179 |       const categoryPrompts = this.getPromptsByCategory(prompts, category.id);
180 |       const promptCount = categoryPrompts.length;
181 |       
182 |       categoryBreakdown.push({
183 |         category,
184 |         promptCount
185 |       });
186 |       
187 |       totalPrompts += promptCount;
188 |     }
189 | 
190 |     const categoriesWithPrompts = categoryBreakdown.filter(item => item.promptCount > 0).length;
191 |     const emptyCategoriesCount = this.categories.length - categoriesWithPrompts;
192 |     const averagePromptsPerCategory = this.categories.length > 0 
193 |       ? totalPrompts / this.categories.length 
194 |       : 0;
195 | 
196 |     return {
197 |       totalCategories: this.categories.length,
198 |       categoriesWithPrompts,
199 |       emptyCategoriesCount,
200 |       averagePromptsPerCategory,
201 |       categoryBreakdown
202 |     };
203 |   }
204 | 
205 |   /**
206 |    * Get category-prompt relationships
207 |    */
208 |   getCategoryPromptRelationships(prompts: PromptData[]): CategoryPromptRelationship[] {
209 |     return this.categories.map(category => {
210 |       const categoryPrompts = this.getPromptsByCategory(prompts, category.id);
211 | 
212 |       return {
213 |         categoryId: category.id,
214 |         categoryName: category.name,
215 |         promptIds: categoryPrompts.map(p => p.id),
216 |         promptCount: categoryPrompts.length,
217 |         hasChains: categoryPrompts.some(p => p.file && p.file.includes('chain')),
218 |         hasTemplates: categoryPrompts.some(p => p.file && p.file.includes('template'))
219 |       };
220 |     });
221 |   }
222 | 
223 |   /**
224 |    * Organize prompts by category for display
225 |    */
226 |   organizePromptsByCategory(prompts: PromptData[]): Map<Category, PromptData[]> {
227 |     const organized = new Map<Category, PromptData[]>();
228 |     
229 |     for (const category of this.categories) {
230 |       const categoryPrompts = this.getPromptsByCategory(prompts, category.id);
231 |       organized.set(category, categoryPrompts);
232 |     }
233 | 
234 |     return organized;
235 |   }
236 | 
237 |   /**
238 |    * Check consistency between categories and prompts
239 |    */
240 |   checkConsistency(prompts: PromptData[]): {
241 |     consistent: boolean;
242 |     issues: string[];
243 |     orphanedPrompts: PromptData[];
244 |     emptyCategories: Category[];
245 |   } {
246 |     const issues: string[] = [];
247 |     const orphanedPrompts: PromptData[] = [];
248 |     const emptyCategories: Category[] = [];
249 |     
250 |     const categoryIds = new Set(this.categories.map(cat => cat.id));
251 | 
252 |     // Find orphaned prompts (prompts with invalid category references)
253 |     for (const prompt of prompts) {
254 |       if (prompt.category && !categoryIds.has(prompt.category)) {
255 |         orphanedPrompts.push(prompt);
256 |         issues.push(`Prompt '${prompt.id}' references non-existent category: ${prompt.category}`);
257 |       }
258 |     }
259 | 
260 |     // Find empty categories
261 |     for (const category of this.categories) {
262 |       const categoryPrompts = this.getPromptsByCategory(prompts, category.id);
263 |       if (categoryPrompts.length === 0) {
264 |         emptyCategories.push(category);
265 |       }
266 |     }
267 | 
268 |     const consistent = issues.length === 0 && orphanedPrompts.length === 0;
269 | 
270 |     return {
271 |       consistent,
272 |       issues,
273 |       orphanedPrompts,
274 |       emptyCategories
275 |     };
276 |   }
277 | 
278 |   /**
279 |    * Get debug information for troubleshooting
280 |    */
281 |   getDebugInfo(prompts?: PromptData[]): {
282 |     categoriesLoaded: number;
283 |     categoryIds: string[];
284 |     categoryNames: string[];
285 |     statistics?: CategoryStatistics;
286 |     consistency?: ReturnType<CategoryManager["checkConsistency"]>;
287 |   } {
288 |     const debugInfo = {
289 |       categoriesLoaded: this.categories.length,
290 |       categoryIds: this.categories.map(cat => cat.id),
291 |       categoryNames: this.categories.map(cat => cat.name),
292 |       statistics: prompts ? this.getCategoryStatistics(prompts) : undefined,
293 |       consistency: prompts ? this.checkConsistency(prompts) : undefined
294 |     };
295 | 
296 |     return debugInfo;
297 |   }
298 | }
299 | 
300 | /**
301 |  * Factory function to create a CategoryManager instance
302 |  */
303 | export function createCategoryManager(logger: Logger): CategoryManager {
304 |   return new CategoryManager(logger);
305 | }
```

--------------------------------------------------------------------------------
/server/src/frameworks/types/methodology-types.ts:
--------------------------------------------------------------------------------

```typescript
  1 | /**
  2 |  * Methodology Guide Type Definitions
  3 |  *
  4 |  * Contains all types related to methodology guides, framework definitions,
  5 |  * and methodology-specific interfaces. This consolidates types from multiple
  6 |  * sources to eliminate duplication.
  7 |  */
  8 | 
  9 | import type { ConvertedPrompt } from '../../execution/types.js';
 10 | import type { ContentAnalysisResult } from '../../semantic/configurable-semantic-analyzer.js';
 11 | 
 12 | /**
 13 |  * Framework methodology definitions
 14 |  * Each framework provides system prompt templates and execution guidelines
 15 |  */
 16 | export type FrameworkMethodology = "CAGEERF" | "ReACT" | "5W1H" | "SCAMPER" | "AUTO";
 17 | 
 18 | /**
 19 |  * Framework definition structure
 20 |  */
 21 | export interface FrameworkDefinition {
 22 |   id: string;
 23 |   name: string;
 24 |   description: string;
 25 |   methodology: FrameworkMethodology;
 26 |   systemPromptTemplate: string;
 27 |   executionGuidelines: string[];
 28 |   applicableTypes: string[];
 29 |   priority: number;
 30 |   enabled: boolean;
 31 | }
 32 | 
 33 | /**
 34 |  * Framework execution context
 35 |  */
 36 | export interface FrameworkExecutionContext {
 37 |   selectedFramework: FrameworkDefinition;
 38 |   systemPrompt: string;
 39 |   executionGuidelines: string[];
 40 |   metadata: {
 41 |     selectionReason: string;
 42 |     confidence: number;
 43 |     appliedAt: Date;
 44 |   };
 45 | }
 46 | 
 47 | /**
 48 |  * Framework selection criteria
 49 |  */
 50 | export interface FrameworkSelectionCriteria {
 51 |   promptType?: string;
 52 |   complexity?: 'low' | 'medium' | 'high';
 53 |   domain?: string;
 54 |   userPreference?: FrameworkMethodology;
 55 |   executionType?: 'template' | 'chain';
 56 | }
 57 | 
 58 | /**
 59 |  * Guidance for creating new prompts based on methodology
 60 |  */
 61 | export interface PromptCreationGuidance {
 62 |   // Structure guidance for different methodology sections
 63 |   structureGuidance: {
 64 |     systemPromptSuggestions: string[];
 65 |     userTemplateSuggestions: string[];
 66 |     argumentSuggestions: ArgumentGuidance[];
 67 |   };
 68 | 
 69 |   // Methodology-specific prompt elements
 70 |   methodologyElements: {
 71 |     requiredSections: string[];
 72 |     optionalSections: string[];
 73 |     sectionDescriptions: Record<string, string>;
 74 |   };
 75 | 
 76 |   // Quality improvement suggestions
 77 |   qualityGuidance: {
 78 |     clarityEnhancements: string[];
 79 |     completenessChecks: string[];
 80 |     specificityImprovements: string[];
 81 |   };
 82 | }
 83 | 
 84 | /**
 85 |  * Guidance for processing templates during execution
 86 |  */
 87 | export interface ProcessingGuidance {
 88 |   // Methodology-specific processing steps
 89 |   processingSteps: ProcessingStep[];
 90 | 
 91 |   // Template enhancement suggestions
 92 |   templateEnhancements: {
 93 |     systemPromptAdditions: string[];
 94 |     userPromptModifications: string[];
 95 |     contextualHints: string[];
 96 |   };
 97 | 
 98 |   // Execution flow guidance
 99 |   executionFlow: {
100 |     preProcessingSteps: string[];
101 |     postProcessingSteps: string[];
102 |     validationSteps: string[];
103 |   };
104 | }
105 | 
106 | /**
107 |  * Guidance for step sequencing in execution
108 |  */
109 | export interface StepGuidance {
110 |   // Methodology-specific step sequence
111 |   stepSequence: ExecutionStep[];
112 | 
113 |   // Step-specific enhancements
114 |   stepEnhancements: Record<string, string[]>;
115 | 
116 |   // Quality gates for each step
117 |   stepValidation: Record<string, string[]>;
118 | }
119 | 
120 | /**
121 |  * Overall methodology enhancement for execution
122 |  */
123 | export interface MethodologyEnhancement {
124 |   // System prompt enhancements
125 |   systemPromptGuidance: string;
126 | 
127 |   // Processing enhancements
128 |   processingEnhancements: ProcessingStep[];
129 | 
130 |   // Quality gates specific to methodology
131 |   methodologyGates: QualityGate[];
132 | 
133 |   // Template structure suggestions
134 |   templateSuggestions: TemplateEnhancement[];
135 | 
136 |   // Execution metadata
137 |   enhancementMetadata: {
138 |     methodology: string;
139 |     confidence: number;
140 |     applicabilityReason: string;
141 |     appliedAt: Date;
142 |   };
143 | }
144 | 
145 | /**
146 |  * Core interfaces for guidance components
147 |  */
148 | export interface ArgumentGuidance {
149 |   name: string;
150 |   type: string;
151 |   description: string;
152 |   methodologyReason: string;
153 |   examples: string[];
154 | }
155 | 
156 | export interface ProcessingStep {
157 |   id: string;
158 |   name: string;
159 |   description: string;
160 |   methodologyBasis: string;
161 |   order: number;
162 |   required: boolean;
163 | }
164 | 
165 | export interface ExecutionStep {
166 |   id: string;
167 |   name: string;
168 |   action: string;
169 |   methodologyPhase: string;
170 |   dependencies: string[];
171 |   expected_output: string;
172 | }
173 | 
174 | export interface QualityGate {
175 |   id: string;
176 |   name: string;
177 |   description: string;
178 |   methodologyArea: string;
179 |   validationCriteria: string[];
180 |   priority: 'high' | 'medium' | 'low';
181 | }
182 | 
183 | export interface TemplateEnhancement {
184 |   section: 'system' | 'user' | 'arguments' | 'metadata';
185 |   type: 'addition' | 'modification' | 'structure';
186 |   description: string;
187 |   content: string;
188 |   methodologyJustification: string;
189 |   impact: 'high' | 'medium' | 'low';
190 | }
191 | 
192 | /**
193 |  * Tool-specific descriptions for a methodology
194 |  */
195 | export interface MethodologyToolDescription {
196 |   description?: string;
197 |   parameters?: Record<string, string>;
198 | }
199 | 
200 | /**
201 |  * Complete tool descriptions provided by a methodology guide
202 |  */
203 | export interface MethodologyToolDescriptions {
204 |   prompt_engine?: MethodologyToolDescription;
205 |   prompt_manager?: MethodologyToolDescription;
206 |   system_control?: MethodologyToolDescription;
207 | }
208 | 
209 | /**
210 |  * Methodology validation results
211 |  */
212 | export interface MethodologyValidation {
213 |   compliant: boolean;
214 |   compliance_score: number; // 0.0 to 1.0
215 |   strengths: string[];
216 |   improvement_areas: string[];
217 |   specific_suggestions: TemplateEnhancement[];
218 |   methodology_gaps: string[];
219 | }
220 | 
221 | /**
222 |  * Main interface for methodology guides
223 |  * Framework adapters implement this to provide guidance rather than analysis
224 |  */
225 | export interface IMethodologyGuide {
226 |   // Framework identification
227 |   readonly frameworkId: string;
228 |   readonly frameworkName: string;
229 |   readonly methodology: string;
230 |   readonly version: string;
231 | 
232 |   /**
233 |    * Guide the creation of new prompts using this methodology
234 |    * @param intent The user's intent or goal for the prompt
235 |    * @param context Additional context information
236 |    * @returns Guidance for structuring the prompt according to methodology
237 |    */
238 |   guidePromptCreation(
239 |     intent: string,
240 |     context?: Record<string, any>
241 |   ): PromptCreationGuidance;
242 | 
243 |   /**
244 |    * Guide template processing during execution
245 |    * @param template The template being processed
246 |    * @param executionType The execution strategy from semantic analyzer
247 |    * @returns Processing guidance based on methodology
248 |    */
249 |   guideTemplateProcessing(
250 |     template: string,
251 |     executionType: string
252 |   ): ProcessingGuidance;
253 | 
254 |   /**
255 |    * Guide execution step sequencing
256 |    * @param prompt The prompt being executed
257 |    * @param semanticAnalysis Results from unified semantic analyzer
258 |    * @returns Step-by-step guidance based on methodology
259 |    */
260 |   guideExecutionSteps(
261 |     prompt: ConvertedPrompt,
262 |     semanticAnalysis: ContentAnalysisResult
263 |   ): StepGuidance;
264 | 
265 |   /**
266 |    * Enhance execution with methodology-specific improvements
267 |    * @param prompt The prompt to enhance
268 |    * @param context Current execution context
269 |    * @returns Methodology enhancements to apply
270 |    */
271 |   enhanceWithMethodology(
272 |     prompt: ConvertedPrompt,
273 |     context: Record<string, any>
274 |   ): MethodologyEnhancement;
275 | 
276 |   /**
277 |    * Validate that a prompt follows methodology principles
278 |    * @param prompt The prompt to validate
279 |    * @returns Validation results and improvement suggestions
280 |    */
281 |   validateMethodologyCompliance(
282 |     prompt: ConvertedPrompt
283 |   ): MethodologyValidation;
284 | 
285 |   /**
286 |    * Get methodology-specific system prompt guidance
287 |    * @param context Execution context
288 |    * @returns System prompt additions for this methodology
289 |    */
290 |   getSystemPromptGuidance(
291 |     context: Record<string, any>
292 |   ): string;
293 | 
294 |   /**
295 |    * Get methodology-specific tool descriptions (optional)
296 |    * Provides custom descriptions for MCP tools when this methodology is active
297 |    * @returns Tool descriptions customized for this methodology
298 |    */
299 |   getToolDescriptions?(): MethodologyToolDescriptions;
300 | }
301 | 
302 | /**
303 |  * Base class for methodology guides
304 |  * Provides common functionality for all methodology implementations
305 |  */
306 | export abstract class BaseMethodologyGuide implements IMethodologyGuide {
307 |   abstract readonly frameworkId: string;
308 |   abstract readonly frameworkName: string;
309 |   abstract readonly methodology: string;
310 |   abstract readonly version: string;
311 | 
312 |   abstract guidePromptCreation(
313 |     intent: string,
314 |     context?: Record<string, any>
315 |   ): PromptCreationGuidance;
316 | 
317 |   abstract guideTemplateProcessing(
318 |     template: string,
319 |     executionType: string
320 |   ): ProcessingGuidance;
321 | 
322 |   abstract guideExecutionSteps(
323 |     prompt: ConvertedPrompt,
324 |     semanticAnalysis: ContentAnalysisResult
325 |   ): StepGuidance;
326 | 
327 |   abstract enhanceWithMethodology(
328 |     prompt: ConvertedPrompt,
329 |     context: Record<string, any>
330 |   ): MethodologyEnhancement;
331 | 
332 |   abstract validateMethodologyCompliance(
333 |     prompt: ConvertedPrompt
334 |   ): MethodologyValidation;
335 | 
336 |   abstract getSystemPromptGuidance(
337 |     context: Record<string, any>
338 |   ): string;
339 | 
340 |   /**
341 |    * Helper method to extract combined text from prompt
342 |    */
343 |   protected getCombinedText(prompt: ConvertedPrompt): string {
344 |     return [
345 |       prompt.systemMessage || '',
346 |       prompt.userMessageTemplate || '',
347 |       prompt.description || ''
348 |     ].filter(text => text.trim()).join(' ');
349 |   }
350 | 
351 |   /**
352 |    * Helper method to create enhancement metadata
353 |    */
354 |   protected createEnhancementMetadata(confidence: number, reason: string) {
355 |     return {
356 |       methodology: this.methodology,
357 |       confidence,
358 |       applicabilityReason: reason,
359 |       appliedAt: new Date()
360 |     };
361 |   }
362 | }
```

--------------------------------------------------------------------------------
/server/src/logging/index.ts:
--------------------------------------------------------------------------------

```typescript
  1 | /**
  2 |  * Logging Module
  3 |  * Handles file logging and transport-aware console logging
  4 |  */
  5 | 
  6 | import { appendFile, writeFile } from "fs/promises";
  7 | import { LogLevel, TransportType } from "../types/index.js";
  8 | 
  9 | /**
 10 |  * Logger interface compatible with existing code
 11 |  */
 12 | export interface Logger {
 13 |   info: (message: string, ...args: any[]) => void;
 14 |   error: (message: string, ...args: any[]) => void;
 15 |   warn: (message: string, ...args: any[]) => void;
 16 |   debug: (message: string, ...args: any[]) => void;
 17 | }
 18 | 
 19 | /**
 20 |  * Logging configuration options for EnhancedLogger
 21 |  */
 22 | export interface EnhancedLoggingConfig {
 23 |   logFile: string;
 24 |   transport: string;
 25 |   enableDebug?: boolean;
 26 |   configuredLevel?: string; // NEW: Support config-based log level
 27 | }
 28 | 
 29 | /**
 30 |  * Enhanced logger implementation with file and console logging
 31 |  */
 32 | export class EnhancedLogger implements Logger {
 33 |   private logFile: string;
 34 |   private transport: string;
 35 |   private enableDebug: boolean;
 36 |   private isCI: boolean;
 37 |   private configuredLevel: LogLevel;
 38 |   private static readonly LOG_LEVEL_PRIORITY = {
 39 |     [LogLevel.ERROR]: 0,
 40 |     [LogLevel.WARN]: 1,
 41 |     [LogLevel.INFO]: 2,
 42 |     [LogLevel.DEBUG]: 3,
 43 |   };
 44 | 
 45 |   constructor(config: EnhancedLoggingConfig) {
 46 |     this.logFile = config.logFile;
 47 |     this.transport = config.transport;
 48 |     this.enableDebug = config.enableDebug || false;
 49 |     this.isCI = process.env.CI === 'true' || process.env.NODE_ENV === 'test';
 50 |     
 51 |     // Map config level to LogLevel enum with fallback to INFO
 52 |     this.configuredLevel = this.parseLogLevel(config.configuredLevel || 'info');
 53 |   }
 54 | 
 55 |   /**
 56 |    * Parse string log level to LogLevel enum
 57 |    */
 58 |   private parseLogLevel(level: string): LogLevel {
 59 |     const normalizedLevel = level.toUpperCase();
 60 |     switch (normalizedLevel) {
 61 |       case 'DEBUG': return LogLevel.DEBUG;
 62 |       case 'INFO': return LogLevel.INFO;
 63 |       case 'WARN': return LogLevel.WARN;
 64 |       case 'ERROR': return LogLevel.ERROR;
 65 |       default: 
 66 |         console.warn(`Unknown log level "${level}", defaulting to INFO`);
 67 |         return LogLevel.INFO;
 68 |     }
 69 |   }
 70 | 
 71 |   /**
 72 |    * Check if a log level should be output based on configuration
 73 |    */
 74 |   private shouldLog(level: LogLevel): boolean {
 75 |     // Command-line flags override config
 76 |     if (this.enableDebug) {
 77 |       return true; // Show everything in debug mode
 78 |     }
 79 |     
 80 |     const levelPriority = EnhancedLogger.LOG_LEVEL_PRIORITY[level];
 81 |     const configPriority = EnhancedLogger.LOG_LEVEL_PRIORITY[this.configuredLevel];
 82 |     
 83 |     return levelPriority <= configPriority;
 84 |   }
 85 | 
 86 |   /**
 87 |    * Initialize the log file with a clean start
 88 |    */
 89 |   async initLogFile(): Promise<void> {
 90 |     try {
 91 |       const timestamp = new Date().toISOString();
 92 |       await writeFile(
 93 |         this.logFile,
 94 |         `--- MCP Server Log Started at ${timestamp} ---\n`,
 95 |         "utf8"
 96 |       );
 97 |     } catch (error) {
 98 |       console.error(`Error initializing log file:`, error);
 99 |     }
100 |   }
101 | 
102 |   /**
103 |    * Write a message to the log file
104 |    */
105 |   private async logToFile(
106 |     level: LogLevel,
107 |     message: string,
108 |     ...args: any[]
109 |   ): Promise<void> {
110 |     // Check if this log level should be output based on configuration
111 |     if (!this.shouldLog(level)) {
112 |       return;
113 |     }
114 | 
115 |     try {
116 |       let logMessage = `[${new Date().toISOString()}] [${level}] ${message}`;
117 |       if (args.length > 0) {
118 |         logMessage += ` ${args
119 |           .map((arg) => (typeof arg === "object" ? JSON.stringify(arg) : arg))
120 |           .join(" ")}`;
121 |       }
122 |       await appendFile(this.logFile, logMessage + "\n", "utf8");
123 |     } catch (error) {
124 |       console.error("Error writing to log file:", error);
125 |     }
126 |   }
127 | 
128 |   /**
129 |    * Log to console based on transport and environment
130 |    */
131 |   private logToConsole(level: LogLevel, message: string, ...args: any[]): void {
132 |     // Check if this log level should be output based on configuration
133 |     if (!this.shouldLog(level)) {
134 |       return;
135 |     }
136 | 
137 |     // In CI environment, always log errors and warnings regardless of transport
138 |     // This ensures critical issues are visible in CI output
139 |     if (this.isCI) {
140 |       if (level === LogLevel.ERROR || level === LogLevel.WARN) {
141 |         switch (level) {
142 |           case LogLevel.ERROR:
143 |             console.error(`[ERROR] ${message}`, ...args);
144 |             break;
145 |           case LogLevel.WARN:
146 |             console.warn(`[WARN] ${message}`, ...args);
147 |             break;
148 |         }
149 |         return;
150 |       }
151 |       // In CI, suppress DEBUG messages unless explicitly enabled
152 |       if (level === LogLevel.DEBUG && !this.enableDebug) {
153 |         return;
154 |       }
155 |     }
156 | 
157 |     // Standard logging for non-CI environments
158 |     if (this.transport !== TransportType.STDIO) {
159 |       switch (level) {
160 |         case LogLevel.INFO:
161 |           console.log(`[INFO] ${message}`, ...args);
162 |           break;
163 |         case LogLevel.ERROR:
164 |           console.error(`[ERROR] ${message}`, ...args);
165 |           break;
166 |         case LogLevel.WARN:
167 |           console.warn(`[WARN] ${message}`, ...args);
168 |           break;
169 |         case LogLevel.DEBUG:
170 |           console.log(`[DEBUG] ${message}`, ...args);
171 |           break;
172 |       }
173 |     }
174 |   }
175 | 
176 |   /**
177 |    * Info level logging
178 |    */
179 |   info(message: string, ...args: any[]): void {
180 |     this.logToConsole(LogLevel.INFO, message, ...args);
181 |     this.logToFile(LogLevel.INFO, message, ...args);
182 |   }
183 | 
184 |   /**
185 |    * Error level logging
186 |    */
187 |   error(message: string, ...args: any[]): void {
188 |     this.logToConsole(LogLevel.ERROR, message, ...args);
189 |     this.logToFile(LogLevel.ERROR, message, ...args);
190 |   }
191 | 
192 |   /**
193 |    * Warning level logging
194 |    */
195 |   warn(message: string, ...args: any[]): void {
196 |     this.logToConsole(LogLevel.WARN, message, ...args);
197 |     this.logToFile(LogLevel.WARN, message, ...args);
198 |   }
199 | 
200 |   /**
201 |    * Debug level logging
202 |    */
203 |   debug(message: string, ...args: any[]): void {
204 |     this.logToConsole(LogLevel.DEBUG, message, ...args);
205 |     this.logToFile(LogLevel.DEBUG, message, ...args);
206 |   }
207 | 
208 |   /**
209 |    * Update transport type (useful when transport is determined after logger creation)
210 |    */
211 |   setTransport(transport: string): void {
212 |     this.transport = transport;
213 |   }
214 | 
215 |   /**
216 |    * Enable or disable debug logging
217 |    */
218 |   setDebugEnabled(enabled: boolean): void {
219 |     this.enableDebug = enabled;
220 |   }
221 | 
222 |   /**
223 |    * Log startup information
224 |    */
225 |   logStartupInfo(transport: string, config: any): void {
226 |     this.info(`Server starting up - Process ID: ${process.pid}`);
227 |     this.info(`Node version: ${process.version}`);
228 |     this.info(`Working directory: ${process.cwd()}`);
229 |     this.info(`Using transport: ${transport}`);
230 |     this.info(`Command-line arguments: ${JSON.stringify(process.argv)}`);
231 |     this.debug("Configuration:", JSON.stringify(config, null, 2));
232 |   }
233 | 
234 |   /**
235 |    * Log memory usage information
236 |    */
237 |   logMemoryUsage(): void {
238 |     this.info(
239 |       `Server process memory usage: ${JSON.stringify(process.memoryUsage())}`
240 |     );
241 |   }
242 | }
243 | 
244 | /**
245 |  * Create a logger instance
246 |  */
247 | export function createLogger(config: EnhancedLoggingConfig): EnhancedLogger {
248 |   return new EnhancedLogger(config);
249 | }
250 | 
251 | /**
252 |  * Create a simple logger for areas that don't need the full enhanced logger
253 |  * Now supports verbosity control via command-line flags
254 |  */
255 | export function createSimpleLogger(transport: string = "sse"): Logger {
256 |   const enableConsole = transport !== TransportType.STDIO;
257 | 
258 |   // Check command-line flags for verbosity control
259 |   const args = process.argv.slice(2);
260 |   const isVerbose =
261 |     args.includes("--verbose") || args.includes("--debug-startup");
262 |   const isQuiet = args.includes("--quiet");
263 | 
264 |   return {
265 |     info: (message: string, ...args: any[]) => {
266 |       if (enableConsole && !isQuiet) {
267 |         console.log(`[INFO] ${message}`, ...args);
268 |       }
269 |     },
270 |     error: (message: string, ...args: any[]) => {
271 |       if (enableConsole && !isQuiet) {
272 |         console.error(`[ERROR] ${message}`, ...args);
273 |       }
274 |     },
275 |     warn: (message: string, ...args: any[]) => {
276 |       if (enableConsole && !isQuiet) {
277 |         console.warn(`[WARN] ${message}`, ...args);
278 |       }
279 |     },
280 |     debug: (message: string, ...args: any[]) => {
281 |       if (enableConsole && isVerbose) {
282 |         console.log(`[DEBUG] ${message}`, ...args);
283 |       }
284 |     },
285 |   };
286 | }
287 | 
288 | /**
289 |  * Setup console redirection for STDIO transport
290 |  * This prevents log messages from interfering with JSON MCP messages
291 |  */
292 | export function setupConsoleRedirection(logger: Logger): void {
293 |   const originalConsoleLog = console.log;
294 |   const originalConsoleError = console.error;
295 | 
296 |   console.log = (...args) => {
297 |     logger.debug("CONSOLE: " + args.join(" "));
298 |   };
299 | 
300 |   console.error = (...args) => {
301 |     logger.error("CONSOLE_ERROR: " + args.join(" "));
302 |   };
303 | }
304 | 
305 | /**
306 |  * Setup process event handlers for logging
307 |  */
308 | export function setupProcessEventHandlers(logger: Logger): void {
309 |   // Handle graceful shutdown
310 |   process.on("SIGINT", () => {
311 |     logger.info("Shutting down server...");
312 |     process.exit(0);
313 |   });
314 | 
315 |   // Handle uncaught exceptions
316 |   process.on("uncaughtException", (error) => {
317 |     logger.error("Uncaught exception:", error);
318 |   });
319 | 
320 |   // Handle unhandled promise rejections
321 |   process.on("unhandledRejection", (reason, promise) => {
322 |     logger.error("Unhandled Rejection at:", promise, "reason:", reason);
323 |   });
324 | 
325 |   // Log when the stdin closes (which happens when the parent process terminates)
326 |   process.stdin.on("end", () => {
327 |     logger.info("STDIN stream ended - parent process may have terminated");
328 |     process.exit(0);
329 |   });
330 | }
331 | 
```

--------------------------------------------------------------------------------
/server/src/gates/intelligence/GatePerformanceAnalyzer.ts:
--------------------------------------------------------------------------------

```typescript
  1 | /**
  2 |  * Gate Performance Analyzer - Performance Metrics & Optimization
  3 |  *
  4 |  * Single responsibility: Track gate performance metrics and provide optimization recommendations.
  5 |  * Clean dependencies: Only logger for performance tracking.
  6 |  */
  7 | 
  8 | import type { Logger } from '../../logging/index.js';
  9 | import { GatePerformanceMetrics, GateSystemAnalytics } from '../core/gate-definitions.js';
 10 | 
 11 | /**
 12 |  * Performance trend data
 13 |  */
 14 | interface PerformanceTrend {
 15 |   gateId: string;
 16 |   trend: 'improving' | 'declining' | 'stable';
 17 |   changePercent: number;
 18 |   recommendation: string;
 19 | }
 20 | 
 21 | /**
 22 |  * Gate performance analyzer with metrics tracking and optimization recommendations
 23 |  */
 24 | export class GatePerformanceAnalyzer {
 25 |   private gateMetrics = new Map<string, GatePerformanceMetrics>();
 26 |   private sessionStartTime: Date;
 27 |   private totalExecutions = 0;
 28 |   private logger: Logger;
 29 | 
 30 |   constructor(logger: Logger) {
 31 |     this.logger = logger;
 32 |     this.sessionStartTime = new Date();
 33 |     this.logger.debug('[GATE PERFORMANCE ANALYZER] Initialized');
 34 |   }
 35 | 
 36 |   /**
 37 |    * Record gate execution performance
 38 |    *
 39 |    * @param gateId - Gate identifier
 40 |    * @param executionTime - Time taken for gate execution (ms)
 41 |    * @param success - Whether the gate execution was successful
 42 |    */
 43 |   recordGateExecution(gateId: string, executionTime: number, success: boolean): void {
 44 |     this.logger.debug('[GATE PERFORMANCE ANALYZER] Recording execution:', {
 45 |       gateId,
 46 |       executionTime,
 47 |       success
 48 |     });
 49 | 
 50 |     let metrics = this.gateMetrics.get(gateId);
 51 | 
 52 |     if (!metrics) {
 53 |       metrics = {
 54 |         gateId,
 55 |         avgExecutionTime: executionTime,
 56 |         successRate: success ? 1.0 : 0.0,
 57 |         retryRate: success ? 0.0 : 1.0,
 58 |         lastUsed: new Date(),
 59 |         usageCount: 1
 60 |       };
 61 |     } else {
 62 |       // Update metrics with rolling average
 63 |       const totalTime = metrics.avgExecutionTime * metrics.usageCount + executionTime;
 64 |       metrics.usageCount++;
 65 |       metrics.avgExecutionTime = totalTime / metrics.usageCount;
 66 | 
 67 |       // Update success rate
 68 |       const totalSuccesses = metrics.successRate * (metrics.usageCount - 1) + (success ? 1 : 0);
 69 |       metrics.successRate = totalSuccesses / metrics.usageCount;
 70 | 
 71 |       // Update retry rate
 72 |       const totalRetries = metrics.retryRate * (metrics.usageCount - 1) + (success ? 0 : 1);
 73 |       metrics.retryRate = totalRetries / metrics.usageCount;
 74 | 
 75 |       metrics.lastUsed = new Date();
 76 |     }
 77 | 
 78 |     this.gateMetrics.set(gateId, metrics);
 79 |     this.totalExecutions++;
 80 |   }
 81 | 
 82 |   /**
 83 |    * Get performance analytics for all gates
 84 |    *
 85 |    * @returns Complete gate system analytics
 86 |    */
 87 |   getPerformanceAnalytics(): GateSystemAnalytics {
 88 |     const allMetrics = Array.from(this.gateMetrics.values());
 89 | 
 90 |     if (allMetrics.length === 0) {
 91 |       return {
 92 |         totalGates: 0,
 93 |         avgExecutionTime: 0,
 94 |         overallSuccessRate: 0,
 95 |         topPerformingGates: [],
 96 |         underperformingGates: [],
 97 |         recommendations: ['No gate performance data available yet']
 98 |       };
 99 |     }
100 | 
101 |     // Calculate overall metrics
102 |     const totalGates = allMetrics.length;
103 |     const avgExecutionTime = allMetrics.reduce((sum, m) => sum + m.avgExecutionTime, 0) / totalGates;
104 |     const overallSuccessRate = allMetrics.reduce((sum, m) => sum + m.successRate, 0) / totalGates;
105 | 
106 |     // Sort gates by performance
107 |     const sortedByPerformance = [...allMetrics].sort((a, b) => {
108 |       const scoreA = this.calculatePerformanceScore(a);
109 |       const scoreB = this.calculatePerformanceScore(b);
110 |       return scoreB - scoreA;
111 |     });
112 | 
113 |     const topPerformingGates = sortedByPerformance
114 |       .slice(0, 3)
115 |       .map(m => m.gateId);
116 | 
117 |     const underperformingGates = sortedByPerformance
118 |       .slice(-3)
119 |       .filter(m => this.calculatePerformanceScore(m) < 0.7)
120 |       .map(m => m.gateId);
121 | 
122 |     const recommendations = this.generateOptimizationRecommendations(allMetrics);
123 | 
124 |     return {
125 |       totalGates,
126 |       avgExecutionTime: Math.round(avgExecutionTime),
127 |       overallSuccessRate: Math.round(overallSuccessRate * 100) / 100,
128 |       topPerformingGates,
129 |       underperformingGates,
130 |       recommendations
131 |     };
132 |   }
133 | 
134 |   /**
135 |    * Get metrics for a specific gate
136 |    *
137 |    * @param gateId - Gate identifier
138 |    * @returns Gate performance metrics or null if not found
139 |    */
140 |   getGateMetrics(gateId: string): GatePerformanceMetrics | null {
141 |     const metrics = this.gateMetrics.get(gateId);
142 |     return metrics ? { ...metrics } : null;
143 |   }
144 | 
145 |   /**
146 |    * Get performance trends for analysis
147 |    *
148 |    * @returns Array of performance trends
149 |    */
150 |   getPerformanceTrends(): PerformanceTrend[] {
151 |     const trends: PerformanceTrend[] = [];
152 | 
153 |     for (const metrics of this.gateMetrics.values()) {
154 |       const trend = this.calculateTrend(metrics);
155 |       trends.push(trend);
156 |     }
157 | 
158 |     return trends.sort((a, b) => Math.abs(b.changePercent) - Math.abs(a.changePercent));
159 |   }
160 | 
161 |   /**
162 |    * Calculate performance score for a gate (0-1, higher is better)
163 |    */
164 |   private calculatePerformanceScore(metrics: GatePerformanceMetrics): number {
165 |     const successWeight = 0.6;
166 |     const speedWeight = 0.3;
167 |     const usageWeight = 0.1;
168 | 
169 |     // Normalize execution time (assuming 500ms is baseline)
170 |     const speedScore = Math.max(0, Math.min(1, (500 - metrics.avgExecutionTime) / 500 + 0.5));
171 | 
172 |     // Normalize usage count (logarithmic scale)
173 |     const usageScore = Math.min(1, Math.log10(metrics.usageCount + 1) / 2);
174 | 
175 |     return (
176 |       metrics.successRate * successWeight +
177 |       speedScore * speedWeight +
178 |       usageScore * usageWeight
179 |     );
180 |   }
181 | 
182 |   /**
183 |    * Calculate performance trend for a gate
184 |    */
185 |   private calculateTrend(metrics: GatePerformanceMetrics): PerformanceTrend {
186 |     // Simple trend analysis based on recent performance
187 |     // In a real implementation, this would track historical data
188 | 
189 |     let trend: 'improving' | 'declining' | 'stable' = 'stable';
190 |     let changePercent = 0;
191 |     let recommendation = 'Performance is stable';
192 | 
193 |     const performanceScore = this.calculatePerformanceScore(metrics);
194 | 
195 |     if (performanceScore > 0.8) {
196 |       trend = 'improving';
197 |       changePercent = 5; // Mock improvement
198 |       recommendation = 'Excellent performance, consider as a model for other gates';
199 |     } else if (performanceScore < 0.5) {
200 |       trend = 'declining';
201 |       changePercent = -10; // Mock decline
202 |       recommendation = 'Performance needs attention, consider optimization';
203 |     } else {
204 |       trend = 'stable';
205 |       changePercent = 0;
206 |       recommendation = 'Performance is acceptable, monitor for changes';
207 |     }
208 | 
209 |     return {
210 |       gateId: metrics.gateId,
211 |       trend,
212 |       changePercent,
213 |       recommendation
214 |     };
215 |   }
216 | 
217 |   /**
218 |    * Generate optimization recommendations based on metrics
219 |    */
220 |   private generateOptimizationRecommendations(allMetrics: GatePerformanceMetrics[]): string[] {
221 |     const recommendations: string[] = [];
222 | 
223 |     // Check for slow gates
224 |     const slowGates = allMetrics.filter(m => m.avgExecutionTime > 300);
225 |     if (slowGates.length > 0) {
226 |       recommendations.push(
227 |         `Optimize slow gates: ${slowGates.map(g => g.gateId).join(', ')} (>${300}ms avg)`
228 |       );
229 |     }
230 | 
231 |     // Check for low success rates
232 |     const unreliableGates = allMetrics.filter(m => m.successRate < 0.8);
233 |     if (unreliableGates.length > 0) {
234 |       recommendations.push(
235 |         `Improve reliability of: ${unreliableGates.map(g => g.gateId).join(', ')} (<80% success)`
236 |       );
237 |     }
238 | 
239 |     // Check for unused gates
240 |     const underusedGates = allMetrics.filter(m => m.usageCount < 5);
241 |     if (underusedGates.length > 0) {
242 |       recommendations.push(
243 |         `Review gate relevance: ${underusedGates.map(g => g.gateId).join(', ')} (low usage)`
244 |       );
245 |     }
246 | 
247 |     // Overall system recommendations
248 |     const avgSuccessRate = allMetrics.reduce((sum, m) => sum + m.successRate, 0) / allMetrics.length;
249 |     if (avgSuccessRate < 0.85) {
250 |       recommendations.push('Overall system success rate is below optimal (85%), review gate criteria');
251 |     }
252 | 
253 |     if (recommendations.length === 0) {
254 |       recommendations.push('Gate system performance is optimal, no immediate optimizations needed');
255 |     }
256 | 
257 |     return recommendations;
258 |   }
259 | 
260 |   /**
261 |    * Reset all performance metrics
262 |    */
263 |   resetMetrics(): void {
264 |     this.gateMetrics.clear();
265 |     this.sessionStartTime = new Date();
266 |     this.totalExecutions = 0;
267 |     this.logger.info('[GATE PERFORMANCE ANALYZER] Performance metrics reset');
268 |   }
269 | 
270 |   /**
271 |    * Get session statistics
272 |    */
273 |   getSessionStatistics() {
274 |     const sessionDuration = Date.now() - this.sessionStartTime.getTime();
275 |     const avgExecutionsPerMinute = this.totalExecutions / (sessionDuration / 60000);
276 | 
277 |     return {
278 |       sessionDuration: Math.round(sessionDuration / 1000), // seconds
279 |       totalExecutions: this.totalExecutions,
280 |       avgExecutionsPerMinute: Math.round(avgExecutionsPerMinute * 10) / 10,
281 |       uniqueGatesUsed: this.gateMetrics.size,
282 |       sessionStartTime: this.sessionStartTime.toISOString()
283 |     };
284 |   }
285 | 
286 |   /**
287 |    * Export metrics for external analysis
288 |    */
289 |   exportMetrics(): { metrics: GatePerformanceMetrics[]; session: any } {
290 |     return {
291 |       metrics: Array.from(this.gateMetrics.values()),
292 |       session: this.getSessionStatistics()
293 |     };
294 |   }
295 | }
296 | 
297 | /**
298 |  * Factory function for creating gate performance analyzer
299 |  */
300 | export function createGatePerformanceAnalyzer(logger: Logger): GatePerformanceAnalyzer {
301 |   return new GatePerformanceAnalyzer(logger);
302 | }
```

--------------------------------------------------------------------------------
/server/src/mcp-tools/prompt-manager/analysis/comparison-engine.ts:
--------------------------------------------------------------------------------

```typescript
  1 | /**
  2 |  * Before/after analysis comparison engine
  3 |  */
  4 | 
  5 | import { Logger } from "../../../logging/index.js";
  6 | import { PromptClassification } from "../core/types.js";
  7 | 
  8 | /**
  9 |  * Comparison result interface
 10 |  */
 11 | export interface ComparisonResult {
 12 |   hasChanges: boolean;
 13 |   summary: string;
 14 |   changes: ComparisonChange[];
 15 |   recommendations: string[];
 16 | }
 17 | 
 18 | /**
 19 |  * Individual comparison change
 20 |  */
 21 | export interface ComparisonChange {
 22 |   type: 'execution_type' | 'framework_requirement' | 'gates' | 'confidence' | 'complexity';
 23 |   before: any;
 24 |   after: any;
 25 |   impact: 'positive' | 'negative' | 'neutral';
 26 |   description: string;
 27 | }
 28 | 
 29 | /**
 30 |  * Analysis comparison engine for tracking prompt evolution
 31 |  */
 32 | export class ComparisonEngine {
 33 |   private logger: Logger;
 34 | 
 35 |   constructor(logger: Logger) {
 36 |     this.logger = logger;
 37 |   }
 38 | 
 39 |   /**
 40 |    * Compare two prompt analyses and generate change summary
 41 |    */
 42 |   compareAnalyses(
 43 |     before: PromptClassification,
 44 |     after: PromptClassification,
 45 |     promptId: string
 46 |   ): ComparisonResult {
 47 |     const changes: ComparisonChange[] = [];
 48 | 
 49 |     // Compare execution type
 50 |     if (before.executionType !== after.executionType) {
 51 |       changes.push({
 52 |         type: 'execution_type',
 53 |         before: before.executionType,
 54 |         after: after.executionType,
 55 |         impact: this.assessExecutionTypeChange(before.executionType, after.executionType),
 56 |         description: `Execution type changed from ${before.executionType} to ${after.executionType}`
 57 |       });
 58 |     }
 59 | 
 60 |     // Compare framework requirements
 61 |     if (before.requiresFramework !== after.requiresFramework) {
 62 |       changes.push({
 63 |         type: 'framework_requirement',
 64 |         before: before.requiresFramework,
 65 |         after: after.requiresFramework,
 66 |         impact: after.requiresFramework ? 'positive' : 'neutral',
 67 |         description: `Framework requirement ${after.requiresFramework ? 'added' : 'removed'}`
 68 |       });
 69 |     }
 70 | 
 71 |     // Compare gates
 72 |     const gateChanges = this.compareGates(before.suggestedGates, after.suggestedGates);
 73 |     changes.push(...gateChanges);
 74 | 
 75 |     // Compare confidence (if both are available and significantly different)
 76 |     if (Math.abs(before.confidence - after.confidence) > 0.2) {
 77 |       changes.push({
 78 |         type: 'confidence',
 79 |         before: before.confidence,
 80 |         after: after.confidence,
 81 |         impact: after.confidence > before.confidence ? 'positive' : 'negative',
 82 |         description: `Analysis confidence ${after.confidence > before.confidence ? 'improved' : 'decreased'} (${Math.round((after.confidence - before.confidence) * 100)}%)`
 83 |       });
 84 |     }
 85 | 
 86 |     return {
 87 |       hasChanges: changes.length > 0,
 88 |       summary: this.generateSummary(changes),
 89 |       changes,
 90 |       recommendations: this.generateRecommendations(changes, before, after)
 91 |     };
 92 |   }
 93 | 
 94 |   /**
 95 |    * Compare gate suggestions
 96 |    */
 97 |   private compareGates(beforeGates: string[], afterGates: string[]): ComparisonChange[] {
 98 |     const changes: ComparisonChange[] = [];
 99 |     const beforeSet = new Set(beforeGates);
100 |     const afterSet = new Set(afterGates);
101 | 
102 |     const addedGates = [...afterSet].filter(g => !beforeSet.has(g));
103 |     const removedGates = [...beforeSet].filter(g => !afterSet.has(g));
104 | 
105 |     if (addedGates.length > 0) {
106 |       changes.push({
107 |         type: 'gates',
108 |         before: beforeGates,
109 |         after: afterGates,
110 |         impact: 'positive',
111 |         description: `Added quality gates: ${addedGates.join(', ')}`
112 |       });
113 |     }
114 | 
115 |     if (removedGates.length > 0) {
116 |       changes.push({
117 |         type: 'gates',
118 |         before: beforeGates,
119 |         after: afterGates,
120 |         impact: 'neutral',
121 |         description: `Removed gates: ${removedGates.join(', ')}`
122 |       });
123 |     }
124 | 
125 |     return changes;
126 |   }
127 | 
128 |   /**
129 |    * Assess the impact of execution type changes
130 |    */
131 |   private assessExecutionTypeChange(
132 |     before: string,
133 |     after: string
134 |   ): 'positive' | 'negative' | 'neutral' {
135 |     // Define execution type hierarchy (complexity order)
136 |     const complexity: Record<string, number> = {
137 |       'prompt': 1,
138 |       'template': 2,
139 |       'chain': 3
140 |     };
141 | 
142 |     const beforeComplexity = complexity[before] || 0;
143 |     const afterComplexity = complexity[after] || 0;
144 | 
145 |     if (afterComplexity > beforeComplexity) {
146 |       return 'positive'; // Upgrading to more sophisticated type
147 |     } else if (afterComplexity < beforeComplexity) {
148 |       return 'neutral'; // Simplifying (could be positive optimization)
149 |     }
150 | 
151 |     return 'neutral';
152 |   }
153 | 
154 |   /**
155 |    * Generate summary of changes
156 |    */
157 |   private generateSummary(changes: ComparisonChange[]): string {
158 |     if (changes.length === 0) {
159 |       return "No significant changes detected";
160 |     }
161 | 
162 |     const typeChanges = changes.filter(c => c.type === 'execution_type');
163 |     const gateChanges = changes.filter(c => c.type === 'gates');
164 |     const frameworkChanges = changes.filter(c => c.type === 'framework_requirement');
165 | 
166 |     const parts: string[] = [];
167 | 
168 |     if (typeChanges.length > 0) {
169 |       const change = typeChanges[0];
170 |       parts.push(`🔄 **Type**: ${change.before} → ${change.after}`);
171 |     }
172 | 
173 |     if (frameworkChanges.length > 0) {
174 |       const change = frameworkChanges[0];
175 |       const status = change.after ? 'enabled' : 'disabled';
176 |       parts.push(`🧠 **Framework**: ${status}`);
177 |     }
178 | 
179 |     if (gateChanges.length > 0) {
180 |       const addedGates = gateChanges.filter(c => c.description.includes('Added'));
181 |       const removedGates = gateChanges.filter(c => c.description.includes('Removed'));
182 | 
183 |       if (addedGates.length > 0) {
184 |         parts.push(`✅ **Added Gates**`);
185 |       }
186 |       if (removedGates.length > 0) {
187 |         parts.push(`❌ **Removed Gates**`);
188 |       }
189 |     }
190 | 
191 |     if (parts.length === 0) {
192 |       return "Analysis metrics updated";
193 |     }
194 | 
195 |     return `📊 **Analysis Changes**: ${parts.join(' • ')}`;
196 |   }
197 | 
198 |   /**
199 |    * Generate recommendations based on changes
200 |    */
201 |   private generateRecommendations(
202 |     changes: ComparisonChange[],
203 |     before: PromptClassification,
204 |     after: PromptClassification
205 |   ): string[] {
206 |     const recommendations: string[] = [];
207 | 
208 |     // Execution type recommendations
209 |     const typeChanges = changes.filter(c => c.type === 'execution_type');
210 |     if (typeChanges.length > 0) {
211 |       const change = typeChanges[0];
212 |       if (change.after === 'chain' && change.before !== 'chain') {
213 |         recommendations.push("💡 Consider adding chain validation gates for multi-step execution");
214 |       } else if (change.after === 'template' && change.before === 'prompt') {
215 |         recommendations.push("💡 Framework integration now available for structured analysis");
216 |       } else if (change.after === 'prompt' && change.before !== 'prompt') {
217 |         recommendations.push("⚡ Simplified execution should improve performance");
218 |       }
219 |     }
220 | 
221 |     // Framework recommendations
222 |     const frameworkChanges = changes.filter(c => c.type === 'framework_requirement');
223 |     if (frameworkChanges.length > 0) {
224 |       const change = frameworkChanges[0];
225 |       if (change.after && !change.before) {
226 |         recommendations.push("🎯 Enable CAGEERF or ReACT framework for optimal results");
227 |       } else if (!change.after && change.before) {
228 |         recommendations.push("🚀 Framework overhead removed - consider basic prompt execution");
229 |       }
230 |     }
231 | 
232 |     // Gate recommendations
233 |     const gateChanges = changes.filter(c => c.type === 'gates');
234 |     if (gateChanges.some(c => c.description.includes('Added'))) {
235 |       recommendations.push("🔒 New quality gates will improve execution reliability");
236 |     }
237 | 
238 |     // Confidence recommendations
239 |     const confidenceChanges = changes.filter(c => c.type === 'confidence');
240 |     if (confidenceChanges.length > 0) {
241 |       const change = confidenceChanges[0];
242 |       if (change.impact === 'negative') {
243 |         recommendations.push("⚠️ Lower confidence suggests prompt may need refinement");
244 |       } else if (change.impact === 'positive') {
245 |         recommendations.push("✅ Improved confidence indicates better prompt structure");
246 |       }
247 |     }
248 | 
249 |     return recommendations;
250 |   }
251 | 
252 |   /**
253 |    * Generate change summary for display
254 |    */
255 |   generateDisplaySummary(result: ComparisonResult): string | null {
256 |     if (!result.hasChanges) {
257 |       return null;
258 |     }
259 | 
260 |     let summary = result.summary;
261 | 
262 |     if (result.recommendations.length > 0) {
263 |       summary += `\n\n💡 **Recommendations**:\n`;
264 |       result.recommendations.forEach((rec, i) => {
265 |         summary += `${i + 1}. ${rec}\n`;
266 |       });
267 |     }
268 | 
269 |     return summary;
270 |   }
271 | 
272 |   /**
273 |    * Track analysis evolution over time
274 |    */
275 |   trackEvolution(
276 |     promptId: string,
277 |     classification: PromptClassification
278 |   ): void {
279 |     // Log significant analysis data for evolution tracking
280 |     this.logger.debug(`Analysis evolution for ${promptId}:`, {
281 |       executionType: classification.executionType,
282 |       requiresFramework: classification.requiresFramework,
283 |       confidence: classification.confidence,
284 |       gates: classification.suggestedGates.length,
285 |       analysisMode: classification.analysisMode,
286 |       timestamp: new Date().toISOString()
287 |     });
288 |   }
289 | 
290 |   /**
291 |    * Assess overall improvement direction
292 |    */
293 |   assessImprovement(changes: ComparisonChange[]): 'improved' | 'degraded' | 'neutral' {
294 |     const positiveChanges = changes.filter(c => c.impact === 'positive').length;
295 |     const negativeChanges = changes.filter(c => c.impact === 'negative').length;
296 | 
297 |     if (positiveChanges > negativeChanges) {
298 |       return 'improved';
299 |     } else if (negativeChanges > positiveChanges) {
300 |       return 'degraded';
301 |     }
302 | 
303 |     return 'neutral';
304 |   }
305 | }
```

--------------------------------------------------------------------------------
/server/src/prompts/converter.ts:
--------------------------------------------------------------------------------

```typescript
  1 | /**
  2 |  * Prompt Converter Module
  3 |  * Handles converting markdown prompts to JSON structure with validation
  4 |  */
  5 | 
  6 | import path from "path";
  7 | import { Logger } from "../logging/index.js";
  8 | import type { ConvertedPrompt } from "../execution/types.js";
  9 | import type { PromptData } from "./types.js";
 10 | import { isChainPrompt } from "../utils/chainUtils.js";
 11 | import { PromptLoader } from "./loader.js";
 12 | 
 13 | /**
 14 |  * Prompt Converter class
 15 |  */
 16 | export class PromptConverter {
 17 |   private logger: Logger;
 18 |   private loader: PromptLoader;
 19 | 
 20 |   constructor(logger: Logger, loader?: PromptLoader) {
 21 |     this.logger = logger;
 22 |     this.loader = loader || new PromptLoader(logger);
 23 |   }
 24 | 
 25 |   /**
 26 |    * Convert markdown prompts to JSON structure in memory
 27 |    */
 28 |   async convertMarkdownPromptsToJson(
 29 |     promptsData: PromptData[],
 30 |     basePath?: string
 31 |   ): Promise<ConvertedPrompt[]> {
 32 |     const convertedPrompts: ConvertedPrompt[] = [];
 33 | 
 34 |     this.logger.info(
 35 |       `Converting ${promptsData.length} markdown prompts to JSON structure...`
 36 |     );
 37 | 
 38 |     for (const promptData of promptsData) {
 39 |       try {
 40 |         // Determine base path for loading files
 41 |         const fileBasePath = basePath || path.join(process.cwd(), "..");
 42 | 
 43 |         // Load the prompt file content using the loader
 44 |         const promptFile = await this.loader.loadPromptFile(
 45 |           promptData.file,
 46 |           fileBasePath
 47 |         );
 48 | 
 49 |         // Load chain steps from markdown-embedded format
 50 |         let chainSteps = promptFile.chainSteps || [];
 51 | 
 52 |         // Create converted prompt structure
 53 |         const convertedPrompt: ConvertedPrompt = {
 54 |           id: promptData.id,
 55 |           name: promptData.name,
 56 |           description: promptData.description,
 57 |           category: promptData.category,
 58 |           systemMessage: promptFile.systemMessage,
 59 |           userMessageTemplate: promptFile.userMessageTemplate,
 60 |           arguments: promptData.arguments.map((arg) => ({
 61 |             name: arg.name,
 62 |             description: arg.description,
 63 |             required: arg.required,
 64 |           })),
 65 |           // Include chain information from markdown-embedded chainSteps
 66 |           chainSteps: chainSteps,
 67 |           // Phase 2: Include gate configuration from prompt file
 68 |           gateConfiguration: promptFile.gateConfiguration,
 69 |           tools: promptData.tools || false,
 70 |           onEmptyInvocation:
 71 |             promptData.onEmptyInvocation || "execute_if_possible",
 72 |         };
 73 | 
 74 |         // NOTE: All chains now use markdown-embedded format
 75 |         // Modular chain system has been removed - chains are defined inline within markdown files
 76 |         if (isChainPrompt(convertedPrompt) && chainSteps.length === 0) {
 77 |           this.logger.debug(`Chain prompt '${convertedPrompt.id}' has no embedded chain steps - will be treated as single prompt`);
 78 |         }
 79 | 
 80 |         // Validate the onEmptyInvocation field
 81 |         if (
 82 |           promptData.onEmptyInvocation &&
 83 |           promptData.onEmptyInvocation !== "return_template" &&
 84 |           promptData.onEmptyInvocation !== "execute_if_possible"
 85 |         ) {
 86 |           this.logger.warn(
 87 |             `Prompt '${promptData.id}' has an invalid 'onEmptyInvocation' value: "${promptData.onEmptyInvocation}". ` +
 88 |               `Defaulting to "execute_if_possible". Allowed values are "return_template" or "execute_if_possible".`
 89 |           );
 90 |           convertedPrompt.onEmptyInvocation = "execute_if_possible";
 91 |         }
 92 | 
 93 |         // Validate the converted prompt
 94 |         const validation = this.validateConvertedPrompt(convertedPrompt);
 95 |         if (!validation.isValid) {
 96 |           this.logger.warn(
 97 |             `Prompt ${
 98 |               promptData.id
 99 |             } has validation issues: ${validation.errors.join(", ")}`
100 |           );
101 |           // Continue processing even with warnings
102 |         }
103 | 
104 |         convertedPrompts.push(convertedPrompt);
105 |       } catch (error) {
106 |         this.logger.error(`Error converting prompt ${promptData.id}:`, error);
107 |         // Continue with other prompts even if one fails
108 |       }
109 |     }
110 | 
111 |     this.logger.info(
112 |       `Successfully converted ${convertedPrompts.length} prompts`
113 |     );
114 |     return convertedPrompts;
115 |   }
116 | 
117 |   /**
118 |    * Validate a converted prompt
119 |    */
120 |   validateConvertedPrompt(prompt: ConvertedPrompt): {
121 |     isValid: boolean;
122 |     errors: string[];
123 |     warnings: string[];
124 |   } {
125 |     const errors: string[] = [];
126 |     const warnings: string[] = [];
127 | 
128 |     // Check required fields
129 |     if (!prompt.id) {
130 |       errors.push("Missing required field: id");
131 |     }
132 |     if (!prompt.name) {
133 |       errors.push("Missing required field: name");
134 |     }
135 |     if (!prompt.category) {
136 |       errors.push("Missing required field: category");
137 |     }
138 | 
139 |     // Check that either userMessageTemplate exists or it's a valid chain
140 |     if (!prompt.userMessageTemplate && !((prompt.chainSteps?.length || 0) > 0)) {
141 |       errors.push(
142 |         "Either userMessageTemplate must be provided or prompt must be a valid chain"
143 |       );
144 |     }
145 | 
146 |     // Validate chain prompts
147 |     if ((prompt.chainSteps?.length || 0) > 0) {
148 |       if (!prompt.chainSteps || prompt.chainSteps.length === 0) {
149 |         errors.push("Chain prompt must have at least one chain step");
150 |       } else {
151 |         // Validate each chain step
152 |         prompt.chainSteps.forEach((step, index) => {
153 |           if (!step.promptId) {
154 |             errors.push(`Chain step ${index + 1} missing promptId`);
155 |           }
156 |           if (!step.stepName) {
157 |             errors.push(`Chain step ${index + 1} missing stepName`);
158 |           }
159 |         });
160 |       }
161 |     }
162 | 
163 |     // Validate arguments
164 |     if (prompt.arguments) {
165 |       prompt.arguments.forEach((arg, index) => {
166 |         if (!arg.name) {
167 |           errors.push(`Argument ${index + 1} missing name`);
168 |         }
169 |         if (typeof arg.required !== "boolean") {
170 |           warnings.push(
171 |             `Argument ${arg.name || index + 1} has invalid required value`
172 |           );
173 |         }
174 |       });
175 |     }
176 | 
177 |     // Check for placeholder validation in template
178 |     if (prompt.userMessageTemplate) {
179 |       // Validate template syntax - reject Handlebars syntax
180 |       if (prompt.userMessageTemplate.includes('{{#if') ||
181 |           prompt.userMessageTemplate.includes('{{/if') ||
182 |           prompt.userMessageTemplate.includes('{{#each') ||
183 |           prompt.userMessageTemplate.includes('{{/each') ||
184 |           prompt.userMessageTemplate.includes('{{#unless') ||
185 |           prompt.userMessageTemplate.includes('{{/unless')) {
186 |         errors.push(
187 |           `Handlebars syntax detected in template. This system uses Nunjucks syntax.\n` +
188 |           `Replace: {{#if condition}} → {% if condition %}\n` +
189 |           `Replace: {{/if}} → {% endif %}\n` +
190 |           `Replace: {{#each items}} → {% for item in items %}\n` +
191 |           `Replace: {{/each}} → {% endfor %}`
192 |         );
193 |       }
194 | 
195 |       const placeholders = this.extractPlaceholders(prompt.userMessageTemplate);
196 |       const argumentNames = prompt.arguments.map((arg) => arg.name);
197 | 
198 |       // Find placeholders that don't have corresponding arguments
199 |       const orphanedPlaceholders = placeholders.filter(
200 |         (placeholder) =>
201 |           !argumentNames.includes(placeholder) &&
202 |           !this.isSpecialPlaceholder(placeholder)
203 |       );
204 | 
205 |       if (orphanedPlaceholders.length > 0) {
206 |         warnings.push(
207 |           `Template has placeholders without arguments: ${orphanedPlaceholders.join(
208 |             ", "
209 |           )}`
210 |         );
211 |       }
212 | 
213 |       // Find arguments that aren't used in the template
214 |       const unusedArguments = argumentNames.filter(
215 |         (argName) => !placeholders.includes(argName)
216 |       );
217 | 
218 |       if (unusedArguments.length > 0) {
219 |         warnings.push(
220 |           `Arguments not used in template: ${unusedArguments.join(", ")}`
221 |         );
222 |       }
223 |     }
224 | 
225 |     return {
226 |       isValid: errors.length === 0,
227 |       errors,
228 |       warnings,
229 |     };
230 |   }
231 | 
232 |   /**
233 |    * Extract placeholders from a template string
234 |    */
235 |   private extractPlaceholders(template: string): string[] {
236 |     const placeholderRegex = /\{\{([^}]+)\}\}/g;
237 |     const placeholders: string[] = [];
238 |     let match;
239 | 
240 |     while ((match = placeholderRegex.exec(template)) !== null) {
241 |       const placeholder = match[1].trim();
242 |       if (!placeholders.includes(placeholder)) {
243 |         placeholders.push(placeholder);
244 |       }
245 |     }
246 | 
247 |     return placeholders;
248 |   }
249 | 
250 |   /**
251 |    * Check if a placeholder is a special system placeholder
252 |    */
253 |   private isSpecialPlaceholder(placeholder: string): boolean {
254 |     const specialPlaceholders = [
255 |       "previous_message",
256 |       "tools_available",
257 |       "current_step_number",
258 |       "total_steps",
259 |       "current_step_name",
260 |       "step_number",
261 |       "step_name",
262 |     ];
263 | 
264 |     return (
265 |       specialPlaceholders.includes(placeholder) ||
266 |       placeholder.startsWith("ref:")
267 |     );
268 |   }
269 | 
270 |   /**
271 |    * Get conversion statistics
272 |    */
273 |   getConversionStats(
274 |     originalCount: number,
275 |     convertedPrompts: ConvertedPrompt[]
276 |   ): {
277 |     totalOriginal: number;
278 |     totalConverted: number;
279 |     successRate: number;
280 |     chainPrompts: number;
281 |     regularPrompts: number;
282 |     totalArguments: number;
283 |   } {
284 |     const chainPrompts = convertedPrompts.filter((p) => isChainPrompt(p)).length;
285 |     const regularPrompts = convertedPrompts.length - chainPrompts;
286 |     const totalArguments = convertedPrompts.reduce(
287 |       (sum, p) => sum + p.arguments.length,
288 |       0
289 |     );
290 | 
291 |     return {
292 |       totalOriginal: originalCount,
293 |       totalConverted: convertedPrompts.length,
294 |       successRate:
295 |         originalCount > 0 ? convertedPrompts.length / originalCount : 0,
296 |       chainPrompts,
297 |       regularPrompts,
298 |       totalArguments,
299 |     };
300 |   }
301 | }
302 | 
```

--------------------------------------------------------------------------------
/scripts/setup-windows-testing.sh:
--------------------------------------------------------------------------------

```bash
  1 | #!/bin/bash
  2 | 
  3 | # Windows Container Testing Setup Script
  4 | # Sets up multiple approaches for testing Windows compatibility locally
  5 | 
  6 | set -e
  7 | 
  8 | # Colors for output
  9 | RED='\033[0;31m'
 10 | GREEN='\033[0;32m'
 11 | YELLOW='\033[1;33m'
 12 | BLUE='\033[0;34m'
 13 | NC='\033[0m' # No Color
 14 | 
 15 | print_status() {
 16 |     echo -e "${BLUE}[INFO]${NC} $1"
 17 | }
 18 | 
 19 | print_success() {
 20 |     echo -e "${GREEN}[SUCCESS]${NC} $1"
 21 | }
 22 | 
 23 | print_warning() {
 24 |     echo -e "${YELLOW}[WARNING]${NC} $1"
 25 | }
 26 | 
 27 | print_error() {
 28 |     echo -e "${RED}[ERROR]${NC} $1"
 29 | }
 30 | 
 31 | print_status "Setting up Windows container testing environment..."
 32 | 
 33 | # Check current system
 34 | print_status "Checking system capabilities..."
 35 | echo "Docker version: $(docker --version)"
 36 | echo "Docker info:"
 37 | docker system info | grep -E "(Operating System|OSType|Architecture|Kernel Version)"
 38 | 
 39 | # Method 1: Check if Windows containers are available
 40 | print_status "Method 1: Checking for native Windows container support..."
 41 | if docker pull mcr.microsoft.com/windows/nanoserver:ltsc2022 2>/dev/null; then
 42 |     print_success "Native Windows containers are available!"
 43 |     WINDOWS_NATIVE=true
 44 | else
 45 |     print_warning "Native Windows containers not available (expected in WSL2/Linux Docker)"
 46 |     WINDOWS_NATIVE=false
 47 | fi
 48 | 
 49 | # Method 2: Set up Node.js Windows simulation
 50 | print_status "Method 2: Setting up Node.js Windows simulation..."
 51 | if docker pull node:18-alpine 2>/dev/null; then
 52 |     print_success "Node.js Alpine images available for cross-platform testing"
 53 |     NODE_SIMULATION=true
 54 | else
 55 |     print_error "Node.js images not available"
 56 |     NODE_SIMULATION=false
 57 | fi
 58 | 
 59 | # Method 3: Create Windows environment simulation (inline)
 60 | print_status "Method 3: Windows environment simulation (using inline variables)..."
 61 | cat > scripts/windows-tests/windows-env.sh << 'EOF'
 62 | #!/bin/bash
 63 | # Windows environment simulation - no sensitive files
 64 | export RUNNER_OS=Windows
 65 | export PATH="/c/Windows/System32:/c/Windows:/c/Windows/System32/Wbem:$PATH"
 66 | export USERPROFILE=/c/Users/runneradmin
 67 | export TEMP=/c/Users/runneradmin/AppData/Local/Temp
 68 | export TMP=/c/Users/runneradmin/AppData/Local/Temp
 69 | export HOMEDRIVE=C:
 70 | export HOMEPATH=/Users/runneradmin
 71 | export PATHEXT=.COM:.EXE:.BAT:.CMD:.VBS:.VBE:.JS:.JSE:.WSF:.WSH:.MSC
 72 | echo "Windows environment variables set"
 73 | EOF
 74 | chmod +x scripts/windows-tests/windows-env.sh
 75 | 
 76 | # Method 4: Enhanced Act configuration for Windows testing
 77 | print_status "Method 4: Creating enhanced Act configuration..."
 78 | cp .actrc .actrc.backup
 79 | cat > .actrc.windows-enhanced << 'EOF'
 80 | # Enhanced Windows Testing Configuration
 81 | 
 82 | # Primary testing (Linux-based but Windows-compatible Node.js testing)
 83 | -P ubuntu-latest=catthehacker/ubuntu:act-22.04
 84 | -P windows-latest=node:18-alpine
 85 | -P windows-2022=node:18-alpine  
 86 | -P windows-2019=node:16-alpine
 87 | -P macos-latest=catthehacker/ubuntu:act-22.04
 88 | 
 89 | # Environment variables for Windows simulation
 90 | --env NODE_ENV=test
 91 | --env CI=true
 92 | --env RUNNER_OS=Windows
 93 | --env RUNNER_TEMP=/tmp
 94 | --env RUNNER_TOOL_CACHE=/opt/hostedtoolcache
 95 | 
 96 | # Enhanced settings
 97 | --verbose
 98 | --container-daemon-socket unix:///var/run/docker.sock
 99 | --artifact-server-path /tmp/act-artifacts
100 | --bind
101 | EOF
102 | 
103 | # Method 5: Create Windows-specific test scripts
104 | print_status "Method 5: Creating Windows-specific test scenarios..."
105 | mkdir -p scripts/windows-tests
106 | 
107 | cat > scripts/windows-tests/test-windows-paths.js << 'EOF'
108 | // Test Windows path handling
109 | const path = require('path');
110 | const os = require('os');
111 | 
112 | console.log('Testing Windows-compatible path handling...');
113 | console.log('Platform:', os.platform());
114 | console.log('Path separator:', path.sep);
115 | console.log('Path delimiter:', path.delimiter);
116 | 
117 | // Test path operations that should work cross-platform
118 | const testPath = path.join('server', 'src', 'index.ts');
119 | console.log('Cross-platform path:', testPath);
120 | 
121 | // Test environment variables
122 | console.log('NODE_ENV:', process.env.NODE_ENV);
123 | console.log('RUNNER_OS:', process.env.RUNNER_OS);
124 | 
125 | console.log('✅ Windows compatibility test passed');
126 | EOF
127 | 
128 | cat > scripts/windows-tests/test-windows-startup.sh << 'EOF'
129 | #!/bin/bash
130 | # Test Windows-like startup scenarios
131 | 
132 | echo "Testing Windows-compatible startup..."
133 | 
134 | # Simulate Windows environment
135 | export RUNNER_OS=Windows
136 | export PATH="/c/Windows/System32:$PATH"
137 | 
138 | # Test Node.js startup
139 | cd server
140 | echo "Testing Node.js startup in Windows-like environment..."
141 | node --version
142 | npm --version
143 | 
144 | # Test our application
145 | echo "Testing MCP server startup..."
146 | npm run help
147 | 
148 | echo "✅ Windows startup test completed"
149 | EOF
150 | 
151 | chmod +x scripts/windows-tests/test-windows-startup.sh
152 | 
153 | # Method 6: Create multi-platform test runner
154 | print_status "Method 6: Creating comprehensive test runner..."
155 | cat > scripts/test-all-platforms.sh << 'EOF'
156 | #!/bin/bash
157 | 
158 | # Comprehensive multi-platform testing script
159 | 
160 | set -e
161 | 
162 | RED='\033[0;31m'
163 | GREEN='\033[0;32m'
164 | YELLOW='\033[1;33m'
165 | BLUE='\033[0;34m'
166 | NC='\033[0m'
167 | 
168 | print_test() {
169 |     echo -e "${BLUE}[TEST]${NC} $1"
170 | }
171 | 
172 | print_pass() {
173 |     echo -e "${GREEN}[PASS]${NC} $1"
174 | }
175 | 
176 | print_fail() {
177 |     echo -e "${RED}[FAIL]${NC} $1"
178 | }
179 | 
180 | # Test 1: Ubuntu (Linux) - Primary platform
181 | print_test "Testing Ubuntu/Linux platform..."
182 | if ./local-test.sh dry-run code-quality >/dev/null 2>&1; then
183 |     print_pass "Ubuntu/Linux testing works"
184 | else
185 |     print_fail "Ubuntu/Linux testing failed"
186 | fi
187 | 
188 | # Test 2: Windows simulation with Node.js
189 | print_test "Testing Windows simulation (Node.js)..."
190 | if docker run --rm -v "$PWD":/workspace -w /workspace/server node:18-alpine npm --version >/dev/null 2>&1; then
191 |     print_pass "Windows simulation (Node.js) works"
192 | else
193 |     print_fail "Windows simulation (Node.js) failed"
194 | fi
195 | 
196 | # Test 3: Cross-platform Node.js compatibility
197 | print_test "Testing cross-platform Node.js compatibility..."
198 | if node scripts/windows-tests/test-windows-paths.js >/dev/null 2>&1; then
199 |     print_pass "Cross-platform compatibility works"
200 | else
201 |     print_fail "Cross-platform compatibility failed"
202 | fi
203 | 
204 | # Test 4: Windows environment simulation
205 | print_test "Testing Windows environment simulation..."
206 | if source .env.windows && echo "Windows env loaded" >/dev/null 2>&1; then
207 |     print_pass "Windows environment simulation works"
208 | else
209 |     print_fail "Windows environment simulation failed"
210 | fi
211 | 
212 | echo ""
213 | echo "Multi-platform testing summary completed!"
214 | EOF
215 | 
216 | chmod +x scripts/test-all-platforms.sh
217 | 
218 | # Create usage instructions
219 | print_status "Creating usage instructions..."
220 | cat > WINDOWS-TESTING.md << 'EOF'
221 | # Windows Container Testing Setup
222 | 
223 | This setup provides multiple approaches for testing Windows compatibility locally in a WSL2/Linux Docker environment.
224 | 
225 | ## Available Methods
226 | 
227 | ### Method 1: Native Windows Containers (if available)
228 | ```bash
229 | # Only works if Docker is configured for Windows containers
230 | docker pull mcr.microsoft.com/windows/nanoserver:ltsc2022
231 | ```
232 | 
233 | ### Method 2: Node.js Windows Simulation
234 | ```bash
235 | # Use Alpine Node.js images for lightweight Windows-compatible testing
236 | ./local-test.sh run code-quality --actrc .actrc.windows-enhanced
237 | ```
238 | 
239 | ### Method 3: Cross-Platform Node.js Testing
240 | ```bash
241 | # Test Node.js compatibility across platforms
242 | node scripts/windows-tests/test-windows-paths.js
243 | scripts/windows-tests/test-windows-startup.sh
244 | ```
245 | 
246 | ### Method 4: Environment Simulation
247 | ```bash
248 | # Load Windows-like environment variables
249 | source scripts/windows-tests/windows-env.sh
250 | ```
251 | 
252 | ### Method 5: Comprehensive Testing
253 | ```bash
254 | # Run all platform tests
255 | scripts/test-all-platforms.sh
256 | ```
257 | 
258 | ## Usage Examples
259 | 
260 | ### Quick Windows Simulation Test
261 | ```bash
262 | # Test with Windows-like configuration
263 | ACT_RC=.actrc.windows-enhanced ./local-test.sh dry-run code-quality
264 | ```
265 | 
266 | ### Cross-Platform Build Test
267 | ```bash
268 | # Test Node.js builds across platforms
269 | docker run --rm -v "$PWD":/workspace -w /workspace/server node:18-alpine npm run build
270 | docker run --rm -v "$PWD":/workspace -w /workspace/server node:18-windowsservercore npm run build
271 | ```
272 | 
273 | ### Comprehensive CI Simulation
274 | ```bash
275 | # Simulate full CI pipeline with all platforms
276 | ./scripts/test-all-platforms.sh
277 | ```
278 | 
279 | ## Configuration Files
280 | 
281 | - `.actrc.windows-enhanced` - Enhanced Act configuration for Windows testing
282 | - `scripts/windows-tests/windows-env.sh` - Windows environment simulation script
283 | - `scripts/windows-tests/` - Windows-specific test scripts
284 | - `scripts/test-all-platforms.sh` - Comprehensive test runner
285 | 
286 | ## Notes
287 | 
288 | - True Windows containers require Windows host or Docker Desktop Windows mode
289 | - This setup provides the next best thing: cross-platform Node.js testing
290 | - Environment simulation helps catch Windows-specific path and environment issues
291 | - All tests are designed to work in WSL2/Linux Docker environments
292 | 
293 | ## Troubleshooting
294 | 
295 | 1. **Windows containers not available**: This is expected in WSL2. Use Node.js simulation instead.
296 | 2. **Path issues**: Use Node.js `path` module for cross-platform path handling.
297 | 3. **Environment variables**: Test with both Linux and Windows-style environment variables.
298 | EOF
299 | 
300 | # Summary and next steps
301 | print_status "Setup complete! Summary:"
302 | echo ""
303 | print_success "✅ Windows testing environment configured"
304 | print_success "✅ Multiple testing approaches available"
305 | print_success "✅ Cross-platform Node.js testing ready"
306 | print_success "✅ Environment simulation configured"
307 | print_success "✅ Comprehensive test runner created"
308 | echo ""
309 | print_status "Next steps:"
310 | echo "1. Review WINDOWS-TESTING.md for usage instructions"
311 | echo "2. Run: scripts/test-all-platforms.sh"
312 | echo "3. Test specific scenarios with the enhanced Act configuration"
313 | echo ""
314 | print_status "Available test commands:"
315 | echo "• scripts/test-all-platforms.sh - Comprehensive testing"
316 | echo "• ACT_RC=.actrc.windows-enhanced ./local-test.sh dry-run code-quality"
317 | echo "• node scripts/windows-tests/test-windows-paths.js"
318 | echo "• scripts/windows-tests/test-windows-startup.sh"
```

--------------------------------------------------------------------------------
/docs/troubleshooting.md:
--------------------------------------------------------------------------------

```markdown
  1 | # Troubleshooting Guide
  2 | 
  3 | This guide helps you diagnose and fix common issues with the Claude Prompts MCP Server.
  4 | 
  5 | ## 🚨 Quick Fixes for Common Issues
  6 | 
  7 | ### Server Won't Start
  8 | 
  9 | **Symptoms:**
 10 | 
 11 | - Server exits immediately after startup
 12 | - "Unable to determine server root directory" error
 13 | - Module not found errors
 14 | 
 15 | **Solutions:**
 16 | 
 17 | 1. **Set Environment Variables (Recommended)**
 18 | 
 19 |    ```bash
 20 |    # Windows
 21 |    set MCP_SERVER_ROOT=E:\path\to\claude-prompts-mcp\server
 22 |    set MCP_PROMPTS_CONFIG_PATH=E:\path\to\claude-prompts-mcp\server\promptsConfig.json
 23 | 
 24 |    # macOS/Linux
 25 |    export MCP_SERVER_ROOT=/path/to/claude-prompts-mcp/server
 26 |    export MCP_PROMPTS_CONFIG_PATH=/path/to/claude-prompts-mcp/server/promptsConfig.json
 27 |    ```
 28 | 
 29 | 2. **Use Absolute Paths in Claude Desktop Config**
 30 | 
 31 |    ```json
 32 |    {
 33 |      "mcpServers": {
 34 |        "claude-prompts-mcp": {
 35 |          "command": "node",
 36 |          "args": ["E:\\full\\path\\to\\server\\dist\\index.js"],
 37 |          "env": {
 38 |            "MCP_SERVER_ROOT": "E:\\full\\path\\to\\server",
 39 |            "MCP_PROMPTS_CONFIG_PATH": "E:\\full\\path\\to\\server\\promptsConfig.json"
 40 |          }
 41 |        }
 42 |      }
 43 |    }
 44 |    ```
 45 | 
 46 | 3. **Check Working Directory**
 47 |    ```bash
 48 |    cd claude-prompts-mcp/server
 49 |    npm start
 50 |    ```
 51 | 
 52 | ### Claude Desktop Can't Find the Server
 53 | 
 54 | **Symptoms:**
 55 | 
 56 | - Claude says MCP server is unavailable
 57 | - No prompts appear in Claude
 58 | - Connection timeout errors
 59 | 
 60 | **Diagnostic Steps:**
 61 | 
 62 | 1. **Test Server Independently**
 63 | 
 64 |    ```bash
 65 |    cd server
 66 |    npm run build
 67 |    node dist/index.js --transport=stdio --verbose
 68 |    ```
 69 | 
 70 | 2. **Check Claude Desktop Logs**
 71 | 
 72 |    - Windows: `%APPDATA%\Claude\logs\`
 73 |    - macOS: `~/Library/Logs/Claude/`
 74 |    - Look for MCP server errors
 75 | 
 76 | 3. **Verify Configuration**
 77 | 
 78 |    ```bash
 79 |    # Check if config files exist
 80 |    ls -la config.json promptsConfig.json
 81 | 
 82 |    # Validate JSON syntax
 83 |    node -e "console.log(JSON.parse(require('fs').readFileSync('config.json')))"
 84 |    ```
 85 | 
 86 | ### Prompts Not Loading
 87 | 
 88 | **Symptoms:**
 89 | 
 90 | - `>>listprompts` shows no results
 91 | - "No prompts loaded" in server logs
 92 | - Prompt files exist but aren't recognized
 93 | 
 94 | **Solutions:**
 95 | 
 96 | 1. **Check Prompts Configuration**
 97 | 
 98 |    ```bash
 99 |    # Verify promptsConfig.json syntax
100 |    node -e "console.log(JSON.parse(require('fs').readFileSync('promptsConfig.json')))"
101 | 
102 |    # Check category imports
103 |    ls -la prompts/*/prompts.json
104 |    ```
105 | 
106 | 2. **Validate Prompt File Structure**
107 | 
108 |    ```bash
109 |    # Check category-specific prompts.json files
110 |    find prompts -name "prompts.json" -exec echo "=== {} ===" \; -exec cat {} \;
111 |    ```
112 | 
113 | 3. **Test Individual Categories**
114 |    ```bash
115 |    # Start with verbose logging
116 |    npm start -- --verbose
117 |    ```
118 | 
119 | ### Hot-Reload Not Working
120 | 
121 | **Symptoms:**
122 | 
123 | - Changes to prompts don't appear without restart
124 | - `>>reload_prompts` fails
125 | - File watchers not triggering
126 | 
127 | **Solutions:**
128 | 
129 | 1. **Manual Reload**
130 | 
131 |    ```bash
132 |    >>reload_prompts reason="manual test"
133 |    ```
134 | 
135 | 2. **Check File Permissions**
136 | 
137 |    ```bash
138 |    # Ensure files are writable
139 |    ls -la prompts/*/prompts.json
140 |    chmod 644 prompts/*/prompts.json
141 |    ```
142 | 
143 | 3. **Restart Server Process**
144 |    ```bash
145 |    # Full restart
146 |    npm stop
147 |    npm start
148 |    ```
149 | 
150 | ## 🔍 Diagnostic Tools
151 | 
152 | ### Server Health Check
153 | 
154 | Run diagnostic commands to check server health:
155 | 
156 | ```bash
157 | # Check if server responds
158 | curl http://localhost:9090/status
159 | 
160 | # Test MCP tools directly
161 | echo '{"method": "listprompts", "params": {}}' | node dist/index.js --transport=stdio
162 | ```
163 | 
164 | ### Verbose Logging
165 | 
166 | Enable detailed logging for troubleshooting:
167 | 
168 | ```bash
169 | # Start with maximum verbosity
170 | npm start -- --verbose --debug-startup
171 | 
172 | # Or set log level in config.json
173 | {
174 |   "logging": {
175 |     "level": "debug",
176 |     "directory": "./logs"
177 |   }
178 | }
179 | ```
180 | 
181 | ### Path Resolution Debugging
182 | 
183 | Use built-in path detection diagnostics:
184 | 
185 | ```bash
186 | # Test path detection strategies
187 | node dist/index.js --verbose
188 | ```
189 | 
190 | The server will show detailed information about:
191 | 
192 | - Environment variables
193 | - Working directory detection
194 | - Config file resolution
195 | - Prompt file loading
196 | 
197 | ## 🐛 Common Error Messages
198 | 
199 | ### "Unable to determine server root directory"
200 | 
201 | **Cause:** Path detection failed in Claude Desktop environment
202 | 
203 | **Fix:**
204 | 
205 | 1. Set `MCP_SERVER_ROOT` environment variable
206 | 2. Use absolute paths in Claude Desktop config
207 | 3. Ensure working directory is correct
208 | 
209 | ### "Prompts configuration file NOT FOUND"
210 | 
211 | **Cause:** promptsConfig.json path is incorrect
212 | 
213 | **Fix:**
214 | 
215 | 1. Verify file exists: `ls -la promptsConfig.json`
216 | 2. Check file permissions
217 | 
218 | ### "Error loading prompt: [filename]"
219 | 
220 | **Cause:** Invalid markdown format or missing sections
221 | 
222 | **Fix:**
223 | 
224 | 1. Validate markdown syntax
225 | 2. Ensure required sections exist:
226 |    - Title (# heading)
227 |    - Description
228 |    - User Message Template (## heading)
229 | 3. Check for special characters in filenames
230 | 
231 | ### "Module not found" errors
232 | 
233 | **Cause:** Dependencies not installed or build incomplete
234 | 
235 | **Fix:**
236 | 
237 | ```bash
238 | # Reinstall dependencies
239 | rm -rf node_modules package-lock.json
240 | npm install
241 | 
242 | # Rebuild project
243 | npm run build
244 | ```
245 | 
246 | ## 🔧 Advanced Troubleshooting
247 | 
248 | ### Claude Desktop Integration Issues
249 | 
250 | **Problem:** Server works standalone but fails in Claude Desktop
251 | 
252 | **Investigation:**
253 | 
254 | 1. **Environment Differences**
255 | 
256 |    ```bash
257 |    # Compare environments
258 |    node -e "console.log(process.env)" > standalone-env.json
259 |    # Then check Claude Desktop logs for environment
260 |    ```
261 | 
262 | 2. **Working Directory Issues**
263 | 
264 |    ```javascript
265 |    // Add to server startup for debugging
266 |    console.log("Working directory:", process.cwd());
267 |    console.log("Script location:", process.argv[1]);
268 |    console.log("__dirname equivalent:", new URL(".", import.meta.url).pathname);
269 |    ```
270 | 
271 | 3. **Permission Problems**
272 |    ```bash
273 |    # Check if Claude Desktop can access files
274 |    ls -la dist/index.js
275 |    chmod +x dist/index.js
276 |    ```
277 | 
278 | ````
279 | 
280 | ### Network and Transport Issues
281 | 
282 | **Problem:** SSE transport fails or connection drops
283 | 
284 | **Solutions:**
285 | 
286 | 1. **Check Port Availability**
287 | 
288 |    ```bash
289 |    netstat -an | grep 9090
290 |    lsof -i :9090
291 | ````
292 | 
293 | 2. **Test Different Transport**
294 | 
295 |    ```json
296 |    {
297 |      "transports": {
298 |        "default": "stdio",
299 |        "sse": { "enabled": false }
300 |      }
301 |    }
302 |    ```
303 | 
304 | 3. **Firewall Configuration**
305 |    - Ensure port 9090 is open
306 |    - Check antivirus software
307 |    - Verify localhost access
308 | 
309 | ## 🛠️ Development and Testing
310 | 
311 | ### Running Tests
312 | 
313 | ```bash
314 | # Run test suite
315 | npm test
316 | 
317 | # Run with coverage
318 | npm run test:coverage
319 | 
320 | # Test specific modules
321 | npm test -- --grep "PromptManager"
322 | ```
323 | 
324 | ### Manual Testing Process
325 | 
326 | ```bash
327 | # 1. Clean build
328 | npm run clean
329 | npm run build
330 | 
331 | # 2. Test configuration loading
332 | node -e "
333 | const config = require('./dist/config/index.js');
334 | const manager = new config.ConfigManager('./config.json');
335 | manager.loadConfig().then(() => console.log('Config OK'));
336 | "
337 | 
338 | # 3. Test prompt loading
339 | node -e "
340 | const prompts = require('./dist/prompts/index.js');
341 | // Test prompt loading logic
342 | "
343 | 
344 | # 4. Test MCP tools
345 | echo '{"method": "listprompts", "params": {}}' | node dist/index.js --transport=stdio
346 | ```
347 | 
348 | ### Creating Minimal Test Cases
349 | 
350 | For bug reports, create minimal reproduction:
351 | 
352 | ```bash
353 | # Minimal server setup
354 | mkdir test-server
355 | cd test-server
356 | npm init -y
357 | npm install @modelcontextprotocol/sdk
358 | 
359 | # Minimal config.json
360 | echo '{
361 |   "server": { "name": "test", "version": "1.0.0" },
362 |   "prompts": { "file": "promptsConfig.json" }
363 | }' > config.json
364 | 
365 | # Minimal promptsConfig.json
366 | echo '{
367 |   "categories": [{"id": "test", "name": "Test"}],
368 |   "imports": ["prompts/test/prompts.json"]
369 | }' > promptsConfig.json
370 | ```
371 | 
372 | ## 📋 Collecting Debug Information
373 | 
374 | When reporting issues, include:
375 | 
376 | ### System Information
377 | 
378 | ```bash
379 | # System details
380 | node --version
381 | npm --version
382 | uname -a  # or systeminfo on Windows
383 | 
384 | # Project information
385 | git rev-parse HEAD
386 | npm list --depth=0
387 | ```
388 | 
389 | ### Server Logs
390 | 
391 | ```bash
392 | # Capture server startup with full verbosity
393 | npm start -- --verbose --debug-startup 2>&1 | tee server-debug.log
394 | ```
395 | 
396 | ### Configuration Files
397 | 
398 | ```bash
399 | # Sanitize and share configs (remove sensitive data)
400 | cat config.json
401 | cat promptsConfig.json
402 | find prompts -name "prompts.json" -exec echo "=== {} ===" \; -exec cat {} \;
403 | ```
404 | 
405 | ### Claude Desktop Configuration
406 | 
407 | ```json
408 | // Share your claude_desktop_config.json (remove paths if needed)
409 | {
410 |   "mcpServers": {
411 |     "claude-prompts-mcp": {
412 |       // Your configuration here
413 |     }
414 |   }
415 | }
416 | ```
417 | 
418 | ## 🚀 Performance Optimization
419 | 
420 | ### Startup Time Optimization
421 | 
422 | ```bash
423 | # Profile startup time
424 | time npm start
425 | 
426 | # Optimize with environment variables
427 | export MCP_SERVER_ROOT="/full/path/to/server"
428 | export MCP_PROMPTS_CONFIG_PATH="/full/path/to/server/promptsConfig.json"
429 | ```
430 | 
431 | ### Memory Usage Optimization
432 | 
433 | ```javascript
434 | // Monitor memory in config.json
435 | {
436 |   "logging": {
437 |     "level": "info",
438 |     "memoryMonitoring": true
439 |   }
440 | }
441 | ```
442 | 
443 | ### Prompt Loading Optimization
444 | 
445 | - Keep prompt files reasonably sized (< 100KB each)
446 | - Limit number of categories (< 20 for best performance)
447 | - Use text references for very long content
448 | - Avoid deeply nested category structures
449 | 
450 | ## 🆘 Getting Help
451 | 
452 | If you're still experiencing issues:
453 | 
454 | 1. **Search Existing Issues**: Check [GitHub Issues](https://github.com/minipuft/claude-prompts-mcp/issues)
455 | 
456 | 2. **Create Detailed Bug Report**:
457 | 
458 |    - Include error messages and logs
459 |    - Share your configuration (sanitized)
460 |    - Provide reproduction steps
461 |    - Include system information
462 | 
463 | 3. **Join Community Discussions**: [GitHub Discussions](https://github.com/minipuft/claude-prompts-mcp/discussions)
464 | 
465 | 4. **Emergency Debugging**: Use `--verbose --debug-startup` flags for maximum diagnostic output
466 | 
467 | Remember: Most issues are related to path resolution or configuration problems. Setting the environment variables `MCP_SERVER_ROOT` and `MCP_PROMPTS_CONFIG_PATH` solves 90% of setup issues! 🎯
468 | 
```

--------------------------------------------------------------------------------
/server/tests/integration/mcp-tools.test.ts:
--------------------------------------------------------------------------------

```typescript
  1 | /**
  2 |  * MCP Tools Integration Tests - Consolidated Architecture
  3 |  * Tests for the current 3 intelligent MCP tools with enhanced command routing
  4 |  */
  5 | 
  6 | import { createConsolidatedPromptEngine } from '../../dist/mcp-tools/prompt-engine/index.js';
  7 | import { createConsolidatedPromptManager } from '../../dist/mcp-tools/prompt-manager/index.js';
  8 | import { createConsolidatedSystemControl } from '../../dist/mcp-tools/system-control.js';
  9 | import { MockLogger, MockMcpServer, testPrompts } from '../helpers/test-helpers.js';
 10 | 
 11 | describe('Consolidated MCP Tools Integration', () => {
 12 |   let logger: MockLogger;
 13 |   let mockMcpServer: MockMcpServer;
 14 |   let promptEngine: any;
 15 |   let promptManager: any;
 16 |   let systemControl: any;
 17 | 
 18 |   beforeEach(() => {
 19 |     logger = new MockLogger();
 20 |     mockMcpServer = new MockMcpServer();
 21 | 
 22 |     // Updated mock dependencies to match current architecture
 23 |     const mockPromptManagerComponent = {
 24 |       processTemplateAsync: () => Promise.resolve('mocked template result'),
 25 |       convertedPrompts: [testPrompts.simple],
 26 |       promptsData: [testPrompts.simple],
 27 |       loadAndConvertPrompts: () => Promise.resolve([testPrompts.simple])
 28 |     };
 29 | 
 30 |     const mockSemanticAnalyzer = {
 31 |       analyzePrompt: () => Promise.resolve({
 32 |         executionType: 'template',
 33 |         requiresExecution: true,
 34 |         confidence: 0.8
 35 |       }),
 36 |       getConfig: () => ({
 37 |         llmIntegration: { enabled: false }
 38 |       })
 39 |     };
 40 | 
 41 |     const mockFrameworkManager = {
 42 |       getCurrentFramework: () => ({ frameworkId: 'CAGEERF', frameworkName: 'CAGEERF' }),
 43 |       generateExecutionContext: () => ({
 44 |         systemPrompt: 'test system prompt',
 45 |         framework: 'CAGEERF'
 46 |       })
 47 |     };
 48 | 
 49 |     const mockConfigManager = {
 50 |       getConfig: () => ({
 51 |         server: { name: 'test-server', version: '1.0.0' },
 52 |         gates: { definitionsDirectory: "src/gates/definitions", templatesDirectory: "src/gates/templates" }
 53 |       }),
 54 |       getPromptsFilePath: () => '/test/prompts.json'
 55 |     };
 56 | 
 57 |     const mockConversationManager = {
 58 |       addToConversationHistory: () => {},
 59 |       getConversationHistory: () => [],
 60 |       saveStepResult: () => {},
 61 |       getStepResult: () => null,
 62 |       setChainSessionManager: (manager: any) => {
 63 |         // Mock implementation that accepts the chain session manager
 64 |         // This prevents the null reference error in ChainSessionManager constructor
 65 |       },
 66 |       setTextReferenceManager: (manager: any) => {
 67 |         // Mock implementation for text reference manager integration
 68 |       }
 69 |     };
 70 | 
 71 |     const mockTextReferenceManager = {
 72 |       extractReferences: () => [],
 73 |       resolveReferences: () => {},
 74 |       addReference: () => {},
 75 |       saveStepResult: (stepId: string, data: any) => {
 76 |         // Mock implementation for step result storage
 77 |       },
 78 |       getStepResult: (stepId: string) => {
 79 |         // Mock implementation returns null for non-existent steps
 80 |         return null;
 81 |       }
 82 |     };
 83 | 
 84 |     const mockMcpToolsManager = {
 85 |       initialize: () => {},
 86 |       getTools: () => [],
 87 |       promptManagerTool: { handleAction: () => Promise.resolve({ content: [], isError: false }) },
 88 |       systemControl: { handleAction: () => Promise.resolve({ content: [], isError: false }) }
 89 |     };
 90 | 
 91 |     // Create consolidated tools with complete dependencies
 92 |     promptEngine = createConsolidatedPromptEngine(
 93 |       logger,
 94 |       mockMcpServer as any,
 95 |       mockPromptManagerComponent as any,
 96 |       mockConfigManager as any,
 97 |       mockSemanticAnalyzer as any,
 98 |       mockConversationManager as any,
 99 |       mockTextReferenceManager as any,
100 |       mockMcpToolsManager
101 |     );
102 | 
103 |     promptManager = createConsolidatedPromptManager(
104 |       logger,
105 |       mockMcpServer as any,
106 |       mockConfigManager as any,
107 |       mockSemanticAnalyzer as any,
108 |       undefined, // frameworkStateManager
109 |       mockFrameworkManager as any,
110 |       () => Promise.resolve(), // onRefresh
111 |       () => Promise.resolve()  // onRestart
112 |     );
113 | 
114 |     systemControl = createConsolidatedSystemControl(
115 |       logger,
116 |       mockMcpServer as any,
117 |       mockFrameworkManager as any,
118 |       undefined, // frameworkStateManager
119 |       mockMcpToolsManager
120 |     );
121 | 
122 |     // Simulate MCP tool registration process for performance test validation
123 |     mockMcpServer.tool('prompt_engine', 'Unified prompt execution engine', { type: 'object' });
124 |     mockMcpServer.tool('prompt_manager', 'Complete prompt lifecycle management', { type: 'object' });
125 |     mockMcpServer.tool('system_control', 'Framework and system management', { type: 'object' });
126 |   });
127 | 
128 |   afterEach(() => {
129 |     logger.clear();
130 |     mockMcpServer.clear();
131 |   });
132 | 
133 |   describe('Consolidated Prompt Engine', () => {
134 |     test('should create prompt engine tool', () => {
135 |       expect(promptEngine).toBeDefined();
136 |       expect(typeof promptEngine.executePromptCommand).toBe('function');
137 |     });
138 | 
139 |     test('should have routing detection capabilities', () => {
140 |       expect(promptEngine).toBeDefined();
141 |       // The routing functionality is now integrated into executePromptCommand
142 |       expect(typeof promptEngine.executePromptCommand).toBe('function');
143 |     });
144 |   });
145 | 
146 |   describe('Consolidated Prompt Manager', () => {
147 |     test('should create prompt manager tool', () => {
148 |       expect(promptManager).toBeDefined();
149 |       expect(typeof promptManager.handleAction).toBe('function');
150 |     });
151 | 
152 |     test('should handle prompt lifecycle management', () => {
153 |       expect(promptManager).toBeDefined();
154 |       expect(typeof promptManager.handleAction).toBe('function');
155 |     });
156 | 
157 |     test('should support intelligent filtering', () => {
158 |       expect(promptManager).toBeDefined();
159 |       // The consolidated prompt manager should support advanced filtering via handleAction
160 |       expect(typeof promptManager.handleAction).toBe('function');
161 |     });
162 |   });
163 | 
164 |   describe('Consolidated System Control', () => {
165 |     test('should create system control tool', () => {
166 |       expect(systemControl).toBeDefined();
167 |       expect(typeof systemControl.handleAction).toBe('function');
168 |     });
169 | 
170 |     test('should handle framework management', () => {
171 |       expect(systemControl).toBeDefined();
172 |       expect(typeof systemControl.handleAction).toBe('function');
173 |     });
174 | 
175 |     test('should provide system analytics', () => {
176 |       expect(systemControl).toBeDefined();
177 |       // The system control tool should provide analytics capabilities via handleAction
178 |       expect(typeof systemControl.handleAction).toBe('function');
179 |     });
180 |   });
181 | 
182 |   describe('Consolidated Tools Integration', () => {
183 |     test('tools should be functional and have correct interfaces', () => {
184 |       // Test that all tools exist and have proper interfaces
185 |       expect(promptEngine).toBeDefined();
186 |       expect(promptManager).toBeDefined();
187 |       expect(systemControl).toBeDefined();
188 | 
189 |       // Test that all tools have the correct method signatures
190 |       expect(typeof promptEngine.executePromptCommand).toBe('function');
191 |       expect(typeof promptManager.handleAction).toBe('function');
192 |       expect(typeof systemControl.handleAction).toBe('function');
193 |     });
194 | 
195 |     test('should maintain tool consolidation benefits', () => {
196 |       // The consolidated architecture provides 3 intelligent tools instead of 24+ scattered tools
197 |       const tools = [promptEngine, promptManager, systemControl];
198 | 
199 |       // Should have exactly 3 tools
200 |       expect(tools.length).toBe(3);
201 | 
202 |       // All tools should be functional
203 |       tools.forEach(tool => {
204 |         expect(tool).toBeDefined();
205 |       });
206 |     });
207 |   });
208 | 
209 |   describe('Error Handling', () => {
210 |     test('should handle invalid tool creation gracefully', () => {
211 |       expect(() => {
212 |         // Create minimal mock objects that won't cause null reference errors
213 |         const minimalLogger = { debug: () => {}, info: () => {}, warn: () => {}, error: () => {} };
214 |         const minimalPromptManager = { loadAndConvertPrompts: () => Promise.resolve([]) };
215 |         const minimalConfigManager = { getConfig: () => ({ server: {}, gates: {} }) };
216 |         const minimalSemanticAnalyzer = { analyzePrompt: () => Promise.resolve({ executionType: 'prompt' }) };
217 |         const minimalConversationManager = {
218 |           setChainSessionManager: () => {},
219 |           setTextReferenceManager: () => {}
220 |         };
221 |         const minimalTextReferenceManager = { saveStepResult: () => {}, getStepResult: () => null };
222 | 
223 |         createConsolidatedPromptEngine(
224 |           minimalLogger as any,
225 |           mockMcpServer as any,
226 |           minimalPromptManager as any,
227 |           minimalConfigManager as any,
228 |           minimalSemanticAnalyzer as any,
229 |           minimalConversationManager as any,
230 |           minimalTextReferenceManager as any,
231 |           undefined // mcpToolsManager optional
232 |         );
233 |       }).not.toThrow();
234 |     });
235 | 
236 |     test('should handle empty data gracefully', () => {
237 |       expect(promptEngine).toBeDefined();
238 |       expect(promptManager).toBeDefined();
239 |       expect(systemControl).toBeDefined();
240 |     });
241 |   });
242 | 
243 |   describe('Performance', () => {
244 |     test('should register consolidated tools efficiently', () => {
245 |       const start = Date.now();
246 | 
247 |       // Tools should already be registered during setup
248 |       const duration = Date.now() - start;
249 | 
250 |       expect(duration).toBeLessThan(1000); // Should be very fast due to consolidation
251 |     });
252 | 
253 |     test('should maintain performance benefits of consolidation', () => {
254 |       // Consolidated tools should be much more efficient than 24+ legacy tools
255 |       const registeredTools = mockMcpServer.registeredTools;
256 | 
257 |       // With only 3 tools vs 24+, performance should be significantly better
258 |       expect(registeredTools.length).toBeLessThan(10);
259 |       expect(registeredTools.length).toBeGreaterThanOrEqual(3);
260 |     });
261 |   });
262 | });
```

--------------------------------------------------------------------------------
/server/tests/enhanced-validation/lifecycle-validation/lifecycle-test-suite.js:
--------------------------------------------------------------------------------

```javascript
  1 | #!/usr/bin/env node
  2 | /**
  3 |  * Process Lifecycle Validation Test Suite
  4 |  *
  5 |  * Tests the process lifecycle validation system to eliminate emergency process.exit() usage
  6 |  * Validates clean shutdown capabilities and resource management
  7 |  */
  8 | 
  9 | async function runLifecycleValidationTests() {
 10 |   try {
 11 |     console.log('🔄 Running Process Lifecycle Validation Tests...');
 12 |     console.log('🎯 Eliminating emergency process.exit() usage\n');
 13 | 
 14 |     const results = {
 15 |       lifecycleValidator: false,
 16 |       cleanShutdown: false,
 17 |       resourceLeakDetection: false,
 18 |       timeoutCompliance: false,
 19 |       totalTests: 0,
 20 |       passedTests: 0
 21 |     };
 22 | 
 23 |     // Test 1: Lifecycle Validator Creation and Basic Functionality
 24 |     console.log('🔧 Test 1: Lifecycle Validator Functionality');
 25 |     results.totalTests++;
 26 | 
 27 |     try {
 28 |       const { createProcessLifecycleValidator } = await import('./process-lifecycle-validator.js');
 29 |       const { MockLogger } = await import('../../helpers/test-helpers.js');
 30 | 
 31 |       const logger = new MockLogger();
 32 |       const validator = createProcessLifecycleValidator(logger);
 33 | 
 34 |       if (validator && typeof validator.validateCleanShutdown === 'function') {
 35 |         console.log('   ✅ ProcessLifecycleValidator created successfully');
 36 |         console.log('   ✅ All required methods available');
 37 |         results.lifecycleValidator = true;
 38 |         results.passedTests++;
 39 |       } else {
 40 |         console.log('   ❌ ProcessLifecycleValidator missing required methods');
 41 |       }
 42 |     } catch (error) {
 43 |       console.log(`   ❌ Lifecycle validator creation failed: ${error.message}`);
 44 |     }
 45 | 
 46 |     // Test 2: Clean Shutdown Validation
 47 |     console.log('\n🔒 Test 2: Clean Shutdown Validation');
 48 |     results.totalTests++;
 49 | 
 50 |     try {
 51 |       const { createProcessLifecycleValidator } = await import('./process-lifecycle-validator.js');
 52 |       const { MockLogger } = await import('../../helpers/test-helpers.js');
 53 | 
 54 |       const logger = new MockLogger();
 55 |       const validator = createProcessLifecycleValidator(logger);
 56 | 
 57 |       // Create a mock application with proper shutdown
 58 |       const mockApplication = {
 59 |         shutdown: async () => {
 60 |           // Simulate cleanup work
 61 |           await new Promise(resolve => setTimeout(resolve, 50));
 62 |           return true;
 63 |         }
 64 |       };
 65 | 
 66 |       const shutdownResult = await validator.validateCleanShutdown(mockApplication);
 67 | 
 68 |       if (shutdownResult.success && shutdownResult.shutdownTime < 1000) {
 69 |         console.log('   ✅ Mock application shutdown validated successfully');
 70 |         console.log(`   ✅ Shutdown completed in ${shutdownResult.shutdownTime}ms`);
 71 |         console.log(`   ✅ Resources cleared: ${shutdownResult.resourcesCleared ? 'Yes' : 'No'}`);
 72 |         results.cleanShutdown = true;
 73 |         results.passedTests++;
 74 |       } else {
 75 |         console.log('   ❌ Clean shutdown validation failed:', shutdownResult.error || 'Unknown error');
 76 |       }
 77 |     } catch (error) {
 78 |       console.log(`   ❌ Clean shutdown test failed: ${error.message}`);
 79 |     }
 80 | 
 81 |     // Test 3: Resource Leak Detection
 82 |     console.log('\n🕵️ Test 3: Resource Leak Detection');
 83 |     results.totalTests++;
 84 | 
 85 |     try {
 86 |       const { createProcessLifecycleValidator } = await import('./process-lifecycle-validator.js');
 87 |       const { MockLogger } = await import('../../helpers/test-helpers.js');
 88 | 
 89 |       const logger = new MockLogger();
 90 |       const validator = createProcessLifecycleValidator(logger);
 91 | 
 92 |       // Test resource leak detection
 93 |       const leakReport = await validator.detectResourceLeaks();
 94 | 
 95 |       if (leakReport && typeof leakReport.hasLeaks === 'boolean') {
 96 |         console.log('   ✅ Resource leak detection completed');
 97 |         console.log(`   📊 Active handles: ${leakReport.activeHandles}`);
 98 |         console.log(`   📊 Active requests: ${leakReport.activeRequests}`);
 99 |         console.log(`   📊 Has leaks: ${leakReport.hasLeaks ? 'Yes' : 'No'}`);
100 | 
101 |         if (leakReport.hasLeaks && leakReport.recommendations.length > 0) {
102 |           console.log('   💡 Recommendations provided for leak resolution');
103 |         }
104 | 
105 |         results.resourceLeakDetection = true;
106 |         results.passedTests++;
107 |       } else {
108 |         console.log('   ❌ Resource leak detection returned invalid result');
109 |       }
110 |     } catch (error) {
111 |       console.log(`   ❌ Resource leak detection failed: ${error.message}`);
112 |     }
113 | 
114 |     // Test 4: Timeout Compliance Enforcement
115 |     console.log('\n⏱️  Test 4: Timeout Compliance Enforcement');
116 |     results.totalTests++;
117 | 
118 |     try {
119 |       const { createProcessLifecycleValidator } = await import('./process-lifecycle-validator.js');
120 |       const { MockLogger } = await import('../../helpers/test-helpers.js');
121 | 
122 |       const logger = new MockLogger();
123 |       const validator = createProcessLifecycleValidator(logger);
124 | 
125 |       // Test function that completes naturally
126 |       const goodTestFunction = async () => {
127 |         await new Promise(resolve => setTimeout(resolve, 100));
128 |         return 'completed';
129 |       };
130 | 
131 |       const complianceResult = await validator.enforceTimeoutCompliance(goodTestFunction, 1000);
132 | 
133 |       if (complianceResult.success && complianceResult.completedNaturally && !complianceResult.forceExitUsed) {
134 |         console.log('   ✅ Timeout compliance validation works correctly');
135 |         console.log(`   ✅ Test completed naturally in ${complianceResult.duration}ms`);
136 |         console.log('   ✅ No force exit detected');
137 |         results.timeoutCompliance = true;
138 |         results.passedTests++;
139 |       } else {
140 |         console.log('   ❌ Timeout compliance validation failed');
141 |         console.log('   Details:', complianceResult);
142 |       }
143 |     } catch (error) {
144 |       console.log(`   ❌ Timeout compliance test failed: ${error.message}`);
145 |     }
146 | 
147 |     // Test 5: Integration with Existing Resource Tracker
148 |     console.log('\n🔗 Test 5: Global Resource Tracker Integration');
149 |     results.totalTests++;
150 | 
151 |     try {
152 |       const { createProcessLifecycleValidator } = await import('./process-lifecycle-validator.js');
153 |       const { MockLogger } = await import('../../helpers/test-helpers.js');
154 | 
155 |       const logger = new MockLogger();
156 |       const validator = createProcessLifecycleValidator(logger);
157 | 
158 |       // Test resource cleanup validation
159 |       const cleanupResult = await validator.validateResourceCleanup();
160 | 
161 |       if (cleanupResult && typeof cleanupResult.allResourcesCleared === 'boolean') {
162 |         console.log('   ✅ Resource cleanup validation completed');
163 |         console.log(`   📊 Had tracked resources: ${cleanupResult.hadTrackedResources ? 'Yes' : 'No'}`);
164 |         console.log(`   📊 All resources cleared: ${cleanupResult.allResourcesCleared ? 'Yes' : 'No'}`);
165 | 
166 |         if (cleanupResult.hadTrackedResources) {
167 |           console.log(`   📊 Cleared resources: ${cleanupResult.clearedResources}`);
168 |         }
169 | 
170 |         results.passedTests++;
171 |       } else {
172 |         console.log('   ❌ Resource cleanup validation returned invalid result');
173 |       }
174 |     } catch (error) {
175 |       console.log(`   ❌ Resource tracker integration test failed: ${error.message}`);
176 |     }
177 | 
178 |     // Summary
179 |     console.log('\n' + '='.repeat(60));
180 |     console.log('📊 PROCESS LIFECYCLE VALIDATION RESULTS');
181 |     console.log('='.repeat(60));
182 |     console.log(`📈 Tests Passed: ${results.passedTests}/${results.totalTests}`);
183 |     console.log(`📊 Success Rate: ${((results.passedTests / results.totalTests) * 100).toFixed(1)}%`);
184 |     console.log('');
185 |     console.log('🔧 Component Status:');
186 |     console.log(`   Lifecycle Validator: ${results.lifecycleValidator ? '✅' : '❌'}`);
187 |     console.log(`   Clean Shutdown: ${results.cleanShutdown ? '✅' : '❌'}`);
188 |     console.log(`   Resource Leak Detection: ${results.resourceLeakDetection ? '✅' : '❌'}`);
189 |     console.log(`   Timeout Compliance: ${results.timeoutCompliance ? '✅' : '❌'}`);
190 | 
191 |     if (results.passedTests >= 4) { // Allow for resource tracker integration to potentially fail
192 |       console.log('\n🎉 Process lifecycle validation system is working!');
193 |       console.log('✅ Emergency process.exit() calls should no longer be needed');
194 |       console.log('✅ Clean shutdown validation ensures proper test completion');
195 | 
196 |       // Use natural completion instead of process.exit(0)
197 |       return true;
198 |     } else {
199 |       console.log('\n❌ Process lifecycle validation system has issues');
200 |       console.log('⚠️  Emergency process.exit() may still be needed');
201 | 
202 |       // Use natural completion instead of process.exit(1)
203 |       return false;
204 |     }
205 | 
206 |   } catch (error) {
207 |     console.error('❌ Lifecycle validation test execution failed:', error.message);
208 |     console.error('Stack trace:', error.stack);
209 | 
210 |     // Use natural completion instead of process.exit(1)
211 |     return false;
212 |   }
213 | }
214 | 
215 | // Handle process cleanup gracefully
216 | process.on('uncaughtException', (error) => {
217 |   console.error('❌ Uncaught exception in lifecycle validation tests:', error.message);
218 |   // Don't use process.exit(1) - let test runner handle it
219 | });
220 | 
221 | process.on('unhandledRejection', (reason) => {
222 |   console.error('❌ Unhandled rejection in lifecycle validation tests:', reason);
223 |   // Don't use process.exit(1) - let test runner handle it
224 | });
225 | 
226 | // Run the tests and demonstrate natural completion
227 | if (import.meta.url === `file://${process.argv[1]}`) {
228 |   runLifecycleValidationTests().then(success => {
229 |     if (success) {
230 |       console.log('\n🎯 Test completed naturally without process.exit() - this is the goal!');
231 |     } else {
232 |       console.log('\n⚠️  Test completed naturally despite failures - no process.exit() needed');
233 |     }
234 |     // Natural completion - no process.exit() calls
235 |   }).catch(error => {
236 |     console.error('❌ Test execution failed:', error);
237 |     // Natural completion even on error - no process.exit() calls
238 |   });
239 | }
```

--------------------------------------------------------------------------------
/server/src/runtime/startup.ts:
--------------------------------------------------------------------------------

```typescript
  1 | /**
  2 |  * Server Root Detection and Startup Utilities
  3 |  * Robust server root directory detection for different execution contexts
  4 |  */
  5 | 
  6 | import path from "path";
  7 | import { fileURLToPath } from "url";
  8 | 
  9 | /**
 10 |  * Server Root Detector
 11 |  * Handles robust server root directory detection using multiple strategies
 12 |  * optimized for different execution contexts (direct execution vs Claude Desktop)
 13 |  */
 14 | export class ServerRootDetector {
 15 |   /**
 16 |    * Determine the server root directory using multiple strategies
 17 |    * This is more robust for different execution contexts (direct execution vs Claude Desktop)
 18 |    */
 19 |   async determineServerRoot(): Promise<string> {
 20 |     // Check for debug/verbose logging flags
 21 |     const args = process.argv.slice(2);
 22 |     const isVerbose =
 23 |       args.includes("--verbose") || args.includes("--debug-startup");
 24 |     const isQuiet = args.includes("--quiet");
 25 | 
 26 |     // Default to quiet mode (no output) unless verbose is specified
 27 |     const shouldShowOutput = isVerbose;
 28 | 
 29 |     // Early termination: If environment variable is set, use it immediately
 30 |     if (process.env.MCP_SERVER_ROOT) {
 31 |       const envPath = path.resolve(process.env.MCP_SERVER_ROOT);
 32 |       try {
 33 |         const configPath = path.join(envPath, "config.json");
 34 |         const fs = await import("fs/promises");
 35 |         await fs.access(configPath);
 36 | 
 37 |         if (shouldShowOutput) {
 38 |           console.error(`✓ SUCCESS: MCP_SERVER_ROOT environment variable`);
 39 |           console.error(`  Path: ${envPath}`);
 40 |           console.error(`  Config found: ${configPath}`);
 41 |         }
 42 |         return envPath;
 43 |       } catch (error) {
 44 |         if (isVerbose) {
 45 |           console.error(`✗ WARNING: MCP_SERVER_ROOT env var set but invalid`);
 46 |           console.error(`  Tried path: ${envPath}`);
 47 |           console.error(
 48 |             `  Error: ${error instanceof Error ? error.message : String(error)}`
 49 |           );
 50 |           console.error(`  Falling back to automatic detection...`);
 51 |         }
 52 |       }
 53 |     }
 54 | 
 55 |     // Build strategies in optimal order (most likely to succeed first)
 56 |     const strategies = this.buildDetectionStrategies();
 57 | 
 58 |     // Only show diagnostic information in verbose mode
 59 |     if (isVerbose) {
 60 |       this.logDiagnosticInfo(strategies);
 61 |     }
 62 | 
 63 |     // Test strategies with optimized flow
 64 |     return await this.testStrategies(strategies, isVerbose, shouldShowOutput);
 65 |   }
 66 | 
 67 | 
 68 |   /**
 69 |    * Build detection strategies in optimal order
 70 |    */
 71 |   private buildDetectionStrategies() {
 72 |     const strategies = [];
 73 | 
 74 |     // Strategy 1: process.argv[1] script location (most successful in Claude Desktop)
 75 |     if (process.argv[1]) {
 76 |       const scriptPath = process.argv[1];
 77 | 
 78 |       // Primary strategy: Direct script location to server root  
 79 |       strategies.push({
 80 |         name: "process.argv[1] script location",
 81 |         path: path.dirname(path.dirname(scriptPath)), // Go up from dist to server root
 82 |         source: `script: ${scriptPath}`,
 83 |         priority: "high",
 84 |       });
 85 |     }
 86 | 
 87 |     // Strategy 2: import.meta.url (current module location) - reliable fallback
 88 |     const __filename = fileURLToPath(import.meta.url);
 89 |     const __dirname = path.dirname(__filename);
 90 |     strategies.push({
 91 |       name: "import.meta.url relative",
 92 |       path: path.join(__dirname, "..", ".."),
 93 |       source: `module: ${__filename}`,
 94 |       priority: "medium",
 95 |     });
 96 | 
 97 |     // Strategy 3: Common Claude Desktop patterns (ordered by likelihood)
 98 |     const commonPaths = [
 99 |       { path: path.join(process.cwd(), "server"), desc: "cwd/server" },
100 |       { path: process.cwd(), desc: "cwd" },
101 |       { path: path.join(process.cwd(), "..", "server"), desc: "parent/server" },
102 |       { path: path.join(__dirname, "..", "..", ".."), desc: "module parent" },
103 |     ];
104 | 
105 |     for (const { path: commonPath, desc } of commonPaths) {
106 |       strategies.push({
107 |         name: `common pattern (${desc})`,
108 |         path: commonPath,
109 |         source: `pattern: ${commonPath}`,
110 |         priority: "low",
111 |       });
112 |     }
113 | 
114 |     return strategies;
115 |   }
116 | 
117 |   /**
118 |    * Log diagnostic information for troubleshooting
119 |    */
120 |   private logDiagnosticInfo(strategies: any[]) {
121 |     console.error("=== SERVER ROOT DETECTION STRATEGIES ===");
122 |     console.error(`Environment: process.cwd() = ${process.cwd()}`);
123 |     console.error(`Environment: process.argv[0] = ${process.argv[0]}`);
124 |     console.error(
125 |       `Environment: process.argv[1] = ${process.argv[1] || "undefined"}`
126 |     );
127 |     console.error(
128 |       `Environment: __filename = ${fileURLToPath(import.meta.url)}`
129 |     );
130 |     console.error(
131 |       `Environment: MCP_SERVER_ROOT = ${
132 |         process.env.MCP_SERVER_ROOT || "undefined"
133 |       }`
134 |     );
135 |     console.error(`Strategies to test: ${strategies.length}`);
136 |     console.error("");
137 |   }
138 | 
139 |   /**
140 |    * Test strategies with optimized flow
141 |    */
142 |   private async testStrategies(strategies: any[], isVerbose: boolean, shouldShowOutput: boolean): Promise<string> {
143 |     let lastHighPriorityIndex = -1;
144 |     for (let i = 0; i < strategies.length; i++) {
145 |       const strategy = strategies[i];
146 | 
147 |       // Track where high-priority strategies end for early termination logic
148 |       if (strategy.priority === "high") {
149 |         lastHighPriorityIndex = i;
150 |       }
151 | 
152 |       try {
153 |         const resolvedPath = path.resolve(strategy.path);
154 | 
155 |         // Check if config.json exists in this location
156 |         const configPath = path.join(resolvedPath, "config.json");
157 |         const fs = await import("fs/promises");
158 |         await fs.access(configPath);
159 | 
160 |         // Success! Only log in verbose mode
161 |         if (shouldShowOutput) {
162 |           console.error(`✓ SUCCESS: ${strategy.name}`);
163 |           console.error(`  Path: ${resolvedPath}`);
164 |           console.error(`  Source: ${strategy.source}`);
165 |           console.error(`  Config found: ${configPath}`);
166 | 
167 |           // Show efficiency info in verbose mode
168 |           if (isVerbose) {
169 |             console.error(
170 |               `  Strategy #${i + 1}/${strategies.length} (${
171 |                 strategy.priority
172 |               } priority)`
173 |             );
174 |             console.error(
175 |               `  Skipped ${strategies.length - i - 1} remaining strategies`
176 |             );
177 |           }
178 |         }
179 | 
180 |         return resolvedPath;
181 |       } catch (error) {
182 |         // Only log failures in verbose mode
183 |         if (isVerbose) {
184 |           console.error(`✗ FAILED: ${strategy.name}`);
185 |           console.error(`  Tried path: ${path.resolve(strategy.path)}`);
186 |           console.error(`  Source: ${strategy.source}`);
187 |           console.error(`  Priority: ${strategy.priority}`);
188 |           console.error(
189 |             `  Error: ${error instanceof Error ? error.message : String(error)}`
190 |           );
191 |         }
192 | 
193 |         // Early termination: If all high-priority strategies fail and we're not in verbose mode,
194 |         // provide a simplified error message encouraging environment variable usage
195 |         if (
196 |           i === lastHighPriorityIndex &&
197 |           !isVerbose &&
198 |           lastHighPriorityIndex >= 0
199 |         ) {
200 |           if (shouldShowOutput) {
201 |             console.error(
202 |               `⚠️  High-priority detection strategies failed. Trying fallback methods...`
203 |             );
204 |             console.error(
205 |               `💡 Tip: Set MCP_SERVER_ROOT environment variable for guaranteed detection`
206 |             );
207 |             console.error(`📝 Use --verbose to see detailed strategy testing`);
208 |           }
209 |         }
210 |       }
211 |     }
212 | 
213 |     // If all strategies fail, provide optimized troubleshooting information
214 |     const attemptedPaths = strategies
215 |       .map(
216 |         (s, i) =>
217 |           `  ${i + 1}. ${s.name} (${s.priority}): ${path.resolve(s.path)}`
218 |       )
219 |       .join("\n");
220 | 
221 |     const troubleshootingInfo = this.generateTroubleshootingInfo(attemptedPaths);
222 | 
223 |     console.error(troubleshootingInfo);
224 | 
225 |     throw new Error(
226 |       `Unable to auto-detect server root directory after testing ${strategies.length} strategies.\n\n` +
227 |         `SOLUTION OPTIONS:\n` +
228 |         `1. [RECOMMENDED] Set MCP_SERVER_ROOT environment variable for reliable detection\n` +
229 |         `2. Ensure config.json is present in your server directory\n` +
230 |         `3. Check file permissions and directory access\n\n` +
231 |         `See detailed troubleshooting information above.`
232 |     );
233 |   }
234 | 
235 |   /**
236 |    * Generate comprehensive troubleshooting information
237 |    */
238 |   private generateTroubleshootingInfo(attemptedPaths: string): string {
239 |     return `
240 | TROUBLESHOOTING CLAUDE DESKTOP ISSUES:
241 | 
242 | 🎯 SOLUTION OPTIONS:
243 | 
244 | 1. Set MCP_SERVER_ROOT environment variable (most reliable):
245 |    Windows: set MCP_SERVER_ROOT=E:\\path\\to\\claude-prompts-mcp\\server
246 |    macOS/Linux: export MCP_SERVER_ROOT=/path/to/claude-prompts-mcp/server
247 | 
248 | 2. Verify file structure - ensure these files exist:
249 |    • config.json (main server configuration)
250 |    • prompts/ directory (with promptsConfig.json)
251 |    • dist/ directory (compiled JavaScript)
252 | 
253 | 3. Check file permissions and directory access
254 | 
255 | 📁 Claude Desktop Configuration:
256 |    Update your claude_desktop_config.json:
257 |    {
258 |      "mcpServers": {
259 |        "claude-prompts-mcp": {
260 |          "command": "node",
261 |          "args": ["E:\\\\full\\\\path\\\\to\\\\server\\\\dist\\\\index.js", "--transport=stdio"],
262 |          "env": {
263 |            "MCP_SERVER_ROOT": "E:\\\\full\\\\path\\\\to\\\\server"
264 |          }
265 |        }
266 |      }
267 |    }
268 | 
269 | 🔧 Alternative Solutions:
270 |    1. Create wrapper script that sets working directory before launching server
271 |    2. Use absolute paths in your Claude Desktop configuration
272 |    3. Run from the correct working directory (server/)
273 | 
274 | 🐛 Debug Mode:
275 |    Use --verbose or --debug-startup flag to see detailed strategy testing
276 | 
277 | 📊 Detection Summary:
278 |    Current working directory: ${process.cwd()}
279 |    Strategies tested (in order of priority):
280 | ${attemptedPaths}
281 | `;
282 |   }
283 | }
```

--------------------------------------------------------------------------------
/server/src/mcp-tools/prompt-manager/search/prompt-matcher.ts:
--------------------------------------------------------------------------------

```typescript
  1 | /**
  2 |  * Matching and fuzzy search logic for prompt discovery
  3 |  */
  4 | 
  5 | import { Logger } from "../../../logging/index.js";
  6 | import { ConvertedPrompt } from "../../../types/index.js";
  7 | import { PromptClassification, SmartFilters } from "../core/types.js";
  8 | 
  9 | /**
 10 |  * Prompt matching engine with fuzzy search capabilities
 11 |  */
 12 | export class PromptMatcher {
 13 |   private logger: Logger;
 14 | 
 15 |   constructor(logger: Logger) {
 16 |     this.logger = logger;
 17 |   }
 18 | 
 19 |   /**
 20 |    * Check if prompt matches the provided filters
 21 |    */
 22 |   async matchesFilters(
 23 |     prompt: ConvertedPrompt,
 24 |     filters: SmartFilters,
 25 |     classification: PromptClassification
 26 |   ): Promise<boolean> {
 27 |     // Debug logging
 28 |     this.logger.info(`Filtering prompt ${prompt.id}:`, {
 29 |       filters,
 30 |       executionType: classification.executionType,
 31 |       category: prompt.category
 32 |     });
 33 | 
 34 |     // Empty filters match everything
 35 |     if (Object.keys(filters).length === 0) return true;
 36 | 
 37 |     // Type filter
 38 |     if (filters.type && classification.executionType !== filters.type) {
 39 |       this.logger.info(`Type filter rejected: ${classification.executionType} !== ${filters.type}`);
 40 |       return false;
 41 |     }
 42 | 
 43 |     // Category filter
 44 |     if (filters.category && prompt.category !== filters.category) {
 45 |       return false;
 46 |     }
 47 | 
 48 |     // Execution requirement filter
 49 |     if (filters.execution !== undefined &&
 50 |         filters.execution !== classification.requiresExecution) {
 51 |       return false;
 52 |     }
 53 | 
 54 |     // Gates filter
 55 |     if (filters.gates !== undefined) {
 56 |       const hasGates = classification.suggestedGates.length > 0;
 57 |       if (filters.gates !== hasGates) {
 58 |         return false;
 59 |       }
 60 |     }
 61 | 
 62 |     // Intent-based matching
 63 |     if (filters.intent && !this.matchesIntent(prompt, classification, filters.intent)) {
 64 |       return false;
 65 |     }
 66 | 
 67 |     // Text search with fuzzy matching
 68 |     if (filters.text && !this.matchesTextSearch(prompt, classification, filters.text)) {
 69 |       return false;
 70 |     }
 71 | 
 72 |     return true;
 73 |   }
 74 | 
 75 |   /**
 76 |    * Intent-based matching against category and semantic content
 77 |    */
 78 |   private matchesIntent(
 79 |     prompt: ConvertedPrompt,
 80 |     classification: PromptClassification,
 81 |     intent: string
 82 |   ): boolean {
 83 |     const intentSearchable = [
 84 |       prompt.category,
 85 |       prompt.name,
 86 |       prompt.description,
 87 |       classification.executionType,
 88 |       ...classification.reasoning,
 89 |       ...classification.suggestedGates
 90 |     ].join(' ').toLowerCase();
 91 | 
 92 |     // Check if intent matches category, content, or reasoning
 93 |     return intentSearchable.includes(intent.toLowerCase());
 94 |   }
 95 | 
 96 |   /**
 97 |    * Enhanced text search with fuzzy matching
 98 |    */
 99 |   private matchesTextSearch(
100 |     prompt: ConvertedPrompt,
101 |     classification: PromptClassification,
102 |     searchText: string
103 |   ): boolean {
104 |     const searchWords = searchText.toLowerCase().split(/\s+/);
105 |     const searchable = [
106 |       prompt.id,
107 |       prompt.name,
108 |       prompt.description,
109 |       classification.executionType,
110 |       ...classification.suggestedGates
111 |     ].join(' ').toLowerCase();
112 | 
113 |     // Check if all search words are found (allows partial word matching)
114 |     return searchWords.every((word: string) => {
115 |       return searchable.includes(word) ||
116 |              // Basic fuzzy match - check if any searchable word starts with the search word
117 |              searchable.split(/\s+/).some((searchableWord: string) =>
118 |                searchableWord.startsWith(word) || word.startsWith(searchableWord.slice(0, 3))
119 |              );
120 |     });
121 |   }
122 | 
123 |   /**
124 |    * Calculate relevance score for search results ordering
125 |    */
126 |   calculateRelevanceScore(
127 |     prompt: ConvertedPrompt,
128 |     classification: PromptClassification,
129 |     filters: SmartFilters
130 |   ): number {
131 |     let score = 0;
132 | 
133 |     // Base score from classification confidence
134 |     score += classification.confidence * 10;
135 | 
136 |     // Boost for exact matches
137 |     if (filters.text) {
138 |       const searchText = filters.text.toLowerCase();
139 | 
140 |       // Exact name match gets highest boost
141 |       if (prompt.name.toLowerCase().includes(searchText)) {
142 |         score += 50;
143 |       }
144 | 
145 |       // Exact ID match gets high boost
146 |       if (prompt.id.toLowerCase().includes(searchText)) {
147 |         score += 40;
148 |       }
149 | 
150 |       // Description match gets medium boost
151 |       if (prompt.description?.toLowerCase().includes(searchText)) {
152 |         score += 20;
153 |       }
154 | 
155 |       // Category match gets small boost
156 |       if (prompt.category.toLowerCase().includes(searchText)) {
157 |         score += 10;
158 |       }
159 |     }
160 | 
161 |     // Boost for type matches
162 |     if (filters.type && classification.executionType === filters.type) {
163 |       score += 15;
164 |     }
165 | 
166 |     // Boost for category matches
167 |     if (filters.category && prompt.category === filters.category) {
168 |       score += 15;
169 |     }
170 | 
171 |     // Boost for prompts with quality gates
172 |     if (classification.suggestedGates.length > 0) {
173 |       score += 5;
174 |     }
175 | 
176 |     // Boost for framework-ready prompts
177 |     if (classification.requiresFramework) {
178 |       score += 5;
179 |     }
180 | 
181 |     return score;
182 |   }
183 | 
184 |   /**
185 |    * Find similar prompts based on content similarity
186 |    */
187 |   findSimilarPrompts(
188 |     targetPrompt: ConvertedPrompt,
189 |     allPrompts: ConvertedPrompt[],
190 |     limit: number = 5
191 |   ): ConvertedPrompt[] {
192 |     const similarities = allPrompts
193 |       .filter(p => p.id !== targetPrompt.id)
194 |       .map(prompt => ({
195 |         prompt,
196 |         similarity: this.calculateSimilarity(targetPrompt, prompt)
197 |       }))
198 |       .sort((a, b) => b.similarity - a.similarity)
199 |       .slice(0, limit);
200 | 
201 |     return similarities.map(s => s.prompt);
202 |   }
203 | 
204 |   /**
205 |    * Calculate similarity score between two prompts
206 |    */
207 |   private calculateSimilarity(prompt1: ConvertedPrompt, prompt2: ConvertedPrompt): number {
208 |     let similarity = 0;
209 | 
210 |     // Category similarity
211 |     if (prompt1.category === prompt2.category) {
212 |       similarity += 30;
213 |     }
214 | 
215 |     // Name similarity (basic word overlap)
216 |     const name1Words = new Set(prompt1.name.toLowerCase().split(/\s+/));
217 |     const name2Words = new Set(prompt2.name.toLowerCase().split(/\s+/));
218 |     const nameOverlap = this.calculateSetOverlap(name1Words, name2Words);
219 |     similarity += nameOverlap * 20;
220 | 
221 |     // Description similarity
222 |     if (prompt1.description && prompt2.description) {
223 |       const desc1Words = new Set(prompt1.description.toLowerCase().split(/\s+/));
224 |       const desc2Words = new Set(prompt2.description.toLowerCase().split(/\s+/));
225 |       const descOverlap = this.calculateSetOverlap(desc1Words, desc2Words);
226 |       similarity += descOverlap * 15;
227 |     }
228 | 
229 |     // Arguments similarity
230 |     const args1Count = prompt1.arguments?.length || 0;
231 |     const args2Count = prompt2.arguments?.length || 0;
232 |     if (args1Count > 0 || args2Count > 0) {
233 |       const argsSimilarity = 1 - Math.abs(args1Count - args2Count) / Math.max(args1Count, args2Count, 1);
234 |       similarity += argsSimilarity * 10;
235 |     }
236 | 
237 |     // Chain steps similarity
238 |     const chain1Count = prompt1.chainSteps?.length || 0;
239 |     const chain2Count = prompt2.chainSteps?.length || 0;
240 |     if (chain1Count > 0 || chain2Count > 0) {
241 |       const chainSimilarity = 1 - Math.abs(chain1Count - chain2Count) / Math.max(chain1Count, chain2Count, 1);
242 |       similarity += chainSimilarity * 15;
243 |     }
244 | 
245 |     return Math.min(similarity, 100); // Cap at 100
246 |   }
247 | 
248 |   /**
249 |    * Calculate overlap between two sets
250 |    */
251 |   private calculateSetOverlap(set1: Set<string>, set2: Set<string>): number {
252 |     const intersection = new Set([...set1].filter(x => set2.has(x)));
253 |     const union = new Set([...set1, ...set2]);
254 | 
255 |     return union.size > 0 ? intersection.size / union.size : 0;
256 |   }
257 | 
258 |   /**
259 |    * Search prompts with autocomplete suggestions
260 |    */
261 |   generateSearchSuggestions(
262 |     partialQuery: string,
263 |     allPrompts: ConvertedPrompt[]
264 |   ): string[] {
265 |     const suggestions: string[] = [];
266 |     const query = partialQuery.toLowerCase();
267 | 
268 |     // Suggest prompt names that start with the query
269 |     const nameMatches = allPrompts
270 |       .filter(p => p.name.toLowerCase().startsWith(query))
271 |       .map(p => p.name)
272 |       .slice(0, 3);
273 | 
274 |     suggestions.push(...nameMatches);
275 | 
276 |     // Suggest prompt IDs that start with the query
277 |     const idMatches = allPrompts
278 |       .filter(p => p.id.toLowerCase().startsWith(query))
279 |       .map(p => p.id)
280 |       .slice(0, 3);
281 | 
282 |     suggestions.push(...idMatches);
283 | 
284 |     // Suggest categories that start with the query
285 |     const categories = [...new Set(allPrompts.map(p => p.category))]
286 |       .filter(cat => cat.toLowerCase().startsWith(query))
287 |       .slice(0, 2);
288 | 
289 |     suggestions.push(...categories.map(cat => `category:${cat}`));
290 | 
291 |     return [...new Set(suggestions)].slice(0, 8); // Remove duplicates, limit to 8
292 |   }
293 | 
294 |   /**
295 |    * Highlight search terms in text
296 |    */
297 |   highlightSearchTerms(text: string, searchTerms: string[]): string {
298 |     let highlighted = text;
299 | 
300 |     for (const term of searchTerms) {
301 |       const regex = new RegExp(`(${term})`, 'gi');
302 |       highlighted = highlighted.replace(regex, '**$1**');
303 |     }
304 | 
305 |     return highlighted;
306 |   }
307 | 
308 |   /**
309 |    * Extract key phrases from prompt for indexing
310 |    */
311 |   extractKeyPhrases(prompt: ConvertedPrompt): string[] {
312 |     const phrases: string[] = [];
313 | 
314 |     // Extract from name
315 |     phrases.push(...prompt.name.toLowerCase().split(/\s+/));
316 | 
317 |     // Extract from description
318 |     if (prompt.description) {
319 |       phrases.push(...prompt.description.toLowerCase().split(/\s+/));
320 |     }
321 | 
322 |     // Extract from category
323 |     phrases.push(prompt.category);
324 | 
325 |     // Extract from argument names
326 |     if (prompt.arguments) {
327 |       phrases.push(...prompt.arguments.map(arg => arg.name.toLowerCase()));
328 |     }
329 | 
330 |     // Filter out common words and short phrases
331 |     const filtered = phrases
332 |       .filter(phrase => phrase.length > 2)
333 |       .filter(phrase => !['the', 'and', 'for', 'with', 'this', 'that'].includes(phrase));
334 | 
335 |     return [...new Set(filtered)]; // Remove duplicates
336 |   }
337 | }
```

--------------------------------------------------------------------------------
/server/src/mcp-tools/prompt-manager/analysis/prompt-analyzer.ts:
--------------------------------------------------------------------------------

```typescript
  1 | /**
  2 |  * Semantic analysis and classification engine
  3 |  */
  4 | 
  5 | import { Logger } from "../../../logging/index.js";
  6 | import { ContentAnalyzer, ContentAnalysisResult } from "../../../semantic/configurable-semantic-analyzer.js";
  7 | import { ConvertedPrompt } from "../../../types/index.js";
  8 | import {
  9 |   PromptClassification,
 10 |   AnalysisResult,
 11 |   PromptManagerDependencies
 12 | } from "../core/types.js";
 13 | 
 14 | /**
 15 |  * Prompt analysis engine for semantic classification and intelligence feedback
 16 |  */
 17 | export class PromptAnalyzer {
 18 |   private logger: Logger;
 19 |   private semanticAnalyzer: ContentAnalyzer;
 20 | 
 21 |   constructor(dependencies: Pick<PromptManagerDependencies, 'logger' | 'semanticAnalyzer'>) {
 22 |     this.logger = dependencies.logger;
 23 |     this.semanticAnalyzer = dependencies.semanticAnalyzer;
 24 |   }
 25 | 
 26 |   /**
 27 |    * Analyze prompt for intelligence feedback (compact format)
 28 |    */
 29 |   async analyzePromptIntelligence(promptData: any): Promise<AnalysisResult> {
 30 |     // Create temporary ConvertedPrompt for analysis
 31 |     const tempPrompt: ConvertedPrompt = {
 32 |       id: promptData.id,
 33 |       name: promptData.name,
 34 |       description: promptData.description,
 35 |       category: promptData.category,
 36 |       systemMessage: promptData.systemMessage,
 37 |       userMessageTemplate: promptData.userMessageTemplate,
 38 |       arguments: promptData.arguments || [],
 39 |       chainSteps: promptData.chainSteps || []
 40 |     };
 41 | 
 42 |     const classification = await this.analyzePrompt(tempPrompt);
 43 | 
 44 |     // When API Analysis is disabled, show minimal message with no gate suggestions
 45 |     if (!this.semanticAnalyzer.isLLMEnabled()) {
 46 |       return {
 47 |         classification,
 48 |         feedback: `⚠️ API Analysis Disabled\n`,
 49 |         suggestions: []
 50 |       };
 51 |     }
 52 | 
 53 |     // Normal mode: show concise single-line format with type and suggested gates
 54 |     const analysisIcon = this.getAnalysisIcon(classification.analysisMode || classification.framework);
 55 |     let feedback = `${analysisIcon} ${classification.executionType}`;
 56 | 
 57 |     // Add suggested gates if present
 58 |     if (classification.suggestedGates.length > 0) {
 59 |       feedback += ` • Suggested gates: ${classification.suggestedGates.join(', ')}`;
 60 |     }
 61 |     feedback += '\n';
 62 | 
 63 |     // Generate capability-aware suggestions (empty for now in concise mode)
 64 |     const suggestions: string[] = [];
 65 | 
 66 |     return { classification, feedback, suggestions };
 67 |   }
 68 | 
 69 |   /**
 70 |    * Analyze prompt using semantic analyzer (configuration-aware)
 71 |    */
 72 |   async analyzePrompt(prompt: ConvertedPrompt): Promise<PromptClassification> {
 73 |     try {
 74 |       const analysis = await this.semanticAnalyzer.analyzePrompt(prompt);
 75 |       return {
 76 |         executionType: analysis.executionType,
 77 |         requiresExecution: analysis.requiresExecution,
 78 |         requiresFramework: analysis.requiresFramework,
 79 |         confidence: analysis.confidence,
 80 |         reasoning: analysis.reasoning,
 81 |         suggestedGates: analysis.suggestedGates,
 82 |         framework: 'configurable',
 83 |         // Enhanced configurable analysis information
 84 |         analysisMode: analysis.analysisMetadata.mode,
 85 |         capabilities: analysis.capabilities,
 86 |         limitations: analysis.limitations,
 87 |         warnings: analysis.warnings
 88 |       };
 89 |     } catch (error) {
 90 |       this.logger.error(`Configurable semantic analysis failed for ${prompt.id}:`, error);
 91 |       return this.createFallbackAnalysis(prompt, error);
 92 |     }
 93 |   }
 94 | 
 95 |   /**
 96 |    * Create fallback analysis when semantic analysis fails
 97 |    */
 98 |   private createFallbackAnalysis(prompt: ConvertedPrompt, error: any): PromptClassification {
 99 |     return {
100 |       executionType: (prompt.chainSteps?.length ?? 0) > 0 ? 'chain' : 'template',
101 |       requiresExecution: true,
102 |       requiresFramework: true, // Default to requiring framework for fallback
103 |       confidence: 0.5,
104 |       reasoning: [`Fallback analysis: ${error}`],
105 |       suggestedGates: ['execution_validation'],
106 |       framework: 'fallback',
107 |       analysisMode: 'fallback',
108 |       capabilities: {
109 |         canDetectStructure: false,
110 |         canAnalyzeComplexity: false,
111 |         canRecommendFramework: false,
112 |         hasSemanticUnderstanding: false
113 |       },
114 |       limitations: ['Analysis failed - using minimal fallback'],
115 |       warnings: ['⚠️ Analysis error occurred', '🚨 Using minimal fallback analysis']
116 |     };
117 |   }
118 | 
119 |   /**
120 |    * Create fallback analysis when semantic analysis is disabled
121 |    */
122 |   createDisabledAnalysisFallback(prompt: ConvertedPrompt): PromptClassification {
123 |     const hasChainSteps = Boolean(prompt.chainSteps?.length);
124 |     const hasComplexArgs = (prompt.arguments?.length || 0) > 2;
125 |     const hasTemplateVars = /\{\{.*?\}\}/g.test(prompt.userMessageTemplate || '');
126 | 
127 |     // Basic execution type detection without semantic analysis
128 |     let executionType: 'prompt' | 'template' | 'chain' = 'prompt';
129 |     if (hasChainSteps) {
130 |       executionType = 'chain';
131 |     } else if (hasComplexArgs || hasTemplateVars) {
132 |       executionType = 'template';
133 |     }
134 | 
135 |     return {
136 |       executionType,
137 |       requiresExecution: true,
138 |       requiresFramework: false, // Conservative - don't assume framework needed
139 |       confidence: 0.7, // High confidence in basic structural facts
140 |       reasoning: [
141 |         "Semantic analysis unavailable - using basic structural detection",
142 |         `Detected ${executionType} type from file structure`,
143 |         "Framework recommendation unavailable"
144 |       ],
145 |       suggestedGates: ['basic_validation'],
146 |       framework: 'disabled',
147 |       // Analysis metadata
148 |       analysisMode: 'disabled',
149 |       capabilities: {
150 |         canDetectStructure: true,
151 |         canAnalyzeComplexity: false,
152 |         canRecommendFramework: false,
153 |         hasSemanticUnderstanding: false
154 |       },
155 |       limitations: [
156 |         "Semantic analysis unavailable (no LLM integration)",
157 |         "No intelligent framework recommendations available",
158 |         "Limited complexity analysis capabilities"
159 |       ],
160 |       warnings: [
161 |         "⚠️ Semantic analysis unavailable",
162 |         "💡 Configure LLM integration in config for semantic analysis",
163 |         "🔧 Using basic structural detection only"
164 |       ]
165 |     };
166 |   }
167 | 
168 |   /**
169 |    * Get analysis icon based on analysis mode/framework
170 |    */
171 |   private getAnalysisIcon(mode: string | undefined): string {
172 |     switch (mode) {
173 |       case 'disabled': return '🔧'; // Basic structural detection
174 |       case 'structural': return '🔬'; // Structural analysis
175 |       case 'hybrid': return '🔍'; // Enhanced structural
176 |       case 'semantic': return '🧠'; // Full semantic analysis
177 |       case 'fallback': return '🚨'; // Error fallback
178 |       case 'configurable': return '🧠'; // Configured semantic analysis
179 |       default: return '🧠'; // Default intelligent analysis
180 |     }
181 |   }
182 | 
183 |   /**
184 |    * Generate capability-aware suggestions
185 |    */
186 |   private generateSuggestions(classification: PromptClassification): string[] {
187 |     const suggestions: string[] = [];
188 | 
189 |     if (!this.semanticAnalyzer.isLLMEnabled()) {
190 |       suggestions.push("💡 Enable semantic analysis for enhanced capabilities");
191 |       suggestions.push("🎯 Framework recommendation unavailable");
192 |     } else if (classification.analysisMode === 'structural') {
193 |       suggestions.push("💡 Configure LLM integration for intelligent analysis");
194 |     } else if (classification.analysisMode === 'fallback' || classification.framework === 'fallback') {
195 |       suggestions.push("🚨 Fix analysis configuration");
196 |     }
197 | 
198 |     if (!classification.capabilities?.canRecommendFramework) {
199 |       suggestions.push("🎯 Framework recommendation unavailable");
200 |     }
201 | 
202 |     return suggestions;
203 |   }
204 | 
205 |   /**
206 |    * Detect execution type from prompt structure
207 |    */
208 |   detectExecutionType(prompt: ConvertedPrompt): 'prompt' | 'template' | 'chain' {
209 |     if (prompt.chainSteps && prompt.chainSteps.length > 0) {
210 |       return 'chain';
211 |     }
212 | 
213 |     const hasTemplateVars = /\{\{.*?\}\}/g.test(prompt.userMessageTemplate || '');
214 |     const hasComplexArgs = (prompt.arguments?.length || 0) > 2;
215 | 
216 |     if (hasTemplateVars || hasComplexArgs) {
217 |       return 'template';
218 |     }
219 | 
220 |     return 'prompt';
221 |   }
222 | 
223 |   /**
224 |    * Analyze prompt complexity
225 |    */
226 |   analyzeComplexity(prompt: ConvertedPrompt): {
227 |     level: 'low' | 'medium' | 'high';
228 |     factors: string[];
229 |     score: number;
230 |   } {
231 |     const factors: string[] = [];
232 |     let score = 0;
233 | 
234 |     // Check for chain steps
235 |     if (prompt.chainSteps && prompt.chainSteps.length > 0) {
236 |       factors.push(`Chain with ${prompt.chainSteps.length} steps`);
237 |       score += prompt.chainSteps.length * 2;
238 |     }
239 | 
240 |     // Check for arguments
241 |     if (prompt.arguments && prompt.arguments.length > 0) {
242 |       factors.push(`${prompt.arguments.length} arguments`);
243 |       score += prompt.arguments.length;
244 |     }
245 | 
246 |     // Check for template complexity
247 |     const templateVars = (prompt.userMessageTemplate || '').match(/\{\{.*?\}\}/g);
248 |     if (templateVars && templateVars.length > 0) {
249 |       factors.push(`${templateVars.length} template variables`);
250 |       score += templateVars.length;
251 |     }
252 | 
253 |     // Check for system message complexity
254 |     if (prompt.systemMessage && prompt.systemMessage.length > 100) {
255 |       factors.push('Complex system message');
256 |       score += 2;
257 |     }
258 | 
259 |     let level: 'low' | 'medium' | 'high' = 'low';
260 |     if (score > 10) {
261 |       level = 'high';
262 |     } else if (score > 5) {
263 |       level = 'medium';
264 |     }
265 | 
266 |     return { level, factors, score };
267 |   }
268 | 
269 |   /**
270 |    * Check if prompt requires framework support
271 |    */
272 |   requiresFramework(prompt: ConvertedPrompt): boolean {
273 |     const complexity = this.analyzeComplexity(prompt);
274 | 
275 |     // Chain prompts typically benefit from framework guidance
276 |     if (prompt.chainSteps && prompt.chainSteps.length > 0) {
277 |       return true;
278 |     }
279 | 
280 |     // Complex templates with many arguments
281 |     if (complexity.level === 'high') {
282 |       return true;
283 |     }
284 | 
285 |     // Complex system messages suggest structured analysis
286 |     if (prompt.systemMessage && prompt.systemMessage.length > 200) {
287 |       return true;
288 |     }
289 | 
290 |     return false;
291 |   }
292 | }
```
Page 5/18FirstPrevNextLast