#
tokens: 49489/50000 13/252 files (page 7/18)
lines: on (toggle) GitHub
raw markdown copy reset
This is page 7 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/environment-validation/environment-parity-checker.js:
--------------------------------------------------------------------------------

```javascript
  1 | /**
  2 |  * Environment Parity Validation System
  3 |  *
  4 |  * Validates consistency between local and CI environments to prevent
  5 |  * environment-specific failures in GitHub Actions.
  6 |  */
  7 | 
  8 | import fs from 'fs';
  9 | import path from 'path';
 10 | import { fileURLToPath } from 'url';
 11 | 
 12 | const __filename = fileURLToPath(import.meta.url);
 13 | const __dirname = path.dirname(__filename);
 14 | 
 15 | /**
 16 |  * Environment Parity Checker
 17 |  *
 18 |  * Detects environment differences that could cause CI failures
 19 |  */
 20 | export class EnvironmentParityChecker {
 21 |   constructor(logger) {
 22 |     this.logger = logger;
 23 |     this.projectRoot = path.resolve(__dirname, '../../..');
 24 |   }
 25 | 
 26 |   /**
 27 |    * Validate Node.js version against package.json requirements
 28 |    */
 29 |   async validateNodeVersion() {
 30 |     try {
 31 |       const packagePath = path.join(this.projectRoot, 'package.json');
 32 |       const packageJson = JSON.parse(fs.readFileSync(packagePath, 'utf8'));
 33 | 
 34 |       const currentVersion = process.version;
 35 |       const engineRequirement = packageJson.engines?.node;
 36 | 
 37 |       if (!engineRequirement) {
 38 |         return {
 39 |           valid: true,
 40 |           currentVersion,
 41 |           requiredVersion: 'Not specified',
 42 |           warning: 'No Node.js version requirement specified in package.json'
 43 |         };
 44 |       }
 45 | 
 46 |       // Parse version requirement (handle >=16, ^18, etc.)
 47 |       const versionMatch = engineRequirement.match(/([>=^~]*)([0-9.]+)/);
 48 |       if (!versionMatch) {
 49 |         return {
 50 |           valid: false,
 51 |           currentVersion,
 52 |           requiredVersion: engineRequirement,
 53 |           error: 'Invalid version requirement format'
 54 |         };
 55 |       }
 56 | 
 57 |       const [, operator, requiredVersion] = versionMatch;
 58 |       const currentMajor = parseInt(currentVersion.slice(1).split('.')[0]);
 59 |       const requiredMajor = parseInt(requiredVersion.split('.')[0]);
 60 | 
 61 |       let compatible = false;
 62 |       let details = '';
 63 | 
 64 |       switch (operator) {
 65 |         case '>=':
 66 |           compatible = currentMajor >= requiredMajor;
 67 |           details = `Current ${currentMajor} >= Required ${requiredMajor}`;
 68 |           break;
 69 |         case '^':
 70 |           compatible = currentMajor >= requiredMajor;
 71 |           details = `Current ${currentMajor} compatible with ^${requiredMajor}`;
 72 |           break;
 73 |         case '~':
 74 |           compatible = currentMajor === requiredMajor;
 75 |           details = `Current ${currentMajor} matches ~${requiredMajor}`;
 76 |           break;
 77 |         default:
 78 |           compatible = currentMajor >= requiredMajor;
 79 |           details = `Current ${currentMajor} >= Required ${requiredMajor} (default check)`;
 80 |       }
 81 | 
 82 |       return {
 83 |         valid: compatible,
 84 |         currentVersion,
 85 |         requiredVersion: engineRequirement,
 86 |         details,
 87 |         recommendation: compatible ? null : `Upgrade Node.js to meet requirement: ${engineRequirement}`
 88 |       };
 89 | 
 90 |     } catch (error) {
 91 |       return {
 92 |         valid: false,
 93 |         error: `Node version validation failed: ${error.message}`,
 94 |         currentVersion: process.version
 95 |       };
 96 |     }
 97 |   }
 98 | 
 99 |   /**
100 |    * Validate environment variables consistency
101 |    */
102 |   async validateEnvironmentVariables() {
103 |     const criticalEnvVars = [
104 |       'NODE_ENV',
105 |       'MCP_SERVER_ROOT',
106 |       'MCP_PROMPTS_CONFIG_PATH'
107 |     ];
108 | 
109 |     const envReport = {
110 |       valid: true,
111 |       variables: {},
112 |       missing: [],
113 |       recommendations: []
114 |     };
115 | 
116 |     for (const varName of criticalEnvVars) {
117 |       const value = process.env[varName];
118 | 
119 |       envReport.variables[varName] = {
120 |         defined: value !== undefined,
121 |         value: value || null,
122 |         source: 'process.env'
123 |       };
124 | 
125 |       if (!value && varName === 'NODE_ENV') {
126 |         envReport.missing.push(varName);
127 |         envReport.recommendations.push('Set NODE_ENV=test for testing environments');
128 |         envReport.valid = false;
129 |       }
130 |     }
131 | 
132 |     // Check for CI-specific variables
133 |     const ciIndicators = ['CI', 'GITHUB_ACTIONS', 'ACT'];
134 |     const ciDetected = ciIndicators.some(varName => process.env[varName]);
135 | 
136 |     envReport.ciEnvironment = {
137 |       detected: ciDetected,
138 |       indicators: ciIndicators.filter(varName => process.env[varName]),
139 |       isLocal: !ciDetected
140 |     };
141 | 
142 |     // Platform-specific environment checks
143 |     envReport.platform = {
144 |       os: process.platform,
145 |       arch: process.arch,
146 |       isWindows: process.platform === 'win32',
147 |       isWSL: process.env.WSL_DISTRO_NAME !== undefined
148 |     };
149 | 
150 |     return envReport;
151 |   }
152 | 
153 |   /**
154 |    * Validate filesystem behavior for cross-platform compatibility
155 |    */
156 |   async validateFilesystemBehavior() {
157 |     const testDir = path.join(this.projectRoot, 'tests', 'temp');
158 |     const fsReport = {
159 |       valid: true,
160 |       pathSeparator: path.sep,
161 |       platform: process.platform,
162 |       issues: [],
163 |       recommendations: []
164 |     };
165 | 
166 |     try {
167 |       // Ensure test directory exists
168 |       if (!fs.existsSync(testDir)) {
169 |         fs.mkdirSync(testDir, { recursive: true });
170 |       }
171 | 
172 |       // Test case sensitivity
173 |       const testFile1 = path.join(testDir, 'Test.txt');
174 |       const testFile2 = path.join(testDir, 'test.txt');
175 | 
176 |       fs.writeFileSync(testFile1, 'test1');
177 | 
178 |       try {
179 |         fs.writeFileSync(testFile2, 'test2');
180 | 
181 |         // If both files exist, filesystem is case-sensitive
182 |         const file1Exists = fs.existsSync(testFile1);
183 |         const file2Exists = fs.existsSync(testFile2);
184 | 
185 |         fsReport.caseSensitive = file1Exists && file2Exists;
186 | 
187 |         // Clean up test files
188 |         try { fs.unlinkSync(testFile1); } catch {}
189 |         try { fs.unlinkSync(testFile2); } catch {}
190 | 
191 |       } catch (error) {
192 |         // If writing second file fails, filesystem is case-insensitive
193 |         fsReport.caseSensitive = false;
194 |         try { fs.unlinkSync(testFile1); } catch {}
195 |       }
196 | 
197 |       // Test path length limits
198 |       const longPath = path.join(testDir, 'a'.repeat(255));
199 |       try {
200 |         fs.writeFileSync(longPath, 'test');
201 |         fs.unlinkSync(longPath);
202 |         fsReport.supportsLongPaths = true;
203 |       } catch (error) {
204 |         fsReport.supportsLongPaths = false;
205 |         fsReport.issues.push('Long path support limited');
206 |       }
207 | 
208 |       // Test symbolic links (if supported)
209 |       try {
210 |         const linkTarget = path.join(testDir, 'target.txt');
211 |         const linkPath = path.join(testDir, 'symlink.txt');
212 | 
213 |         fs.writeFileSync(linkTarget, 'target');
214 |         fs.symlinkSync(linkTarget, linkPath);
215 | 
216 |         fsReport.supportsSymlinks = fs.lstatSync(linkPath).isSymbolicLink();
217 | 
218 |         fs.unlinkSync(linkPath);
219 |         fs.unlinkSync(linkTarget);
220 | 
221 |       } catch (error) {
222 |         fsReport.supportsSymlinks = false;
223 |         fsReport.issues.push('Symbolic link support unavailable');
224 |       }
225 | 
226 |       // Clean up test directory
227 |       try {
228 |         fs.rmdirSync(testDir);
229 |       } catch (error) {
230 |         // Directory might not be empty or might not exist
231 |       }
232 | 
233 |     } catch (error) {
234 |       fsReport.valid = false;
235 |       fsReport.error = `Filesystem validation failed: ${error.message}`;
236 |     }
237 | 
238 |     return fsReport;
239 |   }
240 | 
241 |   /**
242 |    * Validate package dependencies consistency
243 |    */
244 |   async validatePackageDependencies() {
245 |     try {
246 |       const packagePath = path.join(this.projectRoot, 'package.json');
247 |       const lockfilePath = path.join(this.projectRoot, 'package-lock.json');
248 | 
249 |       const packageJson = JSON.parse(fs.readFileSync(packagePath, 'utf8'));
250 |       let lockfileExists = false;
251 |       let lockfileData = null;
252 | 
253 |       try {
254 |         lockfileData = JSON.parse(fs.readFileSync(lockfilePath, 'utf8'));
255 |         lockfileExists = true;
256 |       } catch (error) {
257 |         // Lockfile doesn't exist or is invalid
258 |       }
259 | 
260 |       const dependencyReport = {
261 |         valid: true,
262 |         packageJsonExists: true,
263 |         lockfileExists,
264 |         dependencies: Object.keys(packageJson.dependencies || {}),
265 |         devDependencies: Object.keys(packageJson.devDependencies || {}),
266 |         issues: [],
267 |         recommendations: []
268 |       };
269 | 
270 |       // Check for critical MCP dependencies
271 |       const criticalDeps = ['@modelcontextprotocol/sdk'];
272 |       const missingCritical = criticalDeps.filter(dep =>
273 |         !dependencyReport.dependencies.includes(dep)
274 |       );
275 | 
276 |       if (missingCritical.length > 0) {
277 |         dependencyReport.valid = false;
278 |         dependencyReport.issues.push(`Missing critical dependencies: ${missingCritical.join(', ')}`);
279 |         dependencyReport.recommendations.push('Install missing MCP SDK dependencies');
280 |       }
281 | 
282 |       // Check lockfile consistency (if exists)
283 |       if (lockfileExists && lockfileData) {
284 |         const lockfileDeps = Object.keys(lockfileData.dependencies || {});
285 |         const packageDeps = [...dependencyReport.dependencies, ...dependencyReport.devDependencies];
286 | 
287 |         const mismatchedDeps = packageDeps.filter(dep => !lockfileDeps.includes(dep));
288 | 
289 |         if (mismatchedDeps.length > 0) {
290 |           dependencyReport.issues.push(`Dependencies not in lockfile: ${mismatchedDeps.join(', ')}`);
291 |           dependencyReport.recommendations.push('Run npm install to update lockfile');
292 |         }
293 |       }
294 | 
295 |       if (!lockfileExists) {
296 |         dependencyReport.recommendations.push('Generate package-lock.json for dependency consistency');
297 |       }
298 | 
299 |       return dependencyReport;
300 | 
301 |     } catch (error) {
302 |       return {
303 |         valid: false,
304 |         error: `Dependency validation failed: ${error.message}`,
305 |         packageJsonExists: false
306 |       };
307 |     }
308 |   }
309 | 
310 |   /**
311 |    * Generate comprehensive environment parity report
312 |    */
313 |   async generateParityReport() {
314 |     this.logger.debug('[ENV PARITY] Starting comprehensive environment validation');
315 | 
316 |     const startTime = Date.now();
317 | 
318 |     const nodeVersion = await this.validateNodeVersion();
319 |     const envVars = await this.validateEnvironmentVariables();
320 |     const filesystem = await this.validateFilesystemBehavior();
321 |     const dependencies = await this.validatePackageDependencies();
322 | 
323 |     const validationTime = Date.now() - startTime;
324 | 
325 |     const overallValid = nodeVersion.valid && envVars.valid && filesystem.valid && dependencies.valid;
326 | 
327 |     const report = {
328 |       timestamp: new Date(),
329 |       validationTime,
330 |       overall: {
331 |         valid: overallValid,
332 |         environment: envVars.ciEnvironment.detected ? 'CI' : 'Local',
333 |         platform: process.platform,
334 |         nodeVersion: process.version
335 |       },
336 |       components: {
337 |         nodeVersion,
338 |         environmentVariables: envVars,
339 |         filesystem,
340 |         dependencies
341 |       },
342 |       recommendations: [
343 |         ...nodeVersion.recommendation ? [nodeVersion.recommendation] : [],
344 |         ...envVars.recommendations,
345 |         ...filesystem.recommendations,
346 |         ...dependencies.recommendations
347 |       ]
348 |     };
349 | 
350 |     this.logger.debug('[ENV PARITY] Environment validation completed', {
351 |       valid: overallValid,
352 |       validationTime,
353 |       platform: process.platform
354 |     });
355 | 
356 |     return report;
357 |   }
358 | 
359 |   /**
360 |    * Quick environment compatibility check
361 |    */
362 |   async quickCompatibilityCheck() {
363 |     const nodeCheck = await this.validateNodeVersion();
364 |     const envCheck = await this.validateEnvironmentVariables();
365 | 
366 |     return {
367 |       compatible: nodeCheck.valid && envCheck.valid,
368 |       issues: [
369 |         ...(nodeCheck.valid ? [] : [nodeCheck.error || nodeCheck.recommendation]),
370 |         ...(envCheck.valid ? [] : envCheck.recommendations)
371 |       ].filter(Boolean)
372 |     };
373 |   }
374 | }
375 | 
376 | /**
377 |  * Factory function for creating checker instance
378 |  */
379 | export function createEnvironmentParityChecker(logger) {
380 |   return new EnvironmentParityChecker(logger);
381 | }
```

--------------------------------------------------------------------------------
/server/src/chain-session/manager.ts:
--------------------------------------------------------------------------------

```typescript
  1 | /**
  2 |  * Chain Session Manager
  3 |  *
  4 |  * Manages chain execution sessions, providing the bridge between MCP session IDs
  5 |  * and the chain state management in ConversationManager. This enables stateful
  6 |  * chain execution across multiple MCP tool calls.
  7 |  */
  8 | 
  9 | import { Logger } from "../logging/index.js";
 10 | import { ConversationManager } from "../text-references/conversation.js";
 11 | import { TextReferenceManager } from "../text-references/index.js";
 12 | import { ChainState } from "../mcp-tools/prompt-engine/core/types.js";
 13 | 
 14 | /**
 15 |  * Session information for chain execution
 16 |  */
 17 | export interface ChainSession {
 18 |   sessionId: string;
 19 |   chainId: string;
 20 |   state: ChainState;
 21 |   currentStepId?: string;
 22 |   executionOrder: number[];
 23 |   startTime: number;
 24 |   lastActivity: number;
 25 |   originalArgs: Record<string, any>;
 26 | }
 27 | 
 28 | /**
 29 |  * Chain Session Manager class
 30 |  *
 31 |  * Coordinates session state between MCP protocol and conversation manager.
 32 |  * Provides session-aware context retrieval for chain execution.
 33 |  */
 34 | export class ChainSessionManager {
 35 |   private logger: Logger;
 36 |   private conversationManager: ConversationManager;
 37 |   private textReferenceManager: TextReferenceManager;
 38 |   private activeSessions: Map<string, ChainSession> = new Map();
 39 |   private chainSessionMapping: Map<string, Set<string>> = new Map(); // chainId -> sessionIds
 40 | 
 41 |   constructor(logger: Logger, conversationManager: ConversationManager, textReferenceManager: TextReferenceManager) {
 42 |     this.logger = logger;
 43 |     this.conversationManager = conversationManager;
 44 |     this.textReferenceManager = textReferenceManager;
 45 | 
 46 |     // Integrate with conversation manager (with enhanced null checking for testing)
 47 |     try {
 48 |       if (conversationManager !== null && conversationManager !== undefined &&
 49 |           conversationManager.setChainSessionManager &&
 50 |           typeof conversationManager.setChainSessionManager === 'function') {
 51 |         conversationManager.setChainSessionManager(this);
 52 |       } else {
 53 |         if (this.logger) {
 54 |           this.logger.debug("ConversationManager is null or missing setChainSessionManager method - running in test mode");
 55 |         }
 56 |       }
 57 |     } catch (error) {
 58 |       // Handle any errors during integration (e.g., null references during testing)
 59 |       if (this.logger) {
 60 |         this.logger.debug(`Failed to integrate with conversation manager: ${error instanceof Error ? error.message : String(error)}`);
 61 |       }
 62 |     }
 63 | 
 64 |     if (this.logger) {
 65 |       this.logger.debug("ChainSessionManager initialized with conversation and text reference manager integration");
 66 |     }
 67 |   }
 68 | 
 69 |   /**
 70 |    * Create a new chain session
 71 |    */
 72 |   createSession(sessionId: string, chainId: string, totalSteps: number, originalArgs: Record<string, any> = {}): ChainSession {
 73 |     const session: ChainSession = {
 74 |       sessionId,
 75 |       chainId,
 76 |       state: {
 77 |         currentStep: 0,
 78 |         totalSteps,
 79 |         lastUpdated: Date.now()
 80 |       },
 81 |       executionOrder: [],
 82 |       startTime: Date.now(),
 83 |       lastActivity: Date.now(),
 84 |       originalArgs
 85 |     };
 86 | 
 87 |     this.activeSessions.set(sessionId, session);
 88 | 
 89 |     // Track chain to session mapping
 90 |     if (!this.chainSessionMapping.has(chainId)) {
 91 |       this.chainSessionMapping.set(chainId, new Set());
 92 |     }
 93 |     this.chainSessionMapping.get(chainId)!.add(sessionId);
 94 | 
 95 |     // Sync with conversation manager
 96 |     this.conversationManager.setChainState(chainId, 0, totalSteps);
 97 | 
 98 |     this.logger.debug(`Created chain session ${sessionId} for chain ${chainId} with ${totalSteps} steps`);
 99 |     return session;
100 |   }
101 | 
102 |   /**
103 |    * Get session by ID
104 |    */
105 |   getSession(sessionId: string): ChainSession | undefined {
106 |     const session = this.activeSessions.get(sessionId);
107 |     if (session) {
108 |       session.lastActivity = Date.now();
109 |     }
110 |     return session;
111 |   }
112 | 
113 |   /**
114 |    * Update session state after step completion
115 |    */
116 |   updateSessionState(sessionId: string, stepNumber: number, stepResult: string, stepMetadata?: any): boolean {
117 |     const session = this.activeSessions.get(sessionId);
118 |     if (!session) {
119 |       this.logger.warn(`Attempted to update non-existent session: ${sessionId}`);
120 |       return false;
121 |     }
122 | 
123 |     // Update session state
124 |     session.state.currentStep = stepNumber + 1; // Move to next step
125 |     session.state.lastUpdated = Date.now();
126 |     session.lastActivity = Date.now();
127 |     session.executionOrder.push(stepNumber);
128 | 
129 |     // Store result in text reference manager (single source of truth)
130 |     this.textReferenceManager.storeChainStepResult(
131 |       session.chainId,
132 |       stepNumber,
133 |       stepResult,
134 |       stepMetadata
135 |     );
136 | 
137 |     // Update conversation manager state for coordination
138 |     this.conversationManager.setChainState(
139 |       session.chainId,
140 |       session.state.currentStep,
141 |       session.state.totalSteps
142 |     );
143 | 
144 |     this.logger.debug(`Updated session ${sessionId}: step ${stepNumber} completed, moved to step ${session.state.currentStep}`);
145 |     return true;
146 |   }
147 | 
148 |   /**
149 |    * Get chain context for session - this is the critical method for fixing contextData
150 |    */
151 |   getChainContext(sessionId: string): Record<string, any> {
152 |     const session = this.activeSessions.get(sessionId);
153 |     if (!session) {
154 |       this.logger.debug(`No session found for ${sessionId}, returning empty context`);
155 |       return {};
156 |     }
157 | 
158 |     // Get chain variables from text reference manager (single source of truth)
159 |     const chainVariables = this.textReferenceManager.buildChainVariables(session.chainId);
160 | 
161 |     // Merge with session-specific context
162 |     const contextData: Record<string, any> = {
163 |       // Core session info
164 |       session_id: sessionId,
165 |       current_step: session.state.currentStep,
166 |       total_steps: session.state.totalSteps,
167 |       execution_order: session.executionOrder,
168 | 
169 |       // Chain variables (step results, etc.) from TextReferenceManager
170 |       ...chainVariables
171 |     };
172 | 
173 |     this.logger.debug(`Retrieved context for session ${sessionId}: ${Object.keys(contextData).length} context variables`);
174 |     return contextData;
175 |   }
176 | 
177 |   /**
178 |    * Get original arguments for session
179 |    */
180 |   getOriginalArgs(sessionId: string): Record<string, any> {
181 |     const session = this.activeSessions.get(sessionId);
182 |     return session?.originalArgs || {};
183 |   }
184 | 
185 |   /**
186 |    * Check if session exists and is active
187 |    */
188 |   hasActiveSession(sessionId: string): boolean {
189 |     return this.activeSessions.has(sessionId);
190 |   }
191 | 
192 |   /**
193 |    * Check if chain has any active sessions
194 |    */
195 |   hasActiveSessionForChain(chainId: string): boolean {
196 |     const sessionIds = this.chainSessionMapping.get(chainId);
197 |     return sessionIds ? sessionIds.size > 0 : false;
198 |   }
199 | 
200 |   /**
201 |    * Get active session for chain (returns first active session)
202 |    */
203 |   getActiveSessionForChain(chainId: string): ChainSession | undefined {
204 |     const sessionIds = this.chainSessionMapping.get(chainId);
205 |     if (!sessionIds || sessionIds.size === 0) {
206 |       return undefined;
207 |     }
208 | 
209 |     // Return the most recently active session
210 |     let mostRecentSession: ChainSession | undefined;
211 |     let mostRecentActivity = 0;
212 | 
213 |     for (const sessionId of sessionIds) {
214 |       const session = this.activeSessions.get(sessionId);
215 |       if (session && session.lastActivity > mostRecentActivity) {
216 |         mostRecentSession = session;
217 |         mostRecentActivity = session.lastActivity;
218 |       }
219 |     }
220 | 
221 |     return mostRecentSession;
222 |   }
223 | 
224 |   /**
225 |    * Clear session
226 |    */
227 |   clearSession(sessionId: string): boolean {
228 |     const session = this.activeSessions.get(sessionId);
229 |     if (!session) {
230 |       return false;
231 |     }
232 | 
233 |     // Remove from chain mapping
234 |     const chainSessions = this.chainSessionMapping.get(session.chainId);
235 |     if (chainSessions) {
236 |       chainSessions.delete(sessionId);
237 |       if (chainSessions.size === 0) {
238 |         this.chainSessionMapping.delete(session.chainId);
239 |       }
240 |     }
241 | 
242 |     // Remove session
243 |     this.activeSessions.delete(sessionId);
244 | 
245 |     this.logger.debug(`Cleared session ${sessionId} for chain ${session.chainId}`);
246 |     return true;
247 |   }
248 | 
249 |   /**
250 |    * Clear all sessions for a chain
251 |    */
252 |   clearSessionsForChain(chainId: string): void {
253 |     const sessionIds = this.chainSessionMapping.get(chainId);
254 |     if (!sessionIds) {
255 |       return;
256 |     }
257 | 
258 |     // Clear all sessions
259 |     sessionIds.forEach(sessionId => {
260 |       this.activeSessions.delete(sessionId);
261 |     });
262 | 
263 |     // Clear mapping
264 |     this.chainSessionMapping.delete(chainId);
265 | 
266 |     // Clear step results from text reference manager
267 |     this.textReferenceManager.clearChainStepResults(chainId);
268 | 
269 |     this.logger.debug(`Cleared all sessions for chain ${chainId}`);
270 |   }
271 | 
272 |   /**
273 |    * Cleanup stale sessions (older than 1 hour)
274 |    */
275 |   cleanupStaleSessions(): number {
276 |     const oneHourAgo = Date.now() - 3600000;
277 |     let cleaned = 0;
278 | 
279 |     for (const [sessionId, session] of this.activeSessions) {
280 |       if (session.lastActivity < oneHourAgo) {
281 |         this.clearSession(sessionId);
282 |         cleaned++;
283 |       }
284 |     }
285 | 
286 |     if (cleaned > 0) {
287 |       this.logger.info(`Cleaned up ${cleaned} stale chain sessions`);
288 |     }
289 | 
290 |     return cleaned;
291 |   }
292 | 
293 |   /**
294 |    * Get session statistics
295 |    */
296 |   getSessionStats(): {
297 |     totalSessions: number;
298 |     totalChains: number;
299 |     averageStepsPerChain: number;
300 |     oldestSessionAge: number;
301 |   } {
302 |     const totalSessions = this.activeSessions.size;
303 |     const totalChains = this.chainSessionMapping.size;
304 | 
305 |     let totalSteps = 0;
306 |     let oldestSessionTime = Date.now();
307 | 
308 |     for (const session of this.activeSessions.values()) {
309 |       totalSteps += session.state.currentStep;
310 |       if (session.startTime < oldestSessionTime) {
311 |         oldestSessionTime = session.startTime;
312 |       }
313 |     }
314 | 
315 |     return {
316 |       totalSessions,
317 |       totalChains,
318 |       averageStepsPerChain: totalChains > 0 ? totalSteps / totalChains : 0,
319 |       oldestSessionAge: Date.now() - oldestSessionTime
320 |     };
321 |   }
322 | 
323 |   /**
324 |    * Validate session integrity
325 |    */
326 |   validateSession(sessionId: string): { valid: boolean; issues: string[] } {
327 |     const session = this.activeSessions.get(sessionId);
328 |     const issues: string[] = [];
329 | 
330 |     if (!session) {
331 |       issues.push("Session not found");
332 |       return { valid: false, issues };
333 |     }
334 | 
335 |     // Check if conversation manager has corresponding state
336 |     const conversationState = this.conversationManager.getChainState(session.chainId);
337 |     if (!conversationState) {
338 |       issues.push("No corresponding conversation state found");
339 |     } else {
340 |       // Check state consistency
341 |       if (conversationState.currentStep !== session.state.currentStep) {
342 |         issues.push(`State mismatch: session=${session.state.currentStep}, conversation=${conversationState.currentStep}`);
343 |       }
344 |       if (conversationState.totalSteps !== session.state.totalSteps) {
345 |         issues.push(`Step count mismatch: session=${session.state.totalSteps}, conversation=${conversationState.totalSteps}`);
346 |       }
347 |     }
348 | 
349 |     // Check for stale session
350 |     const hoursSinceActivity = (Date.now() - session.lastActivity) / 3600000;
351 |     if (hoursSinceActivity > 1) {
352 |       issues.push(`Session stale: ${hoursSinceActivity.toFixed(1)} hours since last activity`);
353 |     }
354 | 
355 |     return { valid: issues.length === 0, issues };
356 |   }
357 | }
358 | 
359 | /**
360 |  * Create and configure a chain session manager
361 |  */
362 | export function createChainSessionManager(
363 |   logger: Logger,
364 |   conversationManager: ConversationManager,
365 |   textReferenceManager: TextReferenceManager
366 | ): ChainSessionManager {
367 |   return new ChainSessionManager(logger, conversationManager, textReferenceManager);
368 | }
```

