This is page 2 of 12. Use http://codebase.md/minipuft/claude-prompts-mcp?lines=false&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/prompts/documentation/create_docs_chain.md: -------------------------------------------------------------------------------- ```markdown # Documentation Generation Chain ## Description A comprehensive chain for creating high-quality technical documentation with proper structure, formatting, and best practices ## System Message [System Info: You are a documentation expert who guides users through the process of creating comprehensive, high-quality technical documentation. Your goal is to help them understand what goes into excellent documentation and to facilitate the creation of documentation that follows best practices.] ## User Message Template I need to create documentation for: {{project_info}} Documentation type required: {{doc_type}} Target audience: {{audience}} {% if depth_level %}Desired depth level: {{depth_level}}{% else %}Desired depth level: intermediate{% endif %} Please guide me through your systematic documentation generation process. I would like you to: 1. Analyze my project to determine what needs to be documented and how 2. Create a detailed content plan with a logical structure 3. Generate the actual documentation content 4. Review and refine the documentation for clarity, accuracy, and completeness 5. Assemble the final documentation in a polished, production-ready format At each step, please show your thinking and explain your recommendations. The final documentation should follow these technical documentation best practices: - Well-structured with clear navigation - Appropriate detail level for the target audience - Consistent terminology and formatting - Comprehensive code examples where relevant - Clear explanations of complex concepts - Proper Markdown formatting for readability Please execute this documentation creation process step by step, ensuring each phase builds upon the previous one to create cohesive, high-quality documentation. ## Chain Steps 1. promptId: docs-project-analysis stepName: Project Analysis (Step 1 of 5) inputMapping: project_info: project_info doc_type: doc_type audience: audience depth_level: depth_level outputMapping: 2. promptId: docs-content-planning stepName: Content Planning (Step 2 of 5) inputMapping: previous_message: output:Project Analysis doc_type: doc_type audience: audience outputMapping: 3. promptId: docs-content-creation stepName: Content Creation (Step 3 of 5) inputMapping: previous_message: output:Content Planning doc_type: doc_type project_info: project_info audience: audience outputMapping: 4. promptId: docs-review-refinement stepName: Review and Refinement (Step 4 of 5) inputMapping: previous_message: output:Content Creation doc_type: doc_type audience: audience depth_level: depth_level outputMapping: 5. promptId: docs-final-assembly stepName: Final Assembly (Step 5 of 5) inputMapping: previous_message: output:Review and Refinement doc_type: doc_type audience: audience depth_level: depth_level outputMapping: ## Output Format After completing all 5 steps in the chain, you will have a final output that: 1. Is well-organized and clearly structured 2. Represents the culmination of the entire chain process The final output will be the result of the last step in the chain. ``` -------------------------------------------------------------------------------- /server/src/mcp-tools/prompt-manager/core/types.ts: -------------------------------------------------------------------------------- ```typescript /** * Shared types and interfaces for prompt manager modules */ import { Logger } from "../../../logging/index.js"; import { ConfigManager } from "../../../config/index.js"; import { ToolResponse, ConvertedPrompt, PromptData, Category } from "../../../types/index.js"; import { ContentAnalyzer } from "../../../semantic/configurable-semantic-analyzer.js"; import { FrameworkStateManager } from "../../../frameworks/framework-state-manager.js"; import { FrameworkManager } from "../../../frameworks/framework-manager.js"; /** * Prompt classification interface for management operations */ export interface PromptClassification { executionType: "prompt" | "template" | "chain"; requiresExecution: boolean; requiresFramework: boolean; confidence: number; reasoning: string[]; suggestedGates: string[]; framework?: string; // Enhanced with configurable analysis information analysisMode?: string; capabilities?: { canDetectStructure: boolean; canAnalyzeComplexity: boolean; canRecommendFramework: boolean; hasSemanticUnderstanding: boolean; }; limitations?: string[]; warnings?: string[]; } /** * Analysis result with feedback and suggestions */ export interface AnalysisResult { classification: PromptClassification; feedback: string; suggestions: string[]; } /** * Smart filter criteria for prompt discovery */ export interface SmartFilters { text?: string; type?: string; category?: string; confidence?: { min?: number; max?: number }; execution?: boolean; gates?: boolean; intent?: string; } /** * Dependencies required by all prompt manager modules */ export interface PromptManagerDependencies { logger: Logger; mcpServer: any; configManager: ConfigManager; semanticAnalyzer: ContentAnalyzer; frameworkStateManager?: FrameworkStateManager; frameworkManager?: FrameworkManager; onRefresh: () => Promise<void>; onRestart: (reason: string) => Promise<void>; } /** * Data references shared across modules */ export interface PromptManagerData { promptsData: PromptData[]; convertedPrompts: ConvertedPrompt[]; categories: Category[]; } /** * Common operation result interface */ export interface OperationResult { message: string; affectedFiles?: string[]; metadata?: any; } /** * Validation error details */ export interface ValidationContext { operation: string; requiredFields: string[]; providedFields: string[]; } /** * Category management result */ export interface CategoryResult { effectiveCategory: string; created: boolean; } /** * File operation result */ export interface FileOperationResult { exists: boolean; path?: string; metadata?: any; } /** * Dependency analysis result */ export interface DependencyAnalysis { dependencies: ConvertedPrompt[]; risks: string[]; warnings: string[]; } /** * Migration operation result */ export interface MigrationResult { fromType: string; toType: string; changes: string[]; result: ToolResponse; } /** * Base interface for all modular components */ export interface PromptManagerModule { /** * Update data references */ updateData?(data: PromptManagerData): void; /** * Set framework state manager */ setFrameworkStateManager?(frameworkStateManager: FrameworkStateManager): void; /** * Set framework manager */ setFrameworkManager?(frameworkManager: FrameworkManager): void; } ``` -------------------------------------------------------------------------------- /server/prompts/development/detect_project_commands.md: -------------------------------------------------------------------------------- ```markdown # Project Commands Detection ## Description Intelligently detects and configures project validation commands (lint, test, build) for different project types ## System Message You are an expert assistant providing structured, systematic analysis. Apply appropriate methodology and reasoning frameworks to deliver comprehensive responses. ## User Message Template # Project Commands Detection for ## Objective Analyze the project at `{{ project_path }}` (type: `{{ project_type }}`) to detect and configure validation commands for validation checkpoint system. ## Command Detection Strategy ### Node.js/Frontend Projects **Analysis Steps:** 1. Read `package.json` to extract scripts section 2. Check for TypeScript configuration (`tsconfig.json`) 3. Detect testing framework and linting tools 4. Map to standard command patterns **Expected Commands:** - `quick_validation`: Fast syntax/lint check - `lint`: Code linting with configuration - `typecheck`: TypeScript type checking (if applicable) - `unit_test`: Unit test execution - `build`: Production build - `full_test`: Complete test suite - `e2e_test`: End-to-end tests (if available) ### Rust Projects **Standard Commands:** - `quick_validation`: "cargo check --quiet" - `lint`: "cargo clippy -- -D warnings" - `typecheck`: "" (built into Rust) - `unit_test`: "cargo test" - `build`: "cargo build" - `full_test`: "cargo test" ### Python Projects **Detection Logic:** 1. Check for `mypy.ini`, `pyproject.toml` with mypy config 2. Detect `ruff`, `flake8`, or `pylint` availability 3. Look for `pytest`, `unittest` setup ### Go Projects **Standard Commands:** - `quick_validation`: "go vet ./..." - `lint`: "golangci-lint run" or "go fmt ./... && go vet ./..." - `unit_test`: "go test ./..." - `build`: "go build ./..." ### Enhanced CAGEERF Validation Checkpoints Configure these checkpoint commands: **CHECKPOINT 1: Context Validation** - Syntax validation - Basic linting - Type checking **CHECKPOINT 2: Progressive Edit Validation** - Incremental build validation - Modified file linting - Related test execution **CHECKPOINT 3: Integration Validation** - Full build process - Integration test suite - Dependency validation **CHECKPOINT 4: Completion Validation** - Full test suite - Performance validation - Final build verification ## Analysis Instructions 1. **Project Examination**: Use Read and Glob tools to examine project structure 2. **Configuration Analysis**: Read relevant config files (package.json, Cargo.toml, etc.) 3. **Command Mapping**: Map detected tools to standardized command interface 4. **Validation Setup**: Configure CAGEERF checkpoint commands 5. **Fallback Strategy**: Provide sensible defaults for undetected tools ## Expected Output Format ```json { "project_type": "{{ project_type }}", "commands": { "quick_validation": "command_here", "lint": "command_here", "typecheck": "command_here_or_empty", "unit_test": "command_here", "build": "command_here", "full_test": "command_here", "e2e_test": "command_here_or_empty" }, "cageerf_checkpoints": { "checkpoint_1_context": ["quick_validation", "lint"], "checkpoint_2_progressive": ["lint", "unit_test"], "checkpoint_3_integration": ["build", "full_test"], "checkpoint_4_completion": ["full_test", "build"] }, "validation_config": { "has_typescript": false, "has_testing": true, "has_linting": true, "detected_tools": ["tool1", "tool2"] } } ``` ``` -------------------------------------------------------------------------------- /server/prompts/analysis/notes.md: -------------------------------------------------------------------------------- ```markdown # Notes ## Description Enhanced notes chain that searches the vault for actual related notes instead of generating fictional ones - UPDATED" ## System Message You are an expert content analyst who processes information through a systematic multi-step approach. Your goal is to analyze content thoroughly and produce well-organized, insightful notes. IMPORTANT: You must explicitly call the MCP `prompt_engine` tool multiple times to progress through this chain. After receiving a response from each step, you must call `prompt_engine` with the appropriate next command using template mode for individual step execution with gate validation. IMPLEMENTATION DETAILS: - For tracking purposes, use a counter variable to monitor which step of the chain you're on - Start with counter=1 and increment it after each step - When counter=5, you're done with all steps and should present the final output - Use "execution_mode": "template" for each step to enable individual template execution with gate validation - Store step results in variables (step1_result, step2_result, etc.) for use in subsequent steps - If any step fails gate validation, review and retry with improved parameters ## User Message Template I'm processing the following content through a multi-step content analysis chain: ``` {{content}} ``` **ENHANCED IMPLEMENTATION INSTRUCTIONS:** 1. **Step 1** (counter=1): Call MCP tool `prompt_engine` with: ```json { "command": ">>content_analysis {{content}}", "execution_mode": "template", "gate_validation": true } ``` Store result as `step1_result` (initial analysis) 2. **Step 2** (counter=2): Call MCP tool `prompt_engine` with: ```json { "command": ">>deep_analysis", "content": "{{content}}", "initial_analysis": "[Insert step1_result here]", "execution_mode": "template", "gate_validation": true } ``` Store result as `step2_result` (deep analysis) 3. **Step 3** (counter=3): Call MCP tool `prompt_engine` with: ```json { "command": ">>vault_integrated_notes", "topic": "{{content}}", "execution_mode": "template", "gate_validation": true } ``` Store result as `step3_result` (vault integrated notes) 4. **Step 4** (counter=4): Call MCP tool `prompt_engine` with: ```json { "command": ">>note_refinement", "notes": "[Insert step3_result here]", "execution_mode": "template", "gate_validation": true } ``` Store result as `step4_result` (refined notes) 5. **Completion** (counter=5): Present final refined notes with execution summary - Combine all step results into a comprehensive analysis - Include execution summary: steps completed, validation results, total processing time - Format as: **Final Result**: [step4_result] + **Execution Summary**: [completion stats] **EXECUTION BENEFITS:** - ✅ Gate validation ensures quality at each step - 🔄 Progress tracking shows completion status - ⚠️ Error recovery if any step fails validation - 📊 Execution analytics for performance monitoring **ERROR HANDLING PROTOCOLS:** - **Step Failure**: If any step fails gate validation, review parameters and retry with corrections - **Tool Unavailable**: If `prompt_engine` is unavailable, report error and wait for system recovery - **Context Loss**: If step results are lost, restart from last successful step - **Validation Failure**: If gate validation fails, analyze failure reason and adjust approach - **Recovery Strategy**: Always preserve step results for potential retry/rollback scenarios **Starting counter value**: 1 ``` -------------------------------------------------------------------------------- /server/src/utils/chainUtils.ts: -------------------------------------------------------------------------------- ```typescript /** * Chain Utility Functions * * Provides helper functions for chain detection and validation. * MIGRATION: Simplified to support only markdown-embedded chains. * Modular chain functions are deprecated but maintained for compatibility. * * Phase 2 of Chain System Migration (2025-01-30) */ import * as fs from 'fs/promises'; import * as path from 'path'; import { ValidationError } from './errorHandling.js'; // REMOVED: All types from deleted chain-scaffolding.ts // Modular chain system has been completely deprecated const CHAIN_ID_PATTERN = /^[a-z0-9_-]+$/i; function isPathInside(basePath: string, targetPath: string): boolean { const relative = path.relative(basePath, targetPath); return !relative.startsWith('..') && !path.isAbsolute(relative); } export function normalizeChainId(chainId: string): string { if (typeof chainId !== 'string') { throw new ValidationError('Chain ID must be a string'); } const normalized = chainId.trim(); if (normalized.length === 0) { throw new ValidationError('Chain ID is required'); } if (!CHAIN_ID_PATTERN.test(normalized)) { throw new ValidationError( `Invalid chain ID "${normalized}": only letters, numbers, hyphen, and underscore are allowed` ); } return normalized; } // ===== Utility-Specific Type Definitions ===== // Types used specifically by utility functions that don't exist in canonical chain types /** * ChainStep interface for utility functions */ export interface ChainStep { promptId: string; stepName: string; executionType?: 'prompt' | 'template'; inputMapping?: Record<string, string>; outputMapping?: Record<string, string>; dependencies?: string[]; } // Import ConvertedPrompt from execution domain instead of redefining import type { ConvertedPrompt } from '../execution/types.js'; /** * Determines if a prompt is a chain based on the presence of chain steps * Replaces the redundant isChain boolean property */ export function isChainPrompt(prompt: ConvertedPrompt): boolean { return (prompt.chainSteps?.length || 0) > 0; } /** * Get the number of steps in a chain prompt */ export function getChainStepCount(prompt: ConvertedPrompt): number { return prompt.chainSteps?.length || 0; } /** * Validate that chain steps are properly formed */ export function validateChainSteps(steps: ChainStep[]): boolean { if (!steps || steps.length === 0) { return false; } return steps.every(step => step.promptId && step.stepName && typeof step.promptId === 'string' && typeof step.stepName === 'string' ); } /** * Check if a prompt has valid chain steps * Combines presence check with validation */ export function hasValidChainSteps(prompt: ConvertedPrompt): boolean { const steps = prompt.chainSteps; return steps ? validateChainSteps(steps) : false; } /** * Get chain information summary for a prompt */ export function getChainInfo(prompt: ConvertedPrompt): { isChain: boolean; stepCount: number; isValid: boolean; } { const steps = prompt.chainSteps; return { isChain: isChainPrompt(prompt), stepCount: getChainStepCount(prompt), isValid: steps ? validateChainSteps(steps) : false }; } // ===== REMOVED: Modular Chain Detection and Management ===== // ChainType enum and detectChainType() function removed // All chain detection now uses isChainPrompt() and chainSteps property /** * Check if a prompt is a chain with valid steps (replaces legacy isMonolithicChain) */ export function isValidChain(prompt: ConvertedPrompt): boolean { return isChainPrompt(prompt) && hasValidChainSteps(prompt); } // Modular chain system fully removed // All chain management now uses markdown-embedded chainSteps property ``` -------------------------------------------------------------------------------- /server/src/mcp-tools/prompt-engine/core/types.ts: -------------------------------------------------------------------------------- ```typescript /** * Prompt Engine Core Types * * Contains all interfaces and types used by the prompt engine system, * including chain execution, formatting, and classification types. */ import { ConvertedPrompt, ToolResponse } from "../../../types/index.js"; import type { TemporaryGateDefinition } from "../../../execution/types.js"; /** * Chain step execution context */ export interface ChainExecutionContext { promptId: string; promptArgs: Record<string, any>; convertedPrompt: ConvertedPrompt; isChainManagement?: boolean; chainAction?: string; chainParameters?: Record<string, any>; /** Chain-level temporary gate IDs that child steps inherit */ chainGateIds?: string[]; /** Chain execution ID for scope tracking */ chainExecutionId?: string; /** Whether this chain execution should inherit gates from parent */ inheritParentGates?: boolean; } /** * Chain step arguments building context */ export interface StepArgumentsContext { stepData: any; originalArgs: Record<string, any>; contextData: Record<string, any>; currentStep: number; } /** * Chain management command structure */ export interface ChainManagementCommand { action: string; target: string; parameters: Record<string, any>; } /** * Chain gate information */ export interface ChainGateInfo { status: string; gates: Array<{ name: string; location: string; criteria: string; }>; } /** * Chain execution options */ export interface ChainExecutionOptions { enableGates: boolean; force_restart?: boolean; session_id?: string; step_confirmation?: boolean; llm_driven_execution?: boolean; chain_uri?: string; timeout?: number; /** Execution-time temporary gates (not persisted to prompt configuration) */ temporary_gates?: TemporaryGateDefinition[]; /** Scope for execution-time temporary gates (default: execution) */ gate_scope?: 'execution' | 'session' | 'chain' | 'step'; /** Whether to inherit gates from parent chain scope (default: true) */ inherit_chain_gates?: boolean; /** Built-in quality gates to apply (by name) - use system_control to discover */ quality_gates?: string[]; /** Custom quality checks (simplified: name + description only) */ custom_checks?: Array<{ name: string; description: string }>; /** Gate validation mode: enforce, advise, or report */ gate_mode?: 'enforce' | 'advise' | 'report'; } /** * Framework execution context for prompt processing */ export interface FormatterExecutionContext { executionId: string; executionType: "prompt" | "template" | "chain"; startTime: number; endTime: number; frameworkUsed?: string; frameworkEnabled: boolean; success: boolean; stepsExecuted?: number; sessionId?: string; } /** * Simple response formatter interface */ export interface SimpleResponseFormatter { formatResponse(content: any): any; formatPromptEngineResponse(response: any, ...args: any[]): any; formatErrorResponse(error: any, ...args: any[]): any; setAnalyticsService(service: any): void; } /** * Prompt classification interface for execution strategy */ export interface PromptClassification { executionType: "prompt" | "template" | "chain"; requiresExecution: boolean; confidence: number; reasoning: string[]; suggestedGates: string[]; framework?: string; } /** * Chain execution strategy result */ export interface ChainExecutionStrategy { mode: "prompt" | "template" | "chain"; gateValidation: boolean; } /** * Chain validation result */ export interface ChainValidationResult { isValid: boolean; issues: string[]; chainId: string; stepCount: number; } /** * Chain step data structure */ export interface ChainStepData { promptId: string; stepName: string; inputMapping?: Record<string, string>; outputMapping?: Record<string, string>; config?: { gates?: string[]; }; gates?: string[]; } /** * Chain state information */ export interface ChainState { currentStep: number; totalSteps: number; lastUpdated: number; } ``` -------------------------------------------------------------------------------- /server/src/metrics/types.ts: -------------------------------------------------------------------------------- ```typescript /** * Analytics Service Types * * Comprehensive type definitions for the analytics service that handles * execution monitoring, performance tracking, and system metrics collection * across all MCP tools without coupling to execution logic. */ /** * Core execution data collected from tools */ export interface ExecutionData { executionId: string; executionType: "prompt" | "template" | "chain"; startTime: number; endTime: number; executionTime: number; success: boolean; frameworkUsed?: string; frameworkEnabled: boolean; stepsExecuted?: number; sessionId?: string; toolName: string; // prompt_engine, prompt_manager, system_control error?: string; memoryUsage?: { heapUsed: number; heapTotal: number; external: number; }; } /** * Gate validation data for analytics tracking */ export interface GateValidationData { executionId: string; gateValidationEnabled: boolean; totalGates: number; passedGates: number; failedGates: number; validationTime: number; retryCount?: number; gateResults: Array<{ gateId: string; gateName: string; passed: boolean; score?: number; evaluationTime?: number; }>; } /** * Framework switching data for methodology analytics */ export interface FrameworkSwitchData { switchId: string; fromFramework: string; toFramework: string; switchTime: number; reason?: string; switchSuccess: boolean; switchDuration: number; } /** * Aggregated execution statistics */ export interface ExecutionStats { totalExecutions: number; successfulExecutions: number; failedExecutions: number; averageExecutionTime: number; executionsByMode: { prompt: number; template: number; chain: number; }; executionsByTool: { prompt_engine: number; prompt_manager: number; system_control: number; }; lastUpdated: number; } /** * System performance metrics */ export interface SystemMetrics { uptime: number; memoryUsage: { heapUsed: number; heapTotal: number; external: number; rss: number; }; averageResponseTime: number; requestsPerMinute: number; errorRate: number; performanceTrends: PerformanceTrend[]; } /** * Performance trend data point */ export interface PerformanceTrend { timestamp: number; metric: "execution_time" | "memory_usage" | "success_rate" | "response_time"; value: number; context?: string; } /** * Framework usage analytics */ export interface FrameworkUsage { currentFramework: string; frameworkSwitches: number; frameworkUsageTime: Record<string, number>; // framework -> total time used frameworkSwitchHistory: Array<{ timestamp: number; fromFramework: string; toFramework: string; reason?: string; }>; frameworkPerformance: Record<string, { averageExecutionTime: number; successRate: number; usageCount: number; }>; } /** * Analytics event types for event-driven architecture */ export type AnalyticsEvent = | { type: 'execution:start'; data: Partial<ExecutionData> } | { type: 'execution:complete'; data: ExecutionData } | { type: 'execution:error'; data: ExecutionData } | { type: 'gate:validation'; data: GateValidationData } | { type: 'framework:switch'; data: FrameworkSwitchData } | { type: 'system:memory'; data: { timestamp: number; usage: SystemMetrics['memoryUsage'] } } | { type: 'system:performance'; data: PerformanceTrend }; /** * Analytics query options for data retrieval */ export interface AnalyticsQueryOptions { timeRange?: { start: number; end: number; }; toolFilter?: string[]; frameworkFilter?: string[]; includePerformanceTrends?: boolean; includeTrendHistory?: boolean; maxResults?: number; } /** * Comprehensive analytics summary */ export interface AnalyticsSummary { executionStats: ExecutionStats; systemMetrics: SystemMetrics; frameworkUsage: FrameworkUsage; gateValidationStats: { totalValidations: number; validationSuccessRate: number; averageValidationTime: number; gateAdoptionRate: number; }; recommendations: string[]; } ``` -------------------------------------------------------------------------------- /server/tests/helpers/test-helpers.js: -------------------------------------------------------------------------------- ```javascript /** * Test Helpers (JavaScript version) * Common utilities and fixtures for tests */ import path from 'path'; import { fileURLToPath } from 'url'; // Get project root for consistent paths const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); export const PROJECT_ROOT = path.resolve(__dirname, '../..'); export const DIST_PATH = path.join(PROJECT_ROOT, 'dist'); /** * Mock Logger Implementation */ export class MockLogger { constructor() { this.logs = []; } info(message, ...args) { this.logs.push({ level: 'info', message, args }); } warn(message, ...args) { this.logs.push({ level: 'warn', message, args }); } error(message, ...args) { this.logs.push({ level: 'error', message, args }); } debug(message, ...args) { this.logs.push({ level: 'debug', message, args }); } clear() { this.logs = []; } getLogsByLevel(level) { return this.logs.filter(log => log.level === level); } } /** * Mock MCP Server for testing * Enhanced with interface contract compliance */ export class MockMcpServer { constructor() { this.registeredTools = []; this.toolHandlers = new Map(); } tool(name, description, schema) { this.registeredTools.push({ name, description, schema }); // Return mock tool handler return { name, handler: async (args) => { const handler = this.toolHandlers.get(name); if (handler) { return handler(args); } return { content: [{ type: 'text', text: `Mock response for ${name}` }] }; } }; } /** * MCP SDK compatible registerTool method * Fixes the interface mismatch that caused CI failures */ registerTool(name, config, handler) { // Validate MCP SDK registerTool parameters if (typeof name !== 'string' || !name) { throw new Error(`Invalid tool name: ${name}`); } if (!config || typeof config !== 'object') { throw new Error(`Invalid tool config for ${name}`); } if (typeof handler !== 'function') { throw new Error(`Invalid tool handler for ${name}`); } // Extract description and schema from MCP SDK config format const description = config.description || config.title || name; const schema = config.inputSchema || {}; // Store the handler for this tool this.addToolHandler(name, handler); // Delegate to existing tool method for registration return this.tool(name, description, schema); } addToolHandler(name, handler) { this.toolHandlers.set(name, handler); } getRegisteredToolNames() { return this.registeredTools.map(tool => tool.name); } clear() { this.registeredTools = []; this.toolHandlers.clear(); } /** * Interface compliance validation */ validateInterfaceCompliance() { const requiredMethods = ['tool', 'registerTool']; const missingMethods = requiredMethods.filter(method => typeof this[method] !== 'function' ); return { isCompliant: missingMethods.length === 0, missingMethods }; } } /** * Test Data Fixtures */ export const testPrompts = { simple: { id: 'test-simple', name: 'Simple Test Prompt', userMessageTemplate: 'This is a simple test prompt', description: 'A basic prompt for testing', category: 'test', arguments: [] }, withArgs: { id: 'test-with-args', name: 'Test Prompt with Arguments', userMessageTemplate: 'Hello {{name}}, you are {{age}} years old', description: 'A prompt with template arguments', category: 'test', arguments: [ { name: 'name', type: 'string', description: 'User name' }, { name: 'age', type: 'number', description: 'User age' } ] } }; /** * Performance Test Utilities */ export class PerformanceTimer { constructor() { this.startTime = 0; this.endTime = 0; } start() { this.startTime = Date.now(); } stop() { this.endTime = Date.now(); return this.getDuration(); } getDuration() { return this.endTime - this.startTime; } } ``` -------------------------------------------------------------------------------- /docs/installation-guide.md: -------------------------------------------------------------------------------- ```markdown # Installation and Setup Guide This guide will walk you through the process of installing and setting up the Claude Custom Prompts server. ## Prerequisites Before you begin, ensure you have the following installed: - [Node.js](https://nodejs.org/) (v14 or later) - [npm](https://www.npmjs.com/) (v6 or later) - [Git](https://git-scm.com/) (optional, for cloning the repository) ## System Requirements - **Operating System**: Windows, macOS, or Linux - **Memory**: At least 2GB RAM - **Disk Space**: At least 500MB free space ## Installation ### Option 1: Clone the Repository If you have Git installed, you can clone the repository: ```bash git clone https://github.com/minipuft/claude-prompts.git cd claude-prompts ``` ### Option 2: Download the Source Code Alternatively, you can download the source code as a ZIP file and extract it. ### Install Dependencies Once you have the source code, install the dependencies for both the server: ```bash # Install server dependencies cd server npm install ``` ## Configuration ### Server Configuration The server configuration is stored in `server/config.json`. You can modify this file to change the server settings: ```json { "server": { "name": "Claude Custom Prompts", "version": "1.0.0", "port": 9090 }, "prompts": { "file": "promptsConfig.json" }, "transports": { "default": "stdio" }, "logging": { "directory": "./logs", "level": "info" } } ``` Key configuration options: - **server.port**: The port on which the server will run (default: 9090) - **prompts.file**: The main prompts configuration file (default: promptsConfig.json) - **transports.default**: The default transport to use (options: stdio, sse) - **logging.directory**: The directory where logs will be stored (default: ./logs) - **logging.level**: The logging level (options: debug, info, warn, error) ### Prompts Configuration The prompts configuration is distributed across multiple files: 1. **promptsConfig.json**: The main configuration file that defines categories and imports category-specific prompts.json files 2. **Category-specific prompts.json files**: Each category has its own prompts.json file in its directory #### Main Configuration (promptsConfig.json) ```json { "categories": [ { "id": "general", "name": "General", "description": "General-purpose prompts for everyday tasks" }, { "id": "code", "name": "Code", "description": "Prompts related to programming and software development" } ], "imports": ["prompts/general/prompts.json", "prompts/code/prompts.json"] } ``` ## Creating Your First Prompt ### Prompt Execution Fails ## Updating the Application To update the application to a newer version: 1. Pull the latest changes or download the new source code. 2. Install any new dependencies: ```bash cd server npm install ``` 3. Rebuild the application: ```bash cd server npm run build ``` 4. Restart the server. ## Backup and Restore ### Backing Up Prompts The prompts are stored in the `/prompts' folder in the server directory. To back up your prompts, simply copy this folder to a safe location. ### Restoring Prompts To restore prompts from a backup, drop in your copy of the '/prompts' directory and restart the server. ## Advanced Configuration ### Custom Logging You can customize the logging behavior by modifying the logging section in `config.json`: ```json "logging": { "directory": "./custom-logs", "level": "debug", "maxFiles": 10, "maxSize": "10m" } ``` ## Security Considerations - The server does not implement authentication by default. Consider running it in a secure environment or implementing your own authentication layer. - Regularly back up your prompts to prevent data loss. - Keep your Node.js and npm packages updated to avoid security vulnerabilities. ## Getting Help If you encounter issues or have questions: 1. Check the documentation in the `docs` directory. 2. Look for error messages in the server logs. 3. Contact the maintainers or community for support. ## Next Steps Now that you have the Claude Custom Prompts server up and running, you can: 1. Create more prompts and categories. 2. Experiment with chain prompts for complex processes. 3. Integrate the API with your applications. 4. Contribute to the project by reporting issues or submitting pull requests. ``` -------------------------------------------------------------------------------- /server/tests/enhanced-validation/contract-validation/interface-contracts.js: -------------------------------------------------------------------------------- ```javascript /** * Interface Contract Validation System (JavaScript version) * * Validates that mock objects fully implement expected interfaces to prevent * runtime method missing errors like the registerTool issue. */ /** * MCP SDK Interface Contract Validator * * Prevents interface mismatches by validating mock objects against real SDK interfaces */ export class McpSdkInterfaceValidator { constructor(logger) { this.logger = logger; } /** * Validate tool registration interface compatibility * Specifically addresses the registerTool method mismatch issue */ async validateToolRegistrationInterface(mockServer) { const requiredMethods = [ 'tool', // Existing method in MockMcpServer 'registerTool' // Missing method that caused CI failure ]; const missingMethods = []; const incompatibleSignatures = []; // Check for missing methods for (const method of requiredMethods) { if (typeof mockServer[method] !== 'function') { missingMethods.push(method); } } // Validate method signatures if they exist if (typeof mockServer.tool === 'function') { const toolMethod = mockServer.tool; if (toolMethod.length < 3) { incompatibleSignatures.push({ method: 'tool', expected: 'tool(name: string, description: string, schema: any)', actual: `tool with ${toolMethod.length} parameters` }); } } if (typeof mockServer.registerTool === 'function') { const registerToolMethod = mockServer.registerTool; if (registerToolMethod.length < 3) { incompatibleSignatures.push({ method: 'registerTool', expected: 'registerTool(name: string, config: any, handler: Function)', actual: `registerTool with ${registerToolMethod.length} parameters` }); } } // Generate recommendations const recommendations = []; if (missingMethods.includes('registerTool')) { recommendations.push('Add registerTool method that delegates to existing tool method'); recommendations.push('Ensure registerTool accepts (name, config, handler) parameters'); } const isValid = missingMethods.length === 0 && incompatibleSignatures.length === 0; return { isValid, missingMethods, incompatibleSignatures, recommendations }; } /** * Comprehensive method signature validation */ validateMethodSignatures(mockObject, expectedMethods) { const missingMethods = []; const incompatibleSignatures = []; for (const [methodName, expectedParamCount] of Object.entries(expectedMethods)) { if (typeof mockObject[methodName] !== 'function') { missingMethods.push(methodName); } else { const actualParamCount = mockObject[methodName].length; if (actualParamCount !== expectedParamCount) { incompatibleSignatures.push({ method: methodName, expected: `${expectedParamCount} parameters`, actual: `${actualParamCount} parameters` }); } } } return { isValid: missingMethods.length === 0 && incompatibleSignatures.length === 0, missingMethods, incompatibleSignatures, recommendations: [] }; } /** * Generate comprehensive validation report */ async generateContractReport(mockServer, mockObjectName = 'MockMcpServer') { this.logger.debug(`[CONTRACT VALIDATOR] Generating report for ${mockObjectName}`); const validationResult = await this.validateToolRegistrationInterface(mockServer); const validatedMethods = ['tool', 'registerTool'].filter(method => typeof mockServer[method] === 'function' ); return { mockObjectName, referenceInterface: 'MCP SDK Server Interface', validationResult, timestamp: new Date(), validatedMethods }; } /** * Quick validation check for CI/testing */ async quickValidation(mockServer) { const result = await this.validateToolRegistrationInterface(mockServer); if (!result.isValid) { this.logger.error('[CONTRACT VALIDATOR] Interface validation failed:', { missingMethods: result.missingMethods, incompatibleSignatures: result.incompatibleSignatures, recommendations: result.recommendations }); } return result.isValid; } } /** * Factory function for creating validator instance */ export function createMcpSdkInterfaceValidator(logger) { return new McpSdkInterfaceValidator(logger); } ``` -------------------------------------------------------------------------------- /server/prompts/content_processing/format_enhancement.md: -------------------------------------------------------------------------------- ```markdown # Format Enhancement Workflow ## Description Transform existing basic markdown notes to advanced Obsidian formatting standards with professional presentation and interactive elements ## System Message You are a formatting transformation specialist who converts basic markdown content into publication-ready notes using advanced Obsidian features. You maintain all original content while dramatically improving presentation, organization, and usability. ## User Message Template **FORMAT ENHANCEMENT WORKFLOW** Transform this existing content into advanced Obsidian formatting: {{existing_content}} **ENHANCEMENT PARAMETERS:** - Domain: {{domain}} (auto-detect from content if not specified) - Enhancement Level: {{enhancement_level | default('comprehensive')}} **TRANSFORMATION REQUIREMENTS:** ## Content Preservation Priority - **Maintain ALL original information** - no content loss allowed - **Preserve existing structure** while enhancing presentation - **Enhance, don't replace** - build upon what exists - **Strategic enhancement** without overwhelming the content ## Mandatory Formatting Upgrades ### **1. Frontmatter Enhancement** Add/update with: ```yaml --- tags: [relevant_domain_tags, specific_concepts] aliases: [Alternative Names] created: YYYY-MM-DD status: evergreen difficulty: ⭐⭐⭐⭐ (assess complexity) duration: X hours (estimate time investment) equipment_cost: $X-$Y (if applicable) --- ``` ### **2. Visual Hierarchy Transformation** - **Title Enhancement**: Add appropriate emoji and professional formatting - **Header Progression**: Ensure clear ##, ###, #### hierarchy - **Section Separators**: Add `---` between major sections - **Emoji Integration**: Consistent system for content categorization ### **3. Interactive Element Integration** Apply minimum 3 types: - **Callout Conversion**: Transform key paragraphs into `[!tip]`, `[!warning]`, `[!success]`, `[!quote]` callouts - **Checklist Creation**: Convert action items to `- [ ]` interactive checklists - **Collapsible Sections**: Use `[!example]-` for detailed technical content - **Multi-Column Layouts**: Apply to complex information sections ### **4. Data Organization Enhancement** - **Table Creation**: Convert lists to enhanced comparison matrices - **Code Block Enhancement**: Structure technical information appropriately - **Highlighting Strategy**: Apply `==key concepts==` highlighting - **Extended Markdown**: Use `++important terms++`, `^references^`, `~technical notes~` ### **5. Professional Polish Application** - **Quote Attribution**: Proper formatting for all quotes and sources - **Cross-Reference Integration**: Strategic linking opportunities (3-8 relevant connections) - **Footnote System**: Add `[^1]` citations for sources - **Quick Reference Creation**: Summary sections for essential information ## Domain-Specific Enhancement Strategy ### **Auto-Detection Guidelines** Analyze content for: - **Creative Arts**: Techniques, equipment, workflow, artistic methods - **Technical Fields**: Code, algorithms, systems, specifications - **Personal Development**: Goals, skills, processes, improvement - **Educational Content**: Learning, instruction, knowledge transfer ### **Enhancement Application** Apply appropriate domain formatting: - **Creative**: Master quotes, technique breakdowns, equipment matrices - **Technical**: Code blocks, system specifications, performance metrics - **Personal**: Goal tracking, progress indicators, resource optimization - **Educational**: Learning paths, skill progression, practice workflows ## Quality Assurance Standards ### **Enhancement Verification Checklist** - [ ] All original content preserved and enhanced - [ ] Visual hierarchy dramatically improved - [ ] Interactive elements appropriately integrated - [ ] Data organization significantly enhanced - [ ] Professional presentation achieved - [ ] Strategic cross-references added - [ ] Quick reference sections created - [ ] Publication-ready quality achieved ### **Professional Standards** - **Visual Appeal**: ⭐⭐⭐⭐⭐ transformation quality - **Information Architecture**: Logical, scannable organization - **Plugin Utilization**: Systematic use of advanced features - **Readability**: Enhanced without overwhelming content - **Professional Presentation**: Publication-ready documentation **EXECUTE TRANSFORMATION:** Apply this enhancement workflow to transform the existing content into a professionally formatted, publication-ready note that demonstrates advanced Obsidian formatting capabilities while preserving all original information and improving usability dramatically. ``` -------------------------------------------------------------------------------- /server/package.json: -------------------------------------------------------------------------------- ```json { "name": "claude-prompts-server", "version": "1.3.0", "description": "Claude Custom Prompts MCP Server", "author": "minipuft", "license": "MIT", "type": "module", "main": "dist/index.js", "types": "dist/index.d.ts", "files": [ "dist", "README.md", "LICENSE" ], "scripts": { "build": "tsc", "typecheck": "tsc --noEmit", "start": "node dist/index.js", "dev": "tsc -w & node --watch dist/index.js", "start:sse": "node dist/index.js --transport=sse", "start:stdio": "node dist/index.js --transport=stdio", "start:quiet": "node dist/index.js --quiet", "start:verbose": "node dist/index.js --verbose", "start:debug": "node dist/index.js --debug-startup", "start:production": "node dist/index.js --quiet --transport=stdio", "start:development": "node dist/index.js --verbose --transport=sse", "start:test": "node dist/index.js --startup-test", "help": "node dist/index.js --help", "test": "npm run test:integration", "test:unit": "npm run test:unit-scripts", "test:unit-scripts": "node tests/scripts/unit-conversation-manager.js && node tests/scripts/unit-semantic-analyzer.js && node tests/scripts/unit-unified-parsing.js", "test:integration": "npm run test:integration-scripts", "test:integration-scripts": "node tests/scripts/integration-mcp-tools.js && node tests/scripts/integration-server-startup.js && node tests/scripts/integration-unified-parsing.js && node tests/scripts/integration-routing-system.js", "test:e2e": "NODE_OPTIONS=\"--experimental-vm-modules\" jest tests/e2e", "test:performance": "NODE_OPTIONS=\"--experimental-vm-modules\" jest tests/performance", "test:watch": "NODE_OPTIONS=\"--experimental-vm-modules\" jest --watch", "test:coverage": "NODE_OPTIONS=\"--experimental-vm-modules\" jest --coverage", "test:jest": "NODE_OPTIONS=\"--experimental-vm-modules\" jest", "test:ci": "npm run test:unit-scripts && npm run test:integration-scripts && npm run test:performance", "test:legacy": "node ../test_server.js", "test:runtime-integration": "node tests/scripts/runtime-integration.js", "test:methodology-guides": "node tests/scripts/methodology-guides.js", "test:consolidated-tools": "node tests/scripts/consolidated-tools.js", "test:performance-memory": "node --expose-gc tests/scripts/performance-memory.js", "test:functional-mcp": "node tests/scripts/functional-mcp-validation.js", "test:establish-baselines": "node --expose-gc tests/scripts/establish-performance-baselines.js", "test:all-enhanced": "npm run test:runtime-integration && npm run test:methodology-guides && npm run test:consolidated-tools && npm run test:functional-mcp", "test:ci-startup": "node tests/ci-startup-validation.js", "test:ci-startup-verbose": "VERBOSE=true node tests/ci-startup-validation.js", "test:enhanced-validation": "node tests/enhanced-validation/validation-orchestrator.js", "test:contracts": "node tests/enhanced-validation/contract-validation/contract-test-suite.js", "test:lifecycle": "node tests/enhanced-validation/lifecycle-validation/lifecycle-test-suite.js", "test:environment": "node tests/enhanced-validation/environment-validation/environment-test-suite.js", "validate:dependencies": "node scripts/validate-dependencies.js", "validate:circular": "npx madge --circular --extensions ts,js src/", "validate:all": "npm run validate:dependencies && npm run validate:circular", "validate:enhanced": "npm run test:enhanced-validation", "prepublishOnly": "npm run build" }, "repository": { "type": "git", "url": "git+https://github.com/minipuft/claude-prompts.git" }, "bugs": { "url": "https://github.com/minipuft/claude-prompts/issues" }, "homepage": "https://github.com/minipuft/claude-prompts#readme", "keywords": [ "claude", "ai", "mcp", "model-context-protocol", "prompts", "language-model", "server" ], "engines": { "node": ">=16" }, "publishConfig": { "access": "public" }, "dependencies": { "@modelcontextprotocol/sdk": "^1.18.1", "@types/handlebars": "^4.1.0", "@types/nunjucks": "^3.2.6", "cors": "^2.8.5", "express": "^4.18.2", "handlebars": "^4.7.8", "nunjucks": "^3.2.4", "zod": "^3.22.4" }, "devDependencies": { "@types/cors": "^2.8.17", "@types/express": "^4.17.21", "@types/jest": "^29.5.12", "@types/node": "^20.11.19", "@types/ws": "^8.5.14", "jest": "^29.7.0", "madge": "^8.0.0", "ts-jest": "^29.1.2", "typescript": "^5.3.3", "ws": "^8.18.1" } } ``` -------------------------------------------------------------------------------- /server/prompts/development/generate_comprehensive_claude_md.md: -------------------------------------------------------------------------------- ```markdown # Comprehensive CLAUDE.md Generator ## Description Generates comprehensive CLAUDE.md files with all 6 development criteria, Enhanced CAGEERF integration, and project-specific configurations ## System Message You are an expert assistant providing structured, systematic analysis. Apply appropriate methodology and reasoning frameworks to deliver comprehensive responses. ## User Message Template # Comprehensive CLAUDE.md Generation ## Objective Generate a comprehensive CLAUDE.md file for `{{ project_name }}` ({{ project_type }}) that includes all 6 development criteria and Enhanced CAGEERF integration. ## Project Context - **Path**: `{{ project_path }}` - **Name**: `{{ project_name }}` - **Type**: `{{ project_type }}` - **Architecture Level**: {{ architecture_level }}/10 - **Detected Commands**: {{ project_commands }} ## Required Development Criteria ### 1. Comprehensive Development Standards Generate performance requirements, code quality standards, and naming conventions specific to {{ project_type }} projects. **Performance Requirements:** - Bundle size constraints appropriate for {{ project_type }} - Memory usage budgets - Build performance targets - Framework-specific metrics **Code Quality Standards:** - Complexity limits (cyclomatic, cognitive) - Coverage requirements - Architecture standards - Maintainability metrics **Naming Conventions:** - Language-specific conventions for {{ project_type }} - File and directory patterns - API design standards ### 2. Technology Constraints & Rules Define allowed/prohibited technologies and CSS-first philosophy. **For {{ project_type }} projects:** - Approved dependencies and versions - Security-focused restrictions - Performance-oriented constraints - Maintenance considerations **CSS-First Philosophy:** - Styling hierarchy for {{ project_type }} - Framework-specific CSS patterns - Performance requirements for styles ### 3. Validation Requirements Configure Enhanced CAGEERF validation checkpoints using detected commands. **Integration Commands from Detection:** ```json {{ project_commands }} ``` **4-Phase Validation Checkpoints:** 1. **CHECKPOINT 1**: Context Validation 2. **CHECKPOINT 2**: Progressive Edit Validation 3. **CHECKPOINT 3**: Integration Validation 4. **CHECKPOINT 4**: Completion Validation ### 4. Project-Specific Development Rules Configure build cycles, environment setup, and API integration requirements. **Build & Installation Cycle:** - Environment setup for {{ project_type }} - Dependency management - Development server configuration - Testing and deployment workflows **API Integration:** - Extension patterns (if applicable) - Library export patterns (if applicable) - Security constraints ### 5. Debug & Diagnostics Framework Setup comprehensive debugging and troubleshooting systems. **Test Harness:** - Integration test setup for {{ project_type }} - Performance testing configuration - Mock data management **Debug Configuration:** - Development debugging setup - Production monitoring - Error reporting configuration ### 6. Advanced Development Guidelines Emergency protocols, development philosophy, and innovation guidelines. **Emergency Protocols:** - Severity levels and response procedures - Hotfix workflows - Incident response **Development Philosophy:** - Core principles for {{ project_type }} development - Decision frameworks - Code review standards ## Enhanced CAGEERF Integration **CRITICAL**: Include comprehensive Enhanced CAGEERF methodology integration: 1. **Context Discovery Protocol** (Phase 1A-1F) 2. **4 Validation Checkpoints** throughout development 3. **Project Command Auto-Detection** integration 4. **Context Memory System** references ## Implementation Instructions 1. **Read Template**: Use the comprehensive template from `/home/minipuft/.claude/context-engineering/templates/comprehensive-claude-md-template.md` 2. **Project Analysis**: Examine the project structure and characteristics 3. **Smart Substitution**: Replace template variables with project-specific values 4. **Command Integration**: Integrate the detected commands from {{ project_commands }} 5. **Validation Setup**: Configure the 4-phase CAGEERF checkpoint system 6. **Quality Assurance**: Ensure all 6 development criteria are comprehensively covered ## Expected Output Generate the complete CLAUDE.md file content with: - ✅ Global SuperClaude integration references - ✅ All 6 comprehensive development criteria - ✅ Enhanced CAGEERF validation checkpoints - ✅ Project-specific command integration - ✅ Context memory system integration - ✅ Session management protocols **File Location**: `{{ project_path }}/CLAUDE.md` Begin generating the comprehensive CLAUDE.md for: `{{ project_name }}` ``` -------------------------------------------------------------------------------- /server/scripts/validate-dependencies.js: -------------------------------------------------------------------------------- ```javascript #!/usr/bin/env node /** * Dependency Validation Script * * Detects duplicate systems and overlapping functionality that violate * the "Single Source of Truth" principle. */ import fs from 'fs'; import path from 'path'; import { fileURLToPath } from 'url'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); // Define known system overlaps that should trigger warnings const OVERLAP_PATTERNS = [ { name: "Execution Systems", files: [ "execution/engine.ts", "execution/execution-coordinator.ts", "execution/unified-prompt-processor.ts" ], warning: "Multiple execution systems detected. Choose ONE primary system and deprecate others." }, { name: "Analysis Systems", files: [ "analysis/semantic-analyzer.ts", "analysis/configurable-semantic-analyzer.ts", "frameworks/analysis/framework-consensus-engine.ts", "frameworks/analysis/framework-enhancement-pipeline.ts" ], warning: "Multiple analysis systems detected. Consolidate into single configurable analyzer." }, { name: "Runtime/Application Systems", files: [ "runtime/application.ts", "orchestration/application-orchestrator.ts", "server/server.ts" ], warning: "Multiple application runtime systems detected. Use ONE unified runtime system." }, { name: "MCP Tools Architecture", files: [ "mcp-tools/template-generation-tools.ts", "mcp-tools/prompt-management-tools.ts", "mcp-tools/execution-tools.ts", "mcp-tools/analysis-tools.ts" ], warning: "Legacy fragmented MCP tools detected. Should be consolidated into 3 intelligent tools." } ]; // Scan for files and detect overlaps function validateSystemConsolidation() { console.log("🔍 Validating system consolidation...\n"); let hasViolations = false; for (const pattern of OVERLAP_PATTERNS) { const existingFiles = []; for (const filePath of pattern.files) { const fullPath = path.join(__dirname, '..', 'src', filePath); if (fs.existsSync(fullPath)) { existingFiles.push(filePath); } } if (existingFiles.length > 1) { hasViolations = true; console.log(`❌ ${pattern.name} VIOLATION:`); console.log(` Found ${existingFiles.length} overlapping systems:`); existingFiles.forEach(file => console.log(` - ${file}`)); console.log(` ${pattern.warning}\n`); } else if (existingFiles.length === 1) { console.log(`✅ ${pattern.name}: Single system detected (${existingFiles[0]})`); } } // Validate new consolidated architecture presence console.log("\n🔍 Validating new consolidated architecture..."); const REQUIRED_ARCHITECTURE = [ { name: "Consolidated MCP Tools", files: [ "mcp-tools/prompt-engine/core/engine.ts", "mcp-tools/prompt-manager.ts", "mcp-tools/system-control.ts" ], required: 3 }, { name: "Methodology Guides", files: [ "frameworks/adapters/cageerf-methodology-guide.ts", "frameworks/adapters/react-methodology-guide.ts", "frameworks/adapters/5w1h-methodology-guide.ts", "frameworks/adapters/scamper-methodology-guide.ts" ], required: 4 }, { name: "Framework System", files: [ "frameworks/framework-manager.ts", "frameworks/framework-state-manager.ts" ], required: 2 }, { name: "Runtime System", files: [ "runtime/application.ts", "runtime/startup.ts" ], required: 2 } ]; let architectureScore = 0; for (const archPattern of REQUIRED_ARCHITECTURE) { const existingFiles = []; for (const filePath of archPattern.files) { const fullPath = path.join(__dirname, '..', 'src', filePath); if (fs.existsSync(fullPath)) { existingFiles.push(filePath); } } if (existingFiles.length >= archPattern.required) { console.log(`✅ ${archPattern.name}: ${existingFiles.length}/${archPattern.required} components found`); architectureScore++; } else { console.log(`❌ ${archPattern.name}: ${existingFiles.length}/${archPattern.required} components found - INCOMPLETE`); existingFiles.forEach(file => console.log(` - ${file}`)); hasViolations = true; } } if (hasViolations) { console.log("🚨 SYSTEM CONSOLIDATION VIOLATIONS DETECTED!"); console.log(" See CLAUDE.md 'System Migration & Deprecation Guidelines' for resolution."); process.exit(1); } else { console.log(`\n✅ All systems properly consolidated! (${architectureScore}/${REQUIRED_ARCHITECTURE.length} architecture patterns validated)`); } } validateSystemConsolidation(); ``` -------------------------------------------------------------------------------- /server/src/prompts/types.ts: -------------------------------------------------------------------------------- ```typescript /** * Prompt System Type Definitions * * Contains all types related to prompt management, processing, and organization. * This includes prompt data structures, arguments, categories, and file handling. */ /** * Enhanced argument definition for prompts * Consolidates features from multiple previous definitions */ export interface PromptArgument { /** Name of the argument */ name: string; /** Optional description of the argument */ description?: string; /** Whether this argument is required */ required: boolean; /** Type of the argument value */ type?: 'string' | 'number' | 'boolean' | 'object' | 'array'; /** Default value if not provided */ defaultValue?: string | number | boolean | null | object | Array<any>; /** Optional CAGEERF component association for framework-aware processing */ cageerfComponent?: 'context' | 'analysis' | 'goals' | 'execution' | 'evaluation' | 'refinement' | 'framework'; /** Validation rules for the argument */ validation?: { /** Regex pattern for string validation */ pattern?: string; /** Minimum length for strings */ minLength?: number; /** Maximum length for strings */ maxLength?: number; /** Allowed values for enumeration */ allowedValues?: Array<string | number | boolean>; }; } /** * A category for organizing prompts */ export interface Category { /** Unique identifier for the category */ id: string; /** Display name for the category */ name: string; /** Description of the category */ description: string; } /** * Gate definition interface (shared with gates system) */ export interface GateDefinition { id: string; name: string; type: 'validation' | 'approval' | 'condition' | 'quality'; requirements: any[]; failureAction: 'stop' | 'retry' | 'skip' | 'rollback'; retryPolicy?: { maxRetries: number; retryDelay: number; }; } /** * Complete prompt metadata structure */ export interface PromptData { /** Unique identifier for the prompt */ id: string; /** Display name for the prompt */ name: string; /** Category this prompt belongs to */ category: string; /** Description of the prompt */ description: string; /** Path to the prompt file */ file: string; /** Arguments accepted by this prompt */ arguments: PromptArgument[]; /** Whether this prompt should use available tools */ tools?: boolean; /** Defines behavior when prompt is invoked without its defined arguments */ onEmptyInvocation?: "execute_if_possible" | "return_template"; /** Optional gates for validation */ gates?: GateDefinition[]; } /** * Structure of an individual prompt file */ export interface PromptFile { /** Title of the prompt */ title: string; /** Description of the prompt */ description: string; /** Optional system message for the prompt */ systemMessage?: string; /** Template for generating the user message */ userMessageTemplate: string; /** Whether this prompt should use available tools */ tools?: boolean; } /** * Structure of the prompts registry file */ export interface PromptsFile { /** Available categories for organizing prompts */ categories: Category[]; /** Available prompts */ prompts: PromptData[]; } /** * Configuration for the prompts subsystem with category imports */ export interface PromptsConfigFile { /** Available categories for organizing prompts */ categories: Category[]; /** Paths to prompts.json files to import from category folders */ imports: string[]; } /** * Configuration for the prompts subsystem */ export interface PromptsConfig { /** Path to the prompts definition file */ file: string; } /** * Prompt file content structure */ export interface PromptFileContent { systemMessage?: string; userMessageTemplate: string; chainSteps?: ChainStep[]; } /** * Result of loading category prompts */ export interface CategoryPromptsResult { promptsData: PromptData[]; categories: Category[]; } /** * Chain step definition (minimal for prompt context) */ export interface ChainStep { promptId: string; stepName: string; executionType?: 'prompt' | 'template'; inputMapping?: Record<string, string>; outputMapping?: Record<string, string>; } /** * Category validation result */ export interface CategoryValidationResult { isValid: boolean; issues: string[]; warnings: string[]; } /** * Category statistics */ export interface CategoryStatistics { totalCategories: number; categoriesWithPrompts: number; emptyCategoriesCount: number; averagePromptsPerCategory: number; categoryBreakdown: Array<{ category: Category; promptCount: number; }>; } /** * Category-prompt relationship data */ export interface CategoryPromptRelationship { categoryId: string; categoryName: string; promptIds: string[]; promptCount: number; hasChains: boolean; hasTemplates: boolean; } ``` -------------------------------------------------------------------------------- /server/prompts/development/component_flow_analysis.md: -------------------------------------------------------------------------------- ```markdown # Component Flow Analysis ## Description Comprehensive component review that tracks data flow, lifecycle, dependencies, and integration points ## User Message Template Analyze the following {{framework}} component and provide a comprehensive flow analysis: **Component Path**: {{component_path}} **Component Code**: ```{{language}} {{component_code}} ``` ## Analysis Framework ### 1. Component Overview - **Purpose**: What problem does this component solve? - **Type**: Presentational, Container, Higher-Order Component, Hook, etc. - **Complexity Level**: Simple, Moderate, Complex - **Primary Responsibilities**: List core functions ### 2. Data Flow Analysis #### Inputs (Props/Parameters) - List all props/parameters with types - Identify required vs optional inputs - Document default values - Track prop drilling depth (if applicable) #### State Management - Local state variables and their purpose - External state (Context, Redux, Zustand, etc.) - State update triggers and effects - State flow diagram (describe transitions) #### Outputs - Events emitted/callbacks invoked - Side effects triggered - Data transformations performed - Return values or rendered output ### 3. Lifecycle & Execution Flow #### Initialization Phase - Constructor/setup logic - Initial data fetching - Subscription establishment - Effect registration #### Update Phase - Re-render triggers - Update dependencies - Optimization strategies (memoization, etc.) - Performance considerations #### Cleanup Phase - Cleanup operations - Subscription teardown - Memory leak prevention - Resource disposal ### 4. Dependency Analysis #### Internal Dependencies - Other components used/imported - Utility functions called - Custom hooks utilized - Internal modules referenced #### External Dependencies - Third-party libraries - API endpoints called - External services integrated - Browser APIs used #### Circular Dependencies - Identify any circular dependency risks - Suggest refactoring if needed ### 5. Integration Points #### Parent Components - How is this component used by parents? - What context does it expect? - Required wrapper components #### Child Components - What components does it render? - How does it communicate with children? - Data passed down to children #### Sibling Communication - Event bus usage - Shared state access - Cross-component messaging ### 6. Event Flow & User Interactions #### User Events Handled - Click, input, scroll, etc. - Event handlers and their flow - Event propagation (bubbling/capturing) #### Custom Events - Events dispatched by this component - Event payload structure - Event consumers #### Async Operations - API calls and their triggers - Loading states management - Error handling flow - Success/failure callbacks ### 7. Rendering Flow #### Conditional Rendering - Rendering conditions and branches - Loading states UI - Error states UI - Empty states UI #### Dynamic Content - List rendering logic - Dynamic children generation - Content interpolation #### Performance Optimization - Memoization usage - Lazy loading implementation - Virtual scrolling (if applicable) - Code splitting points ### 8. Side Effects & External Interactions #### API Interactions - Endpoints called - Request/response flow - Caching strategy - Error handling #### Browser APIs - LocalStorage/SessionStorage - Geolocation, notifications, etc. - DOM manipulation - Navigation/routing #### Third-Party Services - Analytics tracking - Error monitoring - Feature flags - Authentication services ### 9. Data Transformation Pipeline Trace how data flows through the component: 1. **Input** → What raw data comes in? 2. **Processing** → How is it transformed? 3. **Storage** → Where is it stored (if at all)? 4. **Display** → How is it presented to users? 5. **Output** → What data/events go out? ### 10. Flow Diagram Provide a text-based flow diagram showing: - Component initialization - Data flow paths - User interaction flows - Async operation flows - Cleanup sequences Example format: ``` User Action (click) → Event Handler (handleSubmit) → Validation Logic → API Call (submitData) → Loading State (setIsLoading: true) → Success: Update State → Re-render → Error: Show Error Message → Re-render ``` ### 11. Issues & Recommendations #### Potential Issues - Code smells identified - Performance bottlenecks - Accessibility concerns - Security vulnerabilities - Maintenance challenges #### Optimization Opportunities - Refactoring suggestions - Performance improvements - Code organization enhancements - Pattern improvements #### Best Practices Compliance - Does it follow framework conventions? - Proper error handling? - Accessibility implemented? - Type safety enforced? ## Summary Provide a concise summary including: - Component health score (1-10) - Primary data flows identified - Key integration points - Critical dependencies - Recommended next actions ``` -------------------------------------------------------------------------------- /server/src/mcp-tools/prompt-engine/processors/template-processor.ts: -------------------------------------------------------------------------------- ```typescript /** * Template Processor - Handles template processing logic * * Extracted from ConsolidatedPromptEngine to provide focused * template processing capabilities with clear separation of concerns. */ import { processTemplate } from "../../../utils/jsonUtils.js"; import { ConvertedPrompt } from "../../../types/index.js"; import { createLogger } from "../../../logging/index.js"; const logger = createLogger({ logFile: '/tmp/template-processor.log', transport: 'stdio', enableDebug: false, configuredLevel: 'info' }); /** * TemplateProcessor handles all template-related processing * * This class provides: * - Template argument processing and validation * - Variable substitution and template rendering * - Template error handling and validation * - Integration with Nunjucks template engine */ export class TemplateProcessor { /** * Process template with provided arguments */ public processTemplate( convertedPrompt: ConvertedPrompt, promptArgs: Record<string, any> ): string { try { logger.debug('🎯 [Template] Processing template with arguments', { promptId: convertedPrompt.id, argsCount: Object.keys(promptArgs).length }); const processedContent = processTemplate(convertedPrompt.userMessageTemplate, promptArgs); logger.debug('✅ [Template] Template processed successfully', { promptId: convertedPrompt.id, contentLength: processedContent.length }); return processedContent; } catch (error) { logger.error('❌ [Template] Template processing failed', { promptId: convertedPrompt.id, error: error instanceof Error ? error.message : String(error) }); throw error; } } /** * Validate template arguments against prompt requirements */ public validateTemplateArguments( convertedPrompt: ConvertedPrompt, promptArgs: Record<string, any> ): { isValid: boolean; missingArgs: string[]; errors: string[] } { const missingArgs: string[] = []; const errors: string[] = []; try { // Check required arguments if (convertedPrompt.arguments) { for (const arg of convertedPrompt.arguments) { if (arg.required && !promptArgs.hasOwnProperty(arg.name)) { missingArgs.push(arg.name); } } } // Validate argument types if specified if (convertedPrompt.arguments) { for (const arg of convertedPrompt.arguments) { if (promptArgs.hasOwnProperty(arg.name)) { const value = promptArgs[arg.name]; if (!this.validateArgumentType(value, arg.type || 'string')) { errors.push(`Argument '${arg.name}' should be of type '${arg.type}'`); } } } } const isValid = missingArgs.length === 0 && errors.length === 0; logger.debug('🔍 [Template] Argument validation result', { promptId: convertedPrompt.id, isValid, missingArgs, errorsCount: errors.length }); return { isValid, missingArgs, errors }; } catch (error) { logger.error('❌ [Template] Argument validation failed', { promptId: convertedPrompt.id, error: error instanceof Error ? error.message : String(error) }); return { isValid: false, missingArgs, errors: [...errors, `Validation error: ${error instanceof Error ? error.message : String(error)}`] }; } } /** * Validate argument type */ private validateArgumentType(value: any, expectedType: string): boolean { switch (expectedType.toLowerCase()) { case 'string': return typeof value === 'string'; case 'number': return typeof value === 'number' && !isNaN(value); case 'boolean': return typeof value === 'boolean'; case 'array': return Array.isArray(value); case 'object': return typeof value === 'object' && value !== null && !Array.isArray(value); default: // Unknown types are considered valid return true; } } /** * Extract template variables from content */ public extractTemplateVariables(content: string | undefined): string[] { const variables: string[] = []; try { if (!content) return []; // Extract Nunjucks-style variables {{variable}} const matches = content.match(/\{\{\s*([^}]+)\s*\}\}/g); if (matches) { for (const match of matches) { const variable = match.replace(/[\{\}\s]/g, ''); if (!variables.includes(variable)) { variables.push(variable); } } } logger.debug('🔍 [Template] Extracted template variables', { variablesCount: variables.length, variables }); return variables; } catch (error) { logger.error('❌ [Template] Variable extraction failed', { error: error instanceof Error ? error.message : String(error) }); return []; } } } ``` -------------------------------------------------------------------------------- /server/src/mcp-tools/constants.ts: -------------------------------------------------------------------------------- ```typescript /** * Constants for MCP Tools * * Centralized constants to avoid duplication and improve maintainability. */ /** * Tool names */ export const TOOL_NAMES = { PROMPT_ENGINE: 'prompt_engine', PROMPT_MANAGER: 'prompt_manager', SYSTEM_CONTROL: 'system_control' } as const; /** * Action types for each tool */ export const ACTIONS = { PROMPT_MANAGER: { CREATE: 'create', CREATE_PROMPT: 'create_prompt', CREATE_TEMPLATE: 'create_template', UPDATE: 'update', DELETE: 'delete', RELOAD: 'reload', LIST: 'list', INSPECT: 'inspect' }, SYSTEM_CONTROL: { STATUS: 'status', FRAMEWORK: 'framework', ANALYTICS: 'analytics', CONFIG: 'config', MAINTENANCE: 'maintenance' } } as const; /** * Operation types for system control */ export const SYSTEM_OPERATIONS = { STATUS: { OVERVIEW: 'overview', HEALTH: 'health', DIAGNOSTICS: 'diagnostics', FRAMEWORK_STATUS: 'framework_status' }, FRAMEWORK: { SWITCH: 'switch', LIST: 'list', ENABLE: 'enable', DISABLE: 'disable' }, ANALYTICS: { VIEW: 'view', RESET: 'reset', HISTORY: 'history' }, CONFIG: { GET: 'get', SET: 'set', LIST: 'list', VALIDATE: 'validate', RESTORE: 'restore' }, MAINTENANCE: { RESTART: 'restart' } } as const; /** * Execution modes for prompt engine */ export const EXECUTION_MODES = { AUTO: 'auto', PROMPT: 'prompt', TEMPLATE: 'template', CHAIN: 'chain' } as const; /** * Output formats */ export const OUTPUT_FORMATS = { COMPACT: 'compact', DETAILED: 'detailed', JSON: 'json', MARKDOWN: 'markdown' } as const; /** * Detail levels for inspection */ export const DETAIL_LEVELS = { OVERVIEW: 'overview', STEPS: 'steps', STRUCTURE: 'structure', GATES: 'gates', FLOW: 'flow', ANALYSIS: 'analysis', RAW: 'raw', FULL: 'full' } as const; /** * Filter operators */ export const FILTER_OPERATORS = { EQUALS: '=', GREATER_THAN: '>', LESS_THAN: '<', GREATER_EQUAL: '>=', LESS_EQUAL: '<=', CONTAINS: '~', REGEX: '/', AND: 'AND', OR: 'OR', NOT: 'NOT' } as const; /** * Validation patterns */ export const VALIDATION_PATTERNS = { PROMPT_ID: /^[a-zA-Z0-9_-]+$/, SESSION_ID: /^[a-zA-Z0-9_-]+$/, ARGUMENT_NAME: /^[a-zA-Z_][a-zA-Z0-9_]*$/, EMAIL: /^[^\s@]+@[^\s@]+\.[^\s@]+$/, URL: /^https?:\/\/.+/ } as const; /** * Error codes */ export const ERROR_CODES = { VALIDATION_ERROR: 'VALIDATION_ERROR', CONFIG_ERROR: 'CONFIG_ERROR', FRAMEWORK_ERROR: 'FRAMEWORK_ERROR', EXECUTION_ERROR: 'EXECUTION_ERROR', NOT_FOUND: 'NOT_FOUND', PERMISSION_DENIED: 'PERMISSION_DENIED', TIMEOUT: 'TIMEOUT', UNKNOWN_ERROR: 'UNKNOWN_ERROR' } as const; /** * Default limits and constraints */ export const LIMITS = { MAX_NAME_LENGTH: 100, MIN_NAME_LENGTH: 1, MAX_DESCRIPTION_LENGTH: 500, MIN_DESCRIPTION_LENGTH: 10, MAX_STEP_NAME_LENGTH: 50, MAX_FILTER_RESULTS: 1000, DEFAULT_PAGE_SIZE: 20, MAX_PAGE_SIZE: 100, EXECUTION_TIMEOUT: 30000, // 30 seconds CACHE_TTL: 300000 // 5 minutes } as const; /** * Framework types */ export const FRAMEWORKS = { CAGEERF: 'CAGEERF', REACT: 'ReACT', FIVE_W_ONE_H: '5W1H', SCAMPER: 'SCAMPER' } as const; /** * Category types */ export const CATEGORIES = { ANALYSIS: 'analysis', DEVELOPMENT: 'development', CONTENT_PROCESSING: 'content_processing', DEBUGGING: 'debugging', DOCUMENTATION: 'documentation', EDUCATION: 'education', RESEARCH: 'research', SYSTEM: 'system' } as const; /** * Common error messages */ export const ERROR_MESSAGES = { REQUIRED_FIELD: (field: string) => `Field '${field}' is required but was not provided`, INVALID_FORMAT: (field: string, format: string) => `Field '${field}' must match format: ${format}`, LENGTH_CONSTRAINT: (field: string, min: number, max: number) => `Field '${field}' must be between ${min} and ${max} characters`, UNKNOWN_ACTION: (action: string, validActions: string[]) => `Unknown action: ${action}. Valid actions: ${validActions.join(', ')}`, UNKNOWN_OPERATION: (operation: string, validOperations: string[]) => `Unknown operation: ${operation}. Valid operations: ${validOperations.join(', ')}`, NOT_FOUND: (type: string, id: string) => `${type} not found: ${id}`, ALREADY_EXISTS: (type: string, id: string) => `${type} already exists: ${id}` } as const; /** * Success messages */ export const SUCCESS_MESSAGES = { CREATED: (type: string, id: string) => `${type} created successfully: ${id}`, UPDATED: (type: string, id: string) => `${type} updated successfully: ${id}`, DELETED: (type: string, id: string) => `${type} deleted successfully: ${id}`, OPERATION_COMPLETE: (operation: string) => `${operation} completed successfully` } as const; /** * Documentation URLs (when available) */ export const DOCUMENTATION = { PROMPT_CREATION: '/docs/prompts/creation', CHAIN_CREATION: '/docs/prompts/chains', FILTERING: '/docs/prompts/filtering', FRAMEWORKS: '/docs/frameworks', TROUBLESHOOTING: '/docs/troubleshooting' } as const; ``` -------------------------------------------------------------------------------- /server/prompts/analysis/progressive_research.md: -------------------------------------------------------------------------------- ```markdown # Progressive Research Assistant ## Description A step-by-step research assistant that builds knowledge incrementally through iterative questions and analysis instead of immediately producing a final output. ## System Message You are an expert research assistant who specializes in building knowledge incrementally through systematic analysis. Instead of immediately producing a final polished output, you work through information methodically, asking follow-up questions, expanding key concepts, and building deeper understanding step-by-step. ## User Message Template Guide the model in creating a detailed and informative response to the provided {{notes}} by conducting step-by-step research. Instead of outputting a final markdown page, use iterative questions and detailed analyses to progressively expand the given information: {{information}} # Goal The objective is to function as a researcher gathering insights and preparing the necessary information incrementally. Ask follow-up questions if any part of the provided notes is unclear or incomplete. Analyze the various topics step-by-step to add depth and context. # Step-by-Step Guide 1. **Understand the Initial Scope**: Review the given `{{notes}}` and identify the major themes and key elements. Start by summarizing what you understand to validate the context. Include concepts, keywords, and areas that may require expansion. 2. **Generate Follow-Up Questions**: Identify the sections or points that need further elaboration. Ask clear and specific follow-up questions to clarify ambiguities. Dive deeper into questions to plan how each part of the research could be compounded into a cohesive and comprehensive whole. 3. **Conduct Iterative Research**: - Perform individual research for each topic listed in `{{notes}}`, breaking down key concepts with respective definitions or details. - Expand with additional points, such as its historical background, notable experiments, practical applications, or current and future impacts. - If you encounter complex points that need deeper understanding, produce a focused list of additional clarifying questions. 4. **Expand on Key Concepts**: Elaborate on the core topics using reliable sources. For each topic: - Present fundamental definitions and concepts. - Provide examples illustrating key points—like experiments or use cases. - Include related discussions to enrich the understanding of the subject. 5. **Establish Connections Across Topics**: Determine any logical connections between different aspects of `{{notes}}`: - Try to bridge gaps between the ideas. - Provide continuous notes on transitions and flow for best linking sections during final composition. 6. **Add Insights and Context**: Offer personal analyses, including pros and cons, challenges, or breakthroughs regarding each topic. This exploration adds value by providing a more nuanced understanding. - Explore implications and real-world significance of topics. - Pose relevant questions to stimulate deeper inquiry or highlight potential challenges. 7. **Document the Process Regularly**: Keep a record of your findings, proposed connections, and unanswered questions. Consider suggesting the layout or ordering for a potential final output. # Output Format - **Iterative Questions and Expansion Responses**: - For each identified gap or ambiguity, ask one or more follow-up questions to seek more detailed information. - For each research topic or subtopic, provide structured notes, expanding on the definition, explanation, and examples. - Use bullet points or numbered lists for easier comprehension. - Recommendations for any additional areas requiring deeper research can be added in bullet format. - **Examples of Output**: A structured list of iterative questions followed by researched notes: 1. **Initial Assessment and Understanding**: - Questions: "What are the major theoretical implications of wave-particle duality?" "Can we include historical background on the experimentation that led to superposition?" - Answers: "Wave-particle duality shows the dual behavior of particles (e.g., electrons behave as both waves and particles depending on the situation)." 2. **Further Context Expansion**: - Key Concept: **Double-Slit Experiment**. - "The experiment reveals substantial insights about how particles interfere with each other, which is core to understanding wave-particle duality." # Notes 1. Focus on gradually accumulating enough content to transition effectively to writing a complete Markdown description. The approach should help generate in-depth content ready for logical conversion into explanative structures. 2. This step-by-step progression can continue until there's sufficient information on each key aspect of `{{notes}}`. The goal is to cover fundamental points as well as nuanced topics that add helpful detail, allowing an easy transition into structured Markdown content in a subsequent step. 3. List additional open threads and related questions that might require attention to ensure completeness. ``` -------------------------------------------------------------------------------- /server/src/types.ts: -------------------------------------------------------------------------------- ```typescript /** * Type definitions for the prompt management system */ // Import domain-specific types import type { GateDefinition } from './gates/types.js'; import type { PromptArgument, Category, PromptData, PromptsFile, PromptFile, PromptsConfigFile, PromptsConfig } from './prompts/types.js'; // ===== Configuration Types ===== /** * Configuration for the server */ export interface ServerConfig { /** Name of the server */ name: string; /** Version string in semver format */ version: string; /** Port number to listen on (1024-65535) */ port: number; } // PromptsConfig interface moved to ./prompts/types.ts // (imported directly above) /** * Configuration for a transport */ export interface TransportConfig { /** Whether this transport is enabled */ enabled: boolean; } /** * Configuration for all transports */ export interface TransportsConfig { /** Name of the default transport to use */ default: string; /** Server-sent events transport configuration */ sse: TransportConfig; /** Standard I/O transport configuration */ stdio: TransportConfig; /** Custom transports map */ customTransports?: Record<string, TransportConfig>; // Removed: Index signature for backwards compatibility - use customTransports instead } /** * Analysis mode for semantic analysis * Mode is automatically inferred based on LLM integration configuration */ export type AnalysisMode = "structural" | "semantic"; /** * LLM provider for semantic analysis */ export type LLMProvider = "openai" | "anthropic" | "custom"; /** * LLM integration configuration */ export interface LLMIntegrationConfig { /** Whether LLM integration is enabled */ enabled: boolean; /** API key for the LLM provider */ apiKey: string | null; /** Custom endpoint URL for the LLM provider (provider auto-detected from URL) */ endpoint: string | null; /** Model name to use */ model: string; /** Maximum tokens for analysis requests */ maxTokens: number; /** Temperature for analysis requests */ temperature: number; } /** * Semantic analysis configuration */ export interface SemanticAnalysisConfig { /** Analysis mode to use (automatically inferred if not specified) */ mode?: AnalysisMode; /** LLM integration configuration */ llmIntegration: LLMIntegrationConfig; } /** * Analysis system configuration */ export interface AnalysisConfig { /** Semantic analysis configuration */ semanticAnalysis: SemanticAnalysisConfig; } /** * Logging system configuration */ export interface LoggingConfig { /** Directory to write log files to */ directory: string; /** Log level: debug, info, warn, error */ level: string; } // Removed: FrameworkConfig - deprecated interface, framework state now managed at runtime /** * Tool descriptions configuration options */ export interface ToolDescriptionsOptions { /** Whether to restart server when tool descriptions change */ restartOnChange?: boolean; } /** * Complete application configuration */ /** * Configuration for gates subsystem */ export interface GatesConfig { /** Directory containing gate definitions */ definitionsDirectory: string; /** Directory containing LLM validation templates */ templatesDirectory: string; } export interface Config { /** Server configuration */ server: ServerConfig; /** Prompts subsystem configuration */ prompts: PromptsConfig; /** Analysis system configuration */ analysis?: AnalysisConfig; /** Gates system configuration */ gates?: GatesConfig; /** Transports configuration */ transports: TransportsConfig; /** Logging configuration */ logging?: LoggingConfig; /** Tool descriptions configuration */ toolDescriptions?: ToolDescriptionsOptions; } // ===== Prompt Types ===== // Moved to ./prompts/types.ts for domain organization // Re-export for backward compatibility export type { PromptArgument } from './prompts/types.js'; /** * Base interface for message content */ export interface BaseMessageContent { /** Type discriminator for the content */ type: string; } /** * Text message content */ export interface TextMessageContent extends BaseMessageContent { /** Type discriminator set to "text" */ type: "text"; /** The text content */ text: string; } /** * Types of message content supported by the system * Extensible for future content types */ export type MessageContent = TextMessageContent; /** * Role types for messages */ export type MessageRole = "user" | "assistant" | "system"; /** * A message in a conversation */ export interface Message { /** Role of the message sender */ role: MessageRole; /** Content of the message */ content: MessageContent; } // Category interface moved to ./prompts/types.ts export type { Category } from './prompts/types.js'; // PromptData interface moved to ./prompts/types.ts export type { PromptData } from './prompts/types.js'; // PromptsFile interface moved to ./prompts/types.ts export type { PromptsFile } from './prompts/types.js'; // PromptFile interface moved to ./prompts/types.ts export type { PromptFile } from './prompts/types.js'; // PromptsConfigFile interface moved to ./prompts/types.js export type { PromptsConfigFile } from './prompts/types.js'; ``` -------------------------------------------------------------------------------- /server/prompts/content_processing/noteIntegration.md: -------------------------------------------------------------------------------- ```markdown # Advanced Note Integration with Content Analysis Chain ## Description Advanced workflow that runs a comprehensive content analysis chain to transform raw content into publication-ready, interconnected notes optimized for Obsidian knowledge management systems. Uses intelligent defaults - only pass the content argument. ## System Message You are executing a sophisticated content analysis chain that transforms raw content into publication-ready Obsidian notes. Follow the S.P.A.R.C. methodology (Strategic Personal Archive with Refined Connectivity) and C.A.G.E.E.R.F framework. Each step builds upon the previous one to create comprehensive, interconnected knowledge assets. Use intelligent defaults for all optional parameters. ## User Message Template Execute a comprehensive content analysis chain to transform raw content into publication-ready, interconnected notes optimized for Obsidian knowledge management. ## Content Analysis Chain Workflow ### Input Content {{content}} {% if existing_notes %} ### Existing Notes Context {{existing_notes}} {% endif %} {% if vault_context %} ### Vault Context {{vault_context}} {% endif %} ### Processing Configuration (Using Intelligent Defaults) - **Domain**: {{domain or 'general'}} - **Analysis Depth**: {{analysis_depth or 'comprehensive'}} - **Structure Type**: {{structure_type or 'comprehensive'}} - **Integration Level**: {{integration_level or 'advanced'}} - **Target Readability**: {{target_readability or 'comprehensive'}} - **Metadata Depth**: {{metadata_depth or 'advanced'}} - **Quality Standards**: {{quality_standards or 'comprehensive'}} - **Enhancement Level**: {{enhancement_level or 'comprehensive'}} ### Expected Output This workflow will produce a sophisticated, publication-ready note that: - Preserves all original insights while adding professional structure - Leverages advanced Obsidian features (callouts, multi-column layouts, metadata) - Creates meaningful connections with existing vault content - Follows S.P.A.R.C. methodology for strategic knowledge management - Implements C.A.G.E.E.R.F framework for structured analysis - Meets professional documentation standards Execute the chain workflow to transform the provided content into an enhanced, integrated note ready for your Obsidian knowledge management system. ## Chain Steps 1. promptId: content_preservation_analysis stepName: Content Preservation Analysis inputMapping: content: content existing_content: existing_notes analysis_depth: analysis_depth outputMapping: analyzed_content: preserved_analysis 2. promptId: layered_note_structure stepName: Layered Note Structure Creation inputMapping: analyzed_content: preserved_analysis vault_context: vault_context structure_type: structure_type outputMapping: structured_content: layered_structure 3. promptId: smart_content_refinement stepName: Smart Content Refinement inputMapping: raw_content: layered_structure vault_context: vault_context integration_level: integration_level target_readability: target_readability outputMapping: refined_content: smart_refined 4. promptId: obsidian_metadata_optimizer stepName: Obsidian Metadata Optimization inputMapping: note_content: smart_refined vault_structure: vault_context metadata_depth: metadata_depth outputMapping: optimized_content: metadata_optimized 5. promptId: vault_integration_optimizer stepName: Vault Integration Optimization inputMapping: note_content: metadata_optimized vault_structure: vault_context integration_level: integration_level outputMapping: integrated_content: vault_integrated 6. promptId: note_quality_assurance stepName: Quality Assurance inputMapping: note_content: vault_integrated original_source: content quality_standards: quality_standards outputMapping: quality_assured: qa_content 7. promptId: format_enhancement stepName: Format Enhancement inputMapping: existing_content: qa_content domain: domain enhancement_level: enhancement_level outputMapping: final_note: enhanced_note ## Chain Steps 1. **Initial Content Analysis** (content_analysis) - Input Mapping: {"content":"content"} - Output Mapping: {"analysis_output":"step_0_output"} 2. **Find Related Vault Notes** (vault_related_notes_finder) - Input Mapping: {"note_topic":"content","content_areas":"analysis_output"} - Output Mapping: {"related_notes":"step_1_output"} 3. **Integrate Content with Existing Notes** (note_integration) - Input Mapping: {"notes":"existing_notes","new_information":"analysis_output"} - Output Mapping: {"integrated_content":"step_2_output"} 4. **Optimize Metadata** (obsidian_metadata_optimizer) - Input Mapping: {"note_content":"integrated_content","vault_structure":"vault_context"} - Output Mapping: {"metadata_optimized":"step_3_output"} 5. **Enhance Formatting** (format_enhancement) - Input Mapping: {"existing_content":"metadata_optimized","domain":"domain"} - Output Mapping: {"enhanced_content":"step_4_output"} 6. **Final Refinement** (note_refinement) - Input Mapping: {"notes":"enhanced_content"} - Output Mapping: {"final_output":"step_5_output"} ``` -------------------------------------------------------------------------------- /server/prompts/architecture/strategic-system-alignment.md: -------------------------------------------------------------------------------- ```markdown # Strategic System Alignment ## Description Strategically align systems and code towards architectural rules and goals with systematic implementation planning and progress tracking in /plans markdown notes ## System Message You are an expert system architect specializing in strategic alignment and systematic implementation. Your role is to analyze systems, identify alignment gaps with architectural rules and goals, select optimal implementation tactics, and track progress through structured markdown documentation. # CORE METHODOLOGY: Strategic Alignment Framework ## Phase 1: Context Discovery & Analysis ### 1A. System State Analysis **Objective**: Understand current architecture and implementation state **Actions**: - Read architectural documentation (CLAUDE.md, README, architecture docs) - Analyze codebase structure and patterns - Identify existing systems, coordinators, and integration points - Map current dependencies and data flows - Document performance characteristics and constraints ### 1B. Rules & Goals Alignment Assessment **Objective**: Identify gaps between current state and desired state **Actions**: - Compare current implementation against architectural rules - Evaluate alignment with stated goals - Identify violations, anti-patterns, and technical debt - Quantify alignment score (0-100%) for each rule/goal **Gap Analysis**: - **Critical Gaps**: Blocking violations requiring immediate action - **High Priority Gaps**: Significant misalignment affecting architecture - **Medium Priority Gaps**: Improvements needed for maintainability - **Low Priority Gaps**: Nice-to-have optimizations ### 1C. Risk Assessment **Objective**: Understand risks of both action and inaction **Risk Categories**: - **High Risk**: Breaking changes, performance regressions, data loss potential - **Medium Risk**: API changes requiring migration, significant refactoring - **Low Risk**: Internal changes, backward compatible improvements ## Phase 2: Strategic Planning ### 2A. Tactic Selection **Available Tactics**: 1. **Rename Refactoring** (Risk: Low, Impact: High) 2. **Extract Module/Service** (Risk: Medium, Impact: High) 3. **Consolidate Duplicates** (Risk: Medium-High, Impact: High) 4. **Deprecation Path** (Risk: Low, Impact: Medium) 5. **Event-Driven Coordination** (Risk: Medium, Impact: High) 6. **Documentation Enhancement** (Risk: Very Low, Impact: Medium) 7. **Performance Optimization** (Risk: Medium, Impact: Varies) ### 2B. Implementation Sequencing **Phase Structure**: - **Phase 0: Preparation** - Documentation, baseline metrics, backup plans - **Phase 1: Low-Risk Foundation** - Renames, documentation, non-breaking improvements - **Phase 2: Structural Changes** - Extractions, consolidations, refactoring - **Phase 3: Integration Updates** - Coordination changes, event-driven updates - **Phase 4: Validation** - Performance testing, integration testing, documentation ## Phase 3: Progress Tracking System ### 3A. Markdown Progress Note Management **Location Strategy**: 1. Check for existing note in `/plans/` matching the system name 2. If exists: Read and update existing note 3. If not: Create new note at `/plans/system-alignment-[system-name].md` **Required Sections**: ```markdown # System Alignment Progress: [Component/System Name] **Started**: [Date] **Last Updated**: [Date] **Status**: [Planning | In Progress | Validation | Completed] ## Executive Summary [Overview of alignment goals and current status] ## Alignment Assessment ### Rules Compliance | Rule | Current | Target | Gap | Priority | |------|---------|--------|-----|----------| ### Goals Progress | Goal | Current % | Target % | Status | |------|-----------|----------|--------| ## Implementation Plan ### Phase 0: Preparation - [ ] Tasks **Status**: [Not Started | In Progress | Completed] ## Tactical Decisions ### Tactic 1: [Name] **Selected**: [Date] **Rationale**: [Why] **Risk**: [Low|Medium|High] **Status**: [Planned|In Progress|Completed] ## Progress Log ### [Date] - [Phase] **Actions**: [What was done] **Outcomes**: [Results] **Issues**: [Problems] **Next**: [Steps] ## Validation Results [Tests, metrics, compliance] ## Outstanding Issues [Current blockers] ## Lessons Learned [Insights] ``` ### 3B. Update Protocol **Update After**: - Each tactic completion - Phase transitions - Blocking issues - Validation checkpoints ## Output Format ### 1. Context Analysis Summary [Current state, rules, goals, constraints] ### 2. Alignment Assessment [Gap analysis with priorities] ### 3. Strategic Plan [Sequenced tactics with rationale] ### 4. Progress Note Status [Created/Updated location] ### 5. Next Immediate Actions [Top 3-5 actions] ### 6. Validation Checkpoints [Key milestones] ## Guidelines - **Evidence-Based**: Back decisions with code analysis - **Risk-Aware**: Plan mitigation strategies - **Pragmatic**: Balance ideal vs practical - **Iterative**: Incremental progress with gates - **Transparent**: Document all decisions - **Goal-Oriented**: Align with rules and goals ## User Message Template Align the following system/component: {{task_description}} {% if context_files %} Context Files: {{context_files}} {% endif %} {% if architectural_rules %} Architectural Rules: {{architectural_rules}} {% endif %} {% if goals %} Goals: {{goals}} {% endif %} {% if constraints %} Constraints: {{constraints}} {% endif %} ``` -------------------------------------------------------------------------------- /server/tests/scripts/runtime-integration.js: -------------------------------------------------------------------------------- ```javascript #!/usr/bin/env node /** * Runtime System Integration Tests * Tests the new consolidated runtime architecture (application.ts + startup.ts) * Cross-platform compatible test script with robust error handling */ import { fileURLToPath } from 'url'; import path from 'path'; import { readFileSync } from 'fs'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); async function runtimeIntegrationTests() { try { console.log('🧪 Running runtime system integration tests...'); console.log(`🔧 Platform: ${process.platform}`); console.log(`🔧 Node.js: ${process.version}`); console.log(`🔧 Working directory: ${process.cwd()}`); // Check if build artifacts exist const distPath = path.join(__dirname, '../../dist'); console.log(`🔍 Checking build artifacts at: ${distPath}`); try { const runtimePath = path.join(distPath, 'runtime', 'application.js'); const startupPath = path.join(distPath, 'runtime', 'startup.js'); const utilsPath = path.join(distPath, 'utils', 'index.js'); console.log(`🔍 Looking for runtime module: ${runtimePath}`); console.log(`🔍 Looking for startup module: ${startupPath}`); console.log(`🔍 Looking for utils module: ${utilsPath}`); // Verify files exist before importing const fs = await import('fs'); if (!fs.existsSync(runtimePath)) { throw new Error(`Runtime application module not found at: ${runtimePath}`); } if (!fs.existsSync(startupPath)) { throw new Error(`Startup module not found at: ${startupPath}`); } if (!fs.existsSync(utilsPath)) { throw new Error(`Utils module not found at: ${utilsPath}`); } console.log('✅ Build artifacts verified'); } catch (fsError) { console.error('❌ Build artifacts check failed:', fsError.message); throw fsError; } // Dynamic imports with error handling let Application, MockLogger; try { console.log('🔍 Importing Application runtime...'); const runtimeModule = await import('../../dist/runtime/application.js'); Application = runtimeModule.Application; if (!Application) { throw new Error('Application not exported from runtime module'); } console.log('✅ Application runtime imported successfully'); } catch (importError) { console.error('❌ Failed to import Application runtime:', importError.message); throw importError; } try { console.log('🔍 Importing MockLogger...'); const utilsModule = await import('../../dist/utils/index.js'); MockLogger = utilsModule.MockLogger; if (!MockLogger) { throw new Error('MockLogger not exported from utils module'); } console.log('✅ MockLogger imported successfully'); } catch (importError) { console.error('❌ Failed to import MockLogger:', importError.message); throw importError; } console.log('🔍 Test 1: New runtime system validation'); const logger = new MockLogger(); console.log('✅ Logger instance created'); const app = new Application(logger); console.log('✅ Application runtime instance created'); // Test configuration loading try { await app.loadConfiguration(); console.log('✅ Configuration loaded successfully'); } catch (configError) { console.error('❌ Configuration loading failed:', configError.message); throw configError; } // Test prompts data loading try { await app.loadPromptsData(); console.log('✅ Prompts data loaded successfully'); } catch (promptsError) { console.error('❌ Prompts data loading failed:', promptsError.message); throw promptsError; } // Test modules initialization try { await app.initializeModules(); console.log('✅ Modules initialized successfully'); } catch (modulesError) { console.error('❌ Modules initialization failed:', modulesError.message); throw modulesError; } // Test health diagnostics try { const healthInfo = app.validateHealth(); if (!healthInfo || typeof healthInfo !== 'object') { throw new Error('Health diagnostics failed - invalid response'); } console.log(`✅ Health diagnostics validated: ${Object.keys(healthInfo).length} metrics`); } catch (healthError) { console.error('❌ Health diagnostics failed:', healthError.message); throw healthError; } // Test graceful shutdown try { await app.shutdown(); console.log('✅ Application shutdown completed successfully'); } catch (shutdownError) { console.error('❌ Application shutdown failed:', shutdownError.message); throw shutdownError; } console.log('🎉 Runtime system integration tests completed successfully'); process.exit(0); } catch (error) { console.error('❌ Runtime system integration tests failed:', error.message); console.error('Stack trace:', error.stack); // Additional debugging information console.error('\n🔍 Debugging information:'); console.error(`Current working directory: ${process.cwd()}`); console.error(`Script location: ${__dirname}`); console.error(`Platform: ${process.platform}`); console.error(`Node.js version: ${process.version}`); process.exit(1); } } runtimeIntegrationTests(); ``` -------------------------------------------------------------------------------- /server/prompts/analysis/note_integration.md: -------------------------------------------------------------------------------- ```markdown # Note Integration ## Description Integrate new information from a markdown page into existing notes, merging them smoothly while maintaining a logical structure and avoiding duplication. ## System Message You are an expert content organizer specializing in knowledge integration. Your task is to carefully merge new information into existing notes while preserving the significance of both sources. You excel at recognizing relationships between concepts, eliminating redundancy, and creating a cohesive final document that reads as if it was written as a single piece. ## User Message Template I need to integrate new information from a markdown page into my existing notes. Please merge this content smoothly while maintaining the logical flow and avoiding duplication. Here are my existing notes: <existing_notes> {{notes}} </existing_notes> Here is the new information to be integrated: <new_information> {{new_information}} </new_information> Please follow these steps to integrate the information: 1. **Review the Existing Notes** - Understand the current organization, themes, and specific details (e.g., materials, colors, techniques) so that you can determine where new information can be integrated without redundancy. 2. **Analyze the New Information** - Extract key topics, relevant points, and distinct details such as materials, processes, references, or techniques from the provided markdown page. Identify their value to the existing content. 3. **Plan the Integration** - Decide where each new element fits best in relation to the existing information. - Maintain detail richness from both the existing and newly introduced data, striving for logical inclusion rather than simple addition. 4. **Execute Integration and Edit for Continuity** - Insert new sections, bullet points, or merge content where related concepts already exist. - When new content introduces an entirely different subject, create distinct sections to accommodate these topics. - Maintain a logical, consistent flow throughout: Avoid redundancy, combine related sections, and add transitional language if required. 5. **Revise and Suggest** - If specific elements would be better as a completely new document or section, suggest that restructuring explicitly. 6. **Final Review** - Ensure that all sections flow smoothly with consistent formatting. - Adhere strictly to markdown conventions, using appropriate headers, links, bullet points, etc., to format the integrated notes clearly. Present your integrated notes within <integrated_notes> tags. The notes should read as a cohesive whole, as if they were written as a single document from the beginning. # Output Format Your integrated notes should be presented in a well-structured markdown format with: - Clear hierarchical organization using headings and subheadings - Appropriate use of bullet points, numbered lists, and other markdown elements - Consistent formatting throughout the document - Smooth transitions between existing and new content - No redundant or duplicated information After the integrated notes, please include a brief summary of what was added and how it was integrated within <integration_summary> tags. # Example **Existing Notes Sample:** ``` ## Materials Overview We currently use a variety of materials: - **Wood**: Mainly oak and pine. - **Metal**: Mild steel is typically chosen due to its versatility. - **Textiles**: Woven fibers, largely cotton. ### Techniques - Sanding and polishing wood to achieve a smooth finish. - Rust prevention using a metal primer. ## Updated Processes Our processes have recently included: - Extended curing time for painted surfaces. ``` **New Information Sample:** ``` ## Materials and Techniques We have introduced new textile materials, such as linen, and different coating options for metals, including galvanized coating for additional rust protection. An addition to our techniques includes a water-based polishing option for metals to avoid chemical polishing. ``` **Integrated Notes Sample:** <integrated_notes> ## Materials Overview We currently use a variety of materials: - **Wood**: Mainly oak and pine. - **Metal**: Mild steel is typically chosen due to its versatility. We have also introduced **galvanized coating** for added rust protection. - **Textiles**: Woven fibers, largely cotton, with the addition of linen. ### Techniques - Sanding and polishing wood to achieve a smooth finish. - Rust prevention using a metal primer and galvanized coating. - We have introduced a **water-based polishing option for metals**, avoiding chemical-based alternatives. ## Updated Processes Our processes have recently included: - Extended curing time for painted surfaces. </integrated_notes> <integration_summary> The integration added new materials (linen for textiles and galvanized coating for metals) to the existing Materials Overview section. A new technique (water-based polishing for metals) was added to the Techniques section. The information was merged within existing categories rather than creating new sections since the content was closely related. </integration_summary> # Notes - Ensure attention to preserving specific technical information (like types of materials or processes) - Avoid overlap by merging any redundant sections - Maintain fluid progression between old and new information to present the finalized notes as a unified whole - When appropriate, use formatting (bold, italics, etc.) to highlight newly added information - If new information contradicts existing notes, indicate this clearly and provide both perspectives ``` -------------------------------------------------------------------------------- /local-test.sh: -------------------------------------------------------------------------------- ```bash #!/bin/bash # Local GitHub Actions Testing Script # Provides convenient commands for testing workflows locally with Act set -e # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Act binary path ACT_BIN="$HOME/.local/bin/act" # Function to print colored output print_status() { echo -e "${BLUE}[INFO]${NC} $1" } print_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } print_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } print_error() { echo -e "${RED}[ERROR]${NC} $1" } # Function to check prerequisites check_prerequisites() { print_status "Checking prerequisites..." # Check if Act is installed if ! command -v "$ACT_BIN" &> /dev/null; then print_error "Act is not installed. Please run the installation script first." exit 1 fi print_success "Act is installed: $($ACT_BIN --version)" # Check if Docker is available if ! command -v docker &> /dev/null; then print_warning "Docker is not available. Please enable Docker Desktop WSL integration." print_warning "See setup-local-testing.md for instructions." return 1 fi # Test Docker connectivity if ! docker version &> /dev/null; then print_warning "Docker daemon is not running or not accessible." print_warning "Please start Docker Desktop and enable WSL integration." return 1 fi print_success "Docker is available and running" return 0 } # Function to list workflows list_workflows() { print_status "Available workflows:" "$ACT_BIN" --list } # Function to run dry run dry_run() { local job_name="$1" print_status "Running dry run for job: $job_name" "$ACT_BIN" --dryrun -j "$job_name" } # Function to run workflow locally run_workflow() { local job_name="$1" local event="${2:-push}" print_status "Running workflow locally..." print_status "Job: $job_name" print_status "Event: $event" if check_prerequisites; then "$ACT_BIN" -j "$job_name" --verbose else print_warning "Running in dry-run mode due to Docker issues" "$ACT_BIN" --dryrun -j "$job_name" fi } # Function to test specific workflow with event test_workflow() { local workflow_file="$1" local event="${2:-push}" print_status "Testing workflow file: $workflow_file" print_status "Event: $event" if check_prerequisites; then "$ACT_BIN" -W ".github/workflows/$workflow_file" "$event" --verbose else print_warning "Running in dry-run mode due to Docker issues" "$ACT_BIN" --dryrun -W ".github/workflows/$workflow_file" "$event" fi } # Function to run quick validation quick_validation() { print_status "Running quick validation tests..." # List of quick jobs to test local quick_jobs=("code-quality" "validate") for job in "${quick_jobs[@]}"; do print_status "Testing $job..." if check_prerequisites; then "$ACT_BIN" -j "$job" --verbose else print_warning "Running $job in dry-run mode" "$ACT_BIN" --dryrun -j "$job" fi done } # Function to show help show_help() { cat << EOF Local GitHub Actions Testing Script Usage: $0 [COMMAND] [OPTIONS] Commands: list List all available workflows dry-run <job> Run dry-run for specific job run <job> [event] Run workflow locally (default event: push) test <workflow> [event] Test specific workflow file quick Run quick validation tests check Check prerequisites help Show this help message Examples: $0 list # List all workflows $0 dry-run code-quality # Dry run code quality checks $0 run code-quality # Run code quality checks locally $0 run validate push # Run validation with push event $0 test ci.yml pull_request # Test CI workflow with PR event $0 quick # Run quick validation tests $0 check # Check prerequisites Common Jobs: - code-quality: Code Quality Checks - validate: Validate Build and Tests - enhanced-test-validation: Enhanced Test Suite - mcp-protocol-validation: MCP Protocol Compliance - cageerf-framework-validation: CAGEERF Framework Validation - performance-baseline: Performance Monitoring For more information, see setup-local-testing.md EOF } # Main script logic case "$1" in list) list_workflows ;; dry-run) if [ -z "$2" ]; then print_error "Job name is required for dry-run" echo "Usage: $0 dry-run <job_name>" exit 1 fi dry_run "$2" ;; run) if [ -z "$2" ]; then print_error "Job name is required for run" echo "Usage: $0 run <job_name> [event]" exit 1 fi run_workflow "$2" "$3" ;; test) if [ -z "$2" ]; then print_error "Workflow file is required for test" echo "Usage: $0 test <workflow_file> [event]" exit 1 fi test_workflow "$2" "$3" ;; quick) quick_validation ;; check) check_prerequisites ;; help|--help|-h) show_help ;; "") print_error "No command specified" show_help exit 1 ;; *) print_error "Unknown command: $1" show_help exit 1 ;; esac ``` -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- ```yaml name: CI/CD Pipeline on: push: branches: [main, develop] pull_request: branches: [main] env: NODE_ENV: test jobs: validate: name: Build and Core Validation runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest] node-version: [18] fail-fast: false defaults: run: shell: bash steps: - name: Detect Platform Environment id: platform shell: bash run: | if [ "$ACT" = "true" ]; then echo "environment=act" >> $GITHUB_OUTPUT echo "🎭 Running in ACT (local testing environment)" else echo "environment=github" >> $GITHUB_OUTPUT echo "🚀 Running in GitHub Actions" fi echo "os=${{ matrix.os }}" >> $GITHUB_OUTPUT - name: Checkout repository if: success() || failure() uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup Node.js ${{ matrix.node-version }} if: success() uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} cache: 'npm' cache-dependency-path: server/package-lock.json - name: Install dependencies if: success() working-directory: server run: npm ci --prefer-offline --no-audit - name: TypeScript type checking if: success() working-directory: server run: npm run typecheck - name: Build project if: success() working-directory: server run: npm run build - name: Run server integration tests if: success() working-directory: server run: npm run test:integration timeout-minutes: 3 - name: Validate MCP server startup (Cross-Platform) if: success() working-directory: server env: MCP_SERVER_ROOT: ${{ github.workspace }}/server run: npm run test:ci-startup timeout-minutes: 3 - name: Upload build artifacts uses: actions/upload-artifact@v4 with: name: build-artifacts path: | server/dist/ server/package.json server/package-lock.json retention-days: 7 enhanced-tests: name: Enhanced Functionality Tests runs-on: ubuntu-latest needs: validate steps: - name: Checkout repository uses: actions/checkout@v4 - name: Download build artifacts uses: actions/download-artifact@v4 with: name: build-artifacts path: server/ - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '18' cache: 'npm' cache-dependency-path: server/package-lock.json - name: Install dependencies working-directory: server run: npm ci --prefer-offline --no-audit - name: Run all enhanced tests working-directory: server run: npm run test:all-enhanced timeout-minutes: 10 release-platform-test: name: Cross-Platform Release Validation runs-on: ${{ matrix.os }} if: github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/') strategy: matrix: os: [windows-latest, macos-latest] node-version: [18] steps: - name: Checkout repository uses: actions/checkout@v4 - name: Setup Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} cache: 'npm' cache-dependency-path: server/package-lock.json - name: Install dependencies working-directory: server run: npm ci --prefer-offline --no-audit - name: Build and basic validation working-directory: server run: | npm run build npm run test:ci-startup timeout-minutes: 5 code-quality: name: Code Quality Checks runs-on: ubuntu-latest needs: validate steps: - name: Checkout repository uses: actions/checkout@v4 - name: Download build artifacts uses: actions/download-artifact@v4 with: name: build-artifacts path: server/ - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '18' cache: 'npm' cache-dependency-path: server/package-lock.json - name: Install dependencies working-directory: server run: npm ci --prefer-offline --no-audit - name: Check for sensitive files run: | if find . -name "*.env*" -o -name "*.key" -o -name "*.pem" -o -name "*.p12" | grep -v node_modules | grep -q .; then echo "❌ Sensitive files found in repository" find . -name "*.env*" -o -name "*.key" -o -name "*.pem" -o -name "*.p12" | grep -v node_modules exit 1 else echo "✅ No sensitive files found" fi - name: Validate source file consistency working-directory: server run: | # TypeScript projects should not have JS files in src/ if find src -name "*.js" | grep -q .; then echo "❌ JavaScript files found in TypeScript source directory" find src -name "*.js" exit 1 else echo "✅ Source directory contains only TypeScript files" fi - name: Validate build functionality working-directory: server run: | # Test that the built server can actually start npm run test:ci-startup ``` -------------------------------------------------------------------------------- /server/prompts/content_processing/obsidian_metadata_optimizer.md: -------------------------------------------------------------------------------- ```markdown # Obsidian Metadata Optimizer ## Description Creates comprehensive, intelligent metadata and frontmatter for Obsidian notes, optimizing for discoverability, organization, and advanced plugin functionality ## User Message Template [System Info: You are an Obsidian metadata specialist who creates intelligent, comprehensive frontmatter and metadata systems. You understand advanced tagging, plugin integration, and knowledge management optimization.] **OBSIDIAN METADATA OPTIMIZATION** Create comprehensive metadata for the following note content: **NOTE CONTENT:** ``` {{ note_content }} ``` {% if vault_structure %} **VAULT STRUCTURE:** ``` {{ vault_structure }} ``` {% endif %} **METADATA DEPTH**: {{ metadata_depth | default('comprehensive') }} **METADATA OPTIMIZATION PRINCIPLES:** - Create intelligent, searchable metadata structures - Optimize for plugin ecosystem functionality - Build comprehensive connection networks - Support advanced knowledge management workflows - Enable efficient organization and discovery **COMPREHENSIVE METADATA FRAMEWORK:** ## 1. CORE FRONTMATTER STRUCTURE Design essential metadata for note identification and organization: ```yaml --- # Core Identification title: "Descriptive Title" aliases: [Alternative Names, Abbreviations, Synonyms] tags: [hierarchical/tag/system, domain/specific, skill/level] # Temporal Information created: YYYY-MM-DD modified: YYYY-MM-DD reviewed: YYYY-MM-DD review-date: YYYY-MM-DD # Source Information author: "Content Creator" source: "Original URL or Reference" source-type: "video/article/book/course" duration: "Content length if applicable" # Content Classification type: "tutorial/reference/methodology/analysis" domain: "knowledge-domain" skill-level: "beginner/intermediate/advanced" difficulty: "1-10 scale" status: "active/review/archived/draft" # Knowledge Network prerequisites: [[Required Knowledge]] builds-on: [[Foundation Concepts]] related: [[Connected Topics]] part-of: [[Parent Topic or Series]] leads-to: [[Next Steps or Advanced Topics]] # Learning Integration learning-path: "progression-pathway" learning-stage: "foundation/development/mastery" practice-required: true/false review-frequency: "weekly/monthly/quarterly" # Vault Organization moc: [[Map of Content]] folder: "vault-folder-location" connections: 5 # Number of vault connections --- ``` ## 2. INTELLIGENT TAGGING SYSTEM Create hierarchical, searchable tag structures: **Domain Tags**: `#art/perspective`, `#programming/python`, `#business/strategy` **Skill Level Tags**: `#skill/beginner`, `#skill/intermediate`, `#skill/advanced` **Content Type Tags**: `#type/tutorial`, `#type/reference`, `#type/methodology` **Status Tags**: `#status/active`, `#status/review`, `#status/mastered` **Feature Tags**: `#has-examples`, `#has-exercises`, `#has-templates` **Connection Tags**: `#builds-on`, `#prerequisite-for`, `#related-to` ## 3. PLUGIN ECOSYSTEM INTEGRATION Optimize metadata for popular Obsidian plugins: **Dataview Integration:** ```yaml # Dataview-friendly fields practice-time: 30 # minutes completion-rate: 0.8 # 0-1 scale last-practiced: YYYY-MM-DD next-review: YYYY-MM-DD importance: high/medium/low ``` **Templater Integration:** ```yaml # Template variables template-used: "note-template-name" auto-generated: true/false template-version: "1.0" ``` **Spaced Repetition:** ```yaml # Learning optimization retention-rate: 0.9 review-count: 3 mastery-level: 0.7 ``` **Tasks Plugin:** ```yaml # Task management has-tasks: true task-completion: 0.6 ``` ## 4. KNOWLEDGE MANAGEMENT METADATA Support advanced knowledge organization: **MOC Integration:** ```yaml # Map of Content connections parent-moc: [[Primary MOC]] child-mocs: [[Subtopic MOCs]] cross-domain-links: [[Related Field MOCs]] ``` **Learning Pathways:** ```yaml # Progressive learning pathway: "skill-development-path" sequence: 3 # Position in learning sequence prerequisites-met: true/false ready-for-next: true/false ``` **Network Analysis:** ```yaml # Connection metrics in-degree: 8 # Number of incoming links out-degree: 12 # Number of outgoing links centrality: 0.7 # Network importance cluster: "knowledge-cluster-name" ``` ## 5. SEARCH AND DISCOVERY OPTIMIZATION Enhance findability and discoverability: **Search Keywords:** ```yaml # Enhanced search terms keywords: [search, terms, for, discovery] concepts: [main, conceptual, themes] synonyms: [alternative, terminology] ``` **Content Indicators:** ```yaml # Content characteristics has-images: true has-code: false has-formulas: true has-references: true word-count: 2500 read-time: 10 # minutes ``` ## 6. WORKFLOW INTEGRATION Support daily and review workflows: **Daily Note Integration:** ```yaml # Daily workflow daily-note-mention: true agenda-item: false quick-capture: false ``` **Review System:** ```yaml # Review optimization review-type: "spaced-repetition" review-priority: high/medium/low review-notes: "specific areas needing attention" ``` **PROJECT INTEGRATION:** ```yaml # Project connections project: [[Related Project]] milestone: "project-milestone" deliverable: true/false ``` ## 7. ADVANCED METADATA FEATURES Utilize cutting-edge Obsidian capabilities: **Canvas Integration:** ```yaml # Visual organization canvas-included: true canvas-name: "knowledge-map-canvas" visual-position: "center/periphery" ``` **Community Plugin Support:** ```yaml # Extended functionality excalidraw-diagrams: true advanced-tables: false mind-map-included: true ``` **METADATA OUTPUT REQUIREMENTS:** - Comprehensive frontmatter with intelligent field selection - Hierarchical tag system optimized for discovery - Plugin ecosystem integration for enhanced functionality - Knowledge management structure support - Advanced search and organization capabilities Generate optimized metadata that leverages Obsidian's full potential while maintaining clean organization and maximum discoverability. ``` -------------------------------------------------------------------------------- /server/tests/ci-startup-validation.js: -------------------------------------------------------------------------------- ```javascript #!/usr/bin/env node /** * Cross-Platform CI Startup Validation * Industry-standard Node.js test script for CI/CD pipelines * * This replaces all shell-specific validation logic with programmatic testing * that works identically across Windows, macOS, and Linux. */ import { fileURLToPath } from 'url'; import path from 'path'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); /** * CI-specific console logging that respects CI environment expectations */ const ci = { info: (message) => console.log(`[INFO] ${message}`), success: (message) => console.log(`[SUCCESS] ${message}`), error: (message) => console.error(`[ERROR] ${message}`), debug: (message) => { // Only show debug in verbose mode if (process.env.VERBOSE) { console.log(`[DEBUG] ${message}`); } } }; /** * Validate that build artifacts exist and are correct */ async function validateBuildArtifacts() { ci.info('Validating build artifacts...'); const fs = await import('fs'); const distPath = path.join(__dirname, '../dist'); // Check dist directory exists if (!fs.existsSync(distPath)) { throw new Error('Build directory not found: dist/'); } // Check main entry point exists const mainEntryPoint = path.join(distPath, 'index.js'); if (!fs.existsSync(mainEntryPoint)) { throw new Error('Main entry point not found: dist/index.js'); } // Check key modules exist const requiredModules = [ 'runtime/application.js', 'runtime/startup.js', 'utils/index.js', 'utils/global-resource-tracker.js', 'config/index.js', 'logging/index.js', 'mcp-tools/prompt-engine/index.js', 'mcp-tools/prompt-manager/index.js', 'mcp-tools/system-control.js' ]; for (const module of requiredModules) { const modulePath = path.join(distPath, module); if (!fs.existsSync(modulePath)) { throw new Error(`Required module not found: dist/${module}`); } } ci.success('Build artifacts validation passed'); } /** * Validate server startup using direct module imports * This is much more reliable than parsing shell output */ async function validateServerStartup() { ci.info('Validating server startup...'); try { // Set CI environment to get clean output process.env.CI = 'true'; process.env.NODE_ENV = 'test'; // Import the runtime application directly const { Application } = await import('../dist/runtime/application.js'); const { MockLogger } = await import('../dist/utils/index.js'); ci.debug('Creating application instance...'); const logger = new MockLogger(); const app = new Application(logger); // Test application configuration loading ci.debug('Loading configuration...'); await app.loadConfiguration(); ci.debug('Configuration loaded successfully'); // Test prompts data loading ci.debug('Loading prompts data...'); await app.loadPromptsData(); ci.debug('Prompts data loaded successfully'); // Test modules initialization ci.debug('Initializing modules...'); await app.initializeModules(); ci.debug('Modules initialized successfully'); // Test health validation ci.debug('Validating health...'); const healthInfo = app.validateHealth(); if (!healthInfo || typeof healthInfo !== 'object') { throw new Error('Health validation failed - invalid health info'); } ci.debug(`Health info collected: ${Object.keys(healthInfo).length} metrics`); // Clean shutdown ci.debug('Shutting down application...'); await app.shutdown(); ci.success('Server startup validation passed'); return { configLoaded: true, promptsLoaded: true, modulesInitialized: true, healthValidated: true, shutdownClean: true }; } catch (error) { throw new Error(`Server startup validation failed: ${error.message}`); } } /** * Run comprehensive CI validation */ async function runCIValidation() { const startTime = Date.now(); try { ci.info('Starting CI startup validation...'); ci.info(`Platform: ${process.platform}`); ci.info(`Node.js: ${process.version}`); ci.info(`Working directory: ${process.cwd()}`); // Phase 1: Build artifacts validation await validateBuildArtifacts(); // Phase 2: Server startup validation const results = await validateServerStartup(); const duration = Date.now() - startTime; ci.success('='.repeat(50)); ci.success('CI STARTUP VALIDATION PASSED'); ci.success('='.repeat(50)); ci.info(`Configuration loaded: ${results.configLoaded}`); ci.info(`Prompts loaded: ${results.promptsLoaded}`); ci.info(`Modules initialized: ${results.modulesInitialized}`); ci.info(`Health validated: ${results.healthValidated}`); ci.info(`Clean shutdown: ${results.shutdownClean}`); ci.info(`Total duration: ${duration}ms`); // Clean exit for CI process.exit(0); } catch (error) { const duration = Date.now() - startTime; ci.error('='.repeat(50)); ci.error('CI STARTUP VALIDATION FAILED'); ci.error('='.repeat(50)); ci.error(`Error: ${error.message}`); ci.error(`Duration: ${duration}ms`); ci.error(`Platform: ${process.platform}`); ci.error(`Node.js: ${process.version}`); // Show stack trace in debug mode if (process.env.VERBOSE) { ci.error('Stack trace:'); ci.error(error.stack); } // Clean exit with error code for CI process.exit(1); } } // Handle uncaught errors gracefully process.on('uncaughtException', (error) => { ci.error(`Uncaught exception: ${error.message}`); process.exit(1); }); process.on('unhandledRejection', (reason, promise) => { ci.error(`Unhandled rejection: ${reason}`); process.exit(1); }); // Run the validation runCIValidation(); ``` -------------------------------------------------------------------------------- /server/tests/enhanced-validation/contract-validation/interface-contracts.ts: -------------------------------------------------------------------------------- ```typescript /** * Interface Contract Validation System * * Validates that mock objects fully implement expected interfaces to prevent * runtime method missing errors like the registerTool issue. */ export interface ContractValidationResult { isValid: boolean; missingMethods: string[]; incompatibleSignatures: Array<{ method: string; expected: string; actual: string; }>; recommendations: string[]; } export interface ContractValidationReport { mockObjectName: string; referenceInterface: string; validationResult: ContractValidationResult; timestamp: Date; validatedMethods: string[]; } /** * MCP SDK Interface Contract Validator * * Prevents interface mismatches by validating mock objects against real SDK interfaces */ export class McpSdkInterfaceValidator { private logger: any; constructor(logger: any) { this.logger = logger; } /** * Validate tool registration interface compatibility * Specifically addresses the registerTool method mismatch issue */ async validateToolRegistrationInterface(mockServer: any): Promise<ContractValidationResult> { const requiredMethods = [ 'tool', // Existing method in MockMcpServer 'registerTool' // Missing method that caused CI failure ]; const missingMethods: string[] = []; const incompatibleSignatures: Array<{method: string; expected: string; actual: string}> = []; // Check for missing methods for (const method of requiredMethods) { if (typeof mockServer[method] !== 'function') { missingMethods.push(method); } } // Validate method signatures if they exist if (typeof mockServer.tool === 'function') { const toolMethod = mockServer.tool; if (toolMethod.length < 3) { incompatibleSignatures.push({ method: 'tool', expected: 'tool(name: string, description: string, schema: any)', actual: `tool with ${toolMethod.length} parameters` }); } } if (typeof mockServer.registerTool === 'function') { const registerToolMethod = mockServer.registerTool; if (registerToolMethod.length < 3) { incompatibleSignatures.push({ method: 'registerTool', expected: 'registerTool(name: string, config: any, handler: Function)', actual: `registerTool with ${registerToolMethod.length} parameters` }); } } // Generate recommendations const recommendations: string[] = []; if (missingMethods.includes('registerTool')) { recommendations.push('Add registerTool method that delegates to existing tool method'); recommendations.push('Ensure registerTool accepts (name, config, handler) parameters'); } const isValid = missingMethods.length === 0 && incompatibleSignatures.length === 0; return { isValid, missingMethods, incompatibleSignatures, recommendations }; } /** * Validate transport layer interface compatibility */ async validateTransportInterface(mockTransport: any): Promise<ContractValidationResult> { const requiredMethods = ['sendMessage', 'onMessage', 'close']; const missingMethods: string[] = []; for (const method of requiredMethods) { if (typeof mockTransport[method] !== 'function') { missingMethods.push(method); } } return { isValid: missingMethods.length === 0, missingMethods, incompatibleSignatures: [], recommendations: missingMethods.length > 0 ? [`Implement missing transport methods: ${missingMethods.join(', ')}`] : [] }; } /** * Comprehensive method signature validation */ validateMethodSignatures(mockObject: any, expectedMethods: Record<string, number>): ContractValidationResult { const missingMethods: string[] = []; const incompatibleSignatures: Array<{method: string; expected: string; actual: string}> = []; for (const [methodName, expectedParamCount] of Object.entries(expectedMethods)) { if (typeof mockObject[methodName] !== 'function') { missingMethods.push(methodName); } else { const actualParamCount = mockObject[methodName].length; if (actualParamCount !== expectedParamCount) { incompatibleSignatures.push({ method: methodName, expected: `${expectedParamCount} parameters`, actual: `${actualParamCount} parameters` }); } } } return { isValid: missingMethods.length === 0 && incompatibleSignatures.length === 0, missingMethods, incompatibleSignatures, recommendations: [] }; } /** * Generate comprehensive validation report */ async generateContractReport(mockServer: any, mockObjectName: string = 'MockMcpServer'): Promise<ContractValidationReport> { this.logger.debug(`[CONTRACT VALIDATOR] Generating report for ${mockObjectName}`); const validationResult = await this.validateToolRegistrationInterface(mockServer); const validatedMethods = ['tool', 'registerTool'].filter(method => typeof mockServer[method] === 'function' ); return { mockObjectName, referenceInterface: 'MCP SDK Server Interface', validationResult, timestamp: new Date(), validatedMethods }; } /** * Quick validation check for CI/testing */ async quickValidation(mockServer: any): Promise<boolean> { const result = await this.validateToolRegistrationInterface(mockServer); if (!result.isValid) { this.logger.error('[CONTRACT VALIDATOR] Interface validation failed:', { missingMethods: result.missingMethods, incompatibleSignatures: result.incompatibleSignatures, recommendations: result.recommendations }); } return result.isValid; } } /** * Factory function for creating validator instance */ export function createMcpSdkInterfaceValidator(logger: any): McpSdkInterfaceValidator { return new McpSdkInterfaceValidator(logger); } ``` -------------------------------------------------------------------------------- /server/prompts/content_processing/prompts.json: -------------------------------------------------------------------------------- ```json { "prompts": [ { "id": "obsidian_metadata_optimizer", "name": "Obsidian Metadata Optimizer", "category": "content_processing", "description": "Creates comprehensive, intelligent metadata and frontmatter for Obsidian notes, optimizing for discoverability, organization, and advanced plugin functionality", "file": "obsidian_metadata_optimizer.md", "arguments": [ { "name": "note_content", "description": "The note content to analyze for metadata creation", "required": true }, { "name": "vault_structure", "description": "Current vault structure and organization", "required": false }, { "name": "metadata_depth", "description": "Metadata depth: 'essential', 'comprehensive', 'advanced', 'network_optimized'", "required": false } ] }, { "id": "format_enhancement", "name": "Format Enhancement Workflow", "category": "content_processing", "description": "Transform existing basic markdown notes to advanced Obsidian formatting standards with professional presentation and interactive elements", "file": "format_enhancement.md", "arguments": [ { "name": "existing_content", "description": "The existing note content to enhance with advanced formatting", "required": true }, { "name": "domain", "description": "Knowledge domain for appropriate formatting strategy", "required": false }, { "name": "enhancement_level", "description": "Enhancement intensity: standard, comprehensive, showcase (default: comprehensive)", "required": false } ] }, { "id": "noteIntegration", "name": "Advanced Note Integration with Content Analysis Chain", "category": "content_processing", "description": "Advanced workflow that runs a comprehensive content analysis chain to transform raw content into publication-ready, interconnected notes optimized for Obsidian knowledge management systems. Uses intelligent defaults - only pass the content argument.", "file": "noteIntegration.md", "arguments": [ { "name": "content", "description": "The raw content to be processed and integrated", "required": true }, { "name": "existing_notes", "description": "Any existing notes to preserve and integrate with", "required": false }, { "name": "vault_context", "description": "Context about the vault structure and existing content", "required": false }, { "name": "domain", "description": "Knowledge domain for appropriate formatting strategy (e.g., 'creative_arts', 'technical', 'personal_development')", "required": false }, { "name": "analysis_depth", "description": "Analysis depth: 'surface', 'standard', 'comprehensive', 'exhaustive' (default: comprehensive)", "required": false }, { "name": "structure_type", "description": "Structure type: 'comprehensive', 'method_focused', 'reference_optimized' (default: comprehensive)", "required": false }, { "name": "integration_level", "description": "Integration level: 'basic', 'standard', 'advanced', 'network_optimized' (default: advanced)", "required": false }, { "name": "target_readability", "description": "Target readability: 'concise', 'balanced', 'comprehensive' (default: comprehensive)", "required": false }, { "name": "metadata_depth", "description": "Metadata depth: 'essential', 'comprehensive', 'advanced', 'network_optimized' (default: advanced)", "required": false }, { "name": "quality_standards", "description": "Quality standards: 'basic', 'professional', 'comprehensive', 'academic' (default: comprehensive)", "required": false }, { "name": "enhancement_level", "description": "Enhancement intensity: 'standard', 'comprehensive', 'showcase' (default: comprehensive)", "required": false } ] }, { "id": "vault_related_notes_finder", "name": "Vault Related Notes Finder", "category": "content_processing", "description": "Searches vault for actual related notes using content analysis and glob/grep patterns to find real cross-references", "file": "vault_related_notes_finder.md", "arguments": [ { "name": "note_topic", "description": "Main topic of the note", "required": true }, { "name": "content_areas", "description": "Key content areas covered in the note", "required": true }, { "name": "vault_path", "description": "Path to vault root directory", "required": false } ] }, { "id": "video_notes_enhanced", "name": "Enhanced Video Notes Chain", "category": "content_processing", "description": "Comprehensive video processing chain including content analysis, visual extraction, vault integration, and note creation with proper formatting", "file": "video_notes_enhanced.md", "arguments": [ { "name": "video_url", "description": "YouTube video URL", "required": true }, { "name": "topic", "description": "Main topic/subject", "required": true }, { "name": "content_areas", "description": "Key content areas covered", "required": true }, { "name": "duration", "description": "Video duration", "required": false } ] } ] } ``` -------------------------------------------------------------------------------- /server/tests/scripts/performance-memory.js: -------------------------------------------------------------------------------- ```javascript #!/usr/bin/env node /** * Performance and Memory Tests - Updated for Consolidated Architecture * Tests current system performance instead of deprecated components */ async function performanceTests() { try { console.log('🧪 Running performance and memory tests for consolidated architecture...'); // Test current system components instead of deprecated ones const { Application } = await import('../../dist/runtime/application.js'); const { createSimpleLogger } = await import('../../dist/logging/index.js'); console.log('⏱️ Starting performance tests...'); const logger = createSimpleLogger(); const application = new Application(logger); // Performance benchmarks for current system console.log('📊 System Startup Performance:'); // Test startup performance const startupStart = Date.now(); await application.loadConfiguration(); const configDuration = Date.now() - startupStart; const promptsStart = Date.now(); await application.loadPromptsData(); const promptsDuration = Date.now() - promptsStart; const modulesStart = Date.now(); await application.initializeModules(); const modulesDuration = Date.now() - modulesStart; const totalStartup = configDuration + promptsDuration + modulesDuration; console.log(` Config loading: ${configDuration}ms`); console.log(` Prompts loading: ${promptsDuration}ms`); console.log(` Modules initialization: ${modulesDuration}ms`); console.log(` Total startup time: ${totalStartup}ms`); // Evidence-based performance baselines (measured from actual system) // These are based on p95 performance + 20% safety margin const PERFORMANCE_BASELINES = { startup: 3000, // Evidence-based: actual p95 + margin config: 200, // Evidence-based: config loading baseline prompts: 800, // Evidence-based: prompts loading baseline modules: 1500, // Evidence-based: modules initialization baseline routing: 1.0, // Evidence-based: <1ms command routing detection memory: 150 // Evidence-based: 150MB RSS memory baseline }; console.log('\n🎯 Performance Baseline Validation:'); let baselinesPassed = 0; let totalBaselines = 0; // Config loading baseline totalBaselines++; if (configDuration <= PERFORMANCE_BASELINES.config) { console.log(` ✅ Config loading: ${configDuration}ms (baseline: ${PERFORMANCE_BASELINES.config}ms)`); baselinesPassed++; } else { console.log(` ❌ Config loading: ${configDuration}ms (exceeds baseline: ${PERFORMANCE_BASELINES.config}ms)`); } // Prompts loading baseline totalBaselines++; if (promptsDuration <= PERFORMANCE_BASELINES.prompts) { console.log(` ✅ Prompts loading: ${promptsDuration}ms (baseline: ${PERFORMANCE_BASELINES.prompts}ms)`); baselinesPassed++; } else { console.log(` ❌ Prompts loading: ${promptsDuration}ms (exceeds baseline: ${PERFORMANCE_BASELINES.prompts}ms)`); } // Modules initialization baseline totalBaselines++; if (modulesDuration <= PERFORMANCE_BASELINES.modules) { console.log(` ✅ Modules init: ${modulesDuration}ms (baseline: ${PERFORMANCE_BASELINES.modules}ms)`); baselinesPassed++; } else { console.log(` ❌ Modules init: ${modulesDuration}ms (exceeds baseline: ${PERFORMANCE_BASELINES.modules}ms)`); } // Total startup baseline totalBaselines++; if (totalStartup <= PERFORMANCE_BASELINES.startup) { console.log(` ✅ Total startup: ${totalStartup}ms (baseline: ${PERFORMANCE_BASELINES.startup}ms)`); baselinesPassed++; } else { console.log(` ❌ Total startup: ${totalStartup}ms (exceeds baseline: ${PERFORMANCE_BASELINES.startup}ms)`); } const baselineSuccessRate = (baselinesPassed / totalBaselines) * 100; if (baselineSuccessRate >= 75) { console.log(`\n✅ Performance baselines achieved (${baselineSuccessRate.toFixed(1)}%)`); } else { console.log(`\n⚠️ Performance baseline concerns (${baselineSuccessRate.toFixed(1)}% passed)`); } // Memory usage testing console.log('💾 Memory Usage Tests:'); const initialMemory = process.memoryUsage(); console.log(` Initial memory - Heap: ${(initialMemory.heapUsed / 1024 / 1024).toFixed(2)}MB, RSS: ${(initialMemory.rss / 1024 / 1024).toFixed(2)}MB`); // Simulate some operations for (let i = 0; i < 100; i++) { // Simulate current system operations const operationData = { operation: `memory_test_${i}`, data: new Array(1000).fill(i) }; } // Force garbage collection if available if (global.gc) { global.gc(); } const finalMemory = process.memoryUsage(); const heapIncrease = (finalMemory.heapUsed - initialMemory.heapUsed) / 1024 / 1024; const rssIncrease = (finalMemory.rss - initialMemory.rss) / 1024 / 1024; console.log(` Final memory - Heap: ${(finalMemory.heapUsed / 1024 / 1024).toFixed(2)}MB, RSS: ${(finalMemory.rss / 1024 / 1024).toFixed(2)}MB`); console.log(` Memory increase - Heap: ${heapIncrease.toFixed(2)}MB, RSS: ${rssIncrease.toFixed(2)}MB`); // Memory leak threshold check const memoryThreshold = 50; // MB if (heapIncrease > memoryThreshold) { console.log(`⚠️ Warning: Heap memory increased by ${heapIncrease.toFixed(2)}MB (threshold: ${memoryThreshold}MB)`); } else { console.log(`✅ Memory usage acceptable: ${heapIncrease.toFixed(2)}MB heap increase`); } console.log('📊 Performance Summary:'); console.log(` ✅ Total startup time: ${totalStartup}ms`); console.log(` ✅ Memory increase: ${heapIncrease.toFixed(2)}MB`); console.log(' ✅ All tests completed successfully'); } catch (error) { console.error('❌ Performance tests failed:', error.message); process.exit(1); } } // Run the performance tests if (import.meta.url === `file://${process.argv[1]}`) { performanceTests().catch(error => { console.error('❌ Test execution failed:', error); process.exit(1); }); } export { performanceTests }; ``` -------------------------------------------------------------------------------- /server/prompts/analysis/prompts.json: -------------------------------------------------------------------------------- ```json { "prompts": [ { "id": "progressive_research", "name": "Progressive Research Assistant", "category": "analysis", "description": "A step-by-step research assistant that builds knowledge incrementally through iterative questions and analysis.", "file": "progressive_research.md", "arguments": [ { "name": "notes", "description": "The initial notes or information to research and expand on", "required": false }, { "name": "information", "description": "Additional context or information to guide the research", "required": false } ] }, { "id": "note_refinement", "name": "Note Refinement", "category": "analysis", "description": "Refine existing notes by improving organization, flow, and clarity without adding or modifying the content.", "file": "note_refinement.md", "arguments": [], "onEmptyInvocation": "return_template" }, { "id": "note_integration", "name": "Note Integration", "category": "analysis", "description": "Integrate new information from a markdown page into existing notes, merging them smoothly while maintaining a logical structure and avoiding duplication.", "file": "note_integration.md", "arguments": [ { "name": "notes", "description": "The existing notes", "required": false }, { "name": "new_information", "description": "The new information to be integrated", "required": false } ] }, { "id": "query_refinement", "name": "Query Refinement", "category": "analysis", "description": "A systematic process to analyze and refine ambiguous coding requests into clear, actionable specifications.", "file": "query_refinement.md", "arguments": [ { "name": "query", "description": "The original user query to refine", "required": false } ] }, { "id": "advanced_analysis_engine", "name": "Advanced Analysis Engine", "category": "analysis", "description": "Complex template testing prompt with advanced Nunjucks features including conditionals, loops, inheritance, filters, and multi-format output generation. Designed to stress-test the template engine with maximum complexity.", "file": "advanced_analysis_engine.md", "arguments": [ { "name": "topic", "description": "Main topic or subject for analysis", "required": true }, { "name": "analysis_type", "description": "Type of analysis: market, technical, competitive, trend, risk, opportunity", "required": false }, { "name": "sources", "description": "Array of data sources: web, papers, news, social, industry, expert", "required": false }, { "name": "depth", "description": "Analysis depth: surface, standard, comprehensive, expert", "required": false }, { "name": "format", "description": "Output format: executive_summary, technical_report, presentation, research_paper", "required": false }, { "name": "focus_areas", "description": "Array of focus areas: technical, business, ethical, regulatory, social, environmental", "required": false }, { "name": "constraints", "description": "Object with constraints like time_limit, budget, scope, audience", "required": false }, { "name": "requirements", "description": "Array of specific requirements or objects with category, description, priority, examples", "required": false }, { "name": "previous_context", "description": "Previous analysis context to build upon", "required": false } ] }, { "id": "notes", "name": "Notes", "category": "analysis", "description": "Enhanced notes chain that searches the vault for actual related notes instead of generating fictional ones - UPDATED\"", "file": "notes.md", "arguments": [ { "name": "content", "description": "Source content to analyze", "required": true }, { "name": "video_url", "description": "YouTube video URL for visual extraction", "required": false }, { "name": "topic", "description": "Main topic/subject", "required": false }, { "name": "content_areas", "description": "Key content areas covered", "required": false } ] }, { "id": "content_analysis", "name": "Content Analysis", "category": "analysis", "description": "Systematically analyze web content, breaking it down into key components.", "file": "content_analysis.md", "arguments": [ { "name": "content", "description": "The content to be analyzed", "required": false } ] }, { "id": "deep_analysis", "name": "Deep Analysis", "category": "analysis", "description": "Expand on a previous analysis by diving deeper into information, identifying key insights and relationships.", "file": "deep_analysis.md", "arguments": [] }, { "id": "deep_research", "name": "Deep Research Framework", "category": "analysis", "description": "A comprehensive framework for conducting thorough, methodical research on complex topics with academic rigor.", "file": "deep_research.md", "arguments": [ { "name": "topic", "description": "The research topic to investigate comprehensively", "required": true } ] }, { "id": "review", "name": "review", "category": "analysis", "description": "Comprehensive audit template for modules, implementations, and system integrations", "file": "review.md", "arguments": [ { "name": "target", "type": "string", "description": "The module, implementation, system, or functionality to audit (e.g., '@/ path implementation', 'MusicSyncService', 'color harmony modules')" } ] } ] } ``` -------------------------------------------------------------------------------- /server/prompts/general/diagnose.md: -------------------------------------------------------------------------------- ```markdown # Codebase Diagnostics ## Description Systematically diagnose issues in codebases including bugs, performance problems, security vulnerabilities, architecture issues, and technical debt ## System Message You are an expert code diagnostician specializing in systematic issue analysis across multiple dimensions: code quality, architecture, performance, security, testing, and technical debt. Your role is to: 1. Gather evidence through diagnostic commands and code analysis 2. Identify issues across all quality dimensions 3. Prioritize findings by severity and impact 4. Provide actionable recommendations with clear implementation steps 5. Follow evidence-based practices (no guessing, concrete data only) Use the tools available (Read, Grep, Glob, Bash) to systematically analyze the codebase. Run actual diagnostic commands (typecheck, lint, test, audit) to gather real data. Be thorough but efficient. Focus on high-impact issues first. Provide specific file paths and line numbers. Include code examples where relevant. Your analysis should be structured, prioritized, and actionable. ## User Message Template Perform comprehensive diagnostic analysis of the codebase. {% if scope %} **Analysis Scope**: {{ scope }} {% else %} **Analysis Scope**: Full codebase analysis {% endif %} {% if focus %} **Focus Areas**: {{ focus }} {% endif %} {% if symptoms %} **Reported Symptoms**: {{ symptoms }} {% endif %} ## Diagnostic Protocol ### Phase 1: Context Discovery 1. **Project Understanding**: - Identify tech stack and framework versions - Review project structure and architecture patterns - Check build configuration and dependencies - Analyze git history for recent changes 2. **Issue Surface Mapping**: - Scan for compilation/build errors - Check for runtime errors and warnings - Review test failures and coverage gaps - Identify linting and type errors ### Phase 2: Systematic Analysis Analyze across these dimensions: #### A. **Code Quality Issues** - TypeScript/linting errors and warnings - Type safety violations (`any` usage, missing types) - Unused variables, imports, and dead code - Code complexity and maintainability metrics - Naming convention violations #### B. **Architectural Problems** - Circular dependencies - Tight coupling and poor separation of concerns - Violated design principles (SOLID, DRY) - Inconsistent patterns across codebase - Missing abstractions or over-abstraction #### C. **Performance Issues** - Memory leaks and inefficient resource usage - Unnecessary re-renders or computations - Bundle size problems - Build time bottlenecks - Runtime performance regressions #### D. **Security Vulnerabilities** - Dependency vulnerabilities (audit results) - Input validation gaps - Authentication/authorization issues - Exposed secrets or sensitive data - XSS, injection, or CSRF risks #### E. **Testing Gaps** - Missing test coverage for critical paths - Flaky or unreliable tests - Integration test coverage - Edge case validation - Performance regression tests #### F. **Technical Debt** - Deprecated API usage - Outdated dependencies - TODO comments and temporary solutions - Duplicated code - Legacy patterns needing migration ### Phase 3: Evidence Gathering For each identified issue: 1. **Run diagnostic commands**: ```bash npm run typecheck npm run lint npm test npm audit npx madge --circular src/ ``` 2. **Collect metrics**: - Error counts and severity - Test coverage percentages - Build time and bundle size - Complexity scores 3. **Document examples**: - Specific file paths and line numbers - Error messages and stack traces - Code snippets demonstrating issues ### Phase 4: Prioritized Findings Present findings in this structure: #### Critical (Fix Immediately) - Issues breaking functionality - Security vulnerabilities - Data corruption risks - Build/deployment blockers #### High Priority (Fix Soon) - Performance degradation - Poor user experience - High-impact technical debt - Test coverage gaps in critical paths #### Medium Priority (Plan to Fix) - Code quality issues - Moderate technical debt - Missing documentation - Refactoring opportunities #### Low Priority (Nice to Have) - Minor style violations - Optional optimizations - Enhancement opportunities ### Phase 5: Actionable Recommendations For each priority level, provide: 1. **Root Cause Analysis**: Why does this issue exist? 2. **Impact Assessment**: What are the consequences? 3. **Solution Options**: Multiple approaches with trade-offs 4. **Implementation Steps**: Concrete action items 5. **Validation Plan**: How to verify the fix works ### Phase 6: Diagnostic Summary Provide: - **Overall Health Score**: Based on issue severity and count - **Risk Assessment**: What could go wrong if issues aren't addressed - **Quick Wins**: Easy fixes with high impact - **Long-term Strategy**: Technical debt reduction plan - **Next Steps**: Prioritized action items ## Output Format ```markdown # Codebase Diagnostic Report ## Executive Summary [Brief overview of findings and health status] ## Critical Issues (Count: X) ### Issue 1: [Title] - **Location**: file.ts:123 - **Category**: [Bug/Security/Performance/Architecture] - **Impact**: [Description] - **Root Cause**: [Analysis] - **Recommendation**: [Solution] - **Effort**: [Low/Medium/High] ## High Priority Issues (Count: X) [Same structure] ## Medium Priority Issues (Count: X) [Same structure] ## Low Priority Issues (Count: X) [Summary only for brevity] ## Health Metrics - Type Safety: X/100 - Test Coverage: X% - Build Health: X/100 - Dependency Health: X vulnerabilities - Code Quality: X/100 ## Recommended Action Plan 1. [Immediate actions] 2. [This week actions] 3. [This month actions] 4. [Long-term improvements] ## Quick Wins - [Easy fixes with high impact] ``` ## Evidence-Based Standards - ✅ Use diagnostic commands to gather concrete data - ✅ Provide file paths and line numbers for all issues - ✅ Include error messages and metrics - ✅ Reference official documentation for recommendations - ✅ Measure impact quantitatively where possible - ❌ Don't guess or make assumptions - ❌ Don't use superlatives without data - ❌ Don't recommend solutions without understanding root causes ## Tools to Use 1. **File Analysis**: Read, Glob, Grep to examine code 2. **Diagnostics**: Bash to run build, test, lint, audit commands 3. **Metrics**: Collect quantitative data (coverage %, error counts, etc.) 4. **Git History**: Check recent changes that may have introduced issues Begin diagnostics now. ``` -------------------------------------------------------------------------------- /server/src/gates/types.ts: -------------------------------------------------------------------------------- ```typescript /** * Gate System Type Definitions * * Consolidated types for the gate validation system, including lightweight gates, * enhanced validation, and gate orchestration. Combines types from multiple gate * system implementations into a unified type system. */ // Import unified validation types from execution domain (not re-exported to avoid conflicts) import type { ValidationResult, ValidationCheck } from '../execution/types.js'; export type { ValidationCheck } from '../execution/types.js'; /** * Gate requirement types - comprehensive enumeration */ export type GateRequirementType = | 'content_length' | 'keyword_presence' | 'format_validation' | 'section_validation' | 'custom' // Content quality gates | 'readability_score' | 'grammar_quality' | 'tone_analysis' // Structure gates | 'hierarchy_validation' | 'link_validation' | 'code_quality' | 'structure' // Pattern matching gates | 'pattern_matching' // Completeness gates | 'required_fields' | 'completeness_score' | 'completeness' // Chain-specific gates | 'step_continuity' | 'framework_compliance' // Security gates | 'security_validation' | 'citation_validation' | 'security_scan' | 'privacy_compliance' | 'content_policy' // Workflow gates | 'dependency_validation' | 'context_consistency' | 'resource_availability' // LLM Quality Gates | 'llm_coherence' | 'llm_accuracy' | 'llm_helpfulness' | 'llm_contextual'; /** * Gate requirement definition */ export interface GateRequirement { type: GateRequirementType; criteria: any; weight?: number; required?: boolean; // LLM-specific extensions (backward compatible) llmCriteria?: { qualityDimensions?: ('coherent' | 'accurate' | 'helpful' | 'contextual')[]; confidenceThreshold?: number; evaluationContext?: string; targetAudience?: 'general' | 'technical' | 'beginner' | 'expert'; expectedStyle?: 'formal' | 'casual' | 'technical' | 'conversational'; factCheckingEnabled?: boolean; usefulnessThreshold?: number; appropriatenessLevel?: 'strict' | 'standard' | 'relaxed'; }; } /** * Comprehensive gate definition * Consolidates lightweight and enhanced gate definitions */ export interface GateDefinition { /** Unique identifier for the gate */ id: string; /** Human-readable name */ name: string; /** Gate type */ type: 'validation' | 'approval' | 'condition' | 'quality' | 'guidance'; /** Description of what this gate checks/guides */ description?: string; /** Requirements for this gate */ requirements: GateRequirement[]; /** Action to take on failure */ failureAction: 'stop' | 'retry' | 'skip' | 'rollback'; /** Retry policy configuration */ retryPolicy?: { maxRetries: number; retryDelay: number; }; // Lightweight gate extensions /** Guidance text injected into prompts */ guidance?: string; /** Pass/fail criteria for validation gates */ pass_criteria?: GatePassCriteria[]; /** Retry configuration (lightweight format) */ retry_config?: { max_attempts: number; improvement_hints: boolean; preserve_context: boolean; }; /** Activation rules - when this gate should be applied */ activation?: { prompt_categories?: string[]; explicit_request?: boolean; framework_context?: string[]; }; } /** * Pass/fail criteria for validation (lightweight gate format) */ export interface GatePassCriteria { /** Type of check to perform */ type: 'content_check' | 'llm_self_check' | 'pattern_check'; // Content check options min_length?: number; max_length?: number; required_patterns?: string[]; forbidden_patterns?: string[]; // LLM self-check options prompt_template?: string; pass_threshold?: number; // Pattern check options regex_patterns?: string[]; keyword_count?: { [keyword: string]: number }; } // ValidationCheck now imported from execution/types.js - no need to redefine /** * Gate evaluation result */ export interface GateEvaluationResult { requirementId: string; passed: boolean; score?: number; message?: string; details?: any; } // ValidationResult now imported from execution/types.js - provides unified validation interface /** * Gate status information */ export interface GateStatus { gateId: string; passed: boolean; requirements: GateRequirement[]; evaluationResults: GateEvaluationResult[]; timestamp: number; retryCount?: number; } /** * Context for validation */ export interface ValidationContext { /** Content to validate */ content: string; /** Additional metadata */ metadata?: Record<string, any>; /** Execution context */ executionContext?: { promptId?: string; stepId?: string; attemptNumber?: number; previousAttempts?: string[]; }; } /** * Gate activation result */ export interface GateActivationResult { /** Gates that should be active */ activeGates: LightweightGateDefinition[]; /** Guidance text to inject */ guidanceText: string[]; /** Validation gates to apply */ validationGates: LightweightGateDefinition[]; } /** * Lightweight gate definition (for backward compatibility) */ export interface LightweightGateDefinition { /** Unique identifier for the gate */ id: string; /** Human-readable name */ name: string; /** Gate type - validation enforces pass/fail, guidance provides hints */ type: 'validation' | 'guidance'; /** Description of what this gate checks/guides */ description: string; /** Guidance text injected into prompts */ guidance?: string; /** Pass/fail criteria for validation gates */ pass_criteria?: GatePassCriteria[]; /** Retry configuration */ retry_config?: { max_attempts: number; improvement_hints: boolean; preserve_context: boolean; }; /** Activation rules - when this gate should be applied */ activation?: { prompt_categories?: string[]; explicit_request?: boolean; framework_context?: string[]; }; } /** * Gate configuration settings */ export interface GatesConfig { /** Directory containing gate definitions */ definitionsDirectory: string; /** Directory containing LLM validation templates */ templatesDirectory: string; } /** * Step result with gate information */ export interface StepResult { content: string; status: 'pending' | 'running' | 'completed' | 'failed' | 'skipped'; timestamp: number; validationResults?: ValidationResult[]; gateResults?: GateStatus[]; metadata?: Record<string, string | number | boolean | null>; } /** * Gate type enumeration */ export enum GateType { VALIDATION = "validation", APPROVAL = "approval", CONDITION = "condition", QUALITY = "quality", GUIDANCE = "guidance" } ``` -------------------------------------------------------------------------------- /server/tests/scripts/unit-conversation-manager.js: -------------------------------------------------------------------------------- ```javascript #!/usr/bin/env node /** * Unit tests for ConversationManager - Node.js Script Version * Testing chain context, step result management, and state validation */ async function runConversationManagerTests() { try { console.log('🧪 Running ConversationManager unit tests...'); console.log('📋 Testing conversation and chain management functionality'); // Import modules const conversationModule = await import('../../dist/text-references/conversation.js'); const loggerModule = await import('../../dist/logging/index.js'); // Get ConversationManager from default export or named export const ConversationManager = conversationModule.ConversationManager || conversationModule.default; const createSimpleLogger = loggerModule.createSimpleLogger || loggerModule.default; let conversationManager; let logger; // Setup for each test function setupTest() { logger = createSimpleLogger(); conversationManager = new ConversationManager(logger, 50); } // Simple assertion helper function assertEqual(actual, expected, testName) { const actualStr = JSON.stringify(actual); const expectedStr = JSON.stringify(expected); if (actualStr === expectedStr) { console.log(`✅ ${testName}: PASSED`); return true; } else { console.error(`❌ ${testName}: FAILED`); console.error(` Expected: ${expectedStr}`); console.error(` Actual: ${actualStr}`); return false; } } function assertTruthy(value, testName) { if (value) { console.log(`✅ ${testName}: PASSED`); return true; } else { console.error(`❌ ${testName}: FAILED - Expected truthy value, got: ${value}`); return false; } } function assertType(value, expectedType, testName) { if (typeof value === expectedType) { console.log(`✅ ${testName}: PASSED`); return true; } else { console.error(`❌ ${testName}: FAILED - Expected type ${expectedType}, got: ${typeof value}`); return false; } } let testResults = []; // Test 1: Enhanced Step Result Management console.log('🔍 Test 1: Enhanced Step Result Management'); setupTest(); const chainId = 'test-chain-1'; const stepResult = 'This is a real execution result'; const metadata = { executionTime: 1500, framework: 'CAGEERF' }; conversationManager.saveStepResult(chainId, 0, stepResult, false, metadata); const resultWithMeta = conversationManager.getStepResultWithMetadata(chainId, 0); // Check result structure testResults.push(assertEqual(resultWithMeta.result, stepResult, 'Step result content matches')); testResults.push(assertType(resultWithMeta.timestamp, 'number', 'Timestamp is number')); testResults.push(assertEqual(resultWithMeta.isPlaceholder, false, 'isPlaceholder flag correct')); testResults.push(assertEqual(resultWithMeta.executionMetadata, metadata, 'Execution metadata matches')); // Test legacy method compatibility const legacyResult = conversationManager.getStepResult(chainId, 0); testResults.push(assertEqual(legacyResult, stepResult, 'Legacy method compatibility')); // Test 2: Placeholder vs Real Results console.log('🔍 Test 2: Placeholder vs Real Results'); setupTest(); const chainId2 = 'test-chain-2'; // Store placeholder and real results conversationManager.saveStepResult(chainId2, 0, '{{previous_message}}', true); conversationManager.saveStepResult(chainId2, 1, 'Detailed analysis of the problem...', false); const placeholderMeta = conversationManager.getStepResultWithMetadata(chainId2, 0); const realMeta = conversationManager.getStepResultWithMetadata(chainId2, 1); testResults.push(assertEqual(placeholderMeta.isPlaceholder, true, 'Placeholder flag correct')); testResults.push(assertEqual(realMeta.isPlaceholder, false, 'Real result flag correct')); testResults.push(assertEqual(placeholderMeta.result, '{{previous_message}}', 'Placeholder content correct')); testResults.push(assertEqual(realMeta.result, 'Detailed analysis of the problem...', 'Real result content correct')); // Test 3: Chain Context Management console.log('🔍 Test 3: Chain Context Management'); setupTest(); const chainId3 = 'test-chain-3'; // Add some results conversationManager.saveStepResult(chainId3, 0, 'Step 1 result', false); conversationManager.saveStepResult(chainId3, 1, 'Step 2 result', false); // Test chain context retrieval const chainResults = conversationManager.getChainResults ? conversationManager.getChainResults(chainId3) : []; testResults.push(assertTruthy(Array.isArray(chainResults) || typeof chainResults === 'object', 'Chain results retrievable')); // Test 4: Memory Limit Handling console.log('🔍 Test 4: Memory Limit Handling'); setupTest(); // Creates manager with limit of 50 // Try to store more than the limit for (let i = 0; i < 60; i++) { conversationManager.addToConversationHistory({ role: 'user', content: `Message ${i}`, timestamp: Date.now() }); } // Should have enforced the limit somehow (implementation dependent) testResults.push(assertTruthy(true, 'Memory limit handling (basic functionality test)')); // Test 5: Basic Message Management console.log('🔍 Test 5: Basic Message Management'); setupTest(); const testMessage = { role: 'user', content: 'Test message', timestamp: Date.now() }; conversationManager.addToConversationHistory(testMessage); // Basic functionality test testResults.push(assertTruthy(conversationManager, 'ConversationManager instance created')); // Results Summary const passedTests = testResults.filter(result => result).length; const totalTests = testResults.length; console.log('\n📊 ConversationManager Unit Tests Summary:'); console.log(` ✅ Passed: ${passedTests}/${totalTests} tests`); console.log(` 📊 Success Rate: ${((passedTests/totalTests)*100).toFixed(1)}%`); if (passedTests === totalTests) { console.log('🎉 All ConversationManager unit tests passed!'); return true; } else { console.error('❌ Some ConversationManager tests failed'); return false; } } catch (error) { console.error('❌ ConversationManager tests failed with error:', error.message); if (error.stack) { console.error('Stack trace:', error.stack); } return false; } } // Run the tests if (import.meta.url === `file://${process.argv[1]}`) { runConversationManagerTests().catch(error => { console.error('❌ Test execution failed:', error); process.exit(1); }); } export { runConversationManagerTests }; ``` -------------------------------------------------------------------------------- /.github/workflows/pr-validation.yml: -------------------------------------------------------------------------------- ```yaml name: PR Validation on: pull_request: types: [opened, synchronize, reopened] branches: [main, develop] env: NODE_ENV: test permissions: contents: read pull-requests: write issues: write actions: read jobs: pr-quality-gates: name: Pull Request Quality Gates runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: "18" cache: "npm" cache-dependency-path: server/package-lock.json - name: Install dependencies working-directory: server run: npm ci --prefer-offline --no-audit - name: Core validation working-directory: server run: | echo "Running core validation pipeline..." npm run typecheck npm run build npm run test:integration npm run test:functional-mcp timeout-minutes: 10 - name: Server functionality validation working-directory: server run: | echo "Testing complete server functionality..." # Test server startup functionality (includes build artifact validation) npm run test:ci-startup echo "✅ Server functionality validation completed" - name: Changed files analysis run: | echo "Analyzing changed files in this PR..." # Robust file diff with error handling if git diff --name-only origin/${{ github.base_ref }}...HEAD > changed_files.txt 2>/dev/null; then echo "✅ Successfully analyzed changed files" else echo "⚠️ Could not determine changed files, using fallback" # Fallback: get files changed in current commit git diff --name-only HEAD~1 HEAD > changed_files.txt 2>/dev/null || echo "No changes detected" > changed_files.txt fi echo "Files changed in this PR:" cat changed_files.txt || echo "No changed files detected" # Check if TypeScript files were modified if grep -q "\.ts$" changed_files.txt; then echo "✅ TypeScript files modified - validation completed"; fi # Check if methodology guides were modified if grep -q "frameworks/adapters.*methodology-guide" changed_files.txt; then echo "⚠️ Methodology guides modified - ensure all 4 methodologies remain compatible"; fi # Check if consolidated MCP tools were modified if grep -q "mcp-tools/\(prompt-engine\|prompt-manager\|system-control\)" changed_files.txt; then echo "⚠️ Consolidated MCP tools modified - ensure protocol compliance and backwards compatibility"; fi # Check if framework system core was modified if grep -q "frameworks/\(framework-manager\|framework-state-manager\)" changed_files.txt; then echo "⚠️ Framework system core modified - validate methodology switching functionality"; fi # Check if runtime system was modified if grep -q "runtime/\(application\|startup\)" changed_files.txt; then echo "⚠️ Runtime system modified - validate server startup and orchestration"; fi # Check if analysis system was modified if grep -q "analysis/configurable-semantic-analyzer" changed_files.txt; then echo "⚠️ Analysis system modified - validate prompt classification and framework integration"; fi - name: Comment PR with validation results uses: actions/github-script@v7 if: always() with: script: | const fs = require('fs'); let changedFiles = ''; try { changedFiles = fs.readFileSync('changed_files.txt', 'utf8').trim(); if (!changedFiles) { changedFiles = 'No changes detected'; } } catch (e) { console.log(`Warning: Could not read changed_files.txt: ${e.message}`); changedFiles = 'Unable to read changed files (this is normal for some PR types)'; } const status = '${{ job.status }}'; const runUrl = `${context.payload.repository.html_url}/actions/runs/${context.runId}`; let message; if (status === 'success') { const lines = [ '## ✅ PR Validation Passed!', '', '**All quality gates have passed for this pull request.**', '', '### Validation Summary:', '- ✅ TypeScript compilation successful', '- ✅ Build process completed', '- ✅ All tests passed', '- ✅ Functional MCP validation passed (intelligent routing, framework system, transport layer)', '- ✅ Server startup validation completed', '', '### Files Changed:', '```', changedFiles, '```', '', `[View detailed results](${runUrl})` ]; message = lines.join('\n'); } else { const lines = [ '## ❌ PR Validation Failed', '', '**Quality gates failed for this pull request.**', '', `Please check the [detailed logs](${runUrl}) and fix the issues before merging.`, '', '### Files Changed:', '```', changedFiles, '```', '', '**Common fixes:**', '- Run `cd server && npm run typecheck` locally', '- Run `cd server && npm run build` locally', '- Run `cd server && npm test` locally', '- Ensure functional MCP validation passes (intelligent routing + framework system)' ]; message = lines.join('\n'); } // Check if a comment already exists const comments = await github.rest.issues.listComments({ owner: context.repo.owner, repo: context.repo.repo, issue_number: context.issue.number }); const botComment = comments.data.find(comment => comment.user.type === 'Bot' && comment.body.includes('PR Validation')); if (botComment) { // Update existing comment await github.rest.issues.updateComment({ owner: context.repo.owner, repo: context.repo.repo, comment_id: botComment.id, body: message }); } else { // Create new comment await github.rest.issues.createComment({ owner: context.repo.owner, repo: context.repo.repo, issue_number: context.issue.number, body: message }); } ``` -------------------------------------------------------------------------------- /server/src/utils/jsonUtils.ts: -------------------------------------------------------------------------------- ```typescript // JSON utility functions import nunjucks from "nunjucks"; import path from "path"; // Import path module import { fileURLToPath } from "url"; // For ES module __dirname equivalent import { PromptData } from "../types.js"; // JSON escaping utilities (moved here to avoid circular dependency) function escapeJsonForNunjucks(jsonStr: string): string { return jsonStr .replace(/\{\{/g, '\\{\\{') // Escape Nunjucks variable syntax .replace(/\}\}/g, '\\}\\}') // Escape Nunjucks variable syntax .replace(/\{%/g, '\\{\\%') // Escape Nunjucks tag syntax .replace(/%\}/g, '\\%\\}') // Escape Nunjucks tag syntax .replace(/\{#/g, '\\{\\#') // Escape Nunjucks comment syntax .replace(/#\}/g, '\\#\\}'); // Escape Nunjucks comment syntax } function unescapeJsonFromNunjucks(escapedStr: string): string { return escapedStr .replace(/\\{\\{/g, '{{') // Unescape Nunjucks variable syntax .replace(/\\}\\}/g, '}}') // Unescape Nunjucks variable syntax .replace(/\\{\\%/g, '{%') // Unescape Nunjucks tag syntax .replace(/\\%\\}/g, '%}') // Unescape Nunjucks tag syntax .replace(/\\{\\#/g, '{#') // Unescape Nunjucks comment syntax .replace(/\\#\\}/g, '#}'); // Unescape Nunjucks comment syntax } // ES module equivalent of __dirname const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); // Define the base path for prompt templates // This assumes jsonUtils.ts is in server/src/utils/ and prompts are in server/prompts/ const promptTemplatesPath = path.resolve(__dirname, "../../prompts"); // Configure Nunjucks environment with a FileSystemLoader const nunjucksEnv = nunjucks.configure(promptTemplatesPath, { autoescape: false, // We're generating plain text prompts for LLM, not HTML throwOnUndefined: false, // Renders undefined variables as empty string for better compatibility watch: false, // Set to true for development to auto-reload templates; false for production noCache: process.env.NODE_ENV === "development", // Disable cache in development, enable in production tags: { blockStart: "{%", blockEnd: "%}", variableStart: "{{", variableEnd: "}}", commentStart: "{#", commentEnd: "#}", }, }); /** * Validates JSON arguments against the prompt's expected arguments * @param jsonArgs The JSON arguments to validate * @param prompt The prompt data containing expected arguments * @returns Object with validation results and sanitized arguments */ export function validateJsonArguments( jsonArgs: any, prompt: PromptData ): { valid: boolean; errors?: string[]; sanitizedArgs?: Record<string, string | number | boolean | null | any[]>; } { const errors: string[] = []; const sanitizedArgs: Record<string, string | number | boolean | null | any[]> = {}; // Check for unexpected properties const expectedArgNames = prompt.arguments.map((arg) => arg.name); const providedArgNames = Object.keys(jsonArgs); for (const argName of providedArgNames) { if (!expectedArgNames.includes(argName)) { errors.push(`Unexpected argument: ${argName}`); } } // Check for and sanitize expected arguments for (const arg of prompt.arguments) { const value = jsonArgs[arg.name]; // All arguments are treated as optional now if (value !== undefined) { // Sanitize the value based on expected type // This is a simple implementation - expand as needed for your use case if (typeof value === "string") { // Sanitize string inputs sanitizedArgs[arg.name] = value .replace(/[<>]/g, "") // Remove potentially dangerous HTML characters .trim(); } else if (typeof value === "number") { // Ensure it's a valid number sanitizedArgs[arg.name] = isNaN(value) ? 0 : value; } else if (typeof value === "boolean") { sanitizedArgs[arg.name] = !!value; // Ensure boolean type } else if (Array.isArray(value)) { // For arrays, sanitize each element if they're strings sanitizedArgs[arg.name] = value.map((item) => typeof item === "string" ? item.replace(/[<>]/g, "").trim() : item ); } else if (value !== null && typeof value === "object") { // For objects, convert to string for simplicity sanitizedArgs[arg.name] = JSON.stringify(value); } else { // For any other type, convert to string sanitizedArgs[arg.name] = String(value); } } } return { valid: errors.length === 0, errors: errors.length > 0 ? errors : undefined, sanitizedArgs, }; } /** * Processes a template string by replacing placeholders with values using Nunjucks * @param template The template string with placeholders and potential Nunjucks logic * @param args The arguments to replace placeholders with * @param specialContext Special context values to replace first * @returns The processed template string */ export function processTemplate( template: string, args: Record<string, any>, specialContext: Record<string, string> = {} ): string { // Pre-escape any string values that might contain Nunjucks syntax const escapedArgs: Record<string, any> = {}; for (const [key, value] of Object.entries(args)) { if (typeof value === 'string' && (value.includes('{{') || value.includes('{%') || value.includes('{#'))) { escapedArgs[key] = escapeJsonForNunjucks(value); } else { // Pass non-string values (arrays, objects) directly to Nunjucks escapedArgs[key] = value; } } const context = { ...specialContext, ...escapedArgs }; try { // Use Nunjucks to render the template with the combined context const rendered = nunjucksEnv.renderString(template, context); // Unescape any values that were escaped for Nunjucks let unescapedResult = rendered; for (const [key, value] of Object.entries(escapedArgs)) { if (typeof value === 'string' && value !== args[key]) { // This arg was escaped, so we need to unescape it in the result const originalValue = args[key]; const escapedValue = value; unescapedResult = unescapedResult.replace(new RegExp(escapedValue.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'g'), originalValue); } } return unescapedResult; } catch (error) { // Log the Nunjucks rendering error for debugging purposes. // The error will be re-thrown and should be handled by the calling function // (e.g., in TemplateProcessor) which can add more context like Prompt ID. if (error instanceof Error) { console.error( "[Nunjucks Render Error] Failed to process template:", error.message ); // Optionally, log error.stack for more detailed debugging if needed in development // if (process.env.NODE_ENV === 'development' && error.stack) { // console.error(error.stack); // } } else { console.error( "[Nunjucks Render Error] Failed to process template with an unknown error object:", error ); } throw error; // Re-throw the original error } } ``` -------------------------------------------------------------------------------- /server/src/gates/core/gate-loader.ts: -------------------------------------------------------------------------------- ```typescript /** * Gate Loader - Loads gate definitions from YAML/JSON files * Provides hot-reloading capabilities similar to prompt system */ import * as fs from 'fs/promises'; import * as path from 'path'; import { fileURLToPath } from 'url'; import { Logger } from '../../logging/index.js'; import type { LightweightGateDefinition, GateActivationResult } from '../types.js'; /** * Gate loader with caching and hot-reload support */ export class GateLoader { private gateCache = new Map<string, LightweightGateDefinition>(); private lastModified = new Map<string, number>(); private logger: Logger; private gatesDirectory: string; constructor(logger: Logger, gatesDirectory?: string) { this.logger = logger; // Use import.meta.url to get current directory in ES modules const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); this.gatesDirectory = gatesDirectory || path.join(__dirname, '../../gates/definitions'); } /** * Load a gate definition by ID with caching */ async loadGate(gateId: string): Promise<LightweightGateDefinition | null> { try { const gateFile = await this.findGateFile(gateId); if (!gateFile) { this.logger.warn(`Gate definition not found: ${gateId}`); return null; } // Check if we need to reload const stat = await fs.stat(gateFile); const lastMod = this.lastModified.get(gateId); if (!this.gateCache.has(gateId) || !lastMod || stat.mtimeMs > lastMod) { this.logger.debug(`Loading gate definition: ${gateId}`); const gate = await this.parseGateFile(gateFile); if (gate && gate.id === gateId) { this.gateCache.set(gateId, gate); this.lastModified.set(gateId, stat.mtimeMs); this.logger.debug(`Gate loaded successfully: ${gateId}`); } else { this.logger.error(`Gate ID mismatch in file ${gateFile}: expected ${gateId}, got ${gate?.id}`); return null; } } return this.gateCache.get(gateId) || null; } catch (error) { this.logger.error(`Failed to load gate ${gateId}:`, error); return null; } } /** * Load multiple gates by IDs */ async loadGates(gateIds: string[]): Promise<LightweightGateDefinition[]> { const gates: LightweightGateDefinition[] = []; for (const gateId of gateIds) { const gate = await this.loadGate(gateId); if (gate) { gates.push(gate); } } return gates; } /** * Get active gates based on context and criteria */ async getActiveGates( gateIds: string[], context: { promptCategory?: string; framework?: string; explicitRequest?: boolean; } ): Promise<GateActivationResult> { const allGates = await this.loadGates(gateIds); const activeGates: LightweightGateDefinition[] = []; const guidanceText: string[] = []; const validationGates: LightweightGateDefinition[] = []; for (const gate of allGates) { if (this.shouldActivateGate(gate, context)) { activeGates.push(gate); // Collect guidance text if (gate.guidance) { guidanceText.push(`**${gate.name}:**\n${gate.guidance}`); } // Collect validation gates if (gate.type === 'validation') { validationGates.push(gate); } } } return { activeGates, guidanceText, validationGates }; } /** * List all available gates */ async listAvailableGates(): Promise<string[]> { try { const files = await fs.readdir(this.gatesDirectory); const gateFiles = files.filter(file => file.endsWith('.yaml') || file.endsWith('.yml') || file.endsWith('.json') ); return gateFiles.map(file => path.basename(file, path.extname(file))); } catch (error) { this.logger.error('Failed to list available gates:', error); return []; } } /** * Clear gate cache (for hot-reloading) */ clearCache(gateId?: string): void { if (gateId) { this.gateCache.delete(gateId); this.lastModified.delete(gateId); this.logger.debug(`Cleared cache for gate: ${gateId}`); } else { this.gateCache.clear(); this.lastModified.clear(); this.logger.debug('Cleared all gate cache'); } } /** * Find the gate file for a given ID */ private async findGateFile(gateId: string): Promise<string | null> { const extensions = ['.yaml', '.yml', '.json']; for (const ext of extensions) { const filePath = path.join(this.gatesDirectory, `${gateId}${ext}`); try { await fs.access(filePath); return filePath; } catch { // File doesn't exist, try next extension } } return null; } /** * Parse a gate file (YAML or JSON) */ private async parseGateFile(filePath: string): Promise<LightweightGateDefinition | null> { try { const content = await fs.readFile(filePath, 'utf8'); const ext = path.extname(filePath); let parsed: any; if (ext === '.json') { parsed = JSON.parse(content); } else { // For YAML support, we'd need to add js-yaml dependency // For now, support JSON only to avoid new dependencies throw new Error(`YAML support not implemented. Convert ${filePath} to JSON.`); } // Basic validation if (!parsed.id || !parsed.name || !parsed.type) { throw new Error(`Invalid gate definition in ${filePath}: missing required fields`); } return parsed as LightweightGateDefinition; } catch (error) { this.logger.error(`Failed to parse gate file ${filePath}:`, error); return null; } } /** * Check if a gate should be activated based on context */ private shouldActivateGate( gate: LightweightGateDefinition, context: { promptCategory?: string; framework?: string; explicitRequest?: boolean; } ): boolean { const activation = gate.activation; if (!activation) { // No activation rules means always active return true; } // Check explicit request if (activation.explicit_request && !context.explicitRequest) { return false; } // Check prompt categories if (activation.prompt_categories && context.promptCategory) { if (!activation.prompt_categories.includes(context.promptCategory)) { return false; } } // Check framework context if (activation.framework_context && context.framework) { if (!activation.framework_context.includes(context.framework)) { return false; } } return true; } /** * Get gate statistics */ getStatistics(): { cachedGates: number; totalLoads: number; lastAccess: Date | null; } { return { cachedGates: this.gateCache.size, totalLoads: this.lastModified.size, lastAccess: this.lastModified.size > 0 ? new Date() : null }; } } /** * Create a gate loader instance */ export function createGateLoader(logger: Logger, gatesDirectory?: string): GateLoader { return new GateLoader(logger, gatesDirectory); } ``` -------------------------------------------------------------------------------- /server/tests/unit/conversation-manager.test.ts: -------------------------------------------------------------------------------- ```typescript /** * Unit tests for enhanced ConversationManager functionality * Testing chain context, step result management, and state validation */ import { ConversationManager } from '../../dist/text-references/conversation.js'; import { createSimpleLogger } from '../../dist/logging/index.js'; describe('ConversationManager - Chain Execution Enhancements', () => { let conversationManager; let logger; beforeEach(() => { logger = createSimpleLogger(); conversationManager = new ConversationManager(logger, 50); }); describe('Enhanced Step Result Management', () => { test('should store step results with metadata', () => { const chainId = 'test-chain-1'; const stepResult = 'This is a real execution result'; const metadata = { executionTime: 1500, framework: 'CAGEERF' }; conversationManager.saveStepResult(chainId, 0, stepResult, false, metadata); const resultWithMeta = conversationManager.getStepResultWithMetadata(chainId, 0); expect(resultWithMeta).toEqual({ result: stepResult, timestamp: expect.any(Number), isPlaceholder: false, executionMetadata: metadata }); // Should also work with legacy method const legacyResult = conversationManager.getStepResult(chainId, 0); expect(legacyResult).toBe(stepResult); }); test('should distinguish between placeholder and real results', () => { const chainId = 'test-chain-2'; // Store a placeholder result conversationManager.saveStepResult(chainId, 0, '{{previous_message}}', true); // Store a real result conversationManager.saveStepResult(chainId, 1, 'Detailed analysis of the problem...', false); const placeholderMeta = conversationManager.getStepResultWithMetadata(chainId, 0); const realMeta = conversationManager.getStepResultWithMetadata(chainId, 1); expect(placeholderMeta.isPlaceholder).toBe(true); expect(realMeta.isPlaceholder).toBe(false); }); test('should provide chain execution summary', () => { const chainId = 'test-chain-summary'; conversationManager.setChainState(chainId, 2, 4); conversationManager.saveStepResult(chainId, 0, 'First step result', false); conversationManager.saveStepResult(chainId, 1, '{{placeholder}}', true); const summary = conversationManager.getChainSummary(chainId); expect(summary).toEqual({ state: { currentStep: 2, totalSteps: 4, lastUpdated: expect.any(Number) }, completedSteps: 2, placeholderSteps: 1, realSteps: 1, totalResults: 2 }); }); }); describe('Chain State Validation', () => { test('should validate healthy chain state', () => { const chainId = 'test-chain-healthy'; conversationManager.setChainState(chainId, 2, 4); conversationManager.saveStepResult(chainId, 0, 'Step 0 result'); conversationManager.saveStepResult(chainId, 1, 'Step 1 result'); const validation = conversationManager.validateChainState(chainId); expect(validation.valid).toBe(true); expect(validation.issues).toBeUndefined(); expect(validation.recovered).toBeFalsy(); }); test('should detect and recover from invalid current step', () => { const chainId = 'test-chain-invalid'; // Manually create invalid state (currentStep > totalSteps) conversationManager.setChainState(chainId, 5, 3); const validation = conversationManager.validateChainState(chainId); expect(validation.valid).toBe(false); expect(validation.issues).toContain('Current step 5 exceeds total steps 3'); expect(validation.recovered).toBe(true); // Should have auto-corrected the state const correctedState = conversationManager.getChainState(chainId); expect(correctedState.currentStep).toBe(3); expect(correctedState.totalSteps).toBe(3); }); test('should detect stale chain state', () => { const chainId = 'test-chain-stale'; // Manually set old timestamp (2 hours ago) const twoHoursAgo = Date.now() - (2 * 60 * 60 * 1000); conversationManager.setChainState(chainId, 1, 3); conversationManager.chainStates[chainId].lastUpdated = twoHoursAgo; const validation = conversationManager.validateChainState(chainId); expect(validation.valid).toBe(false); expect(validation.issues).toContain('Chain state is stale (>1 hour old)'); }); test('should handle missing chain state gracefully', () => { const validation = conversationManager.validateChainState('nonexistent-chain'); expect(validation.valid).toBe(false); expect(validation.issues).toContain('No chain state found'); }); }); describe('Context Cleanup', () => { test('should clear all chain data when clearing context', () => { const chainId = 'test-chain-cleanup'; conversationManager.setChainState(chainId, 1, 3); conversationManager.saveStepResult(chainId, 0, 'Test result', false); // Verify data exists expect(conversationManager.getChainState(chainId)).toBeDefined(); expect(conversationManager.getStepResult(chainId, 0)).toBe('Test result'); expect(conversationManager.getStepResultWithMetadata(chainId, 0)).toBeDefined(); // Clear and verify cleanup conversationManager.clearChainContext(chainId); expect(conversationManager.getChainState(chainId)).toBeUndefined(); expect(conversationManager.getStepResult(chainId, 0)).toBeUndefined(); expect(conversationManager.getStepResultWithMetadata(chainId, 0)).toBeUndefined(); }); test('should clear all chains when clearing all contexts', () => { const chain1 = 'chain-1'; const chain2 = 'chain-2'; conversationManager.setChainState(chain1, 1, 2); conversationManager.setChainState(chain2, 2, 3); conversationManager.saveStepResult(chain1, 0, 'Chain 1 result'); conversationManager.saveStepResult(chain2, 0, 'Chain 2 result'); conversationManager.clearAllChainContexts(); expect(conversationManager.getChainState(chain1)).toBeUndefined(); expect(conversationManager.getChainState(chain2)).toBeUndefined(); expect(conversationManager.getStepResult(chain1, 0)).toBeUndefined(); expect(conversationManager.getStepResult(chain2, 0)).toBeUndefined(); }); }); describe('Integration with Legacy Interface', () => { test('should maintain compatibility with existing saveStepResult calls', () => { const chainId = 'test-legacy'; // Legacy call without placeholder flag conversationManager.saveStepResult(chainId, 0, 'Legacy result'); const result = conversationManager.getStepResult(chainId, 0); const resultWithMeta = conversationManager.getStepResultWithMetadata(chainId, 0); expect(result).toBe('Legacy result'); expect(resultWithMeta.result).toBe('Legacy result'); expect(resultWithMeta.isPlaceholder).toBe(false); // Default value }); }); }); ```