--------------------------------------------------------------------------------
/server/src/execution/context/framework-injector.ts:
--------------------------------------------------------------------------------

```typescript
  1 | /**
  2 |  * Framework Injector - Phase 3
  3 |  * Handles framework system prompt injection into execution context
  4 |  * Integrates with FrameworkManager to provide methodology-based system prompts
  5 |  */
  6 | 
  7 | import { Logger } from "../../logging/index.js";
  8 | import { ConvertedPrompt } from "../../types/index.js";
  9 | import { FrameworkManager } from "../../frameworks/framework-manager.js";
 10 | import {
 11 |   FrameworkExecutionContext,
 12 |   FrameworkSelectionCriteria
 13 | } from "../../frameworks/types/index.js";
 14 | import { FrameworkStateManager } from "../../frameworks/framework-state-manager.js";
 15 | import { ContentAnalysisResult } from "../../semantic/configurable-semantic-analyzer.js";
 16 | import {
 17 |   IMethodologyGuide,
 18 |   MethodologyEnhancement
 19 | } from "../../frameworks/types/index.js";
 20 | 
 21 | /**
 22 |  * Framework injection result
 23 |  */
 24 | export interface FrameworkInjectionResult {
 25 |   // Original prompt (unchanged)
 26 |   originalPrompt: ConvertedPrompt;
 27 |   
 28 |   // Framework context
 29 |   frameworkContext: FrameworkExecutionContext;
 30 |   
 31 |   // Enhanced prompt with framework system prompt
 32 |   enhancedPrompt: ConvertedPrompt & {
 33 |     frameworkSystemPrompt?: string;
 34 |     frameworkGuidelines?: string[];
 35 |     frameworkMetadata?: {
 36 |       selectedFramework: string;
 37 |       selectionReason: string;
 38 |       confidence: number;
 39 |     };
 40 |     methodologyEnhancement?: MethodologyEnhancement;
 41 |   };
 42 |   
 43 |   // Injection metadata
 44 |   injectionMetadata: {
 45 |     injectedAt: Date;
 46 |     frameworkId: string;
 47 |     injectionMethod: 'system_prompt' | 'user_prefix' | 'guidelines';
 48 |     originalSystemMessage?: string;
 49 |   };
 50 | }
 51 | 
 52 | /**
 53 |  * Framework injection configuration
 54 |  */
 55 | export interface FrameworkInjectionConfig {
 56 |   enableInjection: boolean;
 57 |   injectionMethod: 'system_prompt' | 'user_prefix' | 'guidelines';
 58 |   preserveOriginalSystemMessage: boolean;
 59 |   includeFrameworkMetadata: boolean;
 60 |   userPreferenceOverride?: string;
 61 |   enableMethodologyGuides: boolean;
 62 | }
 63 | 
 64 | /**
 65 |  * Framework Injector Implementation
 66 |  * Injects framework system prompts into prompt execution context
 67 |  */
 68 | export class FrameworkInjector {
 69 |   private frameworkManager: FrameworkManager;
 70 |   private frameworkStateManager?: FrameworkStateManager; // NEW: For checking if framework system is enabled
 71 |   private logger: Logger;
 72 |   private config: FrameworkInjectionConfig;
 73 | 
 74 |   constructor(
 75 |     frameworkManager: FrameworkManager,
 76 |     logger: Logger,
 77 |     config: Partial<FrameworkInjectionConfig> = {},
 78 |     frameworkStateManager?: FrameworkStateManager // NEW: Optional state manager
 79 |   ) {
 80 |     this.frameworkManager = frameworkManager;
 81 |     this.frameworkStateManager = frameworkStateManager;
 82 |     this.logger = logger;
 83 | 
 84 |     this.config = {
 85 |       enableInjection: config.enableInjection ?? true,
 86 |       injectionMethod: config.injectionMethod ?? 'system_prompt',
 87 |       preserveOriginalSystemMessage: config.preserveOriginalSystemMessage ?? true,
 88 |       includeFrameworkMetadata: config.includeFrameworkMetadata ?? true,
 89 |       userPreferenceOverride: config.userPreferenceOverride,
 90 |       enableMethodologyGuides: config.enableMethodologyGuides ?? true
 91 |     };
 92 |   }
 93 | 
 94 |   /**
 95 |    * Main framework injection method
 96 |    * Enhances prompt with appropriate framework system prompt based on semantic analysis
 97 |    */
 98 |   async injectFrameworkContext(
 99 |     prompt: ConvertedPrompt,
100 |     semanticAnalysis: ContentAnalysisResult,
101 |     userFrameworkPreference?: string
102 |   ): Promise<FrameworkInjectionResult> {
103 |     const startTime = Date.now();
104 |     
105 |     try {
106 |       // Skip injection if disabled
107 |       if (!this.config.enableInjection) {
108 |         return this.createPassthroughResult(prompt);
109 |       }
110 | 
111 |       // NEW: Skip injection if framework system is disabled
112 |       if (this.frameworkStateManager && !this.frameworkStateManager.isFrameworkSystemEnabled()) {
113 |         this.logger.debug(`Skipping framework injection - framework system is disabled: ${prompt.id}`);
114 |         return this.createPassthroughResult(prompt);
115 |       }
116 | 
117 |       // Skip framework injection for basic "prompt" execution type
118 |       if (semanticAnalysis.executionType === "prompt") {
119 |         this.logger.debug(`Skipping framework injection for prompt execution: ${prompt.id}`);
120 |         return this.createPassthroughResult(prompt);
121 |       }
122 |       
123 |       // Prepare framework selection criteria based on semantic analysis
124 |       const executionType = semanticAnalysis.executionType;
125 |       const selectionCriteria: FrameworkSelectionCriteria = {
126 |         executionType: executionType as "template" | "chain",
127 |         complexity: semanticAnalysis.complexity,
128 |         userPreference: (userFrameworkPreference || this.config.userPreferenceOverride) as any
129 |       };
130 |       
131 |       // Generate framework execution context
132 |       const frameworkContext = this.frameworkManager.generateExecutionContext(
133 |         prompt,
134 |         selectionCriteria
135 |       );
136 |       
137 |       // Create enhanced prompt with framework injection
138 |       const enhancedPrompt = this.performFrameworkInjection(
139 |         prompt,
140 |         frameworkContext,
141 |         semanticAnalysis
142 |       );
143 |       
144 |       // Create injection result
145 |       const result: FrameworkInjectionResult = {
146 |         originalPrompt: prompt,
147 |         frameworkContext,
148 |         enhancedPrompt,
149 |         injectionMetadata: {
150 |           injectedAt: new Date(),
151 |           frameworkId: frameworkContext.selectedFramework.id,
152 |           injectionMethod: this.config.injectionMethod,
153 |           originalSystemMessage: prompt.systemMessage
154 |         }
155 |       };
156 |       
157 |       const processingTime = Date.now() - startTime;
158 |       this.logger.debug(
159 |         `Framework injection completed: ${frameworkContext.selectedFramework.name} (${processingTime}ms)`
160 |       );
161 |       
162 |       return result;
163 |       
164 |     } catch (error) {
165 |       this.logger.error("Framework injection failed:", error);
166 |       return this.createPassthroughResult(prompt);
167 |     }
168 |   }
169 | 
170 |   /**
171 |    * Quick framework system prompt injection for execution
172 |    */
173 |   async injectSystemPrompt(
174 |     prompt: ConvertedPrompt,
175 |     semanticAnalysis: ContentAnalysisResult
176 |   ): Promise<string> {
177 |     const result = await this.injectFrameworkContext(prompt, semanticAnalysis);
178 |     return result.enhancedPrompt.frameworkSystemPrompt || "";
179 |   }
180 | 
181 |   /**
182 |    * Get framework guidelines for execution context
183 |    */
184 |   async getFrameworkGuidelines(
185 |     prompt: ConvertedPrompt,
186 |     semanticAnalysis: ContentAnalysisResult
187 |   ): Promise<string[]> {
188 |     const result = await this.injectFrameworkContext(prompt, semanticAnalysis);
189 |     return result.frameworkContext.executionGuidelines;
190 |   }
191 | 
192 |   // Private implementation methods
193 | 
194 |   /**
195 |    * Perform the actual framework injection based on configuration
196 |    */
197 |   private performFrameworkInjection(
198 |     prompt: ConvertedPrompt,
199 |     frameworkContext: FrameworkExecutionContext,
200 |     semanticAnalysis: ContentAnalysisResult
201 |   ): FrameworkInjectionResult['enhancedPrompt'] {
202 |     const framework = frameworkContext.selectedFramework;
203 |     const systemPrompt = frameworkContext.systemPrompt;
204 |     
205 |     // Start with original prompt
206 |     const enhancedPrompt = { ...prompt } as FrameworkInjectionResult['enhancedPrompt'];
207 |     
208 |     // Apply injection based on method
209 |     switch (this.config.injectionMethod) {
210 |       case 'system_prompt':
211 |         enhancedPrompt.frameworkSystemPrompt = systemPrompt;
212 |         
213 |         // Combine with original system message if preservation is enabled
214 |         if (this.config.preserveOriginalSystemMessage && prompt.systemMessage) {
215 |           enhancedPrompt.systemMessage = `${systemPrompt}\n\n${prompt.systemMessage}`;
216 |         } else {
217 |           enhancedPrompt.systemMessage = systemPrompt;
218 |         }
219 |         break;
220 |         
221 |       case 'user_prefix':
222 |         enhancedPrompt.frameworkSystemPrompt = systemPrompt;
223 |         // System prompt will be prepended to user message during execution
224 |         break;
225 |         
226 |       case 'guidelines':
227 |         enhancedPrompt.frameworkGuidelines = frameworkContext.executionGuidelines;
228 |         // Guidelines will be applied during execution without modifying prompts
229 |         break;
230 |     }
231 |     
232 |     // Apply methodology guide enhancements if enabled
233 |     if (this.config.enableMethodologyGuides) {
234 |       const methodologyGuide = this.getMethodologyGuide(framework.id);
235 |       if (methodologyGuide) {
236 |         try {
237 |           const methodologyEnhancement = methodologyGuide.enhanceWithMethodology(
238 |             prompt, 
239 |             { semanticAnalysis, frameworkContext }
240 |           );
241 |           enhancedPrompt.methodologyEnhancement = methodologyEnhancement;
242 |           
243 |           // Apply methodology system prompt guidance if using system_prompt injection
244 |           if (this.config.injectionMethod === 'system_prompt' && methodologyEnhancement.systemPromptGuidance) {
245 |             const baseSystemPrompt = enhancedPrompt.systemMessage || '';
246 |             enhancedPrompt.systemMessage = `${baseSystemPrompt}\n\n${methodologyEnhancement.systemPromptGuidance}`;
247 |           }
248 |           
249 |           this.logger.debug(`Methodology guide applied: ${methodologyGuide.methodology}`);
250 |         } catch (error) {
251 |           this.logger.warn(`Failed to apply methodology guide for ${framework.id}:`, error);
252 |         }
253 |       }
254 |     }
255 |     
256 |     // Add framework metadata if enabled
257 |     if (this.config.includeFrameworkMetadata) {
258 |       enhancedPrompt.frameworkMetadata = {
259 |         selectedFramework: framework.name,
260 |         selectionReason: frameworkContext.metadata.selectionReason,
261 |         confidence: frameworkContext.metadata.confidence
262 |       };
263 |     }
264 |     
265 |     return enhancedPrompt;
266 |   }
267 | 
268 |   /**
269 |    * Get methodology guide for a specific framework
270 |    */
271 |   private getMethodologyGuide(frameworkId: string): IMethodologyGuide | null {
272 |     try {
273 |       // Get methodology guide from framework manager
274 |       const guide = this.frameworkManager.getMethodologyGuide(frameworkId);
275 |       if (!guide) {
276 |         this.logger.debug(`No methodology guide available for framework: ${frameworkId}`);
277 |         return null;
278 |       }
279 |       return guide;
280 |     } catch (error) {
281 |       this.logger.warn(`Failed to get methodology guide for ${frameworkId}:`, error);
282 |       return null;
283 |     }
284 |   }
285 | 
286 |   /**
287 |    * Create passthrough result when injection is disabled or fails
288 |    */
289 |   private createPassthroughResult(prompt: ConvertedPrompt): FrameworkInjectionResult {
290 |     // Create minimal framework context for consistency
291 |     const defaultFramework = this.frameworkManager.listFrameworks(true)[0];
292 |     const minimalContext = this.frameworkManager.generateExecutionContext(
293 |       prompt,
294 |       { executionType: "template", complexity: "low" }
295 |     );
296 |     
297 |     return {
298 |       originalPrompt: prompt,
299 |       frameworkContext: minimalContext,
300 |       enhancedPrompt: prompt,
301 |       injectionMetadata: {
302 |         injectedAt: new Date(),
303 |         frameworkId: 'none',
304 |         injectionMethod: this.config.injectionMethod,
305 |         originalSystemMessage: prompt.systemMessage
306 |       }
307 |     };
308 |   }
309 | 
310 |   /**
311 |    * Update injection configuration
312 |    */
313 |   updateConfig(newConfig: Partial<FrameworkInjectionConfig>): void {
314 |     this.config = { ...this.config, ...newConfig };
315 |     this.logger.info("Framework injector configuration updated");
316 |   }
317 | 
318 |   /**
319 |    * Get current injection configuration
320 |    */
321 |   getConfig(): FrameworkInjectionConfig {
322 |     return { ...this.config };
323 |   }
324 | }
325 | 
326 | /**
327 |  * Create and configure framework injector
328 |  */
329 | export async function createFrameworkInjector(
330 |   frameworkManager: FrameworkManager,
331 |   logger: Logger,
332 |   config?: Partial<FrameworkInjectionConfig>,
333 |   frameworkStateManager?: FrameworkStateManager // NEW: Optional state manager
334 | ): Promise<FrameworkInjector> {
335 |   return new FrameworkInjector(frameworkManager, logger, config, frameworkStateManager);
336 | }
```

--------------------------------------------------------------------------------
/server/src/mcp-tools/config-utils.ts:
--------------------------------------------------------------------------------

```typescript
  1 | /**
  2 |  * Configuration Utilities for Safe Config Management
  3 |  *
  4 |  * Provides atomic config operations with backup/rollback capabilities
  5 |  * for secure configuration management in system_control tool.
  6 |  */
  7 | 
  8 | import { writeFile, readFile, copyFile, access } from "fs/promises";
  9 | import path from "path";
 10 | import { Config } from "../types/index.js";
 11 | import { ConfigManager } from "../config/index.js";
 12 | import { Logger } from "../logging/index.js";
 13 | 
 14 | /**
 15 |  * Configuration write result
 16 |  */
 17 | export interface ConfigWriteResult {
 18 |   success: boolean;
 19 |   message: string;
 20 |   backupPath?: string;
 21 |   error?: string;
 22 |   restartRequired?: boolean;
 23 | }
 24 | 
 25 | /**
 26 |  * Configuration backup information
 27 |  */
 28 | export interface ConfigBackup {
 29 |   backupPath: string;
 30 |   timestamp: number;
 31 |   originalConfig: Config;
 32 | }
 33 | 
 34 | /**
 35 |  * Safe Configuration Writer
 36 |  * Provides atomic config operations with automatic backup and rollback
 37 |  */
 38 | export class SafeConfigWriter {
 39 |   private logger: Logger;
 40 |   private configManager: ConfigManager;
 41 |   private configPath: string;
 42 | 
 43 |   constructor(logger: Logger, configManager: ConfigManager, configPath: string) {
 44 |     this.logger = logger;
 45 |     this.configManager = configManager;
 46 |     this.configPath = configPath;
 47 |   }
 48 | 
 49 |   /**
 50 |    * Safely update a configuration value with atomic operations
 51 |    */
 52 |   async updateConfigValue(key: string, value: string): Promise<ConfigWriteResult> {
 53 |     try {
 54 |       // Step 1: Validate the operation
 55 |       const validation = this.validateConfigUpdate(key, value);
 56 |       if (!validation.valid) {
 57 |         return {
 58 |           success: false,
 59 |           message: `Validation failed: ${validation.error}`,
 60 |           error: validation.error
 61 |         };
 62 |       }
 63 | 
 64 |       // Step 2: Create backup
 65 |       const backup = await this.createConfigBackup();
 66 |       this.logger.info(`Config backup created: ${backup.backupPath}`);
 67 | 
 68 |       // Step 3: Load current config and apply changes
 69 |       const currentConfig = this.configManager.getConfig();
 70 |       const updatedConfig = this.applyConfigChange(currentConfig, key, validation.convertedValue);
 71 | 
 72 |       // Step 4: Validate the entire updated configuration
 73 |       const configValidation = this.validateFullConfig(updatedConfig);
 74 |       if (!configValidation.valid) {
 75 |         return {
 76 |           success: false,
 77 |           message: `Configuration validation failed: ${configValidation.error}`,
 78 |           error: configValidation.error,
 79 |           backupPath: backup.backupPath
 80 |         };
 81 |       }
 82 | 
 83 |       // Step 5: Write the new configuration atomically
 84 |       await this.writeConfigAtomic(updatedConfig);
 85 | 
 86 |       // Step 6: Reload ConfigManager to use new config
 87 |       await this.configManager.loadConfig();
 88 | 
 89 |       return {
 90 |         success: true,
 91 |         message: `Configuration updated successfully: ${key} = ${value}`,
 92 |         backupPath: backup.backupPath,
 93 |         restartRequired: this.requiresRestart(key)
 94 |       };
 95 | 
 96 |     } catch (error) {
 97 |       this.logger.error(`Failed to update config ${key}:`, error);
 98 |       return {
 99 |         success: false,
100 |         message: `Failed to update configuration: ${error}`,
101 |         error: String(error)
102 |       };
103 |     }
104 |   }
105 | 
106 |   /**
107 |    * Create a timestamped backup of the current configuration
108 |    */
109 |   private async createConfigBackup(): Promise<ConfigBackup> {
110 |     const timestamp = Date.now();
111 |     const backupPath = `${this.configPath}.backup.${timestamp}`;
112 | 
113 |     try {
114 |       await copyFile(this.configPath, backupPath);
115 |       const originalConfig = this.configManager.getConfig();
116 | 
117 |       this.logger.debug(`Config backup created: ${backupPath}`);
118 |       return {
119 |         backupPath,
120 |         timestamp,
121 |         originalConfig
122 |       };
123 |     } catch (error) {
124 |       this.logger.error(`Failed to create config backup:`, error);
125 |       throw new Error(`Backup creation failed: ${error}`);
126 |     }
127 |   }
128 | 
129 |   /**
130 |    * Restore configuration from backup
131 |    */
132 |   async restoreFromBackup(backupPath: string): Promise<ConfigWriteResult> {
133 |     try {
134 |       // Verify backup exists
135 |       await access(backupPath);
136 | 
137 |       // Restore the backup
138 |       await copyFile(backupPath, this.configPath);
139 | 
140 |       // Reload configuration
141 |       await this.configManager.loadConfig();
142 | 
143 |       this.logger.info(`Configuration restored from backup: ${backupPath}`);
144 | 
145 |       return {
146 |         success: true,
147 |         message: `Configuration successfully restored from backup`
148 |       };
149 | 
150 |     } catch (error) {
151 |       this.logger.error(`Failed to restore from backup ${backupPath}:`, error);
152 |       return {
153 |         success: false,
154 |         message: `Failed to restore configuration: ${error}`,
155 |         error: String(error)
156 |       };
157 |     }
158 |   }
159 | 
160 |   /**
161 |    * Write configuration file atomically (write to temp file, then rename)
162 |    */
163 |   private async writeConfigAtomic(config: Config): Promise<void> {
164 |     const tempPath = `${this.configPath}.tmp`;
165 | 
166 |     try {
167 |       // Write to temporary file first
168 |       const configJson = JSON.stringify(config, null, 2);
169 |       await writeFile(tempPath, configJson, 'utf8');
170 | 
171 |       // Validate the written file can be parsed
172 |       const testContent = await readFile(tempPath, 'utf8');
173 |       JSON.parse(testContent); // Will throw if invalid
174 | 
175 |       // Atomic rename (this is the atomic operation)
176 |       const fs = await import('fs');
177 |       fs.renameSync(tempPath, this.configPath);
178 | 
179 |       this.logger.debug('Configuration written atomically');
180 | 
181 |     } catch (error) {
182 |       // Clean up temp file if it exists
183 |       try {
184 |         const fs = await import('fs');
185 |         if (fs.existsSync(tempPath)) {
186 |           fs.unlinkSync(tempPath);
187 |         }
188 |       } catch (cleanupError) {
189 |         this.logger.warn(`Failed to clean up temp file ${tempPath}:`, cleanupError);
190 |       }
191 |       throw error;
192 |     }
193 |   }
194 | 
195 |   /**
196 |    * Apply a configuration change to a config object
197 |    */
198 |   private applyConfigChange(config: Config, key: string, value: any): Config {
199 |     // Deep clone the config to avoid mutations
200 |     const newConfig = JSON.parse(JSON.stringify(config));
201 | 
202 |     // Apply the change using dot notation
203 |     const parts = key.split('.');
204 |     let current: any = newConfig;
205 | 
206 |     // Navigate to the parent object
207 |     for (let i = 0; i < parts.length - 1; i++) {
208 |       const part = parts[i];
209 |       if (!current[part]) {
210 |         current[part] = {};
211 |       }
212 |       current = current[part];
213 |     }
214 | 
215 |     // Set the final value
216 |     const finalKey = parts[parts.length - 1];
217 |     current[finalKey] = value;
218 | 
219 |     return newConfig as Config;
220 |   }
221 | 
222 |   /**
223 |    * Validate a configuration update
224 |    */
225 |   private validateConfigUpdate(key: string, value: string): { valid: boolean; error?: string; convertedValue?: any } {
226 |     // Use the same validation logic as system-control
227 |     switch (key) {
228 |       case 'server.port':
229 |         const port = parseInt(value, 10);
230 |         if (isNaN(port) || port < 1024 || port > 65535) {
231 |           return { valid: false, error: "Port must be a number between 1024-65535" };
232 |         }
233 |         return { valid: true, convertedValue: port };
234 | 
235 |       case 'server.name':
236 |       case 'server.version':
237 |       case 'logging.directory':
238 |         if (!value || value.trim().length === 0) {
239 |           return { valid: false, error: "Value cannot be empty" };
240 |         }
241 |         return { valid: true, convertedValue: value.trim() };
242 | 
243 |       case 'transports.default':
244 |         if (!['stdio', 'sse'].includes(value)) {
245 |           return { valid: false, error: "Transport must be 'stdio' or 'sse'" };
246 |         }
247 |         return { valid: true, convertedValue: value };
248 | 
249 |       case 'transports.stdio.enabled':
250 |       case 'transports.sse.enabled':
251 |         const boolValue = value.toLowerCase();
252 |         if (!['true', 'false'].includes(boolValue)) {
253 |           return { valid: false, error: "Value must be 'true' or 'false'" };
254 |         }
255 |         return { valid: true, convertedValue: boolValue === 'true' };
256 | 
257 |       case 'logging.level':
258 |         if (!['debug', 'info', 'warn', 'error'].includes(value)) {
259 |           return { valid: false, error: "Log level must be: debug, info, warn, or error" };
260 |         }
261 |         return { valid: true, convertedValue: value };
262 | 
263 |       case 'analysis.semanticAnalysis.llmIntegration.enabled':
264 |         const analysisEnabled = value.toLowerCase();
265 |         if (!['true', 'false'].includes(analysisEnabled)) {
266 |           return { valid: false, error: "Value must be 'true' or 'false'" };
267 |         }
268 |         return { valid: true, convertedValue: analysisEnabled === 'true' };
269 | 
270 |       case 'analysis.semanticAnalysis.llmIntegration.model':
271 |         if (!value || value.trim().length === 0) {
272 |           return { valid: false, error: "Model name cannot be empty" };
273 |         }
274 |         return { valid: true, convertedValue: value.trim() };
275 | 
276 |       case 'analysis.semanticAnalysis.llmIntegration.maxTokens':
277 |         const tokens = parseInt(value, 10);
278 |         if (isNaN(tokens) || tokens < 1 || tokens > 4000) {
279 |           return { valid: false, error: "Max tokens must be a number between 1-4000" };
280 |         }
281 |         return { valid: true, convertedValue: tokens };
282 | 
283 |       case 'analysis.semanticAnalysis.llmIntegration.temperature':
284 |         const temp = parseFloat(value);
285 |         if (isNaN(temp) || temp < 0 || temp > 2) {
286 |           return { valid: false, error: "Temperature must be a number between 0-2" };
287 |         }
288 |         return { valid: true, convertedValue: temp };
289 | 
290 |       default:
291 |         return { valid: false, error: `Unknown configuration key: ${key}` };
292 |     }
293 |   }
294 | 
295 |   /**
296 |    * Validate the entire configuration object
297 |    */
298 |   private validateFullConfig(config: Config): { valid: boolean; error?: string } {
299 |     try {
300 |       // Basic structure validation
301 |       if (!config.server || !config.transports) {
302 |         return { valid: false, error: "Missing required configuration sections" };
303 |       }
304 | 
305 |       // Server validation
306 |       if (!config.server.name || !config.server.version || !config.server.port) {
307 |         return { valid: false, error: "Missing required server configuration" };
308 |       }
309 | 
310 |       if (config.server.port < 1024 || config.server.port > 65535) {
311 |         return { valid: false, error: "Invalid server port range" };
312 |       }
313 | 
314 |       // Transports validation
315 |       if (!['stdio', 'sse'].includes(config.transports.default)) {
316 |         return { valid: false, error: "Invalid default transport" };
317 |       }
318 | 
319 |       if (typeof config.transports.stdio?.enabled !== 'boolean' ||
320 |           typeof config.transports.sse?.enabled !== 'boolean') {
321 |         return { valid: false, error: "Transport enabled flags must be boolean" };
322 |       }
323 | 
324 |       // Logging validation (if present)
325 |       if (config.logging) {
326 |         if (!config.logging.directory || !config.logging.level) {
327 |           return { valid: false, error: "Missing required logging configuration" };
328 |         }
329 | 
330 |         if (!['debug', 'info', 'warn', 'error'].includes(config.logging.level)) {
331 |           return { valid: false, error: "Invalid logging level" };
332 |         }
333 |       }
334 | 
335 |       return { valid: true };
336 | 
337 |     } catch (error) {
338 |       return { valid: false, error: `Configuration validation error: ${error}` };
339 |     }
340 |   }
341 | 
342 |   /**
343 |    * Check if a configuration key requires server restart
344 |    */
345 |   private requiresRestart(key: string): boolean {
346 |     const restartRequired = [
347 |       'server.port',
348 |       'transports.default',
349 |       'transports.stdio.enabled',
350 |       'transports.sse.enabled',
351 |       'analysis.semanticAnalysis.llmIntegration.enabled'
352 |     ];
353 |     return restartRequired.includes(key);
354 |   }
355 | 
356 |   /**
357 |    * Get the configuration file path for debugging/info purposes
358 |    */
359 |   getConfigPath(): string {
360 |     return this.configPath;
361 |   }
362 | }
363 | 
364 | /**
365 |  * Create a SafeConfigWriter instance
366 |  */
367 | export function createSafeConfigWriter(
368 |   logger: Logger,
369 |   configManager: ConfigManager,
370 |   configPath: string
371 | ): SafeConfigWriter {
372 |   return new SafeConfigWriter(logger, configManager, configPath);
373 | }
```

--------------------------------------------------------------------------------
/server/tests/performance/parsing-system-benchmark.test.ts:
--------------------------------------------------------------------------------

```typescript
  1 | /**
  2 |  * Simplified Performance Benchmark Tests for Parsing System
  3 |  *
  4 |  * Core performance tests focusing on essential benchmarks
  5 |  */
  6 | 
  7 | import { describe, test, expect, beforeEach, jest } from '@jest/globals';
  8 | import { performance } from 'perf_hooks';
  9 | import { Logger } from '../../src/logging/index.js';
 10 | import { PromptData } from '../../src/types/index.js';
 11 | import {
 12 |   createParsingSystem,
 13 |   type ExecutionContext
 14 | } from '../../src/execution/parsers/index.js';
 15 | 
 16 | // Mock logger for testing
 17 | const mockLogger: Logger = {
 18 |   debug: jest.fn(),
 19 |   info: jest.fn(),
 20 |   warn: jest.fn(),
 21 |   error: jest.fn()
 22 | } as any;
 23 | 
 24 | // Generate test prompts
 25 | function generateTestPrompts(count: number): PromptData[] {
 26 |   const prompts: PromptData[] = [];
 27 |   for (let i = 0; i < count; i++) {
 28 |     prompts.push({
 29 |       id: `test_prompt_${i}`,
 30 |       name: `test_prompt_${i}`,
 31 |       description: `Test prompt ${i}`,
 32 |       userMessageTemplate: `Process {{content}} with format {{format}}`,
 33 |       arguments: [
 34 |         {
 35 |           name: 'content',
 36 |           description: 'Content to process',
 37 |           required: true
 38 |         },
 39 |         {
 40 |           name: 'format',
 41 |           description: 'Output format',
 42 |           required: false
 43 |         }
 44 |       ],
 45 |       category: 'test'
 46 |     });
 47 |   }
 48 |   return prompts;
 49 | }
 50 | 
 51 | // Performance measurement utility
 52 | class PerformanceTimer {
 53 |   private startTime: number = 0;
 54 | 
 55 |   start(): void {
 56 |     this.startTime = performance.now();
 57 |   }
 58 | 
 59 |   end(): number {
 60 |     return performance.now() - this.startTime;
 61 |   }
 62 | }
 63 | 
 64 | describe('Parsing System Performance Benchmarks', () => {
 65 |   const TEST_PROMPTS = generateTestPrompts(100);
 66 |   const BENCHMARK_ITERATIONS = 50;
 67 | 
 68 |   describe('Command Parsing Performance', () => {
 69 |     test('should parse commands efficiently', async () => {
 70 |       const parsingSystem = createParsingSystem(mockLogger);
 71 |       const timer = new PerformanceTimer();
 72 |       const times: number[] = [];
 73 | 
 74 |       for (let i = 0; i < BENCHMARK_ITERATIONS; i++) {
 75 |         timer.start();
 76 |         await parsingSystem.commandParser.parseCommand(
 77 |           `>>test_prompt_${i % 10} hello world ${i}`,
 78 |           TEST_PROMPTS.slice(0, 10)
 79 |         );
 80 |         times.push(timer.end());
 81 |       }
 82 | 
 83 |       const averageTime = times.reduce((a, b) => a + b, 0) / times.length;
 84 |       const maxTime = Math.max(...times);
 85 | 
 86 |       console.log(`Command Parsing Performance:
 87 |         Average: ${averageTime.toFixed(2)}ms
 88 |         Max: ${maxTime.toFixed(2)}ms`);
 89 | 
 90 |       expect(averageTime).toBeLessThan(10); // Target: under 10ms per parse
 91 |       expect(maxTime).toBeLessThan(50); // No single parse should take more than 50ms
 92 |     });
 93 | 
 94 |     test('should handle different command formats consistently', async () => {
 95 |       const parsingSystem = createParsingSystem(mockLogger);
 96 |       const formats = [
 97 |         '>>test_prompt_1 hello world',
 98 |         '/test_prompt_1 hello world',
 99 |         '{"command": ">>test_prompt_1", "args": "hello world"}',
100 |         'test_prompt_1 {"content": "hello world"}'
101 |       ];
102 | 
103 |       const results: { format: string; time: number }[] = [];
104 | 
105 |       for (const command of formats) {
106 |         const timer = new PerformanceTimer();
107 |         const times: number[] = [];
108 | 
109 |         for (let i = 0; i < 10; i++) {
110 |           timer.start();
111 |           await parsingSystem.commandParser.parseCommand(command, TEST_PROMPTS.slice(0, 10));
112 |           times.push(timer.end());
113 |         }
114 | 
115 |         const averageTime = times.reduce((a, b) => a + b, 0) / times.length;
116 |         results.push({ format: command.split(' ')[0], time: averageTime });
117 |       }
118 | 
119 |       console.log('Command Format Performance:');
120 |       results.forEach(result => {
121 |         console.log(`  ${result.format}: ${result.time.toFixed(2)}ms`);
122 |       });
123 | 
124 |       // All formats should perform reasonably
125 |       results.forEach(result => {
126 |         expect(result.time).toBeLessThan(15);
127 |       });
128 | 
129 |       // Performance should be consistent across formats
130 |       const maxTime = Math.max(...results.map(r => r.time));
131 |       const minTime = Math.min(...results.map(r => r.time));
132 |       expect(maxTime / minTime).toBeLessThan(2);
133 |     });
134 |   });
135 | 
136 |   describe('Argument Processing Performance', () => {
137 |     test('should process arguments efficiently', async () => {
138 |       const parsingSystem = createParsingSystem(mockLogger);
139 |       const timer = new PerformanceTimer();
140 |       const times: number[] = [];
141 | 
142 |       const context: ExecutionContext = {
143 |         conversationHistory: [
144 |           { role: 'user', content: 'Previous message', timestamp: Date.now() }
145 |         ],
146 |         environmentVars: process.env as Record<string, string>,
147 |         promptDefaults: { format: 'text' }
148 |       };
149 | 
150 |       for (let i = 0; i < BENCHMARK_ITERATIONS; i++) {
151 |         const prompt = TEST_PROMPTS[i % TEST_PROMPTS.length];
152 |         timer.start();
153 |         await parsingSystem.argumentProcessor.processArguments(
154 |           `test content ${i}`,
155 |           prompt,
156 |           context
157 |         );
158 |         times.push(timer.end());
159 |       }
160 | 
161 |       const averageTime = times.reduce((a, b) => a + b, 0) / times.length;
162 |       const maxTime = Math.max(...times);
163 | 
164 |       console.log(`Argument Processing Performance:
165 |         Average: ${averageTime.toFixed(2)}ms
166 |         Max: ${maxTime.toFixed(2)}ms`);
167 | 
168 |       expect(averageTime).toBeLessThan(5); // Target: under 5ms per process
169 |       expect(maxTime).toBeLessThan(20); // No single process should take more than 20ms
170 |     });
171 |   });
172 | 
173 |   describe('Context Resolution Performance', () => {
174 |     test('should resolve context efficiently', async () => {
175 |       const parsingSystem = createParsingSystem(mockLogger);
176 |       const timer = new PerformanceTimer();
177 |       const times: number[] = [];
178 | 
179 |       for (let i = 0; i < BENCHMARK_ITERATIONS; i++) {
180 |         timer.start();
181 |         await parsingSystem.contextResolver.resolveContext(`test_key_${i % 10}`);
182 |         times.push(timer.end());
183 |       }
184 | 
185 |       const averageTime = times.reduce((a, b) => a + b, 0) / times.length;
186 |       const maxTime = Math.max(...times);
187 | 
188 |       console.log(`Context Resolution Performance:
189 |         Average: ${averageTime.toFixed(2)}ms
190 |         Max: ${maxTime.toFixed(2)}ms`);
191 | 
192 |       expect(averageTime).toBeLessThan(3); // Target: under 3ms per resolution
193 |       expect(maxTime).toBeLessThan(15); // No single resolution should take more than 15ms
194 |     });
195 | 
196 |     test('should benefit from caching', async () => {
197 |       const parsingSystem = createParsingSystem(mockLogger);
198 |       const timer = new PerformanceTimer();
199 | 
200 |       // First resolution (cache miss)
201 |       timer.start();
202 |       await parsingSystem.contextResolver.resolveContext('cached_key');
203 |       const firstTime = timer.end();
204 | 
205 |       // Second resolution (cache hit)
206 |       timer.start();
207 |       await parsingSystem.contextResolver.resolveContext('cached_key');
208 |       const secondTime = timer.end();
209 | 
210 |       console.log(`Caching Performance:
211 |         Cache miss: ${firstTime.toFixed(2)}ms
212 |         Cache hit: ${secondTime.toFixed(2)}ms
213 |         Improvement: ${((firstTime - secondTime) / firstTime * 100).toFixed(1)}%`);
214 | 
215 |       expect(secondTime).toBeLessThan(firstTime * 0.5); // Cache should be at least 2x faster
216 |       expect(secondTime).toBeLessThan(1); // Cache hits should be very fast
217 |     });
218 |   });
219 | 
220 |   describe('Memory Usage', () => {
221 |     test('should maintain reasonable memory usage', async () => {
222 |       const parsingSystem = createParsingSystem(mockLogger);
223 | 
224 |       // Get initial memory usage
225 |       const initialMemory = process.memoryUsage();
226 | 
227 |       // Perform intensive operations
228 |       for (let i = 0; i < 200; i++) {
229 |         await parsingSystem.commandParser.parseCommand(
230 |           `>>test_prompt_${i % 50} content ${i}`,
231 |           TEST_PROMPTS.slice(0, 50)
232 |         );
233 | 
234 |         await parsingSystem.argumentProcessor.processArguments(
235 |           `content ${i}`,
236 |           TEST_PROMPTS[i % 50]
237 |         );
238 | 
239 |         await parsingSystem.contextResolver.resolveContext(`key_${i % 25}`);
240 |       }
241 | 
242 |       // Force garbage collection if available
243 |       if (global.gc) {
244 |         global.gc();
245 |       }
246 | 
247 |       const finalMemory = process.memoryUsage();
248 |       const heapGrowth = (finalMemory.heapUsed - initialMemory.heapUsed) / 1024 / 1024; // MB
249 | 
250 |       console.log(`Memory Usage:
251 |         Initial heap: ${(initialMemory.heapUsed / 1024 / 1024).toFixed(2)}MB
252 |         Final heap: ${(finalMemory.heapUsed / 1024 / 1024).toFixed(2)}MB
253 |         Growth: ${heapGrowth.toFixed(2)}MB`);
254 | 
255 |       expect(heapGrowth).toBeLessThan(25); // Should not grow by more than 25MB
256 |     });
257 |   });
258 | 
259 |   describe('Concurrent Operations', () => {
260 |     test('should handle concurrent parsing requests', async () => {
261 |       const parsingSystem = createParsingSystem(mockLogger);
262 |       const concurrentRequests = 10;
263 |       const timer = new PerformanceTimer();
264 | 
265 |       timer.start();
266 |       const promises = Array(concurrentRequests).fill(null).map(async (_, i) => {
267 |         return parsingSystem.commandParser.parseCommand(
268 |           `>>test_prompt_${i % 5} concurrent test ${i}`,
269 |           TEST_PROMPTS.slice(0, 5)
270 |         );
271 |       });
272 | 
273 |       await Promise.all(promises);
274 |       const totalTime = timer.end();
275 | 
276 |       console.log(`Concurrent Parsing Performance:
277 |         ${concurrentRequests} concurrent requests
278 |         Total time: ${totalTime.toFixed(2)}ms
279 |         Average per request: ${(totalTime / concurrentRequests).toFixed(2)}ms`);
280 | 
281 |       expect(totalTime).toBeLessThan(250); // Should handle concurrency well
282 |     });
283 |   });
284 | 
285 |   describe('Performance Regression Tests', () => {
286 |     test('should not regress from baseline performance', async () => {
287 |       // Baseline measurements (these would be actual measurements from previous versions)
288 |       const baselineCommandParsing = 15; // ms
289 |       const baselineArgumentProcessing = 8; // ms
290 |       const baselineContextResolution = 5; // ms
291 | 
292 |       const parsingSystem = createParsingSystem(mockLogger);
293 |       const timer = new PerformanceTimer();
294 | 
295 |       // Test command parsing performance
296 |       const commandTimes: number[] = [];
297 |       for (let i = 0; i < 10; i++) {
298 |         timer.start();
299 |         await parsingSystem.commandParser.parseCommand(
300 |           `>>test_prompt_${i % 5} regression test`,
301 |           TEST_PROMPTS.slice(0, 5)
302 |         );
303 |         commandTimes.push(timer.end());
304 |       }
305 |       const avgCommandTime = commandTimes.reduce((a, b) => a + b, 0) / commandTimes.length;
306 | 
307 |       // Test argument processing performance
308 |       const argTimes: number[] = [];
309 |       for (let i = 0; i < 10; i++) {
310 |         timer.start();
311 |         await parsingSystem.argumentProcessor.processArguments(
312 |           'regression test content',
313 |           TEST_PROMPTS[0]
314 |         );
315 |         argTimes.push(timer.end());
316 |       }
317 |       const avgArgTime = argTimes.reduce((a, b) => a + b, 0) / argTimes.length;
318 | 
319 |       // Test context resolution performance
320 |       const contextTimes: number[] = [];
321 |       for (let i = 0; i < 10; i++) {
322 |         timer.start();
323 |         await parsingSystem.contextResolver.resolveContext('regression_test');
324 |         contextTimes.push(timer.end());
325 |       }
326 |       const avgContextTime = contextTimes.reduce((a, b) => a + b, 0) / contextTimes.length;
327 | 
328 |       console.log(`Performance Regression Check:
329 |         Command Parsing - Baseline: ${baselineCommandParsing}ms, Current: ${avgCommandTime.toFixed(2)}ms
330 |         Argument Processing - Baseline: ${baselineArgumentProcessing}ms, Current: ${avgArgTime.toFixed(2)}ms
331 |         Context Resolution - Baseline: ${baselineContextResolution}ms, Current: ${avgContextTime.toFixed(2)}ms`);
332 | 
333 |       // Allow for slight performance variations but no major regressions
334 |       expect(avgCommandTime).toBeLessThan(baselineCommandParsing * 1.2);
335 |       expect(avgArgTime).toBeLessThan(baselineArgumentProcessing * 1.2);
336 |       expect(avgContextTime).toBeLessThan(baselineContextResolution * 1.2);
337 |     });
338 |   });
339 | });
```

--------------------------------------------------------------------------------
/docs/mcp-tool-usage-guide.md:
--------------------------------------------------------------------------------

```markdown
  1 | # MCP Tool Usage Guide
  2 | 
  3 | ## Overview
  4 | 
  5 | This guide explains the **correct way** to interact with the Claude Prompts MCP server. The server provides structured MCP tools that should be used instead of direct file manipulation.
  6 | 
  7 | ## ❌ Wrong Approach (What NOT to do)
  8 | 
  9 | **Never use these tools directly:**
 10 | - `Update()` - Direct file modification
 11 | - `Write()` - Creating files directly
 12 | - `Edit()` - Direct file editing
 13 | - `MultiEdit()` - Direct file operations
 14 | - Direct filesystem manipulation via `Bash` commands
 15 | 
 16 | **Example of INCORRECT usage from logFail.txt:**
 17 | ```
 18 | ● Update(~/Applications/claude-prompts-mcp/server/prompts/chains/notes_modular/chain.json)
 19 | ● Write(~/Applications/claude-prompts-mcp/server/prompts/chains/notes_modular/steps/step_5.md)
 20 | ● Write(~/Applications/claude-prompts-mcp/server/prompts/analysis/notes_step_5.md)
 21 | ```
 22 | 
 23 | This bypasses the MCP system and leads to:
 24 | - MCP protocol violations
 25 | - Missing structured content errors
 26 | - Data inconsistency
 27 | - Broken hot-reloading
 28 | - Registry desynchronization
 29 | 
 30 | ## ✅ Correct Approach (MCP Tools)
 31 | 
 32 | ### 1. Prompt Manager Tool
 33 | 
 34 | The `prompt_manager` tool is your primary interface for all prompt operations:
 35 | 
 36 | #### Available Actions:
 37 | - `create` - Create new prompts (auto-detects type)
 38 | - `create_prompt` - Create basic variable-substitution prompts
 39 | - `create_template` - Create framework-aware templates
 40 | - `update` - Update existing prompts
 41 | - `delete` - Delete prompts with safety checks
 42 | - `modify` - Modify specific sections of prompts
 43 | - `reload` - Hot-reload all prompts
 44 | - `list` - List and search prompts
 45 | - `analyze_type` - Analyze prompt execution type
 46 | - `migrate_type` - Convert between prompt/template types
 47 | 
 48 | ### 2. System Control Tool
 49 | 
 50 | The `system_control` tool manages server state and frameworks:
 51 | 
 52 | #### Available Actions:
 53 | - `status` - Get system status and health
 54 | - `switch_framework` - Change active methodology framework
 55 | - `list_frameworks` - List available frameworks
 56 | - `analytics` - Get execution analytics
 57 | - `config` - Configuration management
 58 | - `restart` - Server restart (with confirmation)
 59 | 
 60 | ### 3. Prompt Engine Tool
 61 | 
 62 | The `prompt_engine` tool executes prompts and chains:
 63 | 
 64 | #### Command Formats:
 65 | - `>>prompt_name arguments` - Execute simple prompts
 66 | - `chain://chain_name` - Execute chains via URI
 67 | - `scaffold chain_name template:custom` - Create new chains
 68 | - `convert source_prompt` - Convert prompts to chains
 69 | 
 70 | ## Correct Chain Modification Workflow
 71 | 
 72 | ### Scenario: Adding a vault search step to notes chain
 73 | 
 74 | **The RIGHT way to do this:**
 75 | 
 76 | ```bash
 77 | # 1. First, check what exists
 78 | prompt_manager(action: "list", filter: "notes")
 79 | 
 80 | # 2. Check if vault_related_notes_finder exists
 81 | prompt_manager(action: "list", filter: "vault")
 82 | 
 83 | # 3. If the vault finder doesn't exist, create it
 84 | prompt_manager(action: "create", id: "vault_related_notes_finder",
 85 |   name: "Vault Related Notes Finder",
 86 |   category: "content_processing",
 87 |   description: "Searches vault for relevant related notes",
 88 |   user_message_template: "Find related notes in {{vault_path}} for: {{note_topic}}")
 89 | 
 90 | # 4. Update the notes chain to include the new step
 91 | prompt_manager(action: "update", id: "notes_modular",
 92 |   chain_steps: [
 93 |     // existing steps...
 94 |     {
 95 |       "id": "step_4",
 96 |       "name": "Vault Related Notes Search",
 97 |       "promptId": "vault_related_notes_finder",
 98 |       "order": 3,
 99 |       "dependencies": ["step_3"],
100 |       "inputMapping": {
101 |         "note_topic": "content",
102 |         "vault_path": "/path/to/vault"
103 |       },
104 |       "outputMapping": {
105 |         "result": "related_notes"
106 |       }
107 |     },
108 |     // updated final step...
109 |   ])
110 | 
111 | # 5. Reload to apply changes
112 | prompt_manager(action: "reload")
113 | 
114 | # 6. Test the updated chain
115 | prompt_engine(command: ">>notes_modular content:'Test content'")
116 | ```
117 | 
118 | ## Common Usage Patterns
119 | 
120 | ### Pattern 1: Creating New Prompts
121 | 
122 | ```bash
123 | # Basic prompt (simple variable substitution)
124 | prompt_manager(action: "create_prompt",
125 |   id: "my_prompt",
126 |   name: "My Simple Prompt",
127 |   user_message_template: "Analyze: {{content}}")
128 | 
129 | # Framework-aware template
130 | prompt_manager(action: "create_template",
131 |   id: "my_template",
132 |   name: "My Smart Template",
133 |   user_message_template: "Using systematic methodology: {{input}}")
134 | ```
135 | 
136 | ### Pattern 2: Modifying Existing Prompts
137 | 
138 | ```bash
139 | # Update entire prompt
140 | prompt_manager(action: "update", id: "existing_prompt",
141 |   name: "Updated Name",
142 |   user_message_template: "New template: {{input}}")
143 | 
144 | # Modify specific section
145 | prompt_manager(action: "modify", id: "existing_prompt",
146 |   section_name: "user_message_template",
147 |   new_content: "Modified template: {{input}}")
148 | ```
149 | 
150 | ### Pattern 3: Working with Chains
151 | 
152 | ```bash
153 | # List chains
154 | prompt_manager(action: "list", filter: "type:chain")
155 | 
156 | # Execute chain
157 | prompt_engine(command: ">>chain_name input:'data'")
158 | 
159 | # Create new chain using scaffolding
160 | prompt_engine(command: "scaffold new_chain template:custom name:'My Chain'")
161 | ```
162 | 
163 | ### Pattern 4: System Management
164 | 
165 | ```bash
166 | # Check system status
167 | system_control(action: "status")
168 | 
169 | # Switch framework methodology
170 | system_control(action: "switch_framework", framework: "CAGEERF",
171 |   reason: "Better for complex analysis")
172 | 
173 | # Get analytics
174 | system_control(action: "analytics", include_history: true)
175 | ```
176 | 
177 | ### Pattern 5: Quality Gates (Simplified)
178 | 
179 | Use the simplified hybrid interface to combine built-in gates with quick custom checks.
180 | 
181 | #### Discover Available Gates
182 | 
183 | ```javascript
184 | // List all configured gates
185 | system_control({
186 |   action: "gates",
187 |   operation: "list"
188 | })
189 | ```
190 | 
191 | #### Basic Usage: Built-in Gates
192 | 
193 | ```javascript
194 | prompt_engine({
195 |   command: ">>code_review code='...'",
196 |   quality_gates: ["gate-name-1", "gate-name-2"],
197 |   gate_mode: "enforce"
198 | })
199 | ```
200 | 
201 | #### Advanced: Custom Checks
202 | 
203 | ```javascript
204 | prompt_engine({
205 |   command: ">>my_prompt",
206 |   quality_gates: ["gate-name"],
207 |   custom_checks: [
208 |     { name: "production-ready", description: "Include error handling and logging" }
209 |   ],
210 |   gate_mode: "enforce"
211 | })
212 | ```
213 | 
214 | #### Gate Modes
215 | 
216 | - **enforce**: Validates output, retries on failure with improvement hints (default when gates provided)
217 | - **advise**: Provides guidance without blocking execution
218 | - **report**: Runs validation once and includes pass/fail status in the response
219 | 
220 | > Need full control? `temporary_gates` remains available for advanced scenarios, but prefer `quality_gates` and `custom_checks` for most workflows.
221 | 
222 | ## Advanced Search and Discovery
223 | 
224 | The prompt_manager supports advanced filtering:
225 | 
226 | ```bash
227 | # Search by category
228 | prompt_manager(action: "list", filter: "category:analysis")
229 | 
230 | # Search by type
231 | prompt_manager(action: "list", filter: "type:chain")
232 | 
233 | # Search by intent
234 | prompt_manager(action: "list", filter: "intent:debugging")
235 | 
236 | # Combined filters
237 | prompt_manager(action: "list", filter: "category:code type:template confidence:>80")
238 | 
239 | # Text search
240 | prompt_manager(action: "list", filter: "notes vault")
241 | ```
242 | 
243 | ## Error Recovery
244 | 
245 | If you encounter MCP protocol errors:
246 | 
247 | 1. **Check tool response structure**:
248 |    - All tools return structured responses with `content` and `structuredContent`
249 |    - Error responses include proper error metadata
250 | 
251 | 2. **Use reload to fix state issues**:
252 |    ```bash
253 |    prompt_manager(action: "reload")
254 |    ```
255 | 
256 | 3. **Check system health**:
257 |    ```bash
258 |    system_control(action: "diagnostics")
259 |    ```
260 | 
261 | 4. **Restart if needed**:
262 |    ```bash
263 |    system_control(action: "restart", confirm: true, reason: "Fix protocol errors")
264 |    ```
265 | 
266 | ## Best Practices
267 | 
268 | ### ✅ DO:
269 | - Always use MCP tools for prompt/chain management
270 | - Use `prompt_manager(action: "list")` to explore available prompts
271 | - Test changes with `prompt_manager(action: "reload")`
272 | - Use structured search filters to find relevant prompts
273 | - Check system status with `system_control(action: "status")`
274 | 
275 | ### ❌ DON'T:
276 | - Never use direct file manipulation (Update, Write, Edit, MultiEdit)
277 | - Don't bypass the MCP tool interface
278 | - Don't create files directly in the prompts directory
279 | - Don't modify JSON files manually
280 | - Don't skip the reload step after changes
281 | 
282 | ## Troubleshooting
283 | 
284 | ### Common Parameter Mistakes
285 | 
286 | #### ❌ "Missing required fields: id, name, description, user_message_template"
287 | 
288 | **Problem**: Trying to create a prompt without all required parameters.
289 | 
290 | **Solution**: All create actions require 4 essential parameters:
291 | ```bash
292 | prompt_manager(
293 |   action: "create",
294 |   id: "unique_identifier",           # ⚠️ REQUIRED
295 |   name: "Human Readable Name",        # ⚠️ REQUIRED
296 |   description: "What it does",        # ⚠️ REQUIRED
297 |   user_message_template: "{{input}}"  # ⚠️ REQUIRED
298 | )
299 | ```
300 | 
301 | **Common variations**:
302 | - ❌ `userMessageTemplate` → ✅ `user_message_template` (snake_case)
303 | - ❌ Missing `id` → ✅ Always include unique identifier
304 | - ❌ Empty string → ✅ Provide meaningful content
305 | 
306 | #### ❌ "Missing required fields: id"
307 | 
308 | **Problem**: Trying to update/delete/modify without specifying which prompt.
309 | 
310 | **Solution**: Most operations need the `id` parameter:
311 | ```bash
312 | # Update
313 | prompt_manager(action: "update", id: "my_prompt", description: "New description")
314 | 
315 | # Delete
316 | prompt_manager(action: "delete", id: "my_prompt")
317 | 
318 | # Analyze
319 | prompt_manager(action: "analyze_type", id: "my_prompt")
320 | ```
321 | 
322 | #### ❌ "Prompt ID must contain only alphanumeric characters, underscores, and hyphens"
323 | 
324 | **Problem**: Using invalid characters in prompt ID.
325 | 
326 | **Solution**: IDs must match pattern `^[a-zA-Z0-9_-]+$`:
327 | ```bash
328 | # ❌ Bad IDs
329 | id: "my prompt"        # spaces not allowed
330 | id: "my.prompt"        # dots not allowed
331 | id: "my/prompt"        # slashes not allowed
332 | 
333 | # ✅ Good IDs
334 | id: "my_prompt"        # underscores OK
335 | id: "my-prompt"        # hyphens OK
336 | id: "MyPrompt123"      # alphanumeric OK
337 | ```
338 | 
339 | ### Parameter Quick Reference
340 | 
341 | | Action | Required Parameters | Optional Parameters |
342 | |--------|-------------------|-------------------|
343 | | `create` | `id`, `name`, `description`, `user_message_template` | `category`, `system_message`, `arguments` |
344 | | `create_prompt` | `id`, `name`, `description`, `user_message_template` | `category`, `system_message`, `arguments` |
345 | | `create_template` | `id`, `name`, `description`, `user_message_template` | `category`, `system_message`, `arguments` |
346 | | `create_with_gates` | `id`, `name`, `description`, `user_message_template`, `gate_configuration` OR `suggested_gates` | `category`, `system_message`, `arguments` |
347 | | `update` | `id` | Any field to update |
348 | | `delete` | `id` | - |
349 | | `modify` | `id`, `section_name`, `new_content` | - |
350 | | `analyze_type` | `id` | - |
351 | | `migrate_type` | `id`, `target_type` | - |
352 | | `analyze_gates` | `id` | - |
353 | | `update_gates` | `id`, `gate_configuration` | - |
354 | | `add_temporary_gates` | `id`, `temporary_gates` | `gate_scope`, `inherit_chain_gates` |
355 | | `suggest_temporary_gates` | `execution_context` | - |
356 | | `reload` | - | `full_restart`, `reason` |
357 | | `list` | - | `search_query` |
358 | 
359 | ### MCP Protocol Errors
360 | 
361 | #### "MCP error -32602: Tool has output schema but no structured content"
362 | This indicates a tool isn't returning properly structured responses. This has been fixed in recent versions, but if encountered:
363 | - Update to the latest server version
364 | - Use the MCP tools instead of direct file operations
365 | 
366 | #### "Resource not found" errors
367 | - Use `prompt_manager(action: "list")` to see available prompts
368 | - Check that the prompt ID exists before trying to modify it
369 | - Use reload to refresh the registry
370 | 
371 | ### Chain Execution Failures
372 | - Validate chain structure with `prompt_manager(action: "list", filter: "type:chain")`
373 | - Check step dependencies and input/output mappings
374 | - Use `system_control(action: "diagnostics")` for debugging
375 | 
376 | ## Summary
377 | 
378 | The MCP server provides a structured, consistent interface for managing prompts and chains. Always use the MCP tools (`prompt_manager`, `system_control`, `prompt_engine`) instead of direct file manipulation. This ensures data consistency, proper error handling, and maintains the MCP protocol compliance.
379 | 
```

--------------------------------------------------------------------------------
/server/src/mcp-tools/prompt-engine/utils/validation.ts:
--------------------------------------------------------------------------------

```typescript
  1 | /**
  2 |  * Engine Validator - Handles engine-specific validation
  3 |  *
  4 |  * Extracted from ConsolidatedPromptEngine to provide focused
  5 |  * validation capabilities with clear separation of concerns.
  6 |  */
  7 | 
  8 | import { createLogger } from "../../../logging/index.js";
  9 | import { ConvertedPrompt } from "../../../types/index.js";
 10 | import { LightweightGateSystem } from "../../../gates/core/index.js";
 11 | 
 12 | const logger = createLogger({
 13 |   logFile: '/tmp/engine-validator.log',
 14 |   transport: 'stdio',
 15 |   enableDebug: false,
 16 |   configuredLevel: 'info'
 17 | });
 18 | 
 19 | export interface ValidationResult {
 20 |   isValid: boolean;
 21 |   errors: string[];
 22 |   warnings: string[];
 23 |   score: number;
 24 | }
 25 | 
 26 | export interface GateValidationResult {
 27 |   passed: boolean;
 28 |   results: Array<{
 29 |     gate: string;
 30 |     passed: boolean;
 31 |     message: string;
 32 |     score?: number;
 33 |   }>;
 34 | }
 35 | 
 36 | /**
 37 |  * EngineValidator handles all engine-specific validation
 38 |  *
 39 |  * This class provides:
 40 |  * - Prompt validation and quality checking
 41 |  * - Gate validation coordination
 42 |  * - Execution readiness assessment
 43 |  * - Quality scoring and recommendations
 44 |  */
 45 | export class EngineValidator {
 46 |   private gateSystem?: LightweightGateSystem;
 47 | 
 48 |   constructor(gateSystem?: LightweightGateSystem) {
 49 |     this.gateSystem = gateSystem;
 50 |   }
 51 | 
 52 |   /**
 53 |    * Validate prompt for execution readiness
 54 |    */
 55 |   public validatePrompt(
 56 |     convertedPrompt: ConvertedPrompt,
 57 |     promptArgs: Record<string, any> = {}
 58 |   ): ValidationResult {
 59 |     try {
 60 |       logger.debug('🔍 [EngineValidator] Validating prompt', {
 61 |         promptId: convertedPrompt.id,
 62 |         hasArgs: Object.keys(promptArgs).length > 0
 63 |       });
 64 | 
 65 |       const errors: string[] = [];
 66 |       const warnings: string[] = [];
 67 |       let score = 100;
 68 | 
 69 |       // Basic prompt validation
 70 |       if (!convertedPrompt.id) {
 71 |         errors.push("Prompt ID is missing");
 72 |         score -= 50;
 73 |       }
 74 | 
 75 |       if (!convertedPrompt.userMessageTemplate || convertedPrompt.userMessageTemplate.trim().length === 0) {
 76 |         errors.push("Prompt content is empty");
 77 |         score -= 50;
 78 |       }
 79 | 
 80 |       // Content quality validation
 81 |       const contentValidation = this.validateContent(convertedPrompt.userMessageTemplate);
 82 |       errors.push(...contentValidation.errors);
 83 |       warnings.push(...contentValidation.warnings);
 84 |       score = Math.min(score, contentValidation.score);
 85 | 
 86 |       // Arguments validation
 87 |       const argsValidation = this.validateArguments(convertedPrompt, promptArgs);
 88 |       errors.push(...argsValidation.errors);
 89 |       warnings.push(...argsValidation.warnings);
 90 |       score = Math.min(score, argsValidation.score);
 91 | 
 92 |       const isValid = errors.length === 0;
 93 | 
 94 |       logger.debug('✅ [EngineValidator] Prompt validation completed', {
 95 |         promptId: convertedPrompt.id,
 96 |         isValid,
 97 |         score,
 98 |         errorsCount: errors.length,
 99 |         warningsCount: warnings.length
100 |       });
101 | 
102 |       return { isValid, errors, warnings, score };
103 |     } catch (error) {
104 |       logger.error('❌ [EngineValidator] Prompt validation failed', {
105 |         promptId: convertedPrompt.id,
106 |         error: error instanceof Error ? error.message : String(error)
107 |       });
108 | 
109 |       return {
110 |         isValid: false,
111 |         errors: [`Validation error: ${error instanceof Error ? error.message : String(error)}`],
112 |         warnings: [],
113 |         score: 0
114 |       };
115 |     }
116 |   }
117 | 
118 |   /**
119 |    * Validate prompt content quality
120 |    */
121 |   private validateContent(content: string | undefined): ValidationResult {
122 |     const errors: string[] = [];
123 |     const warnings: string[] = [];
124 |     let score = 100;
125 | 
126 |     // Handle undefined content
127 |     if (!content) {
128 |       errors.push("Content is undefined or missing");
129 |       return { isValid: false, errors, warnings, score: 0 };
130 |     }
131 | 
132 |     // Length validation
133 |     if (content.length < 10) {
134 |       errors.push("Content is too short (minimum 10 characters)");
135 |       score -= 30;
136 |     }
137 | 
138 |     if (content.length > 50000) {
139 |       warnings.push("Content is very long, may impact performance");
140 |       score -= 10;
141 |     }
142 | 
143 |     // Template syntax validation
144 |     const templateErrors = this.validateTemplateSyntax(content);
145 |     if (templateErrors.length > 0) {
146 |       errors.push(...templateErrors);
147 |       score -= 20;
148 |     }
149 | 
150 |     // Content structure validation
151 |     const structureWarnings = this.validateContentStructure(content);
152 |     warnings.push(...structureWarnings);
153 |     if (structureWarnings.length > 0) {
154 |       score -= 5;
155 |     }
156 | 
157 |     return { isValid: errors.length === 0, errors, warnings, score };
158 |   }
159 | 
160 |   /**
161 |    * Validate template syntax
162 |    */
163 |   private validateTemplateSyntax(content: string): string[] {
164 |     const errors: string[] = [];
165 | 
166 |     // Check for unmatched braces
167 |     const openBraces = (content.match(/\{\{/g) || []).length;
168 |     const closeBraces = (content.match(/\}\}/g) || []).length;
169 |     if (openBraces !== closeBraces) {
170 |       errors.push(`Unmatched template braces: ${openBraces} opening, ${closeBraces} closing`);
171 |     }
172 | 
173 |     // Check for unmatched control structures
174 |     const ifTags = (content.match(/\{%\s*if\s/g) || []).length;
175 |     const endifTags = (content.match(/\{%\s*endif\s*%\}/g) || []).length;
176 |     if (ifTags !== endifTags) {
177 |       errors.push(`Unmatched if/endif tags: ${ifTags} if, ${endifTags} endif`);
178 |     }
179 | 
180 |     const forTags = (content.match(/\{%\s*for\s/g) || []).length;
181 |     const endforTags = (content.match(/\{%\s*endfor\s*%\}/g) || []).length;
182 |     if (forTags !== endforTags) {
183 |       errors.push(`Unmatched for/endfor tags: ${forTags} for, ${endforTags} endfor`);
184 |     }
185 | 
186 |     return errors;
187 |   }
188 | 
189 |   /**
190 |    * Validate content structure
191 |    */
192 |   private validateContentStructure(content: string): string[] {
193 |     const warnings: string[] = [];
194 | 
195 |     // Check for overly complex nesting
196 |     const maxNesting = this.calculateMaxNesting(content);
197 |     if (maxNesting > 3) {
198 |       warnings.push(`Deep template nesting detected (${maxNesting} levels), consider simplifying`);
199 |     }
200 | 
201 |     // Check for potential infinite loops
202 |     if (content.includes('{% for') && !content.includes('{% endfor %}')) {
203 |       warnings.push("Potential incomplete for loop detected");
204 |     }
205 | 
206 |     // Check for missing variable fallbacks
207 |     const variables = content.match(/\{\{\s*([^}]+)\s*\}\}/g) || [];
208 |     for (const variable of variables) {
209 |       if (!variable.includes('|') && !variable.includes('default')) {
210 |         warnings.push(`Variable ${variable} has no fallback value`);
211 |       }
212 |     }
213 | 
214 |     return warnings;
215 |   }
216 | 
217 |   /**
218 |    * Calculate maximum nesting level
219 |    */
220 |   private calculateMaxNesting(content: string): number {
221 |     let maxNesting = 0;
222 |     let currentNesting = 0;
223 | 
224 |     const lines = content.split('\n');
225 |     for (const line of lines) {
226 |       if (line.includes('{% for') || line.includes('{% if')) {
227 |         currentNesting++;
228 |         maxNesting = Math.max(maxNesting, currentNesting);
229 |       } else if (line.includes('{% endfor') || line.includes('{% endif')) {
230 |         currentNesting = Math.max(0, currentNesting - 1);
231 |       }
232 |     }
233 | 
234 |     return maxNesting;
235 |   }
236 | 
237 |   /**
238 |    * Validate arguments against prompt requirements
239 |    */
240 |   private validateArguments(
241 |     convertedPrompt: ConvertedPrompt,
242 |     promptArgs: Record<string, any>
243 |   ): ValidationResult {
244 |     const errors: string[] = [];
245 |     const warnings: string[] = [];
246 |     let score = 100;
247 | 
248 |     if (!convertedPrompt.arguments || convertedPrompt.arguments.length === 0) {
249 |       return { isValid: true, errors, warnings, score };
250 |     }
251 | 
252 |     // Check required arguments
253 |     for (const arg of convertedPrompt.arguments) {
254 |       if (arg.required && !promptArgs.hasOwnProperty(arg.name)) {
255 |         errors.push(`Missing required argument: ${arg.name}`);
256 |         score -= 20;
257 |       }
258 |     }
259 | 
260 |     // Check argument types
261 |     for (const arg of convertedPrompt.arguments) {
262 |       if (promptArgs.hasOwnProperty(arg.name)) {
263 |         const value = promptArgs[arg.name];
264 |         if (!this.isValidArgumentType(value, arg.type || 'string')) {
265 |           errors.push(`Argument '${arg.name}' should be of type '${arg.type}', got '${typeof value}'`);
266 |           score -= 10;
267 |         }
268 |       }
269 |     }
270 | 
271 |     // Check for unused arguments
272 |     const expectedArgs = convertedPrompt.arguments.map((arg: any) => arg.name);
273 |     for (const argName of Object.keys(promptArgs)) {
274 |       if (!expectedArgs.includes(argName)) {
275 |         warnings.push(`Unexpected argument provided: ${argName}`);
276 |         score -= 2;
277 |       }
278 |     }
279 | 
280 |     return { isValid: errors.length === 0, errors, warnings, score };
281 |   }
282 | 
283 |   /**
284 |    * Validate argument type
285 |    */
286 |   private isValidArgumentType(value: any, expectedType: string): boolean {
287 |     switch (expectedType.toLowerCase()) {
288 |       case 'string':
289 |         return typeof value === 'string';
290 |       case 'number':
291 |         return typeof value === 'number' && !isNaN(value);
292 |       case 'boolean':
293 |         return typeof value === 'boolean';
294 |       case 'array':
295 |         return Array.isArray(value);
296 |       case 'object':
297 |         return typeof value === 'object' && value !== null && !Array.isArray(value);
298 |       default:
299 |         return true; // Unknown types are considered valid
300 |     }
301 |   }
302 | 
303 |   /**
304 |    * Validate execution with gates
305 |    */
306 |   public async validateWithGates(
307 |     convertedPrompt: ConvertedPrompt,
308 |     promptArgs: Record<string, any>,
309 |     suggestedGates: string[] = [],
310 |     processedContent?: string
311 |   ): Promise<GateValidationResult> {
312 |     try {
313 |       logger.debug('🚪 [EngineValidator] Validating with gates', {
314 |         promptId: convertedPrompt.id,
315 |         gatesCount: suggestedGates.length,
316 |         hasProcessedContent: !!processedContent
317 |       });
318 | 
319 |       if (!this.gateSystem || suggestedGates.length === 0) {
320 |         return { passed: true, results: [] };
321 |       }
322 | 
323 |       const results: Array<{ gate: string; passed: boolean; message: string; score?: number }> = [];
324 |       let allPassed = true;
325 | 
326 |       // FIXED: Use processed content for validation, not raw template
327 |       const contentToValidate = processedContent || convertedPrompt.userMessageTemplate || '';
328 | 
329 |       for (const gateName of suggestedGates) {
330 |         try {
331 |           const gateResults = await this.gateSystem.validateContent(
332 |             [gateName],
333 |             contentToValidate,
334 |             {
335 |               promptId: convertedPrompt.id,
336 |               stepId: gateName,
337 |               attemptNumber: 1,
338 |               previousAttempts: []
339 |             }
340 |           );
341 |           const gateResult = gateResults[0] || { valid: false, errors: [{ field: 'gate', message: 'Gate validation failed', code: 'VALIDATION_ERROR' }] };
342 | 
343 |           results.push({
344 |             gate: gateName,
345 |             passed: gateResult.valid || gateResult.passed || false,
346 |             message: gateResult.errors?.length ? gateResult.errors[0].message : (gateResult.valid ? 'Gate passed' : 'Gate failed'),
347 |             score: 85 // Default validation score
348 |           });
349 | 
350 |           if (!gateResult.valid && !gateResult.passed) {
351 |             allPassed = false;
352 |           }
353 |         } catch (error) {
354 |           results.push({
355 |             gate: gateName,
356 |             passed: false,
357 |             message: `Gate validation error: ${error instanceof Error ? error.message : String(error)}`
358 |           });
359 |           allPassed = false;
360 |         }
361 |       }
362 | 
363 |       logger.debug('✅ [EngineValidator] Gate validation completed', {
364 |         promptId: convertedPrompt.id,
365 |         allPassed,
366 |         resultsCount: results.length
367 |       });
368 | 
369 |       return { passed: allPassed, results };
370 |     } catch (error) {
371 |       logger.error('❌ [EngineValidator] Gate validation failed', {
372 |         promptId: convertedPrompt.id,
373 |         error: error instanceof Error ? error.message : String(error)
374 |       });
375 | 
376 |       return {
377 |         passed: false,
378 |         results: [{
379 |           gate: 'system',
380 |           passed: false,
381 |           message: `Gate system error: ${error instanceof Error ? error.message : String(error)}`
382 |         }]
383 |       };
384 |     }
385 |   }
386 | }
```

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

```javascript
  1 | #!/usr/bin/env node
  2 | /**
  3 |  * Environment Parity Validation Test Suite
  4 |  *
  5 |  * Tests environment consistency validation to prevent local vs CI environment failures
  6 |  */
  7 | 
  8 | async function runEnvironmentValidationTests() {
  9 |   try {
 10 |     console.log('🌍 Running Environment Parity Validation Tests...');
 11 |     console.log('🎯 Preventing local vs CI environment failures\n');
 12 | 
 13 |     const results = {
 14 |       environmentChecker: false,
 15 |       nodeVersionValidation: false,
 16 |       environmentVariables: false,
 17 |       filesystemBehavior: false,
 18 |       dependencyValidation: false,
 19 |       totalTests: 0,
 20 |       passedTests: 0
 21 |     };
 22 | 
 23 |     // Test 1: Environment Checker Creation
 24 |     console.log('🔧 Test 1: Environment Parity Checker Functionality');
 25 |     results.totalTests++;
 26 | 
 27 |     try {
 28 |       const { createEnvironmentParityChecker } = await import('./environment-parity-checker.js');
 29 |       const { MockLogger } = await import('../../helpers/test-helpers.js');
 30 | 
 31 |       const logger = new MockLogger();
 32 |       const checker = createEnvironmentParityChecker(logger);
 33 | 
 34 |       if (checker && typeof checker.generateParityReport === 'function') {
 35 |         console.log('   ✅ EnvironmentParityChecker created successfully');
 36 |         console.log('   ✅ All required methods available');
 37 |         results.environmentChecker = true;
 38 |         results.passedTests++;
 39 |       } else {
 40 |         console.log('   ❌ EnvironmentParityChecker missing required methods');
 41 |       }
 42 |     } catch (error) {
 43 |       console.log(`   ❌ Environment checker creation failed: ${error.message}`);
 44 |     }
 45 | 
 46 |     // Test 2: Node.js Version Validation
 47 |     console.log('\n📦 Test 2: Node.js Version Validation');
 48 |     results.totalTests++;
 49 | 
 50 |     try {
 51 |       const { createEnvironmentParityChecker } = await import('./environment-parity-checker.js');
 52 |       const { MockLogger } = await import('../../helpers/test-helpers.js');
 53 | 
 54 |       const logger = new MockLogger();
 55 |       const checker = createEnvironmentParityChecker(logger);
 56 | 
 57 |       const nodeReport = await checker.validateNodeVersion();
 58 | 
 59 |       if (nodeReport && typeof nodeReport.valid === 'boolean') {
 60 |         console.log('   ✅ Node.js version validation completed');
 61 |         console.log(`   📊 Current version: ${nodeReport.currentVersion}`);
 62 |         console.log(`   📊 Required version: ${nodeReport.requiredVersion}`);
 63 |         console.log(`   📊 Valid: ${nodeReport.valid ? 'Yes' : 'No'}`);
 64 | 
 65 |         if (nodeReport.details) {
 66 |           console.log(`   📋 Details: ${nodeReport.details}`);
 67 |         }
 68 | 
 69 |         if (nodeReport.warning) {
 70 |           console.log(`   ⚠️  Warning: ${nodeReport.warning}`);
 71 |         }
 72 | 
 73 |         if (nodeReport.recommendation) {
 74 |           console.log(`   💡 Recommendation: ${nodeReport.recommendation}`);
 75 |         }
 76 | 
 77 |         results.nodeVersionValidation = true;
 78 |         results.passedTests++;
 79 |       } else {
 80 |         console.log('   ❌ Node.js version validation returned invalid result');
 81 |       }
 82 |     } catch (error) {
 83 |       console.log(`   ❌ Node.js version validation failed: ${error.message}`);
 84 |     }
 85 | 
 86 |     // Test 3: Environment Variables Validation
 87 |     console.log('\n🔐 Test 3: Environment Variables Validation');
 88 |     results.totalTests++;
 89 | 
 90 |     try {
 91 |       const { createEnvironmentParityChecker } = await import('./environment-parity-checker.js');
 92 |       const { MockLogger } = await import('../../helpers/test-helpers.js');
 93 | 
 94 |       const logger = new MockLogger();
 95 |       const checker = createEnvironmentParityChecker(logger);
 96 | 
 97 |       const envReport = await checker.validateEnvironmentVariables();
 98 | 
 99 |       if (envReport && typeof envReport.valid === 'boolean') {
100 |         console.log('   ✅ Environment variables validation completed');
101 |         console.log(`   📊 Valid: ${envReport.valid ? 'Yes' : 'No'}`);
102 |         console.log(`   📊 CI Environment: ${envReport.ciEnvironment.detected ? 'Yes' : 'No'}`);
103 |         console.log(`   📊 Platform: ${envReport.platform.os} (${envReport.platform.arch})`);
104 | 
105 |         if (envReport.platform.isWSL) {
106 |           console.log('   🐧 WSL environment detected');
107 |         }
108 | 
109 |         if (envReport.missing.length > 0) {
110 |           console.log(`   ⚠️  Missing variables: ${envReport.missing.join(', ')}`);
111 |         }
112 | 
113 |         if (envReport.recommendations.length > 0) {
114 |           console.log('   💡 Recommendations provided for environment setup');
115 |         }
116 | 
117 |         results.environmentVariables = true;
118 |         results.passedTests++;
119 |       } else {
120 |         console.log('   ❌ Environment variables validation returned invalid result');
121 |       }
122 |     } catch (error) {
123 |       console.log(`   ❌ Environment variables validation failed: ${error.message}`);
124 |     }
125 | 
126 |     // Test 4: Filesystem Behavior Validation
127 |     console.log('\n📁 Test 4: Filesystem Behavior Validation');
128 |     results.totalTests++;
129 | 
130 |     try {
131 |       const { createEnvironmentParityChecker } = await import('./environment-parity-checker.js');
132 |       const { MockLogger } = await import('../../helpers/test-helpers.js');
133 | 
134 |       const logger = new MockLogger();
135 |       const checker = createEnvironmentParityChecker(logger);
136 | 
137 |       const fsReport = await checker.validateFilesystemBehavior();
138 | 
139 |       if (fsReport && typeof fsReport.valid === 'boolean') {
140 |         console.log('   ✅ Filesystem behavior validation completed');
141 |         console.log(`   📊 Platform: ${fsReport.platform}`);
142 |         console.log(`   📊 Path separator: "${fsReport.pathSeparator}"`);
143 |         console.log(`   📊 Case sensitive: ${fsReport.caseSensitive ? 'Yes' : 'No'}`);
144 |         console.log(`   📊 Long paths: ${fsReport.supportsLongPaths ? 'Supported' : 'Limited'}`);
145 |         console.log(`   📊 Symlinks: ${fsReport.supportsSymlinks ? 'Supported' : 'Not available'}`);
146 | 
147 |         if (fsReport.issues.length > 0) {
148 |           console.log(`   ⚠️  Issues: ${fsReport.issues.join(', ')}`);
149 |         }
150 | 
151 |         results.filesystemBehavior = true;
152 |         results.passedTests++;
153 |       } else {
154 |         console.log('   ❌ Filesystem behavior validation returned invalid result');
155 |         if (fsReport.error) {
156 |           console.log(`   Error: ${fsReport.error}`);
157 |         }
158 |       }
159 |     } catch (error) {
160 |       console.log(`   ❌ Filesystem behavior validation failed: ${error.message}`);
161 |     }
162 | 
163 |     // Test 5: Package Dependencies Validation
164 |     console.log('\n📋 Test 5: Package Dependencies Validation');
165 |     results.totalTests++;
166 | 
167 |     try {
168 |       const { createEnvironmentParityChecker } = await import('./environment-parity-checker.js');
169 |       const { MockLogger } = await import('../../helpers/test-helpers.js');
170 | 
171 |       const logger = new MockLogger();
172 |       const checker = createEnvironmentParityChecker(logger);
173 | 
174 |       const depReport = await checker.validatePackageDependencies();
175 | 
176 |       if (depReport && typeof depReport.valid === 'boolean') {
177 |         console.log('   ✅ Package dependencies validation completed');
178 |         console.log(`   📊 package.json exists: ${depReport.packageJsonExists ? 'Yes' : 'No'}`);
179 |         console.log(`   📊 package-lock.json exists: ${depReport.lockfileExists ? 'Yes' : 'No'}`);
180 |         console.log(`   📊 Dependencies: ${depReport.dependencies ? depReport.dependencies.length : 0}`);
181 |         console.log(`   📊 Dev dependencies: ${depReport.devDependencies ? depReport.devDependencies.length : 0}`);
182 |         console.log(`   📊 Valid: ${depReport.valid ? 'Yes' : 'No'}`);
183 | 
184 |         if (depReport.issues && depReport.issues.length > 0) {
185 |           console.log(`   ⚠️  Issues: ${depReport.issues.join(', ')}`);
186 |         }
187 | 
188 |         if (depReport.recommendations && depReport.recommendations.length > 0) {
189 |           console.log('   💡 Recommendations provided for dependency management');
190 |         }
191 | 
192 |         results.dependencyValidation = true;
193 |         results.passedTests++;
194 |       } else {
195 |         console.log('   ❌ Package dependencies validation returned invalid result');
196 |         if (depReport.error) {
197 |           console.log(`   Error: ${depReport.error}`);
198 |         }
199 |       }
200 |     } catch (error) {
201 |       console.log(`   ❌ Package dependencies validation failed: ${error.message}`);
202 |     }
203 | 
204 |     // Test 6: Comprehensive Environment Report
205 |     console.log('\n📊 Test 6: Comprehensive Environment Report');
206 |     results.totalTests++;
207 | 
208 |     try {
209 |       const { createEnvironmentParityChecker } = await import('./environment-parity-checker.js');
210 |       const { MockLogger } = await import('../../helpers/test-helpers.js');
211 | 
212 |       const logger = new MockLogger();
213 |       const checker = createEnvironmentParityChecker(logger);
214 | 
215 |       const fullReport = await checker.generateParityReport();
216 | 
217 |       if (fullReport && fullReport.overall) {
218 |         console.log('   ✅ Comprehensive environment report generated');
219 |         console.log(`   📊 Overall valid: ${fullReport.overall.valid ? 'Yes' : 'No'}`);
220 |         console.log(`   📊 Environment: ${fullReport.overall.environment}`);
221 |         console.log(`   📊 Platform: ${fullReport.overall.platform}`);
222 |         console.log(`   📊 Node version: ${fullReport.overall.nodeVersion}`);
223 |         console.log(`   ⏱️  Validation time: ${fullReport.validationTime}ms`);
224 | 
225 |         if (fullReport.recommendations.length > 0) {
226 |           console.log(`   💡 Total recommendations: ${fullReport.recommendations.length}`);
227 |         }
228 | 
229 |         results.passedTests++;
230 |       } else {
231 |         console.log('   ❌ Comprehensive environment report generation failed');
232 |       }
233 |     } catch (error) {
234 |       console.log(`   ❌ Comprehensive environment report failed: ${error.message}`);
235 |     }
236 | 
237 |     // Summary
238 |     console.log('\n' + '='.repeat(60));
239 |     console.log('📊 ENVIRONMENT PARITY VALIDATION RESULTS');
240 |     console.log('='.repeat(60));
241 |     console.log(`📈 Tests Passed: ${results.passedTests}/${results.totalTests}`);
242 |     console.log(`📊 Success Rate: ${((results.passedTests / results.totalTests) * 100).toFixed(1)}%`);
243 |     console.log('');
244 |     console.log('🔧 Component Status:');
245 |     console.log(`   Environment Checker: ${results.environmentChecker ? '✅' : '❌'}`);
246 |     console.log(`   Node Version Validation: ${results.nodeVersionValidation ? '✅' : '❌'}`);
247 |     console.log(`   Environment Variables: ${results.environmentVariables ? '✅' : '❌'}`);
248 |     console.log(`   Filesystem Behavior: ${results.filesystemBehavior ? '✅' : '❌'}`);
249 |     console.log(`   Dependency Validation: ${results.dependencyValidation ? '✅' : '❌'}`);
250 | 
251 |     if (results.passedTests >= 5) { // Allow for some tolerance
252 |       console.log('\n🎉 Environment parity validation system is working!');
253 |       console.log('✅ Local vs CI environment differences can be detected early');
254 |       console.log('✅ Environment-specific failures should be prevented');
255 |       return true;
256 |     } else {
257 |       console.log('\n❌ Environment parity validation system has issues');
258 |       console.log('⚠️  Environment differences may still cause CI failures');
259 |       return false;
260 |     }
261 | 
262 |   } catch (error) {
263 |     console.error('❌ Environment validation test execution failed:', error.message);
264 |     console.error('Stack trace:', error.stack);
265 |     return false;
266 |   }
267 | }
268 | 
269 | // Handle process cleanup gracefully
270 | process.on('uncaughtException', (error) => {
271 |   console.error('❌ Uncaught exception in environment validation tests:', error.message);
272 | });
273 | 
274 | process.on('unhandledRejection', (reason) => {
275 |   console.error('❌ Unhandled rejection in environment validation tests:', reason);
276 | });
277 | 
278 | // Run the tests with natural completion
279 | if (import.meta.url === `file://${process.argv[1]}`) {
280 |   runEnvironmentValidationTests().then(success => {
281 |     if (success) {
282 |       console.log('\n🎯 Environment validation completed successfully!');
283 |     } else {
284 |       console.log('\n⚠️  Environment validation completed with some issues');
285 |     }
286 |     // Natural completion - no process.exit() calls
287 |   }).catch(error => {
288 |     console.error('❌ Test execution failed:', error);
289 |     // Natural completion even on error - no process.exit() calls
290 |   });
291 | }
```

--------------------------------------------------------------------------------
/server/tests/scripts/unit-unified-parsing.js:
--------------------------------------------------------------------------------

```javascript
  1 | #!/usr/bin/env node
  2 | /**
  3 |  * Unified Parsing System Unit Tests - Node.js Script Version
  4 |  * Core functionality tests focusing on essential parsing behavior
  5 |  */
  6 | 
  7 | async function runUnifiedParsingTests() {
  8 |   try {
  9 |     console.log('🧪 Running Unified Parsing System unit tests...');
 10 |     console.log('📋 Testing command parsing, argument processing, and context resolution');
 11 | 
 12 |     // Import modules
 13 |     const parsingModule = await import('../../dist/execution/parsers/index.js');
 14 | 
 15 |     // Get parsing system function from available exports
 16 |     const createParsingSystem = parsingModule.createParsingSystem || parsingModule.createUnifiedParsingSystem || parsingModule.default;
 17 | 
 18 |     // Mock logger
 19 |     const mockLogger = {
 20 |       debug: () => {},
 21 |       info: () => {},
 22 |       warn: () => {},
 23 |       error: () => {}
 24 |     };
 25 | 
 26 |     // Sample prompt data for testing
 27 |     const testPrompts = [
 28 |       {
 29 |         id: 'test_prompt',
 30 |         name: 'test_prompt',
 31 |         description: 'A test prompt',
 32 |         userMessageTemplate: 'Test message: {{content}}',
 33 |         arguments: [
 34 |           {
 35 |             name: 'content',
 36 |             description: 'Content to process',
 37 |             required: true
 38 |           }
 39 |         ],
 40 |         category: 'test'
 41 |       },
 42 |       {
 43 |         id: 'multi_arg_prompt',
 44 |         name: 'multi_arg_prompt',
 45 |         description: 'A prompt with multiple arguments',
 46 |         userMessageTemplate: 'Process {{text}} with {{format}}',
 47 |         arguments: [
 48 |           {
 49 |             name: 'text',
 50 |             description: 'Text to process',
 51 |             required: true
 52 |           },
 53 |           {
 54 |             name: 'format',
 55 |             description: 'Output format',
 56 |             required: false
 57 |           }
 58 |         ],
 59 |         category: 'test'
 60 |       }
 61 |     ];
 62 | 
 63 |     let parsingSystem;
 64 | 
 65 |     // Setup for each test
 66 |     function setupTest() {
 67 |       parsingSystem = createParsingSystem(mockLogger);
 68 |     }
 69 | 
 70 |     // Simple assertion helpers
 71 |     function assertEqual(actual, expected, testName) {
 72 |       if (actual === expected) {
 73 |         console.log(`✅ ${testName}: PASSED`);
 74 |         return true;
 75 |       } else {
 76 |         console.error(`❌ ${testName}: FAILED`);
 77 |         console.error(`   Expected: ${expected}`);
 78 |         console.error(`   Actual:   ${actual}`);
 79 |         return false;
 80 |       }
 81 |     }
 82 | 
 83 |     function assertTruthy(value, testName) {
 84 |       if (value) {
 85 |         console.log(`✅ ${testName}: PASSED`);
 86 |         return true;
 87 |       } else {
 88 |         console.error(`❌ ${testName}: FAILED - Expected truthy value, got: ${value}`);
 89 |         return false;
 90 |       }
 91 |     }
 92 | 
 93 |     function assertLessThan(actual, expected, testName) {
 94 |       if (actual < expected) {
 95 |         console.log(`✅ ${testName}: PASSED (${actual} < ${expected})`);
 96 |         return true;
 97 |       } else {
 98 |         console.error(`❌ ${testName}: FAILED (${actual} >= ${expected})`);
 99 |         return false;
100 |       }
101 |     }
102 | 
103 |     let testResults = [];
104 | 
105 |     // Test 1: Command Parsing
106 |     console.log('🔍 Test 1: Command Parsing');
107 | 
108 |     setupTest();
109 | 
110 |     try {
111 |       const result1 = await parsingSystem.commandParser.parseCommand(
112 |         '>>test_prompt hello world',
113 |         testPrompts
114 |       );
115 | 
116 |       testResults.push(assertEqual(result1.promptId, 'test_prompt', 'Simple command prompt ID parsed'));
117 |       testResults.push(assertEqual(result1.rawArgs, 'hello world', 'Simple command raw args parsed'));
118 |       testResults.push(assertEqual(result1.format, 'simple', 'Simple command format detected'));
119 |     } catch (error) {
120 |       console.error(`❌ Simple command parsing failed: ${error.message}`);
121 |       testResults.push(false);
122 |     }
123 | 
124 |     try {
125 |       const jsonCommand = '{"command": ">>test_prompt", "args": "hello world"}';
126 |       const result2 = await parsingSystem.commandParser.parseCommand(jsonCommand, testPrompts);
127 | 
128 |       testResults.push(assertEqual(result2.promptId, 'test_prompt', 'JSON command prompt ID parsed'));
129 |       testResults.push(assertEqual(result2.format, 'json', 'JSON command format detected'));
130 |     } catch (error) {
131 |       console.error(`❌ JSON command parsing failed: ${error.message}`);
132 |       testResults.push(false);
133 |     }
134 | 
135 |     // Test 2: Error Handling for Unknown Prompts
136 |     console.log('🔍 Test 2: Error Handling for Unknown Prompts');
137 | 
138 |     try {
139 |       await parsingSystem.commandParser.parseCommand('>>unknown_prompt', testPrompts);
140 |       console.error('❌ Unknown prompt error handling: FAILED - Should have thrown error');
141 |       testResults.push(false);
142 |     } catch (error) {
143 |       if (error.message.includes('unknown_prompt')) {
144 |         console.log('✅ Unknown prompt error handling: PASSED');
145 |         testResults.push(true);
146 |       } else {
147 |         console.error(`❌ Unknown prompt error handling: FAILED - Wrong error: ${error.message}`);
148 |         testResults.push(false);
149 |       }
150 |     }
151 | 
152 |     // Test 3: Argument Processing
153 |     console.log('🔍 Test 3: Argument Processing');
154 | 
155 |     try {
156 |       const simpleResult = await parsingSystem.argumentParser.parseArguments(
157 |         'hello world',
158 |         testPrompts[0]
159 |       );
160 | 
161 |       testResults.push(assertEqual(simpleResult.processedArgs.content, 'hello world', 'Simple arguments processed'));
162 |       // ProcessingStrategy may not be implemented in current argument parser - that's acceptable
163 |       testResults.push(assertTruthy(typeof simpleResult.metadata === 'object', 'Simple processing metadata exists'));
164 |     } catch (error) {
165 |       console.error(`❌ Simple argument processing failed: ${error.message}`);
166 |       testResults.push(false);
167 |     }
168 | 
169 |     try {
170 |       const jsonArgs = '{"text": "hello", "format": "json"}';
171 |       const jsonResult = await parsingSystem.argumentParser.parseArguments(
172 |         jsonArgs,
173 |         testPrompts[1]
174 |       );
175 | 
176 |       testResults.push(assertEqual(jsonResult.processedArgs.text, 'hello', 'JSON argument text processed'));
177 |       testResults.push(assertEqual(jsonResult.processedArgs.format, 'json', 'JSON argument format processed'));
178 |       // ProcessingStrategy may not be implemented in current argument parser - that's acceptable
179 |       testResults.push(assertTruthy(typeof jsonResult.metadata === 'object', 'JSON processing metadata exists'));
180 |     } catch (error) {
181 |       console.error(`❌ JSON argument processing failed: ${error.message}`);
182 |       testResults.push(false);
183 |     }
184 | 
185 |     try {
186 |       const kvArgs = 'text=hello format=xml';
187 |       const kvResult = await parsingSystem.argumentParser.parseArguments(
188 |         kvArgs,
189 |         testPrompts[1]
190 |       );
191 | 
192 |       testResults.push(assertEqual(kvResult.processedArgs.text, 'hello', 'Key-value argument text processed'));
193 |       testResults.push(assertEqual(kvResult.processedArgs.format, 'xml', 'Key-value argument format processed'));
194 |       // ProcessingStrategy may not be implemented in current argument parser - that's acceptable
195 |       testResults.push(assertTruthy(typeof kvResult.metadata === 'object', 'Key-value processing metadata exists'));
196 |     } catch (error) {
197 |       console.error(`❌ Key-value argument processing failed: ${error.message}`);
198 |       testResults.push(false);
199 |     }
200 | 
201 |     // Test 4: Context Resolution
202 |     console.log('🔍 Test 4: Context Resolution');
203 | 
204 |     // Test environment variable resolution
205 |     process.env.PROMPT_TEST = 'environment_value';
206 | 
207 |     try {
208 |       const envResult = await parsingSystem.contextResolver.resolveContext('test');
209 |       testResults.push(assertEqual(envResult.value, 'environment_value', 'Environment variable resolved'));
210 |       testResults.push(assertEqual(envResult.source, 'environment_variables', 'Environment variable source correct'));
211 |     } catch (error) {
212 |       console.error(`❌ Environment variable resolution failed: ${error.message}`);
213 |       testResults.push(false);
214 |     } finally {
215 |       delete process.env.PROMPT_TEST;
216 |     }
217 | 
218 |     // Test placeholder generation
219 |     try {
220 |       const placeholderResult = await parsingSystem.contextResolver.resolveContext('unknown_key');
221 |       testResults.push(assertEqual(placeholderResult.source, 'generated_placeholder', 'Placeholder source correct'));
222 |       // Accept that placeholder may or may not include the key name - implementation detail
223 |       testResults.push(assertTruthy(typeof placeholderResult.value === 'string', 'Placeholder value is string'));
224 |     } catch (error) {
225 |       console.error(`❌ Placeholder generation failed: ${error.message}`);
226 |       testResults.push(false);
227 |     }
228 | 
229 |     // Test caching
230 |     try {
231 |       await parsingSystem.contextResolver.resolveContext('cached_key');
232 |       await parsingSystem.contextResolver.resolveContext('cached_key');
233 | 
234 |       const stats = parsingSystem.contextResolver.getStats();
235 |       testResults.push(assertEqual(stats.cacheHits, 1, 'Context resolution caching works'));
236 |     } catch (error) {
237 |       console.error(`❌ Context caching test failed: ${error.message}`);
238 |       testResults.push(false);
239 |     }
240 | 
241 |     // Test 5: Integration Test
242 |     console.log('🔍 Test 5: End-to-End Integration');
243 | 
244 |     try {
245 |       // Parse command
246 |       const parseResult = await parsingSystem.commandParser.parseCommand(
247 |         '>>multi_arg_prompt hello world',
248 |         testPrompts
249 |       );
250 | 
251 |       // Process arguments with context
252 |       const context = {
253 |         conversationHistory: [],
254 |         environmentVars: {},
255 |         promptDefaults: { format: 'text' }
256 |       };
257 | 
258 |       const argResult = await parsingSystem.argumentParser.parseArguments(
259 |         parseResult.rawArgs,
260 |         testPrompts[1],
261 |         context
262 |       );
263 | 
264 |       testResults.push(assertEqual(parseResult.promptId, 'multi_arg_prompt', 'Integration: Command parsed'));
265 |       testResults.push(assertEqual(argResult.processedArgs.text, 'hello world', 'Integration: Arguments processed'));
266 |     } catch (error) {
267 |       console.error(`❌ Integration test failed: ${error.message}`);
268 |       testResults.push(false);
269 |     }
270 | 
271 |     // Test 6: Performance Test
272 |     console.log('🔍 Test 6: Performance Validation');
273 | 
274 |     const start = Date.now();
275 | 
276 |     try {
277 |       for (let i = 0; i < 10; i++) {
278 |         await parsingSystem.commandParser.parseCommand(
279 |           `>>test_prompt test${i}`,
280 |           testPrompts
281 |         );
282 |       }
283 | 
284 |       const duration = Date.now() - start;
285 |       testResults.push(assertLessThan(duration, 1000, 'Performance: 10 parses under 1 second'));
286 |     } catch (error) {
287 |       console.error(`❌ Performance test failed: ${error.message}`);
288 |       testResults.push(false);
289 |     }
290 | 
291 |     // Test 7: Error Handling
292 |     console.log('🔍 Test 7: Error Handling');
293 | 
294 |     // Test empty command handling
295 |     try {
296 |       await parsingSystem.commandParser.parseCommand('', testPrompts);
297 |       console.error('❌ Empty command handling: FAILED - Should have thrown error');
298 |       testResults.push(false);
299 |     } catch (error) {
300 |       if (error.message.includes('empty')) {
301 |         console.log('✅ Empty command handling: PASSED');
302 |         testResults.push(true);
303 |       } else {
304 |         console.error(`❌ Empty command handling: FAILED - Wrong error: ${error.message}`);
305 |         testResults.push(false);
306 |       }
307 |     }
308 | 
309 |     // Results Summary
310 |     const passedTests = testResults.filter(result => result).length;
311 |     const totalTests = testResults.length;
312 | 
313 |     console.log('\n📊 Unified Parsing System Unit Tests Summary:');
314 |     console.log(`   ✅ Passed: ${passedTests}/${totalTests} tests`);
315 |     console.log(`   📊 Success Rate: ${((passedTests/totalTests)*100).toFixed(1)}%`);
316 | 
317 |     if (passedTests === totalTests) {
318 |       console.log('🎉 All Unified Parsing System unit tests passed!');
319 |       return true;
320 |     } else {
321 |       console.error('❌ Some Unified Parsing System tests failed');
322 |       return false;
323 |     }
324 | 
325 |   } catch (error) {
326 |     console.error('❌ Unified Parsing System tests failed with error:', error.message);
327 |     if (error.stack) {
328 |       console.error('Stack trace:', error.stack);
329 |     }
330 |     return false;
331 |   }
332 | }
333 | 
334 | // Run the tests
335 | if (import.meta.url === `file://${process.argv[1]}`) {
336 |   runUnifiedParsingTests().catch(error => {
337 |     console.error('❌ Test execution failed:', error);
338 |     process.exit(1);
339 |   });
340 | }
341 | 
342 | export { runUnifiedParsingTests };
```

--------------------------------------------------------------------------------
/server/src/execution/types.ts:
--------------------------------------------------------------------------------

```typescript
  1 | /**
  2 |  * Execution System Type Definitions
  3 |  *
  4 |  * Contains all types related to prompt execution, strategies, contexts, and results.
  5 |  * This includes execution strategies, converted prompts, contexts, and chain execution.
  6 |  */
  7 | 
  8 | import type { PromptArgument, GateDefinition } from '../prompts/types.js';
  9 | 
 10 | /**
 11 |  * Execution strategy type enumeration - THREE-TIER MODEL
 12 |  * Used by ExecutionEngine's strategy pattern for different execution modes
 13 |  *
 14 |  * - prompt: Basic variable substitution, no framework processing (fastest)
 15 |  * - template: Framework-aware execution with methodology guidance
 16 |  * - chain: Sequential execution using prompts and/or templates (includes former workflow capabilities)
 17 |  */
 18 | export type ExecutionStrategyType = 'prompt' | 'template' | 'chain';
 19 | 
 20 | /**
 21 |  * Execution types for semantic analysis
 22 |  */
 23 | export type ExecutionType = "template" | "chain" | "auto";
 24 | 
 25 | /**
 26 |  * Enhanced chain step definition
 27 |  */
 28 | export interface ChainStep {
 29 |   // Core chain step properties
 30 |   promptId: string; // ID of the prompt to execute in this step
 31 |   stepName: string; // Name of this step
 32 |   executionType?: 'prompt' | 'template'; // Whether to use basic prompt or framework-aware template execution
 33 |   inputMapping?: Record<string, string>; // Maps chain inputs to this step's inputs
 34 |   outputMapping?: Record<string, string>; // Maps this step's outputs to chain outputs
 35 |   qualityGates?: GateDefinition[]; // Optional custom quality gates for this step
 36 | 
 37 |   // Advanced chain capabilities (optional - preserves backward compatibility)
 38 |   dependencies?: string[]; // Step IDs that must complete before this step (enables dependency resolution)
 39 |   parallelGroup?: string; // Group ID for parallel execution (steps with same group run concurrently)
 40 |   timeout?: number; // Step-specific timeout in milliseconds
 41 |   retries?: number; // Number of retries for this step
 42 |   stepType?: 'prompt' | 'tool' | 'gate' | 'condition'; // Extended step types beyond prompt execution
 43 | }
 44 | 
 45 | /**
 46 |  * Comprehensive converted prompt for execution context
 47 |  * Consolidates all previous ConvertedPrompt definitions
 48 |  */
 49 | export interface ConvertedPrompt {
 50 |   id: string;
 51 |   name: string;
 52 |   description: string;
 53 |   category: string;
 54 |   systemMessage?: string;
 55 |   userMessageTemplate: string;
 56 |   arguments: PromptArgument[];
 57 |   // Chain-related properties (isChain removed - now derived from chainSteps presence)
 58 |   chainSteps?: ChainStep[];
 59 |   tools?: boolean; // Whether this prompt should use available tools
 60 |   /** Defines behavior when prompt is invoked without its defined arguments */
 61 |   onEmptyInvocation?: "execute_if_possible" | "return_template";
 62 |   // Gate validation properties
 63 |   gates?: GateDefinition[];
 64 |   // Phase 2: Template-level gate configuration
 65 |   gateConfiguration?: {
 66 |     include?: string[];
 67 |     exclude?: string[];
 68 |     framework_gates?: boolean;
 69 |   };
 70 |   // Phase 3: Enhanced gate configuration with temporary gates
 71 |   enhancedGateConfiguration?: EnhancedGateConfiguration;
 72 |   executionMode?: 'prompt' | 'template' | 'chain'; // 3-tier execution model
 73 |   requiresExecution?: boolean; // Whether this prompt should be executed rather than returned
 74 | }
 75 | 
 76 | /**
 77 |  * Base execution context for all strategies
 78 |  * Provides common execution metadata across all strategy types
 79 |  */
 80 | export interface BaseExecutionContext {
 81 |   /** Unique execution identifier */
 82 |   id: string;
 83 |   /** Strategy type being used */
 84 |   type: ExecutionStrategyType;
 85 |   /** Execution start timestamp */
 86 |   startTime: number;
 87 |   /** Input parameters for execution */
 88 |   inputs: Record<string, string | number | boolean | null>;
 89 |   /** Strategy-specific and user options */
 90 |   options: Record<string, string | number | boolean | null | unknown[]>;
 91 | }
 92 | 
 93 | /**
 94 |  * Chain step execution result
 95 |  */
 96 | export interface ChainStepResult {
 97 |   result: string;
 98 |   metadata: {
 99 |     startTime: number;
100 |     endTime: number;
101 |     duration: number;
102 |     status: 'completed' | 'failed' | 'skipped';
103 |     error?: string;
104 |   };
105 | }
106 | 
107 | /**
108 |  * Chain execution result structure
109 |  */
110 | export interface ChainExecutionResult {
111 |   results: Record<string, string>;
112 |   messages: {
113 |     role: "user" | "assistant";
114 |     content: { type: "text"; text: string };
115 |   }[];
116 | }
117 | 
118 | /**
119 |  * Unified execution result interface
120 |  * Standardizes results across all execution strategies
121 |  */
122 | export interface UnifiedExecutionResult {
123 |   /** Unique execution identifier */
124 |   executionId: string;
125 |   /** Strategy type that was used */
126 |   type: ExecutionStrategyType;
127 |   /** Final execution status */
128 |   status: 'completed' | 'failed' | 'timeout' | 'cancelled';
129 |   /** Execution start timestamp */
130 |   startTime: number;
131 |   /** Execution end timestamp */
132 |   endTime: number;
133 |   /** Strategy-specific result content */
134 |   result: string | ChainExecutionResult;
135 |   /** Error information if execution failed */
136 |   error?: {
137 |     message: string;
138 |     code?: string;
139 |     context?: Record<string, unknown>;
140 |   };
141 | }
142 | 
143 | /**
144 |  * Base execution strategy interface
145 |  * Defines the contract that all execution strategies must implement
146 |  */
147 | export interface ExecutionStrategy {
148 |   /** Strategy type identifier */
149 |   readonly type: ExecutionStrategyType;
150 | 
151 |   /**
152 |    * Execute using this strategy
153 |    * @param context Base execution context
154 |    * @param promptId ID of prompt to execute
155 |    * @param args Execution arguments
156 |    */
157 |   execute(
158 |     context: BaseExecutionContext,
159 |     promptId: string,
160 |     args: Record<string, string | number | boolean | null>
161 |   ): Promise<UnifiedExecutionResult>;
162 | 
163 |   /**
164 |    * Validate if this strategy can handle the given prompt
165 |    * @param prompt The prompt to validate
166 |    */
167 |   canHandle(prompt: ConvertedPrompt): boolean;
168 | 
169 |   /**
170 |    * Get strategy-specific default options
171 |    */
172 |   getOptions(): Record<string, string | number | boolean | null | unknown[]>;
173 | }
174 | 
175 | /**
176 |  * Execution engine statistics
177 |  * Comprehensive performance and usage metrics
178 |  */
179 | export interface ExecutionStats {
180 |   /** Total number of executions */
181 |   totalExecutions: number;
182 |   /** Number of prompt strategy executions */
183 |   promptExecutions: number;
184 |   /** Number of chain strategy executions */
185 |   chainExecutions: number;
186 |   /** Number of failed executions */
187 |   failedExecutions: number;
188 |   /** Average execution time in milliseconds */
189 |   averageExecutionTime: number;
190 |   /** Currently active executions */
191 |   activeExecutions: number;
192 |   /** Conversation manager statistics */
193 |   conversationStats: any;
194 | }
195 | 
196 | /**
197 |  * Performance metrics for ExecutionEngine monitoring
198 |  * Provides detailed performance and health metrics
199 |  */
200 | export interface PerformanceMetrics {
201 |   /** Strategy cache hit rate (0.0 to 1.0) */
202 |   cacheHitRate: number;
203 |   /** Memory usage information */
204 |   memoryUsage: {
205 |     /** Size of strategy selection cache */
206 |     strategyCacheSize: number;
207 |     /** Number of stored execution times */
208 |     executionTimesSize: number;
209 |     /** Number of currently active executions */
210 |     activeExecutionsSize: number;
211 |   };
212 |   /** Execution health metrics */
213 |   executionHealth: {
214 |     /** Success rate (0.0 to 1.0) */
215 |     successRate: number;
216 |     /** Average execution time in milliseconds */
217 |     averageTime: number;
218 |     /** Number of recent executions tracked */
219 |     recentExecutions: number;
220 |   };
221 | }
222 | 
223 | /**
224 |  * Enhanced Chain Execution Options
225 |  * Extends basic chain execution with optional advanced capabilities
226 |  * All advanced options are optional to preserve backward compatibility
227 |  */
228 | export interface EnhancedChainExecutionOptions {
229 |   // Existing basic options (maintained for backward compatibility)
230 |   allowStepFailures?: boolean;          // Allow individual steps to fail without stopping chain
231 |   trackStepResults?: boolean;           // Track results from each step for use in subsequent steps
232 |   useConversationContext?: boolean;     // Include conversation history in step execution
233 |   processTemplates?: boolean;           // Process Nunjucks templates in step prompts
234 | 
235 |   // NEW: Advanced execution options (all optional - default to false/simple behavior)
236 |   enableDependencyResolution?: boolean;  // Enable step dependency resolution and topological ordering
237 |   enableParallelExecution?: boolean;     // Enable parallel execution of steps in same parallel group
238 |   executionTimeout?: number;             // Chain-wide timeout in milliseconds (overrides individual step timeouts)
239 |   advancedGateValidation?: boolean;      // Use comprehensive gate validation
240 |   stepConfirmation?: boolean;            // Require confirmation before executing each step
241 |   continueOnFailure?: boolean;           // Continue chain execution even if non-critical steps fail
242 | }
243 | 
244 | /**
245 |  * Chain execution state
246 |  */
247 | export interface ChainExecutionState {
248 |   chainId: string;
249 |   currentStepIndex: number;
250 |   totalSteps: number;
251 |   stepResults: Record<string, string>;
252 |   startTime: number;
253 | }
254 | 
255 | /**
256 |  * Template processing context
257 |  */
258 | export interface TemplateContext {
259 |   specialContext?: Record<string, string>;
260 |   toolsEnabled?: boolean;
261 | }
262 | 
263 | /**
264 |  * Validation error detail structure
265 |  */
266 | export interface ValidationError {
267 |   field: string;
268 |   message: string;
269 |   code: string;
270 |   suggestion?: string;
271 |   example?: string;
272 | }
273 | 
274 | /**
275 |  * Validation warning structure
276 |  */
277 | export interface ValidationWarning {
278 |   field: string;
279 |   message: string;
280 |   suggestion?: string;
281 | }
282 | 
283 | /**
284 |  * Unified validation result structure
285 |  * Supports both simple validation and comprehensive gate validation
286 |  */
287 | export interface ValidationResult {
288 |   /** Whether validation passed (supports both 'valid' and 'passed' patterns) */
289 |   valid: boolean;
290 |   /** Alternative field name for gate validation compatibility */
291 |   passed?: boolean;
292 |   /** Detailed validation errors */
293 |   errors?: ValidationError[];
294 |   /** Validation warnings */
295 |   warnings?: ValidationWarning[];
296 |   /** Sanitized arguments for simple validation */
297 |   sanitizedArgs?: Record<string, string | number | boolean | null>;
298 | 
299 |   // Extended fields for gate validation (optional)
300 |   /** Gate that was validated (for gate validation) */
301 |   gateId?: string;
302 |   /** Individual check results (for comprehensive validation) */
303 |   checks?: ValidationCheck[];
304 |   /** Hints for improvement on failure (for gate validation) */
305 |   retryHints?: string[];
306 |   /** Validation metadata (for comprehensive validation) */
307 |   metadata?: {
308 |     validationTime: number;
309 |     checksPerformed: number;
310 |     llmValidationUsed: boolean;
311 |   };
312 | 
313 |   // Argument-specific validation (optional)
314 |   /** Argument name (for argument validation) */
315 |   argumentName?: string;
316 |   /** Original value before processing */
317 |   originalValue?: unknown;
318 |   /** Processed value after validation */
319 |   processedValue?: string | number | boolean | null;
320 |   /** Applied validation rules */
321 |   appliedRules?: string[];
322 | }
323 | 
324 | /**
325 |  * Individual validation check result (used in comprehensive validation)
326 |  */
327 | export interface ValidationCheck {
328 |   /** Type of check performed */
329 |   type: string;
330 |   /** Did this check pass */
331 |   passed: boolean;
332 |   /** Score if applicable (0.0-1.0) */
333 |   score?: number;
334 |   /** Details about the check */
335 |   message: string;
336 |   /** Additional context */
337 |   details?: Record<string, any>;
338 | }
339 | 
340 | /**
341 |  * Enhanced gate configuration supporting temporary gates
342 |  * Phase 3: Extends basic gate configuration with temporary gate support
343 |  */
344 | export interface EnhancedGateConfiguration {
345 |   /** Gates to explicitly include */
346 |   include?: string[];
347 |   /** Gates to explicitly exclude */
348 |   exclude?: string[];
349 |   /** Whether to include framework-based gates (default: true) */
350 |   framework_gates?: boolean;
351 |   /** Temporary gate definitions for this execution */
352 |   temporary_gates?: TemporaryGateDefinition[];
353 |   /** Scope for temporary gates */
354 |   gate_scope?: 'execution' | 'session' | 'chain' | 'step';
355 |   /** Whether to inherit gates from parent chain (default: true) */
356 |   inherit_chain_gates?: boolean;
357 | }
358 | 
359 | /**
360 |  * Temporary gate definition for enhanced configuration
361 |  */
362 | export interface TemporaryGateDefinition {
363 |   /** Unique identifier (will be auto-generated if not provided) */
364 |   id?: string;
365 |   /** Human-readable name */
366 |   name: string;
367 |   /** Gate type */
368 |   type: 'validation' | 'approval' | 'condition' | 'quality' | 'guidance';
369 |   /** Scope of the temporary gate */
370 |   scope: 'execution' | 'session' | 'chain' | 'step';
371 |   /** Description of what this gate checks/guides */
372 |   description: string;
373 |   /** Guidance text injected into prompts */
374 |   guidance: string;
375 |   /** Pass/fail criteria for validation gates */
376 |   pass_criteria?: ValidationCheck[];
377 |   /** Expiration timestamp (optional) */
378 |   expires_at?: number;
379 |   /** Source of gate creation */
380 |   source?: 'manual' | 'automatic' | 'analysis';
381 |   /** Additional context for gate creation */
382 |   context?: Record<string, any>;
383 | }
```

--------------------------------------------------------------------------------
/server/src/gates/core/temporary-gate-registry.ts:
--------------------------------------------------------------------------------

```typescript
  1 | /**
  2 |  * Temporary Gate Registry
  3 |  *
  4 |  * Manages in-memory storage and lifecycle for execution-scoped gates that don't persist to filesystem.
  5 |  * Provides automatic cleanup, scope management, and integration with existing gate systems.
  6 |  */
  7 | 
  8 | import { Logger } from '../../logging/index.js';
  9 | import type { GateDefinition } from '../types.js';
 10 | 
 11 | /**
 12 |  * Temporary gate definition with lifecycle management
 13 |  */
 14 | export interface TemporaryGateDefinition {
 15 |   /** Unique identifier (UUID-based to prevent conflicts) */
 16 |   id: string;
 17 |   /** Human-readable name */
 18 |   name: string;
 19 |   /** Gate type */
 20 |   type: 'validation' | 'approval' | 'condition' | 'quality' | 'guidance';
 21 |   /** Scope of the temporary gate */
 22 |   scope: 'execution' | 'session' | 'chain' | 'step';
 23 |   /** Description of what this gate checks/guides */
 24 |   description: string;
 25 |   /** Guidance text injected into prompts */
 26 |   guidance: string;
 27 |   /** Pass/fail criteria for validation gates */
 28 |   pass_criteria?: any[];
 29 |   /** Creation timestamp */
 30 |   created_at: number;
 31 |   /** Expiration timestamp (optional) */
 32 |   expires_at?: number;
 33 |   /** Source of gate creation */
 34 |   source: 'manual' | 'automatic' | 'analysis';
 35 |   /** Additional context for gate creation */
 36 |   context?: Record<string, any>;
 37 |   /** Associated execution/session/chain ID */
 38 |   scope_id?: string;
 39 | }
 40 | 
 41 | /**
 42 |  * Scope management information
 43 |  */
 44 | interface ScopeInfo {
 45 |   scope_type: 'execution' | 'session' | 'chain' | 'step';
 46 |   scope_id: string;
 47 |   gates: Set<string>;
 48 |   created_at: number;
 49 |   expires_at?: number;
 50 | }
 51 | 
 52 | /**
 53 |  * Registry for managing temporary gates
 54 |  */
 55 | export class TemporaryGateRegistry {
 56 |   private logger: Logger;
 57 |   private temporaryGates: Map<string, TemporaryGateDefinition>;
 58 |   private scopeManagement: Map<string, ScopeInfo>;
 59 |   private cleanupTimers: Map<string, NodeJS.Timeout>;
 60 |   private maxMemoryGates: number;
 61 |   private defaultExpirationMs: number;
 62 | 
 63 |   constructor(
 64 |     logger: Logger,
 65 |     options: {
 66 |       maxMemoryGates?: number;
 67 |       defaultExpirationMs?: number;
 68 |     } = {}
 69 |   ) {
 70 |     this.logger = logger;
 71 |     this.temporaryGates = new Map();
 72 |     this.scopeManagement = new Map();
 73 |     this.cleanupTimers = new Map();
 74 |     this.maxMemoryGates = options.maxMemoryGates || 1000;
 75 |     this.defaultExpirationMs = options.defaultExpirationMs || 3600000; // 1 hour
 76 | 
 77 |     this.logger.debug('[TEMP GATE REGISTRY] Initialized with max gates:', this.maxMemoryGates);
 78 |   }
 79 | 
 80 |   /**
 81 |    * Create a new temporary gate
 82 |    */
 83 |   createTemporaryGate(
 84 |     definition: Omit<TemporaryGateDefinition, 'id' | 'created_at'>,
 85 |     scopeId?: string
 86 |   ): string {
 87 |     // Generate unique ID
 88 |     const gateId = `temp_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
 89 | 
 90 |     // Check memory limits
 91 |     if (this.temporaryGates.size >= this.maxMemoryGates) {
 92 |       this.performCleanup();
 93 |       if (this.temporaryGates.size >= this.maxMemoryGates) {
 94 |         throw new Error(`Temporary gate registry at capacity (${this.maxMemoryGates})`);
 95 |       }
 96 |     }
 97 | 
 98 |     const now = Date.now();
 99 |     const tempGate: TemporaryGateDefinition = {
100 |       id: gateId,
101 |       created_at: now,
102 |       expires_at: definition.expires_at || (now + this.defaultExpirationMs),
103 |       scope_id: scopeId,
104 |       ...definition
105 |     };
106 | 
107 |     // Store the gate
108 |     this.temporaryGates.set(gateId, tempGate);
109 | 
110 |     // Manage scope association
111 |     if (scopeId) {
112 |       this.associateWithScope(gateId, definition.scope, scopeId);
113 |     }
114 | 
115 |     // Set up automatic cleanup
116 |     if (tempGate.expires_at) {
117 |       const cleanupTimeout = setTimeout(() => {
118 |         this.removeTemporaryGate(gateId);
119 |       }, tempGate.expires_at - now);
120 | 
121 |       this.cleanupTimers.set(gateId, cleanupTimeout);
122 |     }
123 | 
124 |     this.logger.debug(`[TEMP GATE REGISTRY] Created temporary gate:`, {
125 |       id: gateId,
126 |       name: tempGate.name,
127 |       scope: tempGate.scope,
128 |       scopeId,
129 |       expiresAt: tempGate.expires_at
130 |     });
131 | 
132 |     return gateId;
133 |   }
134 | 
135 |   /**
136 |    * Get a temporary gate by ID
137 |    */
138 |   getTemporaryGate(gateId: string): TemporaryGateDefinition | undefined {
139 |     return this.temporaryGates.get(gateId);
140 |   }
141 | 
142 |   /**
143 |    * Get all temporary gates for a specific scope
144 |    */
145 |   getTemporaryGatesForScope(scope: string, scopeId: string): TemporaryGateDefinition[] {
146 |     const scopeKey = `${scope}:${scopeId}`;
147 |     const scopeInfo = this.scopeManagement.get(scopeKey);
148 | 
149 |     if (!scopeInfo) {
150 |       return [];
151 |     }
152 | 
153 |     const gates: TemporaryGateDefinition[] = [];
154 |     for (const gateId of scopeInfo.gates) {
155 |       const gate = this.temporaryGates.get(gateId);
156 |       if (gate) {
157 |         gates.push(gate);
158 |       }
159 |     }
160 | 
161 |     return gates;
162 |   }
163 | 
164 |   /**
165 |    * Get all active temporary gates
166 |    */
167 |   getAllTemporaryGates(): TemporaryGateDefinition[] {
168 |     return Array.from(this.temporaryGates.values());
169 |   }
170 | 
171 |   /**
172 |    * Convert temporary gate to standard gate definition
173 |    */
174 |   convertToStandardGate(tempGate: TemporaryGateDefinition): GateDefinition {
175 |     return {
176 |       id: tempGate.id,
177 |       name: tempGate.name,
178 |       type: tempGate.type,
179 |       description: tempGate.description,
180 |       requirements: [], // Temporary gates use simplified criteria
181 |       failureAction: 'retry',
182 |       guidance: tempGate.guidance,
183 |       pass_criteria: tempGate.pass_criteria,
184 |       retry_config: {
185 |         max_attempts: 3,
186 |         improvement_hints: true,
187 |         preserve_context: true
188 |       },
189 |       activation: {
190 |         explicit_request: true
191 |       }
192 |     };
193 |   }
194 | 
195 |   /**
196 |    * Remove a temporary gate
197 |    */
198 |   removeTemporaryGate(gateId: string): boolean {
199 |     const gate = this.temporaryGates.get(gateId);
200 |     if (!gate) {
201 |       return false;
202 |     }
203 | 
204 |     // Remove from registry
205 |     this.temporaryGates.delete(gateId);
206 | 
207 |     // Clean up scope associations
208 |     if (gate.scope_id) {
209 |       this.removeFromScope(gateId, gate.scope, gate.scope_id);
210 |     }
211 | 
212 |     // Cancel cleanup timer
213 |     const timer = this.cleanupTimers.get(gateId);
214 |     if (timer) {
215 |       clearTimeout(timer);
216 |       this.cleanupTimers.delete(gateId);
217 |     }
218 | 
219 |     this.logger.debug(`[TEMP GATE REGISTRY] Removed temporary gate: ${gateId}`);
220 |     return true;
221 |   }
222 | 
223 |   /**
224 |    * Clean up expired gates and scopes
225 |    */
226 |   cleanupExpiredGates(): number {
227 |     const now = Date.now();
228 |     let cleanedCount = 0;
229 | 
230 |     // Clean up expired gates
231 |     for (const [gateId, gate] of this.temporaryGates.entries()) {
232 |       if (gate.expires_at && gate.expires_at <= now) {
233 |         this.removeTemporaryGate(gateId);
234 |         cleanedCount++;
235 |       }
236 |     }
237 | 
238 |     // Clean up expired scopes
239 |     for (const [scopeKey, scopeInfo] of this.scopeManagement.entries()) {
240 |       if (scopeInfo.expires_at && scopeInfo.expires_at <= now) {
241 |         this.cleanupScopeByKey(scopeKey);
242 |       }
243 |     }
244 | 
245 |     if (cleanedCount > 0) {
246 |       this.logger.debug(`[TEMP GATE REGISTRY] Cleaned up ${cleanedCount} expired gates`);
247 |     }
248 | 
249 |     return cleanedCount;
250 |   }
251 | 
252 |   /**
253 |    * Clean up all gates for a specific scope
254 |    */
255 |   cleanupScope(scope: string, scopeId?: string): number {
256 |     const scopeKey = scopeId ? `${scope}:${scopeId}` : scope;
257 |     const scopeInfo = this.scopeManagement.get(scopeKey);
258 | 
259 |     if (!scopeInfo) {
260 |       return 0;
261 |     }
262 | 
263 |     let cleanedCount = 0;
264 |     for (const gateId of scopeInfo.gates) {
265 |       if (this.removeTemporaryGate(gateId)) {
266 |         cleanedCount++;
267 |       }
268 |     }
269 | 
270 |     this.scopeManagement.delete(scopeKey);
271 | 
272 |     this.logger.debug(`[TEMP GATE REGISTRY] Cleaned up scope ${scopeKey}: ${cleanedCount} gates`);
273 |     return cleanedCount;
274 |   }
275 | 
276 |   /**
277 |    * Clean up all gates for a chain execution
278 |    * Removes all chain-scoped gates and associated step-scoped gates
279 |    */
280 |   cleanupChainExecution(chainExecutionId: string): number {
281 |     this.logger.debug(`[TEMP GATE REGISTRY] Cleaning up chain execution: ${chainExecutionId}`);
282 | 
283 |     let totalCleaned = 0;
284 | 
285 |     // Clean up chain-scoped gates
286 |     totalCleaned += this.cleanupScope('chain', chainExecutionId);
287 | 
288 |     // Clean up any step-scoped gates associated with this chain
289 |     const stepScopesToClean: string[] = [];
290 |     for (const [scopeKey, scopeInfo] of this.scopeManagement.entries()) {
291 |       if (scopeInfo.scope_type === 'step' && scopeKey.includes(chainExecutionId)) {
292 |         stepScopesToClean.push(scopeKey);
293 |       }
294 |     }
295 | 
296 |     for (const scopeKey of stepScopesToClean) {
297 |       this.cleanupScopeByKey(scopeKey);
298 |       totalCleaned++;
299 |     }
300 | 
301 |     this.logger.info(`[TEMP GATE REGISTRY] Chain ${chainExecutionId} cleanup: ${totalCleaned} gates removed`);
302 |     return totalCleaned;
303 |   }
304 | 
305 |   /**
306 |    * Clean up all gates for an execution scope
307 |    * Convenience method for execution-scoped cleanups
308 |    */
309 |   cleanupExecutionScope(executionId: string): number {
310 |     return this.cleanupScope('execution', executionId);
311 |   }
312 | 
313 |   /**
314 |    * Get registry statistics
315 |    */
316 |   getStatistics() {
317 |     const now = Date.now();
318 |     const gates = Array.from(this.temporaryGates.values());
319 | 
320 |     const expiredCount = gates.filter(g => g.expires_at && g.expires_at <= now).length;
321 |     const byScope = gates.reduce((acc, gate) => {
322 |       acc[gate.scope] = (acc[gate.scope] || 0) + 1;
323 |       return acc;
324 |     }, {} as Record<string, number>);
325 | 
326 |     const bySource = gates.reduce((acc, gate) => {
327 |       acc[gate.source] = (acc[gate.source] || 0) + 1;
328 |       return acc;
329 |     }, {} as Record<string, number>);
330 | 
331 |     return {
332 |       totalGates: this.temporaryGates.size,
333 |       maxCapacity: this.maxMemoryGates,
334 |       utilizationPercent: Math.round((this.temporaryGates.size / this.maxMemoryGates) * 100),
335 |       expiredGates: expiredCount,
336 |       activeScopes: this.scopeManagement.size,
337 |       activeCleanupTimers: this.cleanupTimers.size,
338 |       gatesByScope: byScope,
339 |       gatesBySource: bySource,
340 |       memoryUsageEstimate: this.estimateMemoryUsage()
341 |     };
342 |   }
343 | 
344 |   /**
345 |    * Force cleanup to free memory
346 |    */
347 |   private performCleanup(): void {
348 |     this.logger.debug('[TEMP GATE REGISTRY] Performing forced cleanup');
349 | 
350 |     // First try cleaning expired gates
351 |     const expiredCleaned = this.cleanupExpiredGates();
352 | 
353 |     // If still at capacity, remove oldest gates
354 |     if (this.temporaryGates.size >= this.maxMemoryGates) {
355 |       const gates = Array.from(this.temporaryGates.values())
356 |         .sort((a, b) => a.created_at - b.created_at);
357 | 
358 |       const toRemove = Math.min(100, gates.length - Math.floor(this.maxMemoryGates * 0.8));
359 |       for (let i = 0; i < toRemove; i++) {
360 |         this.removeTemporaryGate(gates[i].id);
361 |       }
362 | 
363 |       this.logger.warn(`[TEMP GATE REGISTRY] Force removed ${toRemove} oldest gates`);
364 |     }
365 |   }
366 | 
367 |   /**
368 |    * Associate gate with scope
369 |    */
370 |   private associateWithScope(gateId: string, scope: string, scopeId: string): void {
371 |     const scopeKey = `${scope}:${scopeId}`;
372 | 
373 |     if (!this.scopeManagement.has(scopeKey)) {
374 |       this.scopeManagement.set(scopeKey, {
375 |         scope_type: scope as any,
376 |         scope_id: scopeId,
377 |         gates: new Set(),
378 |         created_at: Date.now()
379 |       });
380 |     }
381 | 
382 |     this.scopeManagement.get(scopeKey)!.gates.add(gateId);
383 |   }
384 | 
385 |   /**
386 |    * Remove gate from scope
387 |    */
388 |   private removeFromScope(gateId: string, scope: string, scopeId: string): void {
389 |     const scopeKey = `${scope}:${scopeId}`;
390 |     const scopeInfo = this.scopeManagement.get(scopeKey);
391 | 
392 |     if (scopeInfo) {
393 |       scopeInfo.gates.delete(gateId);
394 | 
395 |       // Remove scope if empty
396 |       if (scopeInfo.gates.size === 0) {
397 |         this.scopeManagement.delete(scopeKey);
398 |       }
399 |     }
400 |   }
401 | 
402 |   /**
403 |    * Cleanup scope by key
404 |    */
405 |   private cleanupScopeByKey(scopeKey: string): void {
406 |     const scopeInfo = this.scopeManagement.get(scopeKey);
407 |     if (scopeInfo) {
408 |       for (const gateId of scopeInfo.gates) {
409 |         this.removeTemporaryGate(gateId);
410 |       }
411 |       this.scopeManagement.delete(scopeKey);
412 |     }
413 |   }
414 | 
415 |   /**
416 |    * Estimate memory usage
417 |    */
418 |   private estimateMemoryUsage(): number {
419 |     // Rough estimation: 1KB per gate + scope overhead
420 |     const gateSize = this.temporaryGates.size * 1024;
421 |     const scopeSize = this.scopeManagement.size * 256;
422 |     const timerSize = this.cleanupTimers.size * 64;
423 | 
424 |     return gateSize + scopeSize + timerSize;
425 |   }
426 | 
427 |   /**
428 |    * Cleanup all resources
429 |    */
430 |   destroy(): void {
431 |     this.logger.debug('[TEMP GATE REGISTRY] Destroying registry');
432 | 
433 |     // Clear all timers
434 |     for (const timer of this.cleanupTimers.values()) {
435 |       clearTimeout(timer);
436 |     }
437 | 
438 |     // Clear all data
439 |     this.temporaryGates.clear();
440 |     this.scopeManagement.clear();
441 |     this.cleanupTimers.clear();
442 |   }
443 | }
444 | 
445 | /**
446 |  * Factory function for creating temporary gate registry
447 |  */
448 | export function createTemporaryGateRegistry(
449 |   logger: Logger,
450 |   options?: {
451 |     maxMemoryGates?: number;
452 |     defaultExpirationMs?: number;
453 |   }
454 | ): TemporaryGateRegistry {
455 |   return new TemporaryGateRegistry(logger, options);
456 | }
```

--------------------------------------------------------------------------------
/server/tests/unit/semantic-analyzer-three-tier.test.ts:
--------------------------------------------------------------------------------

```typescript
  1 | /**
  2 |  * Semantic Analyzer Three-Tier Model Unit Tests
  3 |  * Tests the enhanced semantic analyzer for prompt/template/chain/workflow classification
  4 |  */
  5 | 
  6 | import { describe, test, expect, beforeEach, jest } from '@jest/globals';
  7 | import { SemanticAnalyzer } from '../../dist/analysis/semantic-analyzer.js';
  8 | import { Logger } from '../../dist/logging/index.js';
  9 | import { ConvertedPrompt } from '../../dist/types/index.js';
 10 | 
 11 | // Mock logger for testing
 12 | const mockLogger = {
 13 |   debug: jest.fn(),
 14 |   info: jest.fn(),
 15 |   warn: jest.fn(),
 16 |   error: jest.fn(),
 17 | } as unknown as Logger;
 18 | 
 19 | describe('Semantic Analyzer Three-Tier Model', () => {
 20 |   let analyzer: SemanticAnalyzer;
 21 | 
 22 |   beforeEach(() => {
 23 |     analyzer = new SemanticAnalyzer(mockLogger, {
 24 |       enableCaching: false // Disable caching for consistent testing
 25 |     });
 26 |   });
 27 | 
 28 |   describe('Basic Prompt Classification', () => {
 29 |     test('should classify simple variable substitution as "prompt"', async () => {
 30 |       const prompt: ConvertedPrompt = {
 31 |         id: 'test_simple',
 32 |         name: 'Simple Test',
 33 |         description: 'Simple variable substitution',
 34 |         category: 'test',
 35 |         userMessageTemplate: 'Hello {{name}}, how are you?',
 36 |         arguments: [{ name: 'name', required: true, description: 'User name' }]
 37 |       };
 38 | 
 39 |       const analysis = await analyzer.analyzePrompt(prompt);
 40 |       
 41 |       expect(analysis.executionType).toBe('prompt');
 42 |       expect(analysis.requiresFramework).toBe(false);
 43 |       expect(analysis.confidence).toBeGreaterThan(0.5);
 44 |       expect(analysis.frameworkRecommendation.shouldUseFramework).toBe(false);
 45 |     });
 46 | 
 47 |     test('should classify basic prompts with minimal arguments as "prompt"', async () => {
 48 |       const prompt: ConvertedPrompt = {
 49 |         id: 'test_basic',
 50 |         name: 'Basic Greeting',
 51 |         description: 'Basic greeting template',
 52 |         category: 'test',
 53 |         userMessageTemplate: 'Welcome {{user}}! Today is {{date}}.',
 54 |         arguments: [
 55 |           { name: 'user', required: true, description: 'Username' },
 56 |           { name: 'date', required: false, description: 'Current date' }
 57 |         ]
 58 |       };
 59 | 
 60 |       const analysis = await analyzer.analyzePrompt(prompt);
 61 |       
 62 |       expect(analysis.executionType).toBe('prompt');
 63 |       expect(analysis.requiresFramework).toBe(false);
 64 |     });
 65 |   });
 66 | 
 67 |   describe('Framework-Aware Template Classification', () => {
 68 |     test('should classify structured reasoning prompts as "template"', async () => {
 69 |       const prompt: ConvertedPrompt = {
 70 |         id: 'test_analysis',
 71 |         name: 'Deep Analysis Template',
 72 |         description: 'Analyze and evaluate complex situations systematically',
 73 |         category: 'analysis',
 74 |         systemMessage: 'You are a systematic analyst using structured reasoning approaches.',
 75 |         userMessageTemplate: `
 76 |           Please analyze {{topic}} using the following structured approach:
 77 |           
 78 |           1. **Context Analysis**: Examine the background and environment
 79 |           2. **Goal Definition**: Identify key objectives and success criteria
 80 |           3. **Systematic Evaluation**: Break down the problem methodically
 81 |           4. **Refinement**: Iterate and improve your analysis
 82 |           
 83 |           Provide comprehensive reasoning for {{requirements}}.
 84 |         `,
 85 |         arguments: [
 86 |           { name: 'topic', required: true, description: 'Topic to analyze' },
 87 |           { name: 'requirements', required: true, description: 'Analysis requirements' }
 88 |         ]
 89 |       };
 90 | 
 91 |       const analysis = await analyzer.analyzePrompt(prompt);
 92 |       
 93 |       expect(analysis.executionType).toBe('template');
 94 |       expect(analysis.requiresFramework).toBe(true);
 95 |       expect(analysis.executionCharacteristics.hasStructuredReasoning).toBe(true);
 96 |       expect(analysis.executionCharacteristics.hasMethodologyKeywords).toBe(true);
 97 |       expect(analysis.frameworkRecommendation.shouldUseFramework).toBe(true);
 98 |       expect(analysis.frameworkRecommendation.confidence).toBeGreaterThan(0.7);
 99 |     });
100 | 
101 |     test('should classify methodology-heavy prompts as "template"', async () => {
102 |       const prompt: ConvertedPrompt = {
103 |         id: 'test_methodology',
104 |         name: 'CAGEERF Methodology Template',
105 |         description: 'Apply CAGEERF framework for systematic analysis',
106 |         category: 'methodology',
107 |         userMessageTemplate: `
108 |           Apply the CAGEERF methodology to evaluate {{subject}}:
109 |           
110 |           **Context**: What is the relevant background and environment?
111 |           **Analysis**: How should we approach this systematically?
112 |           **Goals**: What are the key objectives and evaluation criteria?
113 |           **Execution**: What steps should be taken?
114 |           **Evaluation**: How do we assess progress and outcomes?
115 |           **Refinement**: What improvements can be made?
116 |           **Framework**: How does this align with our overall approach?
117 |         `,
118 |         arguments: [
119 |           { name: 'subject', required: true, description: 'Subject to evaluate' }
120 |         ]
121 |       };
122 | 
123 |       const analysis = await analyzer.analyzePrompt(prompt);
124 |       
125 |       expect(analysis.executionType).toBe('template');
126 |       expect(analysis.requiresFramework).toBe(true);
127 |       expect(analysis.executionCharacteristics.hasMethodologyKeywords).toBe(true);
128 |       expect(analysis.executionCharacteristics.hasComplexAnalysis).toBe(true);
129 |     });
130 | 
131 |     test('should classify complex prompts without methodology as "template"', async () => {
132 |       const prompt: ConvertedPrompt = {
133 |         id: 'test_complex',
134 |         name: 'Complex Multi-Argument Template',
135 |         description: 'Complex template with many arguments',
136 |         category: 'complex',
137 |         userMessageTemplate: 'Process {{arg1}} with {{arg2}} considering {{arg3}}, {{arg4}}, and {{arg5}} while maintaining {{arg6}} standards.',
138 |         arguments: [
139 |           { name: 'arg1', required: true, description: 'First parameter' },
140 |           { name: 'arg2', required: true, description: 'Second parameter' },
141 |           { name: 'arg3', required: true, description: 'Third parameter' },
142 |           { name: 'arg4', required: true, description: 'Fourth parameter' },
143 |           { name: 'arg5', required: true, description: 'Fifth parameter' },
144 |           { name: 'arg6', required: false, description: 'Quality standards' }
145 |         ]
146 |       };
147 | 
148 |       const analysis = await analyzer.analyzePrompt(prompt);
149 |       
150 |       expect(analysis.executionType).toBe('template');
151 |       expect(analysis.frameworkRecommendation.shouldUseFramework).toBe(true);
152 |       expect(analysis.frameworkRecommendation.confidence).toBeLessThanOrEqual(0.9); // Lower confidence due to lack of methodology keywords
153 |     });
154 |   });
155 | 
156 |   describe('Chain Classification', () => {
157 |     test('should classify chain prompts as "chain"', async () => {
158 |       const prompt: ConvertedPrompt = {
159 |         id: 'test_chain',
160 |         name: 'Analysis Chain',
161 |         description: 'Multi-step analysis process',
162 |         category: 'chain',
163 |         userMessageTemplate: 'Execute analysis steps sequentially',
164 |         chainSteps: [
165 |           { promptId: 'step1', stepName: 'Initial Analysis', executionType: 'template' },
166 |           { promptId: 'step2', stepName: 'Deep Dive', executionType: 'template' },
167 |           { promptId: 'step3', stepName: 'Summary', executionType: 'prompt' }
168 |         ],
169 |         arguments: [{ name: 'input', required: true, description: 'Input data' }]
170 |       };
171 | 
172 |       const analysis = await analyzer.analyzePrompt(prompt);
173 |       
174 |       expect(analysis.executionType).toBe('chain');
175 |       expect(analysis.executionCharacteristics.hasChainSteps).toBe(true);
176 |       expect(analysis.frameworkRecommendation.shouldUseFramework).toBe(true);
177 |     });
178 | 
179 |     test('should detect chain-like patterns in content', async () => {
180 |       const prompt: ConvertedPrompt = {
181 |         id: 'test_steps',
182 |         name: 'Step-by-Step Process',
183 |         description: 'Sequential step process',
184 |         category: 'process',
185 |         userMessageTemplate: `
186 |           Please follow these steps to analyze {{topic}}:
187 |           Step 1: Gather context information
188 |           Step 2: Define analysis goals  
189 |           Step 3: Execute systematic evaluation
190 |           Then proceed to the next action based on results.
191 |         `,
192 |         arguments: [{ name: 'topic', required: true, description: 'Analysis topic' }]
193 |       };
194 | 
195 |       const analysis = await analyzer.analyzePrompt(prompt);
196 |       
197 |       expect(analysis.executionCharacteristics.hasChainSteps).toBe(true);
198 |     });
199 |   });
200 | 
201 |   describe('Workflow Classification', () => {
202 |     test('should classify complex workflow prompts as "workflow"', async () => {
203 |       const prompt: ConvertedPrompt = {
204 |         id: 'test_workflow',
205 |         name: 'Complex Workflow',
206 |         description: 'Complex conditional workflow with loops',
207 |         category: 'workflow',
208 |         userMessageTemplate: `
209 |           {% for item in items %}
210 |             {% if item.condition %}
211 |               Process {{item.name}} with special handling
212 |             {% else %}
213 |               Standard processing for {{item.name}}
214 |             {% endif %}
215 |           {% endfor %}
216 |         `,
217 |         arguments: [
218 |           { name: 'items', required: true, description: 'Items to process' },
219 |           { name: 'config', required: false, description: 'Configuration' },
220 |           { name: 'options', required: false, description: 'Processing options' },
221 |           { name: 'validation', required: false, description: 'Validation rules' },
222 |           { name: 'output', required: false, description: 'Output format' },
223 |           { name: 'metadata', required: false, description: 'Additional metadata' }
224 |         ]
225 |       };
226 | 
227 |       const analysis = await analyzer.analyzePrompt(prompt);
228 |       
229 |       expect(analysis.executionType).toBe('workflow');
230 |       expect(analysis.executionCharacteristics.hasConditionals).toBe(true);
231 |       expect(analysis.executionCharacteristics.hasLoops).toBe(true);
232 |       expect(analysis.complexity).toBe('high');
233 |     });
234 |   });
235 | 
236 |   describe('Framework Recommendation Logic', () => {
237 |     test('should recommend framework for templates but not prompts', async () => {
238 |       const basicPrompt: ConvertedPrompt = {
239 |         id: 'basic',
240 |         name: 'Basic',
241 |         description: 'Basic prompt',
242 |         category: 'test',
243 |         userMessageTemplate: 'Hello {{name}}',
244 |         arguments: [{ name: 'name', required: true, description: 'Name' }]
245 |       };
246 | 
247 |       const templatePrompt: ConvertedPrompt = {
248 |         id: 'template',
249 |         name: 'Analysis Template',
250 |         description: 'Structured analysis template',
251 |         category: 'test',
252 |         userMessageTemplate: 'Analyze {{topic}} systematically using structured reasoning approach',
253 |         arguments: [{ name: 'topic', required: true, description: 'Topic' }]
254 |       };
255 | 
256 |       const basicAnalysis = await analyzer.analyzePrompt(basicPrompt);
257 |       const templateAnalysis = await analyzer.analyzePrompt(templatePrompt);
258 | 
259 |       expect(basicAnalysis.frameworkRecommendation.shouldUseFramework).toBe(false);
260 |       expect(templateAnalysis.frameworkRecommendation.shouldUseFramework).toBe(true);
261 |       
262 |       expect(basicAnalysis.frameworkRecommendation.confidence).toBeGreaterThan(0.8);
263 |       expect(templateAnalysis.frameworkRecommendation.confidence).toBeGreaterThan(0.7);
264 |     });
265 |   });
266 | 
267 |   describe('Performance and Caching', () => {
268 |     test('should handle analysis without caching enabled', async () => {
269 |       const prompt: ConvertedPrompt = {
270 |         id: 'perf_test',
271 |         name: 'Performance Test',
272 |         description: 'Test prompt for performance',
273 |         category: 'test',
274 |         userMessageTemplate: 'Test {{input}}',
275 |         arguments: [{ name: 'input', required: true, description: 'Input' }]
276 |       };
277 | 
278 |       const analysis1 = await analyzer.analyzePrompt(prompt);
279 |       const analysis2 = await analyzer.analyzePrompt(prompt);
280 |       
281 |       expect(analysis1.analysisMetadata.cacheHit).toBe(false);
282 |       expect(analysis2.analysisMetadata.cacheHit).toBe(false);
283 |       expect(analysis1.analysisMetadata.version).toBe('2.0.0');
284 |     });
285 | 
286 |     test('should provide performance stats', () => {
287 |       const stats = analyzer.getPerformanceStats();
288 |       
289 |       expect(stats).toHaveProperty('cacheSize');
290 |       expect(stats).toHaveProperty('cacheEnabled');
291 |       expect(typeof stats.cacheSize).toBe('number');
292 |       expect(typeof stats.cacheEnabled).toBe('boolean');
293 |     });
294 |   });
295 | 
296 |   describe('Error Handling', () => {
297 |     test('should handle prompts with missing fields gracefully', async () => {
298 |       const incompletePrompt: ConvertedPrompt = {
299 |         id: 'incomplete',
300 |         name: 'Incomplete',
301 |         description: 'Missing template',
302 |         category: 'test',
303 |         userMessageTemplate: '',
304 |         arguments: []
305 |       };
306 | 
307 |       const analysis = await analyzer.analyzePrompt(incompletePrompt);
308 |       
309 |       expect(analysis).toBeDefined();
310 |       expect(analysis.executionType).toBeDefined();
311 |       expect(analysis.confidence).toBeGreaterThan(0);
312 |     });
313 |   });
314 | });
```

--------------------------------------------------------------------------------
/docs/prompt-format-guide.md:
--------------------------------------------------------------------------------

```markdown
  1 | # Prompt Format Guide
  2 | 
  3 | This document explains the format and structure of prompts in the Claude Custom Prompts server, including the new standardized execution headers and gate validation features introduced in v1.1.0.
  4 | 
  5 | ## Prompt Configuration System
  6 | 
  7 | Prompts are organized in a distributed configuration system:
  8 | 
  9 | 1. **promptsConfig.json**: The main configuration file that defines categories and imports
 10 | 2. **Category-specific prompts.json files**: Each category has its own prompts.json file
 11 | 3. **Markdown template files**: The actual prompt templates are stored as markdown files
 12 | 
 13 | ### Configuration Structure
 14 | 
 15 | For a complete explanation of the configuration structure, see the [Prompt Management](prompt-management.md) documentation.
 16 | 
 17 | ## Intelligent Prompt File Structure (v1.1.0)
 18 | 
 19 | Prompt templates are stored as markdown files with a specific structure. The system now uses **intelligent semantic analysis** to automatically detect execution requirements, making manual configuration unnecessary.
 20 | 
 21 | **Key Enhancement**: Execution headers are now **purely optional hints** - the system automatically detects execution types and requirements from prompt content using advanced semantic analysis.
 22 | 
 23 | ### Intelligent Structure (Recommended)
 24 | 
 25 | ```markdown
 26 | # Prompt Title
 27 | 
 28 | Brief description of what the prompt does and its purpose.
 29 | 
 30 | ## System Message
 31 | 
 32 | System instructions for Claude.
 33 | 
 34 | ## User Message Template
 35 | 
 36 | Template for the user message with {{placeholders}}.
 37 | 
 38 | ## Arguments
 39 | 
 40 | - argument1: Description of the first argument
 41 | - argument2: Description of the second argument
 42 | ```
 43 | 
 44 | **🧠 Automatic Detection**: The system automatically analyzes your prompt content to determine:
 45 | 
 46 | - **Execution Type**: Whether it's a basic prompt, template, or chain
 47 | - **Quality Gates**: Appropriate validation based on complexity
 48 | - **Execution Requirements**: Whether execution or template return is needed
 49 | 
 50 | ### Optional Enhancement Headers (Legacy)
 51 | 
 52 | If you want to provide explicit hints to Claude (completely optional):
 53 | 
 54 | ```markdown
 55 | # Prompt Title
 56 | 
 57 | _Optional execution hints for Claude:_
 58 | **🎯 EXECUTION TYPE**: Chain Template | Multi-Step Chain | Template
 59 | **⚡ EXECUTION REQUIRED**: This template requires execution / outputs instructions
 60 | 
 61 | ## Description
 62 | 
 63 | Brief description of what the prompt does and its purpose.
 64 | 
 65 | ## System Message
 66 | 
 67 | System instructions for Claude.
 68 | 
 69 | ## User Message Template
 70 | 
 71 | Template for the user message with {{placeholders}}.
 72 | 
 73 | ## Arguments
 74 | 
 75 | - argument1: Description of the first argument
 76 | - argument2: Description of the second argument
 77 | ```
 78 | 
 79 | **Note**: Headers like AUTO-EXECUTION, TOOL INTEGRATION, etc. are no longer needed - the system handles execution intelligently.
 80 | 
 81 | ## Intelligent Analysis System (v1.1.0)
 82 | 
 83 | The system now uses advanced semantic analysis to automatically understand prompts without manual configuration:
 84 | 
 85 | ### Automatic Detection Features
 86 | 
 87 | #### **🧠 Semantic Content Analysis**
 88 | 
 89 | The system analyzes prompt content using advanced patterns:
 90 | 
 91 | - **Chain Detection**: Identifies systematic, multi-step approaches
 92 | - **Action Detection**: Recognizes analysis, processing, and execution requirements
 93 | - **Instruction Generation**: Detects templates that output step-by-step guidance
 94 | - **Template Information**: Identifies prompts that return data vs. executable content
 95 | 
 96 | #### **🎯 Intelligent Classification**
 97 | 
 98 | Prompts are automatically classified into types:
 99 | 
100 | - **`chain`**: Requires execution with quality validation (confidence-based)
101 | - **`chain`**: Multi-step sequential execution with step tracking
102 | - **`template`**: Returns information or configuration data
103 | 
104 | #### **🛡️ Auto-Assigned Quality Gates**
105 | 
106 | Quality gates are intelligently assigned based on:
107 | 
108 | - **Content Complexity**: More arguments = more validation
109 | - **Analysis Requirements**: Analysis prompts get keyword presence checks
110 | - **Chain Patterns**: Step-by-step content gets completion validation
111 | - **Chain Operations**: Multi-step chains get step completion gates
112 | 
113 | #### **⚡ Smart Execution Decisions**
114 | 
115 | The system automatically decides whether to:
116 | 
117 | - **Execute immediately**: For high-confidence chains
118 | - **Return template info**: For information-only prompts
119 | - **Apply quality gates**: Based on prompt complexity and type
120 | - **Enable step confirmation**: For sensitive or complex chains
121 | 
122 | ### Usage Examples
123 | 
124 | #### **Simple Usage (Recommended)**
125 | 
126 | ```bash
127 | # System automatically detects and executes appropriately
128 | >>content_analysis "your content here"
129 | 
130 | # System auto-detects this is a chain, applies quality gates, executes
131 | >>notes "research data to analyze"
132 | 
133 | # System detects this is a template info request, returns guidance
134 | >>listprompts
135 | ```
136 | 
137 | #### **Manual Override (When Needed)**
138 | 
139 | ```bash
140 | # Force specific execution mode
141 | >>execute_prompt {"command": ">>content_analysis data", "execution_mode": "chain"}
142 | 
143 | # Enable step confirmation for sensitive chains
144 | >>execute_prompt {"command": ">>notes data", "step_confirmation": true}
145 | ```
146 | 
147 | ### Required Sections
148 | 
149 | 1. **Title** (Level 1 Heading): The name of the prompt
150 | 2. **Description** (Level 2 Heading): Brief explanation of the prompt's purpose
151 | 3. **User Message Template** (Level 2 Heading): The template for the user message with placeholders
152 | 
153 | ### Optional Sections
154 | 
155 | 1. **System Message** (Level 2 Heading): Instructions for Claude's behavior
156 | 2. **Execution Headers** (Bold formatted): New standardized execution guidance
157 | 3. **Chain Steps** (Level 2 Heading): For chain prompts, defines the steps in the chain
158 | 
159 | ## Placeholders and Arguments
160 | 
161 | Placeholders in templates are denoted by double curly braces: `{{argument_name}}`.
162 | 
163 | ### Argument Registration
164 | 
165 | Arguments are defined in the category's prompts.json file for each prompt:
166 | 
167 | ```json
168 | {
169 |   "prompts": [
170 |     {
171 |       "id": "friendly_greeting",
172 |       "name": "Friendly Greeting",
173 |       "category": "general",
174 |       "description": "A warm, personalized greeting that makes the user feel welcome and valued.",
175 |       "file": "friendly_greeting.md",
176 |       "arguments": [
177 |         {
178 |           "name": "name",
179 |           "description": "The name of the person to greet",
180 |           "required": false
181 |         }
182 |       ]
183 |     }
184 |   ]
185 | }
186 | ```
187 | 
188 | Each argument has the following properties:
189 | 
190 | - `name`: The name of the argument, used in placeholders
191 | - `description`: Description of the argument's purpose
192 | - `required`: Whether the argument is required (boolean)
193 | 
194 | ## Example Prompt
195 | 
196 | ````markdown
197 | # Code Review
198 | 
199 | This prompt helps Claude review code and provide feedback.
200 | 
201 | ## System Message
202 | 
203 | You are an expert code reviewer with deep knowledge of software engineering principles and best practices. Your task is to review code snippets and provide constructive feedback.
204 | 
205 | ## User Message Template
206 | 
207 | Please review the following {{language}} code:
208 | 
209 | ```{{language}}
210 | {{code}}
211 | ```
212 | ````
213 | 
214 | Focus on:
215 | 
216 | - Code quality
217 | - Potential bugs
218 | - Performance issues
219 | - Security concerns
220 | - Readability and maintainability
221 | 
222 | {% if best_practices %}
223 | Also check for adherence to {{language}} best practices.
224 | {% endif %}
225 | 
226 | ## Arguments
227 | 
228 | - language: The programming language of the code (e.g., JavaScript, Python, etc.)
229 | - code: The code snippet to review
230 | - best_practices: Whether to check for language-specific best practices (optional)
231 | 
232 | ````
233 | 
234 | ## Chain Prompt Format
235 | 
236 | Chain prompts include an additional section that defines the steps in the chain:
237 | 
238 | ```markdown
239 | ## Chain Steps
240 | 
241 | 1. promptId: first-step-prompt
242 |    stepName: Initial Analysis
243 |    inputMapping:
244 |      topic: input_topic
245 |    outputMapping:
246 |      keyPoints: analysis_results
247 | 
248 | 2. promptId: second-step-prompt
249 |    stepName: Detailed Exploration
250 |    inputMapping:
251 |      analysisResults: analysis_results
252 |      depth: exploration_depth
253 |    outputMapping:
254 |      detailedFindings: detailed_results
255 | ````
256 | 
257 | Each step includes:
258 | 
259 | 1. **promptId**: The ID of the prompt to execute
260 | 2. **stepName**: A descriptive name for the step
261 | 3. **inputMapping**: How to map chain inputs to step inputs
262 | 4. **outputMapping**: How to map step outputs to chain outputs
263 | 
264 | ## Advanced Templating with Nunjucks (Replacing Conditional Logic)
265 | 
266 | The template system now uses **Nunjucks** for advanced templating features, providing more power and flexibility than the previous Handlebars-style syntax. This allows for conditional logic, loops, and more, directly within your prompt templates.
267 | 
268 | ### Key Nunjucks Features:
269 | 
270 | - **Conditional Logic (`{% if %}` ... `{% else %}` ... `{% endif %}`):**
271 |   Control which parts of your template are rendered based on the presence or value of arguments.
272 | 
273 |   ```nunjucks
274 |   {% if user_role == "admin" %}
275 |   Welcome, Admin! You have full access.
276 |   {% elif user_role == "editor" %}
277 |   Welcome, Editor! You can manage content.
278 |   {% else %}
279 |   Welcome, {{user_name | default("Guest")}}!
280 |   {% endif %}
281 |   ```
282 | 
283 | - **Loops (`{% for %}` ... `{% endfor %}`):**
284 |   Iterate over arrays or lists. If you pass an argument that is an array (e.g., from a JSON object in your calling code), Nunjucks can loop through it.
285 | 
286 |   ```nunjucks
287 |   Your selected topics:
288 |   {% for topic in selected_topics %}
289 |   - {{ topic }}
290 |   {% else %}
291 |   No topics selected.
292 |   {% endfor %}
293 |   ```
294 | 
295 |   _(Note: Ensure list/array arguments are passed in a format Nunjucks can iterate, e.g., as actual arrays in the context.)_
296 | 
297 | - **Standard Variable Placeholders (`{{variable}}`):**
298 |   Simple variable replacement is handled by Nunjucks as well.
299 | 
300 |   ```nunjucks
301 |   The current task is: {{task_description}}.
302 |   ```
303 | 
304 | - \*\*Filters (`{{ variable | filter }}`):
305 |   Nunjucks offers many built-in filters (e.g., `{{ name | lower }}`, `{{ items | length }}`, `{{ title | default("Untitled") }}`) and custom filters can be added globally if needed.
306 | 
307 | * **Macros (`{% macro %}`), Template Inheritance (`{% extends %}`), and Setting Variables (`{% set %}`):**
308 |   Nunjucks also supports defining reusable macros, template inheritance for creating base templates, and setting temporary variables within templates. These powerful features allow for highly modular and maintainable prompt designs.
309 | 
310 |   ```nunjucks
311 |   {# Example of setting a variable #}
312 |   {% set greeting = "Hello" %}
313 |   {% if hour > 12 %}{% set greeting = "Good afternoon" %}{% endif %}
314 |   {{ greeting }}, {{ user_name }}!
315 | 
316 |   {# For macros and inheritance, refer to detailed examples and Nunjucks documentation #}
317 |   ```
318 | 
319 |   For detailed examples and usage of these advanced features, please see the [Prompt Management](prompt-management.md) guide or the [official Nunjucks documentation](https://mozilla.github.io/nunjucks/templating.html).
320 | 
321 | ### Processing Order:
322 | 
323 | 1.  The entire template is processed by Nunjucks, resolving all Nunjucks tags (`{% ... %}`) and variable placeholders (`{{ ... }}`).
324 | 2.  After Nunjucks processing, any text references (e.g., `ref:xyz` for long arguments) are expanded to their full content.
325 | 
326 | For more details on Nunjucks syntax and features, refer to the official [Nunjucks documentation](https://mozilla.github.io/nunjucks/templating.html).
327 | 
328 | ## File Organization
329 | 
330 | Prompts are organized in directories by category:
331 | 
332 | ```
333 | prompts/
334 |   category1/
335 |     prompt1.md
336 |     prompt2.md
337 |   category2/
338 |     prompt3.md
339 |     prompt4.md
340 | ```
341 | 
342 | The category is determined by the directory name.
343 | 
344 | ## Prompt IDs
345 | 
346 | Prompt IDs are generated based on the file path and name:
347 | 
348 | - For a file at `prompts/category/file.md`, the ID would be `category/file`
349 | - IDs are used to reference prompts in API calls and chain definitions
350 | 
351 | ## Best Practices
352 | 
353 | 1. **Clear Descriptions**: Provide clear descriptions of what the prompt does
354 | 2. **Descriptive Arguments**: Clearly describe each argument and whether it's required
355 | 3. **Organized Structure**: Use consistent formatting and organization
356 | 4. **Meaningful Names**: Use descriptive names for prompts and arguments
357 | 5. **Documentation**: Include examples and usage notes where helpful
358 | 6. **Testing**: Test prompts with various inputs to ensure they work as expected
359 | 
360 | ## Common Issues
361 | 
362 | ### Missing Placeholders
363 | 
364 | If a placeholder in the template doesn't have a corresponding argument, it will remain as is in the output.
365 | 
366 | ### Invalid Markdown
367 | 
368 | If the markdown structure is invalid (missing sections, incorrect headings), the prompt may not load correctly.
369 | 
370 | ### Circular References
371 | 
372 | In chain prompts, avoid circular references where prompts depend on each other in a loop.
373 | 
374 | ## Advanced Usage
375 | 
376 | ### Multi-paragraph Arguments
377 | 
378 | For arguments that may contain multiple paragraphs, use triple backticks in the template:
379 | 
380 | ```markdown
381 | ## User Message Template
382 | 
383 | Please analyze the following text:
384 | ```
385 | 
386 | {{long_text}}
387 | 
388 | ```
389 | 
390 | ## Arguments
391 | 
392 | - long_text: A potentially long text that may contain multiple paragraphs
393 | ```
394 | 
395 | ### Dynamic Templates
396 | 
397 | You can create dynamic templates that adapt based on the provided arguments:
398 | 
399 | ```markdown
400 | ## User Message Template
401 | 
402 | {% if detailed %}
403 | Please provide a detailed analysis of {{topic}}, covering all aspects in depth.
404 | {% else %}
405 | Please provide a brief overview of {{topic}}, highlighting only the key points.
406 | {% endif %}
407 | 
408 | ## Arguments
409 | 
410 | - topic: The subject to analyze
411 | - detailed: Whether to provide a detailed analysis (true/false)
412 | ```
413 | 
```
Page 7/18FirstPrevNextLast