claude-flow-novice 2.15.2 → 2.15.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
- package/.claude/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
- package/.claude/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
- package/.claude/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
- package/.claude/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
- package/.claude/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
- package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
- package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
- package/.claude/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
- package/.claude/commands/cfn-loop-cli.md +16 -2
- package/.claude/commands/switch-api.md +31 -10
- package/.claude/hooks/cfn-BACKUP_USAGE.md +243 -243
- package/.claude/hooks/cfn-invoke-security-validation.sh +69 -69
- package/.claude/hooks/cfn-lint-sql-injection.sh +61 -0
- package/.claude/hooks/cfn-post-edit-cfn-retrospective.sh +109 -78
- package/.claude/hooks/cfn-post-edit.config.json +44 -44
- package/.claude/hooks/cfn-pre-edit-security-warning.sh +40 -0
- package/.claude/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
- package/.claude/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
- package/.claude/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
- package/.claude/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
- package/.claude/skills/cfn-hybrid-routing/check-dependencies.sh +51 -51
- package/.claude/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
- package/.claude/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
- package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +184 -23
- package/.claude/skills/cfn-loop-orchestration/security_utils.sh +24 -0
- package/.claude/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
- package/.claude/skills/cfn-loop-validation/orchestrate-cfn-loop.sh +252 -252
- package/.claude/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
- package/.claude/skills/cfn-redis-coordination/agent-log.sh +4 -0
- package/.claude/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
- package/.claude/skills/cfn-redis-coordination/agent-recovery.sh +74 -74
- package/.claude/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
- package/.claude/skills/cfn-redis-coordination/get-context.sh +145 -112
- package/.claude/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
- package/.claude/skills/cfn-redis-coordination/invoke-waiting-mode.sh +3 -0
- package/.claude/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
- package/.claude/skills/cfn-redis-coordination/redis-functions.sh +33 -0
- package/.claude/skills/cfn-redis-coordination/report-completion.sh +24 -31
- package/.claude/skills/cfn-redis-coordination/store-context.sh +4 -0
- package/.claude/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
- package/.claude/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
- package/.claude/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
- package/.claude/skills/cfn-transparency-middleware/middleware-config.sh +28 -28
- package/.claude/skills/cfn-transparency-middleware/performance-benchmark.sh +78 -78
- package/.claude/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
- package/.claude/skills/cfn-transparency-middleware/test-integration.sh +161 -161
- package/.claude/skills/cfn-transparency-middleware/test-transparency-skill.sh +367 -367
- package/.claude/skills/cfn-transparency-middleware/tests/input-validation.sh +107 -92
- package/.claude/skills/cfn-transparency-middleware/wrap-agent.sh +131 -131
- package/README.md +116 -475
- package/claude-assets/agents/cfn-dev-team/README.md +103 -0
- package/claude-assets/agents/cfn-dev-team/architecture/goal-planner.md +1 -1
- package/claude-assets/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +77 -15
- package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +355 -6
- package/claude-assets/agents/cfn-dev-team/coordinators/consensus-builder.md +82 -1
- package/claude-assets/agents/cfn-dev-team/coordinators/handoff-coordinator.md +82 -1
- package/claude-assets/agents/cfn-dev-team/coordinators/multi-sprint-coordinator.md +77 -15
- package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +99 -12
- package/claude-assets/agents/cfn-dev-team/dev-ops/github-commit-agent.md +1 -1
- package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +97 -0
- package/claude-assets/agents/cfn-dev-team/dev-ops/monitoring-specialist.md +20 -1
- package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +97 -0
- package/claude-assets/agents/cfn-dev-team/developers/backend-developer.md +110 -13
- package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +106 -15
- package/claude-assets/agents/cfn-dev-team/developers/database/database-architect.md +115 -11
- package/claude-assets/agents/cfn-dev-team/developers/frontend/mobile-dev.md +94 -7
- package/claude-assets/agents/cfn-dev-team/developers/frontend/react-frontend-engineer.md +87 -9
- package/claude-assets/agents/cfn-dev-team/developers/frontend/typescript-specialist.md +85 -7
- package/claude-assets/agents/cfn-dev-team/developers/frontend/ui-designer.md +160 -28
- package/claude-assets/agents/cfn-dev-team/developers/graphql-specialist.md +101 -19
- package/claude-assets/agents/cfn-dev-team/developers/rust-developer.md +108 -14
- package/claude-assets/agents/cfn-dev-team/reviewers/{reviewer.md → code-reviewer.md} +95 -8
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/code-quality-validator.md +107 -7
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +98 -7
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +95 -7
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/security-specialist.md +136 -9
- package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +108 -1
- package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +107 -13
- package/claude-assets/agents/cfn-dev-team/testers/contract-tester.md +737 -0
- package/claude-assets/agents/cfn-dev-team/testers/e2e/playwright-tester.md +1 -1
- package/claude-assets/agents/cfn-dev-team/testers/integration-tester.md +828 -0
- package/claude-assets/agents/cfn-dev-team/testers/interaction-tester.md +106 -7
- package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +77 -0
- package/claude-assets/agents/cfn-dev-team/testers/mutation-testing-specialist.md +684 -0
- package/claude-assets/agents/cfn-dev-team/testers/playwright-tester.md +110 -1
- package/claude-assets/agents/cfn-dev-team/testers/tester.md +94 -7
- package/claude-assets/agents/cfn-dev-team/utility/code-booster.md +1 -3
- package/claude-assets/agents/cfn-dev-team/utility/epic-creator.md +87 -13
- package/claude-assets/agents/cfn-dev-team/utility/memory-leak-specialist.md +103 -7
- package/claude-assets/agents/cfn-dev-team/utility/researcher.md +1 -3
- package/claude-assets/agents/cfn-dev-team/utility/z-ai-specialist.md +94 -7
- package/claude-assets/agents/docker-coordinators/cfn-docker-v3-coordinator.md +46 -0
- package/claude-assets/agents/project-only-agents/npm-package-specialist.md +1 -1
- package/claude-assets/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
- package/claude-assets/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
- package/claude-assets/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
- package/claude-assets/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
- package/claude-assets/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
- package/claude-assets/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
- package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
- package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
- package/claude-assets/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
- package/claude-assets/commands/cfn-loop-cli.md +16 -2
- package/claude-assets/commands/switch-api.md +31 -10
- package/claude-assets/hooks/cfn-BACKUP_USAGE.md +243 -243
- package/claude-assets/hooks/cfn-invoke-security-validation.sh +69 -69
- package/claude-assets/hooks/cfn-lint-sql-injection.sh +61 -0
- package/claude-assets/hooks/cfn-post-edit-cfn-retrospective.sh +109 -78
- package/claude-assets/hooks/cfn-post-edit.config.json +44 -44
- package/claude-assets/hooks/cfn-post-execution/memory-cleanup.sh +19 -19
- package/claude-assets/hooks/cfn-pre-edit-security-warning.sh +40 -0
- package/claude-assets/hooks/cfn-pre-execution/memory-check.sh +19 -19
- package/claude-assets/hooks/detect-hardcoded-credentials.sh +212 -0
- package/claude-assets/skills/SKILL_TEMPLATE.md +774 -0
- package/claude-assets/skills/agent-lifecycle/execute-lifecycle-hook.sh +543 -572
- package/claude-assets/skills/agent-lifecycle/simple-audit.sh +57 -30
- package/claude-assets/skills/agent-template-generator/SKILL.md +440 -0
- package/claude-assets/skills/agent-template-generator/generate-agent.sh +405 -0
- package/claude-assets/skills/agent-validation-linter/SKILL.md +589 -0
- package/claude-assets/skills/agent-validation-linter/lint-agents.sh +271 -0
- package/claude-assets/skills/bootstrap/bash-fundamentals.md +786 -0
- package/claude-assets/skills/bootstrap/database-connection.md +464 -0
- package/claude-assets/skills/bootstrap/error-handling.md +580 -0
- package/claude-assets/skills/bootstrap/file-operations.md +699 -0
- package/claude-assets/skills/bootstrap/skill-loader.md +616 -0
- package/claude-assets/skills/bootstrap/sqlite-params.sh +287 -0
- package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
- package/claude-assets/skills/cfn-automatic-memory-persistence/persist-agent-output.sh +48 -48
- package/claude-assets/skills/cfn-automatic-memory-persistence/query-agent-history.sh +34 -34
- package/claude-assets/skills/cfn-automatic-memory-persistence/test-memory-persistence.sh +17 -16
- package/claude-assets/skills/cfn-deliverable-validation/confidence-calculator.sh +261 -261
- package/claude-assets/skills/cfn-deployment/SKILL.md +293 -0
- package/claude-assets/skills/cfn-deployment/execute.sh +21 -0
- package/claude-assets/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
- package/claude-assets/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
- package/claude-assets/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
- package/claude-assets/skills/cfn-environment-sanitization/sanitize-environment.sh +38 -0
- package/claude-assets/skills/cfn-error-batching-strategy/lib/core-functions.sh +47 -47
- package/claude-assets/skills/cfn-expert-update/update-expert.sh +345 -345
- package/claude-assets/skills/cfn-file-operations/SKILL.md +290 -0
- package/claude-assets/skills/cfn-file-operations/execute.sh +129 -0
- package/claude-assets/skills/cfn-file-operations/lib/atomic-write.sh +294 -0
- package/claude-assets/skills/cfn-file-operations/lib/lock.sh +361 -0
- package/claude-assets/skills/cfn-file-operations/test.sh +369 -0
- package/claude-assets/skills/cfn-hybrid-routing/check-dependencies.sh +51 -51
- package/claude-assets/skills/cfn-intervention-detector/detect-intervention.sh +110 -110
- package/claude-assets/skills/cfn-intervention-orchestrator/execute-intervention.sh +58 -58
- package/claude-assets/skills/cfn-log-operations/SKILL.md +308 -0
- package/claude-assets/skills/cfn-log-operations/execute.sh +420 -0
- package/claude-assets/skills/cfn-log-operations/lib/rotate.sh +406 -0
- package/claude-assets/skills/cfn-log-operations/lib/search.sh +448 -0
- package/claude-assets/skills/cfn-log-operations/test.sh +394 -0
- package/claude-assets/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
- package/claude-assets/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
- package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +184 -23
- package/claude-assets/skills/cfn-loop-orchestration/security_utils.sh +24 -0
- package/claude-assets/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
- package/claude-assets/skills/cfn-loop-validation/orchestrate-cfn-loop.sh +252 -252
- package/claude-assets/skills/cfn-loop2-output-processing/process-validator-output.sh +275 -275
- package/claude-assets/skills/cfn-memory-management/check-memory.sh +159 -159
- package/claude-assets/skills/cfn-memory-management/cleanup-memory.sh +196 -196
- package/claude-assets/skills/cfn-node-heap-sizer/task-mode-heap-limiter.sh +325 -325
- package/claude-assets/skills/cfn-parameterized-queries/SKILL.md +339 -0
- package/claude-assets/skills/cfn-playbook/query-playbook.sh +19 -15
- package/claude-assets/skills/cfn-playbook/update-playbook.sh +25 -14
- package/claude-assets/skills/cfn-playbook-auto-update/auto-update-playbook.sh +85 -85
- package/claude-assets/skills/cfn-process-instrumentation/instrument-process.sh +44 -0
- package/claude-assets/skills/cfn-promotion/SKILL.md +305 -0
- package/claude-assets/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
- package/claude-assets/skills/cfn-redis-coordination/agent-log.sh +4 -0
- package/claude-assets/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
- package/claude-assets/skills/cfn-redis-coordination/agent-recovery.sh +74 -74
- package/claude-assets/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
- package/claude-assets/skills/cfn-redis-coordination/get-context.sh +145 -112
- package/claude-assets/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
- package/claude-assets/skills/cfn-redis-coordination/invoke-waiting-mode.sh +3 -0
- package/claude-assets/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
- package/claude-assets/skills/cfn-redis-coordination/redis-functions.sh +33 -0
- package/claude-assets/skills/cfn-redis-coordination/report-completion.sh +24 -31
- package/claude-assets/skills/cfn-redis-coordination/store-context.sh +4 -0
- package/claude-assets/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
- package/claude-assets/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
- package/claude-assets/skills/cfn-scope-simplifier/simplify-scope.sh +67 -67
- package/claude-assets/skills/cfn-skill-loader/SKILL.md +466 -0
- package/claude-assets/skills/cfn-skill-loader/execute.sh +344 -0
- package/claude-assets/skills/cfn-specialist-injection/recommend-specialist.sh +56 -56
- package/claude-assets/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
- package/claude-assets/skills/cfn-standardized-error-handling/capture-agent-error.sh +86 -86
- package/claude-assets/skills/cfn-standardized-error-handling/test-error-handling.sh +165 -165
- package/claude-assets/skills/cfn-task-audit/get-audit-data.sh +42 -21
- package/claude-assets/skills/cfn-task-audit/store-task-audit.sh +17 -10
- package/claude-assets/skills/cfn-task-config-init/initialize-config.sh +264 -264
- package/claude-assets/skills/cfn-task-decomposition/task-decomposer.sh +278 -278
- package/claude-assets/skills/cfn-test-runner/detect-regressions.sh +17 -14
- package/claude-assets/skills/cfn-test-runner/detect-regressions.sh.backup-1763392821 +55 -0
- package/claude-assets/skills/cfn-test-runner/store-benchmarks.sh +17 -19
- package/claude-assets/skills/cfn-transparency-middleware/middleware-config.sh +28 -28
- package/claude-assets/skills/cfn-transparency-middleware/performance-benchmark.sh +78 -78
- package/claude-assets/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
- package/claude-assets/skills/cfn-transparency-middleware/test-integration.sh +161 -161
- package/claude-assets/skills/cfn-transparency-middleware/test-transparency-skill.sh +367 -367
- package/claude-assets/skills/cfn-transparency-middleware/tests/input-validation.sh +107 -92
- package/claude-assets/skills/cfn-transparency-middleware/wrap-agent.sh +131 -131
- package/claude-assets/skills/cfn-utilities/SKILL.md +237 -0
- package/claude-assets/skills/cfn-utilities/execute.sh +32 -0
- package/claude-assets/skills/cfn-utilities/lib/errors.sh +56 -0
- package/claude-assets/skills/cfn-utilities/lib/file-ops.sh +164 -0
- package/claude-assets/skills/cfn-utilities/lib/logging.sh +77 -0
- package/claude-assets/skills/cfn-utilities/lib/retry.sh +127 -0
- package/claude-assets/skills/cfn-utilities/test.sh +317 -0
- package/claude-assets/skills/docker-build/SKILL.md +96 -203
- package/claude-assets/skills/docker-build/build.sh +73 -73
- package/claude-assets/skills/integration/agent-handoff.sh +492 -0
- package/claude-assets/skills/integration/file-operations.sh +414 -0
- package/claude-assets/skills/json-validation/SKILL.md +431 -0
- package/claude-assets/skills/json-validation/test-validate-success-criteria.sh +421 -0
- package/claude-assets/skills/json-validation/validate-success-criteria.sh +197 -0
- package/claude-assets/skills/redis-coordination/validate-parameters.sh +34 -0
- package/claude-assets/skills/workflow-codification/APPROVAL_WORKFLOW.md +806 -0
- package/claude-assets/skills/workflow-codification/COST_TRACKING.md +637 -0
- package/claude-assets/skills/workflow-codification/DEPLOY_QUICK_REFERENCE.md +106 -0
- package/claude-assets/skills/workflow-codification/EDGE_CASE_TRACKING.md +404 -0
- package/claude-assets/skills/workflow-codification/PROPAGATE_UPDATE_QUICK_REFERENCE.md +366 -0
- package/claude-assets/skills/workflow-codification/README_PHASE4.md +457 -0
- package/claude-assets/skills/workflow-codification/SKILL.md +110 -0
- package/claude-assets/skills/workflow-codification/analyze-patterns.sh +899 -0
- package/claude-assets/skills/workflow-codification/approval-workflow.sh +514 -0
- package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh +481 -0
- package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh.backup-1763392820 +512 -0
- package/claude-assets/skills/workflow-codification/generate-skill-update.sh +525 -0
- package/claude-assets/skills/workflow-codification/lib/security-utils.sh +204 -0
- package/claude-assets/skills/workflow-codification/propagate-skill-update.sh +648 -0
- package/claude-assets/skills/workflow-codification/propagate-skill-update.sh.backup-1763392820 +664 -0
- package/claude-assets/skills/workflow-codification/review-skill.sh +643 -0
- package/claude-assets/skills/workflow-codification/templates/email-notification.txt +114 -0
- package/claude-assets/skills/workflow-codification/templates/slack-notification.md +85 -0
- package/claude-assets/skills/workflow-codification/test-integration.sh +296 -0
- package/claude-assets/skills/workflow-codification/test-metadata-update.sh +350 -0
- package/claude-assets/skills/workflow-codification/track-cost-savings.sh +486 -0
- package/claude-assets/skills/workflow-codification/track-cost-savings.sh.backup-1763392821 +445 -0
- package/claude-assets/skills/workflow-codification/track-edge-case.sh +290 -0
- package/claude-assets/skills/workflow-codification/workflow-codification.db +0 -0
- package/dist/ace/ace-curator.js +10 -2
- package/dist/ace/ace-curator.js.map +1 -1
- package/dist/ace/ace-generator.js +4 -0
- package/dist/ace/ace-generator.js.map +1 -1
- package/dist/ace/ace-reflector.js +1 -1
- package/dist/ace/ace-reflector.js.map +1 -1
- package/dist/ace/context-injection.js +24 -2
- package/dist/ace/context-injection.js.map +1 -1
- package/dist/agents/agent-loader.js +146 -165
- package/dist/agents/agent-loader.js.map +1 -1
- package/dist/agents/task-agent-integration.js +1 -1
- package/dist/agents/task-agent-integration.js.map +1 -1
- package/dist/api/health-endpoints.js +390 -0
- package/dist/api/health-endpoints.js.map +1 -0
- package/dist/cli/agent-executor.js +4 -1
- package/dist/cli/agent-executor.js.map +1 -1
- package/dist/cli/agent-prompt-builder.js +89 -1
- package/dist/cli/agent-prompt-builder.js.map +1 -1
- package/dist/cli/agent-spawn.js +130 -37
- package/dist/cli/agent-spawn.js.map +1 -1
- package/dist/cli/config-manager.js +91 -109
- package/dist/cli/config-manager.js.map +1 -1
- package/dist/cli/skill-cache-validator.js +412 -0
- package/dist/cli/skill-cache-validator.js.map +1 -0
- package/dist/cli/skill-cli.js +991 -0
- package/dist/cli/skill-cli.js.map +1 -0
- package/dist/cli/skill-execution-logger.js +284 -0
- package/dist/cli/skill-execution-logger.js.map +1 -0
- package/dist/cli/skill-loader.js +457 -0
- package/dist/cli/skill-loader.js.map +1 -0
- package/dist/coordination/event-bus.js +2 -2
- package/dist/coordination/event-bus.js.map +1 -1
- package/dist/coordination/fleet-manager.js +1 -1
- package/dist/coordination/fleet-manager.js.map +1 -1
- package/dist/coordination/index.js +23 -9
- package/dist/coordination/index.js.map +1 -1
- package/dist/coordination/types/fleet-manager.types.js.map +1 -1
- package/dist/db/migration-manager.js +483 -0
- package/dist/db/migration-manager.js.map +1 -0
- package/dist/db/skills-query.js +535 -0
- package/dist/db/skills-query.js.map +1 -0
- package/dist/integration/DatabaseHandoff.js +507 -0
- package/dist/integration/DatabaseHandoff.js.map +1 -0
- package/dist/integration/StandardAdapter.js +291 -0
- package/dist/integration/StandardAdapter.js.map +1 -0
- package/dist/jobs/edge-case-analyzer.js +367 -0
- package/dist/jobs/edge-case-analyzer.js.map +1 -0
- package/dist/jobs/promotion-sla-enforcer.js +288 -0
- package/dist/jobs/promotion-sla-enforcer.js.map +1 -0
- package/dist/lib/agent-output-parser.js +518 -0
- package/dist/lib/agent-output-parser.js.map +1 -0
- package/dist/lib/agent-output-validator.js +950 -0
- package/dist/lib/agent-output-validator.js.map +1 -0
- package/dist/lib/agent-workspace.js +281 -0
- package/dist/lib/agent-workspace.js.map +1 -0
- package/dist/lib/artifact-registry.js +443 -0
- package/dist/lib/artifact-registry.js.map +1 -0
- package/dist/lib/atomic-file-writer.js +377 -0
- package/dist/lib/atomic-file-writer.js.map +1 -0
- package/dist/lib/backup-manager.js +779 -0
- package/dist/lib/backup-manager.js.map +1 -0
- package/dist/lib/checkpoint-manager.js +837 -0
- package/dist/lib/checkpoint-manager.js.map +1 -0
- package/dist/lib/circuit-breaker.js +340 -0
- package/dist/lib/circuit-breaker.js.map +1 -0
- package/dist/lib/completion-signal-handler.js +243 -0
- package/dist/lib/completion-signal-handler.js.map +1 -0
- package/dist/lib/config-manager.js +312 -0
- package/dist/lib/config-manager.js.map +1 -0
- package/dist/lib/config-migrator.js +386 -0
- package/dist/lib/config-migrator.js.map +1 -0
- package/dist/lib/config-validator.js +687 -0
- package/dist/lib/config-validator.js.map +1 -0
- package/dist/lib/correlation-cache.js +311 -0
- package/dist/lib/correlation-cache.js.map +1 -0
- package/dist/lib/correlation.js +263 -0
- package/dist/lib/correlation.js.map +1 -0
- package/dist/lib/database-service/connection-pool-manager.js +520 -0
- package/dist/lib/database-service/connection-pool-manager.js.map +1 -0
- package/dist/lib/database-service/correlation.js +329 -0
- package/dist/lib/database-service/correlation.js.map +1 -0
- package/dist/lib/database-service/errors.js +120 -0
- package/dist/lib/database-service/errors.js.map +1 -0
- package/dist/lib/database-service/index.js +168 -0
- package/dist/lib/database-service/index.js.map +1 -0
- package/dist/lib/database-service/postgres-adapter.js +526 -0
- package/dist/lib/database-service/postgres-adapter.js.map +1 -0
- package/dist/lib/database-service/redis-adapter.js +360 -0
- package/dist/lib/database-service/redis-adapter.js.map +1 -0
- package/dist/lib/database-service/sqlite-adapter.js +544 -0
- package/dist/lib/database-service/sqlite-adapter.js.map +1 -0
- package/dist/lib/database-service/transaction-manager.js +773 -0
- package/dist/lib/database-service/transaction-manager.js.map +1 -0
- package/dist/lib/database-service/types.js +23 -0
- package/dist/lib/database-service/types.js.map +1 -0
- package/dist/lib/deadlock-resolver.js +292 -0
- package/dist/lib/deadlock-resolver.js.map +1 -0
- package/dist/lib/distributed-lock.js +451 -0
- package/dist/lib/distributed-lock.js.map +1 -0
- package/dist/lib/edge-case-deduplicator.js +227 -0
- package/dist/lib/edge-case-deduplicator.js.map +1 -0
- package/dist/lib/encryption-manager.js +322 -0
- package/dist/lib/encryption-manager.js.map +1 -0
- package/dist/lib/error-aggregator.js +234 -0
- package/dist/lib/error-aggregator.js.map +1 -0
- package/dist/lib/errors.js +287 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/file-lock-manager.js +578 -0
- package/dist/lib/file-lock-manager.js.map +1 -0
- package/dist/lib/file-operations.js +367 -0
- package/dist/lib/file-operations.js.map +1 -0
- package/dist/lib/idempotent-write.js +237 -0
- package/dist/lib/idempotent-write.js.map +1 -0
- package/dist/lib/integration-schema-validator.js +522 -0
- package/dist/lib/integration-schema-validator.js.map +1 -0
- package/dist/lib/lock-health-monitor.js +298 -0
- package/dist/lib/lock-health-monitor.js.map +1 -0
- package/dist/lib/log-shipper.js +422 -0
- package/dist/lib/log-shipper.js.map +1 -0
- package/dist/lib/logging.js +146 -0
- package/dist/lib/logging.js.map +1 -0
- package/dist/lib/message-deduplicator.js +439 -0
- package/dist/lib/message-deduplicator.js.map +1 -0
- package/dist/lib/multi-system-query.js +604 -0
- package/dist/lib/multi-system-query.js.map +1 -0
- package/dist/lib/orphan-detector.js +332 -0
- package/dist/lib/orphan-detector.js.map +1 -0
- package/dist/lib/password-generator.js +166 -0
- package/dist/lib/password-generator.js.map +1 -0
- package/dist/lib/path-validator.js +429 -0
- package/dist/lib/path-validator.js.map +1 -0
- package/dist/lib/query-translator.js +905 -0
- package/dist/lib/query-translator.js.map +1 -0
- package/dist/lib/queue-recovery.js +469 -0
- package/dist/lib/queue-recovery.js.map +1 -0
- package/dist/lib/redis-queue-manager.js +512 -0
- package/dist/lib/redis-queue-manager.js.map +1 -0
- package/dist/lib/reflection-archiver.js +272 -0
- package/dist/lib/reflection-archiver.js.map +1 -0
- package/dist/lib/retry-manager.js +453 -0
- package/dist/lib/retry-manager.js.map +1 -0
- package/dist/lib/retry.js +262 -0
- package/dist/lib/retry.js.map +1 -0
- package/dist/lib/schema-transform.js +695 -0
- package/dist/lib/schema-transform.js.map +1 -0
- package/dist/lib/schema-validator.js +491 -0
- package/dist/lib/schema-validator.js.map +1 -0
- package/dist/lib/skill-cache.js +297 -0
- package/dist/lib/skill-cache.js.map +1 -0
- package/dist/lib/skill-content-manager.js +337 -0
- package/dist/lib/skill-content-manager.js.map +1 -0
- package/dist/lib/skill-frontmatter-parser.js +237 -0
- package/dist/lib/skill-frontmatter-parser.js.map +1 -0
- package/dist/lib/skill-git-integration.js +275 -0
- package/dist/lib/skill-git-integration.js.map +1 -0
- package/dist/lib/skill-markdown-validator.js +396 -0
- package/dist/lib/skill-markdown-validator.js.map +1 -0
- package/dist/lib/skill-output-parser.js +312 -0
- package/dist/lib/skill-output-parser.js.map +1 -0
- package/dist/lib/unified-query-api.js +467 -0
- package/dist/lib/unified-query-api.js.map +1 -0
- package/dist/middleware/auth-middleware.js +350 -0
- package/dist/middleware/auth-middleware.js.map +1 -0
- package/dist/middleware/schema-validation.js +347 -0
- package/dist/middleware/schema-validation.js.map +1 -0
- package/dist/providers/anthropic-provider.js +1 -1
- package/dist/providers/anthropic-provider.js.map +1 -1
- package/dist/providers/provider-factory.js +2 -2
- package/dist/providers/provider-factory.js.map +1 -1
- package/dist/services/edge-case-analyzer.js +321 -0
- package/dist/services/edge-case-analyzer.js.map +1 -0
- package/dist/services/edge-case-deduplicator.js +266 -0
- package/dist/services/edge-case-deduplicator.js.map +1 -0
- package/dist/services/edge-case-detector.js +337 -0
- package/dist/services/edge-case-detector.js.map +1 -0
- package/dist/services/edge-case-tracker.js +547 -0
- package/dist/services/edge-case-tracker.js.map +1 -0
- package/dist/services/health-check-system.js +586 -0
- package/dist/services/health-check-system.js.map +1 -0
- package/dist/services/metrics-logger.js +412 -0
- package/dist/services/metrics-logger.js.map +1 -0
- package/dist/services/patch-generator.js +378 -0
- package/dist/services/patch-generator.js.map +1 -0
- package/dist/services/patch-validator.js +337 -0
- package/dist/services/patch-validator.js.map +1 -0
- package/dist/services/performance-monitor.js +811 -0
- package/dist/services/performance-monitor.js.map +1 -0
- package/dist/services/promotion-pipeline.js +918 -0
- package/dist/services/promotion-pipeline.js.map +1 -0
- package/dist/services/promotion-validator.js +394 -0
- package/dist/services/promotion-validator.js.map +1 -0
- package/dist/services/reflection-logger.js +388 -0
- package/dist/services/reflection-logger.js.map +1 -0
- package/dist/services/skill-deployment.js +472 -0
- package/dist/services/skill-deployment.js.map +1 -0
- package/dist/services/skill-loader.js +427 -0
- package/dist/services/skill-loader.js.map +1 -0
- package/dist/services/skill-promotion.js +372 -0
- package/dist/services/skill-promotion.js.map +1 -0
- package/dist/services/skill-validator.js +454 -0
- package/dist/services/skill-validator.js.map +1 -0
- package/dist/services/skill-versioning.js +244 -0
- package/dist/services/skill-versioning.js.map +1 -0
- package/dist/services/workspace-supervisor.js +597 -0
- package/dist/services/workspace-supervisor.js.map +1 -0
- package/dist/types/agent-output.js +44 -0
- package/dist/types/agent-output.js.map +1 -0
- package/dist/types/config.js +28 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/edge-case.js +45 -0
- package/dist/types/edge-case.js.map +1 -0
- package/package.json +201 -176
- package/readme/README.md +19 -4
- package/scripts/artifact-cleanup.sh +392 -0
- package/scripts/backup-cleanup.sh +627 -0
- package/scripts/cleanup-workspaces.sh +412 -0
- package/scripts/cleanup-yaml-configs.sh +141 -0
- package/scripts/deploy-approved-skills.sh +263 -0
- package/scripts/deploy-production.sh +355 -355
- package/scripts/docker-playwright-fix.sh +311 -311
- package/scripts/docker-rebuild-all-agents.sh +127 -127
- package/scripts/health-check.sh +447 -0
- package/scripts/log-aggregator.sh +554 -0
- package/scripts/log-monitor.sh +629 -0
- package/scripts/manage-agent-workspaces.sh +434 -0
- package/scripts/memory-leak-prevention.sh +305 -305
- package/scripts/migrate-artifacts.sh +563 -0
- package/scripts/migrate-schema.sh +533 -0
- package/scripts/migrate-yaml-to-json.sh +465 -0
- package/scripts/promote-staged-skills.sh +423 -0
- package/scripts/run-marketing-tests.sh +42 -42
- package/scripts/update_paths.sh +46 -46
- package/scripts/verify-no-secrets.sh +88 -35
- package/.claude/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
- package/.claude/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
- package/.claude/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
- package/.claude/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
- package/.claude/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
- package/README.md.backup_before_replace +0 -781
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
- package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
- package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/config-validator.ts"],"sourcesContent":["/**\r\n * CFN Configuration Validator\r\n * Validates JSON configurations against the CFN schema with detailed error reporting\r\n *\r\n * @version 1.0.0\r\n * @description Type-safe validation library with 95%+ accuracy\r\n */\r\n\r\nimport {\r\n CFNConfig,\r\n ValidationError,\r\n ValidationResult,\r\n EnvVarExportMap,\r\n EnvironmentVariable,\r\n ConfigLoaderOptions,\r\n} from '../types/config.js';\r\n\r\n/**\r\n * Core validation result from our built-in validator\r\n */\r\ninterface ValidationCheckResult {\r\n valid: boolean;\r\n errors: ValidationError[];\r\n}\r\n\r\n/**\r\n * ConfigValidator: Main validation class\r\n * Provides schema validation, error reporting, and env var export functionality\r\n */\r\nexport class ConfigValidator {\r\n private schema: Record<string, unknown>;\r\n private initialized = true;\r\n\r\n constructor(schema?: Record<string, unknown>) {\r\n if (schema) {\r\n this.schema = schema;\r\n } else {\r\n // Use the default schema embedded below\r\n this.schema = this.getDefaultSchema();\r\n }\r\n }\r\n\r\n /**\r\n * Get default schema definition\r\n */\r\n private getDefaultSchema(): Record<string, unknown> {\r\n return {\r\n $schema: 'https://json-schema.org/draft/2020-12/schema',\r\n $id: 'https://claude-flow-novice.local/schemas/cfn-config-v1.json',\r\n title: 'CFN Configuration Schema v1.0',\r\n description: 'Canonical JSON schema for all Claude Flow Novice configuration files',\r\n version: '1.0.0',\r\n type: 'object',\r\n };\r\n }\r\n\r\n /**\r\n * Main validation method using built-in validators\r\n */\r\n public validate(config: unknown): ValidationResult {\r\n const errors: ValidationError[] = [];\r\n const warnings: string[] = [];\r\n\r\n if (typeof config !== 'object' || config === null) {\r\n return {\r\n valid: false,\r\n errors: [\r\n {\r\n field: 'root',\r\n message: 'Configuration must be a valid JSON object',\r\n path: '/',\r\n code: 'INVALID_TYPE',\r\n },\r\n ],\r\n warnings,\r\n configType: 'unknown',\r\n };\r\n }\r\n\r\n const configObj = config as Record<string, unknown>;\r\n const configType = this.detectConfigType(configObj);\r\n\r\n // Validate based on detected type\r\n switch (configType) {\r\n case 'agent-whitelist':\r\n return this.validateAgentWhitelist(configObj);\r\n case 'mcp-servers':\r\n return this.validateMCPServers(configObj);\r\n case 'skill-requirements':\r\n return this.validateSkillRequirements(configObj);\r\n case 'runtime-contract':\r\n return this.validateRuntimeContract(configObj);\r\n case 'team':\r\n return this.validateTeamConfig(configObj);\r\n default:\r\n return {\r\n valid: false,\r\n errors: [\r\n {\r\n field: 'root',\r\n message:\r\n 'Unknown configuration type. Must include agents, servers, tools, variables, or team',\r\n path: '/',\r\n code: 'UNKNOWN_CONFIG_TYPE',\r\n },\r\n ],\r\n warnings,\r\n configType: 'unknown',\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Validate JSON string\r\n */\r\n public validateJSON(jsonString: string): ValidationResult {\r\n try {\r\n const config = JSON.parse(jsonString);\r\n return this.validate(config);\r\n } catch (error) {\r\n return {\r\n valid: false,\r\n errors: [\r\n {\r\n field: 'json',\r\n message: `Failed to parse JSON: ${error instanceof Error ? error.message : String(error)}`,\r\n path: 'root',\r\n code: 'JSON_PARSE_ERROR',\r\n },\r\n ],\r\n warnings: [],\r\n configType: 'unknown',\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Validate Agent Whitelist Configuration\r\n */\r\n private validateAgentWhitelist(config: Record<string, unknown>): ValidationResult {\r\n const errors: ValidationError[] = [];\r\n const warnings: string[] = [];\r\n\r\n // Check version\r\n if (!config.version || typeof config.version !== 'string') {\r\n errors.push({\r\n field: 'version',\r\n message: 'Missing required field: version (string)',\r\n path: '/version',\r\n code: 'MISSING_REQUIRED',\r\n });\r\n } else if (!/^\\d+\\.\\d+\\.\\d+$/.test(config.version)) {\r\n errors.push({\r\n field: 'version',\r\n message: 'Invalid version format. Expected X.Y.Z format',\r\n path: '/version',\r\n value: config.version,\r\n code: 'INVALID_FORMAT',\r\n });\r\n }\r\n\r\n // Check agents array\r\n if (!Array.isArray(config.agents)) {\r\n errors.push({\r\n field: 'agents',\r\n message: 'Missing required field: agents (array)',\r\n path: '/agents',\r\n code: 'MISSING_REQUIRED',\r\n });\r\n } else {\r\n for (let i = 0; i < (config.agents as unknown[]).length; i++) {\r\n const agent = (config.agents as Record<string, unknown>[])[i];\r\n if (!agent.type || typeof agent.type !== 'string' || agent.type.length === 0) {\r\n errors.push({\r\n field: `agents[${i}].type`,\r\n message: 'Agent type is required and must be non-empty string',\r\n path: `/agents/${i}/type`,\r\n code: 'INVALID_AGENT',\r\n });\r\n }\r\n if (!agent.displayName || typeof agent.displayName !== 'string') {\r\n errors.push({\r\n field: `agents[${i}].displayName`,\r\n message: 'Agent displayName is required',\r\n path: `/agents/${i}/displayName`,\r\n code: 'INVALID_AGENT',\r\n });\r\n }\r\n if (!Array.isArray(agent.skills)) {\r\n errors.push({\r\n field: `agents[${i}].skills`,\r\n message: 'Agent skills must be an array',\r\n path: `/agents/${i}/skills`,\r\n code: 'INVALID_AGENT',\r\n });\r\n }\r\n }\r\n }\r\n\r\n if (!config.lastUpdated) {\r\n warnings.push('Agent configuration missing lastUpdated field (recommended)');\r\n }\r\n\r\n return {\r\n valid: errors.length === 0,\r\n errors,\r\n warnings,\r\n configType: 'agent-whitelist',\r\n };\r\n }\r\n\r\n /**\r\n * Validate MCP Servers Configuration\r\n */\r\n private validateMCPServers(config: Record<string, unknown>): ValidationResult {\r\n const errors: ValidationError[] = [];\r\n const warnings: string[] = [];\r\n\r\n // Check version\r\n if (!config.version || typeof config.version !== 'string') {\r\n errors.push({\r\n field: 'version',\r\n message: 'Missing required field: version',\r\n path: '/version',\r\n code: 'MISSING_REQUIRED',\r\n });\r\n }\r\n\r\n // Check servers object\r\n if (!config.servers || typeof config.servers !== 'object') {\r\n errors.push({\r\n field: 'servers',\r\n message: 'Missing required field: servers (object)',\r\n path: '/servers',\r\n code: 'MISSING_REQUIRED',\r\n });\r\n } else {\r\n const servers = config.servers as Record<string, Record<string, unknown>>;\r\n for (const serverName in servers) {\r\n if (Object.prototype.hasOwnProperty.call(servers, serverName)) {\r\n const serverConfig = servers[serverName];\r\n if (!serverConfig.endpoint || typeof serverConfig.endpoint !== 'string') {\r\n errors.push({\r\n field: `servers.${serverName}.endpoint`,\r\n message: 'Server endpoint is required',\r\n path: `/servers/${serverName}/endpoint`,\r\n code: 'INVALID_SERVER',\r\n });\r\n } else if (!this.isValidURL(serverConfig.endpoint)) {\r\n errors.push({\r\n field: `servers.${serverName}.endpoint`,\r\n message: 'Server endpoint must be a valid URL',\r\n path: `/servers/${serverName}/endpoint`,\r\n value: serverConfig.endpoint,\r\n code: 'INVALID_URL',\r\n });\r\n }\r\n\r\n if (!Array.isArray(serverConfig.requiredSkills)) {\r\n errors.push({\r\n field: `servers.${serverName}.requiredSkills`,\r\n message: 'Server requiredSkills must be an array',\r\n path: `/servers/${serverName}/requiredSkills`,\r\n code: 'INVALID_SERVER',\r\n });\r\n }\r\n\r\n if (!serverConfig.auth || typeof serverConfig.auth !== 'object') {\r\n errors.push({\r\n field: `servers.${serverName}.auth`,\r\n message: 'Server auth is required',\r\n path: `/servers/${serverName}/auth`,\r\n code: 'INVALID_SERVER',\r\n });\r\n }\r\n\r\n if (serverConfig.timeoutMs !== undefined && typeof serverConfig.timeoutMs !== 'number') {\r\n errors.push({\r\n field: `servers.${serverName}.timeoutMs`,\r\n message: 'timeoutMs must be a number',\r\n path: `/servers/${serverName}/timeoutMs`,\r\n code: 'INVALID_TYPE',\r\n });\r\n } else if (serverConfig.timeoutMs !== undefined && (serverConfig.timeoutMs as number) < 1000) {\r\n errors.push({\r\n field: `servers.${serverName}.timeoutMs`,\r\n message: 'timeoutMs must be at least 1000ms',\r\n path: `/servers/${serverName}/timeoutMs`,\r\n value: serverConfig.timeoutMs,\r\n code: 'CONSTRAINT_VIOLATION',\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n return {\r\n valid: errors.length === 0,\r\n errors,\r\n warnings,\r\n configType: 'mcp-servers',\r\n };\r\n }\r\n\r\n /**\r\n * Validate Skill Requirements Configuration\r\n */\r\n private validateSkillRequirements(config: Record<string, unknown>): ValidationResult {\r\n const errors: ValidationError[] = [];\r\n const warnings: string[] = [];\r\n\r\n if (!config.version || typeof config.version !== 'string') {\r\n errors.push({\r\n field: 'version',\r\n message: 'Missing required field: version',\r\n path: '/version',\r\n code: 'MISSING_REQUIRED',\r\n });\r\n }\r\n\r\n if (!config.tools || typeof config.tools !== 'object') {\r\n errors.push({\r\n field: 'tools',\r\n message: 'Missing required field: tools (object)',\r\n path: '/tools',\r\n code: 'MISSING_REQUIRED',\r\n });\r\n } else {\r\n const tools = config.tools as Record<string, Record<string, unknown>>;\r\n for (const toolName in tools) {\r\n if (Object.prototype.hasOwnProperty.call(tools, toolName)) {\r\n const toolConfig = tools[toolName];\r\n if (!toolConfig.displayName || typeof toolConfig.displayName !== 'string') {\r\n errors.push({\r\n field: `tools.${toolName}.displayName`,\r\n message: 'Tool displayName is required',\r\n path: `/tools/${toolName}/displayName`,\r\n code: 'INVALID_TOOL',\r\n });\r\n }\r\n\r\n if (!Array.isArray(toolConfig.requiredSkills) || (toolConfig.requiredSkills as unknown[]).length === 0) {\r\n errors.push({\r\n field: `tools.${toolName}.requiredSkills`,\r\n message: 'Tool requiredSkills must be a non-empty array',\r\n path: `/tools/${toolName}/requiredSkills`,\r\n code: 'INVALID_TOOL',\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n return {\r\n valid: errors.length === 0,\r\n errors,\r\n warnings,\r\n configType: 'skill-requirements',\r\n };\r\n }\r\n\r\n /**\r\n * Validate Runtime Contract Configuration\r\n */\r\n private validateRuntimeContract(config: Record<string, unknown>): ValidationResult {\r\n const errors: ValidationError[] = [];\r\n const warnings: string[] = [];\r\n\r\n if (!config.version || typeof config.version !== 'string') {\r\n errors.push({\r\n field: 'version',\r\n message: 'Missing required field: version',\r\n path: '/version',\r\n code: 'MISSING_REQUIRED',\r\n });\r\n }\r\n\r\n if (config.variables && typeof config.variables === 'object') {\r\n const variables = config.variables as Record<string, Record<string, unknown>>;\r\n for (const varName in variables) {\r\n if (Object.prototype.hasOwnProperty.call(variables, varName)) {\r\n const varConfig = variables[varName];\r\n if (!varConfig.description || typeof varConfig.description !== 'string') {\r\n errors.push({\r\n field: `variables.${varName}.description`,\r\n message: 'Variable description is required',\r\n path: `/variables/${varName}/description`,\r\n code: 'INVALID_VARIABLE',\r\n });\r\n }\r\n const varType = varConfig.type as string;\r\n const validTypes = ['string', 'integer', 'number', 'boolean'];\r\n if (!varConfig.type || validTypes.indexOf(varType) === -1) {\r\n errors.push({\r\n field: `variables.${varName}.type`,\r\n message: 'Variable type must be one of: string, integer, number, boolean',\r\n path: `/variables/${varName}/type`,\r\n code: 'INVALID_VARIABLE',\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n return {\r\n valid: errors.length === 0,\r\n errors,\r\n warnings,\r\n configType: 'runtime-contract',\r\n };\r\n }\r\n\r\n /**\r\n * Validate Team Configuration\r\n */\r\n private validateTeamConfig(config: Record<string, unknown>): ValidationResult {\r\n const errors: ValidationError[] = [];\r\n const warnings: string[] = [];\r\n\r\n if (!config.team || typeof config.team !== 'object') {\r\n errors.push({\r\n field: 'team',\r\n message: 'Missing required field: team (object)',\r\n path: '/team',\r\n code: 'MISSING_REQUIRED',\r\n });\r\n return { valid: false, errors, warnings, configType: 'team' };\r\n }\r\n\r\n const team = config.team as Record<string, unknown>;\r\n\r\n if (!team.id || typeof team.id !== 'string' || team.id.length === 0) {\r\n errors.push({\r\n field: 'team.id',\r\n message: 'Team id is required and must be non-empty',\r\n path: '/team/id',\r\n code: 'INVALID_TEAM',\r\n });\r\n } else if (!/^[a-z0-9-]+$/.test(team.id as string)) {\r\n errors.push({\r\n field: 'team.id',\r\n message: 'Team id must contain only lowercase letters, numbers, and hyphens',\r\n path: '/team/id',\r\n value: team.id,\r\n code: 'INVALID_FORMAT',\r\n });\r\n }\r\n\r\n if (!team.name || typeof team.name !== 'string') {\r\n errors.push({\r\n field: 'team.name',\r\n message: 'Team name is required',\r\n path: '/team/name',\r\n code: 'INVALID_TEAM',\r\n });\r\n }\r\n\r\n // Validate workspace if present (supports both diskQuota and disk_quota)\r\n if (team.workspace && typeof team.workspace === 'object') {\r\n const workspace = team.workspace as Record<string, unknown>;\r\n const diskQuota = this.getPropertyValue(workspace, 'diskQuota');\r\n if (diskQuota !== undefined && !this.isValidDiskQuota(diskQuota)) {\r\n errors.push({\r\n field: 'team.workspace.diskQuota',\r\n message: 'Invalid disk quota format. Expected format: <number><UNIT> (e.g., 100GB)',\r\n path: '/team/workspace/diskQuota',\r\n value: diskQuota,\r\n code: 'INVALID_FORMAT',\r\n });\r\n }\r\n }\r\n\r\n // Validate resources if present (supports both camelCase and snake_case naming)\r\n if (team.resources && typeof team.resources === 'object') {\r\n const resources = team.resources as Record<string, unknown>;\r\n const cpuCores = this.getPropertyValue(resources, 'cpuCores');\r\n const maxAgents = this.getPropertyValue(resources, 'maxAgents');\r\n\r\n // Validate cpuCores (supports cpuCores and cpu_cores)\r\n if (cpuCores !== undefined) {\r\n if (typeof cpuCores !== 'number' || cpuCores < 0) {\r\n errors.push({\r\n field: 'team.resources.cpuCores',\r\n message: 'cpuCores must be a non-negative number',\r\n path: '/team/resources/cpuCores',\r\n value: cpuCores,\r\n code: 'INVALID_TYPE',\r\n });\r\n }\r\n }\r\n\r\n // Validate maxAgents (supports maxAgents and max_agents)\r\n if (maxAgents !== undefined) {\r\n if (typeof maxAgents !== 'number' || maxAgents < 1 || !Number.isInteger(maxAgents)) {\r\n errors.push({\r\n field: 'team.resources.maxAgents',\r\n message: 'maxAgents must be a positive integer',\r\n path: '/team/resources/maxAgents',\r\n value: maxAgents,\r\n code: 'INVALID_TYPE',\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Validate network if present\r\n if (team.network && typeof team.network === 'object') {\r\n const network = team.network as Record<string, unknown>;\r\n if (network.coordinatorIp && !this.isValidIPv4(network.coordinatorIp)) {\r\n errors.push({\r\n field: 'team.network.coordinatorIp',\r\n message: 'Invalid IPv4 format',\r\n path: '/team/network/coordinatorIp',\r\n value: network.coordinatorIp,\r\n code: 'INVALID_FORMAT',\r\n });\r\n }\r\n }\r\n\r\n return {\r\n valid: errors.length === 0,\r\n errors,\r\n warnings,\r\n configType: 'team',\r\n };\r\n }\r\n\r\n /**\r\n * Detect configuration type\r\n */\r\n private detectConfigType(config: Record<string, unknown>): string {\r\n // Check for agent whitelist (has 'agents' array)\r\n if ('agents' in config && Array.isArray(config.agents)) {\r\n return 'agent-whitelist';\r\n }\r\n\r\n // Check for MCP servers (has 'servers' object)\r\n if ('servers' in config && typeof config.servers === 'object') {\r\n return 'mcp-servers';\r\n }\r\n\r\n // Check for skill requirements (has 'tools' object)\r\n if ('tools' in config && typeof config.tools === 'object') {\r\n return 'skill-requirements';\r\n }\r\n\r\n // Check for runtime contract (has 'variables' object)\r\n if ('variables' in config && typeof config.variables === 'object') {\r\n return 'runtime-contract';\r\n }\r\n\r\n // Check for team config (has 'team' object)\r\n if ('team' in config && typeof config.team === 'object') {\r\n return 'team';\r\n }\r\n\r\n return 'unknown';\r\n }\r\n\r\n /**\r\n * Export configuration as environment variables\r\n * Handles type preservation and validation\r\n */\r\n public exportEnvVars(config: unknown): EnvVarExportMap {\r\n if (typeof config !== 'object' || config === null) {\r\n throw new Error('Configuration must be an object');\r\n }\r\n\r\n const configObj = config as Record<string, unknown>;\r\n if (!('variables' in configObj)) {\r\n throw new Error('Configuration is not a valid runtime contract');\r\n }\r\n\r\n const envMap: EnvVarExportMap = {};\r\n const variables = configObj.variables;\r\n\r\n if (typeof variables !== 'object' || variables === null) {\r\n throw new Error('Variables must be an object');\r\n }\r\n\r\n const varsObj = variables as Record<string, unknown>;\r\n for (const key in varsObj) {\r\n if (Object.prototype.hasOwnProperty.call(varsObj, key)) {\r\n const variable = varsObj[key];\r\n const varObj = variable as Record<string, unknown>;\r\n if (varObj.value !== null && varObj.value !== undefined) {\r\n const varType = varObj.type as string;\r\n envMap[key] = this.coerceToCorrectType(varObj.value, varType);\r\n }\r\n }\r\n }\r\n\r\n return envMap;\r\n }\r\n\r\n /**\r\n * Coerce value to correct type without loss\r\n */\r\n private coerceToCorrectType(\r\n value: unknown,\r\n type: string\r\n ): string | number | boolean {\r\n if (type === 'integer' && typeof value === 'string') {\r\n return parseInt(value, 10);\r\n }\r\n if (type === 'number' && typeof value === 'string') {\r\n return parseFloat(value);\r\n }\r\n if (type === 'boolean' && typeof value === 'string') {\r\n return value.toLowerCase() === 'true';\r\n }\r\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\r\n return value;\r\n }\r\n return String(value);\r\n }\r\n\r\n /**\r\n * Format validation errors for display\r\n */\r\n public formatErrors(result: ValidationResult): string {\r\n if (result.valid) {\r\n return 'Configuration is valid.';\r\n }\r\n\r\n let output = `Validation failed with ${result.errors.length} error(s):\\n\\n`;\r\n\r\n for (const error of result.errors) {\r\n output += `[${error.code}] ${error.field || 'root'}\\n`;\r\n output += ` ${error.message}\\n`;\r\n if (error.value !== undefined) {\r\n output += ` Current value: ${JSON.stringify(error.value)}\\n`;\r\n }\r\n output += '\\n';\r\n }\r\n\r\n if (result.warnings.length > 0) {\r\n output += `\\nWarnings (${result.warnings.length}):\\n`;\r\n for (const warning of result.warnings) {\r\n output += ` - ${warning}\\n`;\r\n }\r\n }\r\n\r\n return output;\r\n }\r\n\r\n /**\r\n * Helper: Validate URL format\r\n */\r\n private isValidURL(url: unknown): boolean {\r\n if (typeof url !== 'string') return false;\r\n try {\r\n new URL(url);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Helper: Validate disk quota format\r\n */\r\n private isValidDiskQuota(quota: unknown): boolean {\r\n if (typeof quota !== 'string') return false;\r\n return /^\\d+[KMGTPE]B$/.test(quota);\r\n }\r\n\r\n /**\r\n * Helper: Validate IPv4 format\r\n */\r\n private isValidIPv4(ip: unknown): boolean {\r\n if (typeof ip !== 'string') return false;\r\n const ipv4Pattern = /^(\\d{1,3}\\.){3}\\d{1,3}$/;\r\n if (!ipv4Pattern.test(ip)) return false;\r\n\r\n const parts = ip.split('.');\r\n return parts.every((part) => {\r\n const num = parseInt(part, 10);\r\n return num >= 0 && num <= 255;\r\n });\r\n }\r\n\r\n /**\r\n * Helper: Normalize field name (support both snake_case and camelCase)\r\n * Examples: disk_quota → diskQuota, cpu_cores → cpuCores, maxAgents → maxAgents\r\n */\r\n private normalizeFieldName(name: string): string {\r\n if (!name.includes('_')) return name;\r\n return name.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\r\n }\r\n\r\n /**\r\n * Helper: Get property value supporting both naming conventions\r\n * @param obj Object to search\r\n * @param field Field name in any convention (camelCase or snake_case)\r\n * @returns Value if found, undefined otherwise\r\n */\r\n private getPropertyValue(obj: Record<string, unknown>, field: string): unknown {\r\n // Try camelCase version first\r\n if (field in obj) return obj[field];\r\n\r\n // Try snake_case version\r\n const snakeCase = field.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);\r\n if (snakeCase in obj) return obj[snakeCase];\r\n\r\n // Try normalizing if it's snake_case input\r\n const camelCase = this.normalizeFieldName(field);\r\n if (camelCase in obj) return obj[camelCase];\r\n\r\n return undefined;\r\n }\r\n}\r\n\r\n/**\r\n * Singleton instance for global usage\r\n */\r\nlet validatorInstance: ConfigValidator | null = null;\r\n\r\n/**\r\n * Get or create validator instance\r\n */\r\nexport function getValidator(schema?: Record<string, unknown>): ConfigValidator {\r\n if (!validatorInstance) {\r\n validatorInstance = new ConfigValidator(schema);\r\n }\r\n return validatorInstance;\r\n}\r\n\r\n/**\r\n * Validate configuration object\r\n */\r\nexport function validateConfig(config: unknown): ValidationResult {\r\n return getValidator().validate(config);\r\n}\r\n\r\n/**\r\n * Validate JSON string\r\n */\r\nexport function validateJSON(jsonString: string): ValidationResult {\r\n return getValidator().validateJSON(jsonString);\r\n}\r\n\r\n/**\r\n * Export environment variables from runtime contract\r\n */\r\nexport function exportEnvVars(config: unknown): EnvVarExportMap {\r\n return getValidator().exportEnvVars(config);\r\n}\r\n\r\n/**\r\n * Check if configuration is valid (boolean shortcut)\r\n */\r\nexport function isValidConfig(config: unknown): boolean {\r\n return getValidator().validate(config).valid;\r\n}\r\n\r\n/**\r\n * Reset validator instance (useful for testing)\r\n */\r\nexport function resetValidator(): void {\r\n validatorInstance = null;\r\n}\r\n\r\n/**\r\n * Validate multiple configuration files efficiently\r\n * @param filePaths Array of file paths to validate\r\n * @returns Map of file path to validation result\r\n * @throws Error if file cannot be read\r\n */\r\nexport function validateConfigFiles(\r\n filePaths: string[]\r\n): Record<string, ValidationResult> {\r\n const results: Record<string, ValidationResult> = {};\r\n const validator = getValidator();\r\n\r\n for (const filePath of filePaths) {\r\n try {\r\n // Dynamically import fs module to read file\r\n const fs = require('fs');\r\n const content = fs.readFileSync(filePath, 'utf-8');\r\n const config = JSON.parse(content);\r\n results[filePath] = validator.validate(config);\r\n } catch (error) {\r\n results[filePath] = {\r\n valid: false,\r\n errors: [\r\n {\r\n field: 'file',\r\n message: `Failed to read or parse file: ${error instanceof Error ? error.message : String(error)}`,\r\n path: filePath,\r\n code: 'FILE_READ_ERROR',\r\n },\r\n ],\r\n warnings: [],\r\n configType: 'unknown',\r\n };\r\n }\r\n }\r\n\r\n return results;\r\n}\r\n\r\nexport default ConfigValidator;\r\n"],"names":["ConfigValidator","schema","initialized","getDefaultSchema","$schema","$id","title","description","version","type","validate","config","errors","warnings","valid","field","message","path","code","configType","configObj","detectConfigType","validateAgentWhitelist","validateMCPServers","validateSkillRequirements","validateRuntimeContract","validateTeamConfig","validateJSON","jsonString","JSON","parse","error","Error","String","push","test","value","Array","isArray","agents","i","length","agent","displayName","skills","lastUpdated","servers","serverName","Object","prototype","hasOwnProperty","call","serverConfig","endpoint","isValidURL","requiredSkills","auth","timeoutMs","undefined","tools","toolName","toolConfig","variables","varName","varConfig","varType","validTypes","indexOf","team","id","name","workspace","diskQuota","getPropertyValue","isValidDiskQuota","resources","cpuCores","maxAgents","Number","isInteger","network","coordinatorIp","isValidIPv4","exportEnvVars","envMap","varsObj","key","variable","varObj","coerceToCorrectType","parseInt","parseFloat","toLowerCase","formatErrors","result","output","stringify","warning","url","URL","quota","ip","ipv4Pattern","parts","split","every","part","num","normalizeFieldName","includes","replace","_","letter","toUpperCase","obj","snakeCase","camelCase","validatorInstance","getValidator","validateConfig","isValidConfig","resetValidator","validateConfigFiles","filePaths","results","validator","filePath","fs","require","content","readFileSync"],"mappings":"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"}
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Correlation Cache Layer
|
|
3
|
+
*
|
|
4
|
+
* Provides LRU caching for correlation key queries with TTL and invalidation.
|
|
5
|
+
* Part of Task 3.3: Query Correlation Key Layer
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* const cache = new CorrelationCache({
|
|
10
|
+
* maxSize: 100,
|
|
11
|
+
* ttlMinutes: 5,
|
|
12
|
+
* });
|
|
13
|
+
*
|
|
14
|
+
* cache.set('task:abc123', { data: 'value' });
|
|
15
|
+
* const value = cache.get('task:abc123'); // { data: 'value' }
|
|
16
|
+
* ```
|
|
17
|
+
*/ import { createLogger } from './logging.js';
|
|
18
|
+
/**
|
|
19
|
+
* LRU Cache for correlation key queries
|
|
20
|
+
*
|
|
21
|
+
* Implements Least Recently Used eviction policy with TTL and metrics tracking.
|
|
22
|
+
*/ export class CorrelationCache {
|
|
23
|
+
cache;
|
|
24
|
+
maxSize;
|
|
25
|
+
ttlMinutes;
|
|
26
|
+
logger;
|
|
27
|
+
// Metrics
|
|
28
|
+
hits = 0;
|
|
29
|
+
misses = 0;
|
|
30
|
+
evictions = 0;
|
|
31
|
+
invalidations = 0;
|
|
32
|
+
// Cache warming
|
|
33
|
+
warmingEnabled;
|
|
34
|
+
warmingPatterns;
|
|
35
|
+
// Timer cleanup
|
|
36
|
+
cleanupTimer = null;
|
|
37
|
+
constructor(config = {}){
|
|
38
|
+
this.cache = new Map();
|
|
39
|
+
this.maxSize = config.maxSize || 100;
|
|
40
|
+
this.ttlMinutes = config.ttlMinutes || 5;
|
|
41
|
+
this.warmingEnabled = config.enableWarming || false;
|
|
42
|
+
this.warmingPatterns = config.warmingPatterns || [];
|
|
43
|
+
this.logger = config.logger || createLogger('correlation-cache');
|
|
44
|
+
// Start periodic TTL cleanup
|
|
45
|
+
this.startTTLCleanup();
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get value from cache
|
|
49
|
+
*
|
|
50
|
+
* @param key - Cache key
|
|
51
|
+
* @returns Cached value or undefined
|
|
52
|
+
*/ get(key) {
|
|
53
|
+
const entry = this.cache.get(key);
|
|
54
|
+
if (!entry) {
|
|
55
|
+
this.misses++;
|
|
56
|
+
this.logger.debug('Cache miss', {
|
|
57
|
+
key
|
|
58
|
+
});
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
// Check TTL
|
|
62
|
+
if (this.isExpired(entry)) {
|
|
63
|
+
this.invalidate(key, 'ttl');
|
|
64
|
+
this.misses++;
|
|
65
|
+
this.logger.debug('Cache miss (expired)', {
|
|
66
|
+
key
|
|
67
|
+
});
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
// Update LRU metadata
|
|
71
|
+
entry.lastAccessed = new Date();
|
|
72
|
+
entry.accessCount++;
|
|
73
|
+
// Move to end (most recently used)
|
|
74
|
+
this.cache.delete(key);
|
|
75
|
+
this.cache.set(key, entry);
|
|
76
|
+
this.hits++;
|
|
77
|
+
this.logger.debug('Cache hit', {
|
|
78
|
+
key,
|
|
79
|
+
accessCount: entry.accessCount
|
|
80
|
+
});
|
|
81
|
+
return entry.value;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Set value in cache
|
|
85
|
+
*
|
|
86
|
+
* @param key - Cache key
|
|
87
|
+
* @param value - Value to cache
|
|
88
|
+
* @param ttlMinutes - Optional TTL override
|
|
89
|
+
*/ set(key, value, ttlMinutes) {
|
|
90
|
+
const ttl = (ttlMinutes || this.ttlMinutes) * 60 * 1000; // Convert to milliseconds
|
|
91
|
+
const entry = {
|
|
92
|
+
value,
|
|
93
|
+
createdAt: new Date(),
|
|
94
|
+
lastAccessed: new Date(),
|
|
95
|
+
accessCount: 0,
|
|
96
|
+
ttl
|
|
97
|
+
};
|
|
98
|
+
// Check if we need to evict
|
|
99
|
+
if (this.cache.size >= this.maxSize && !this.cache.has(key)) {
|
|
100
|
+
this.evictLRU();
|
|
101
|
+
}
|
|
102
|
+
// Add/update entry
|
|
103
|
+
this.cache.set(key, entry);
|
|
104
|
+
this.logger.debug('Cache set', {
|
|
105
|
+
key,
|
|
106
|
+
ttl
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Check if key exists in cache
|
|
111
|
+
*
|
|
112
|
+
* @param key - Cache key
|
|
113
|
+
* @returns True if key exists and not expired
|
|
114
|
+
*/ has(key) {
|
|
115
|
+
const entry = this.cache.get(key);
|
|
116
|
+
if (!entry) {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
if (this.isExpired(entry)) {
|
|
120
|
+
this.invalidate(key, 'ttl');
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Delete key from cache
|
|
127
|
+
*
|
|
128
|
+
* @param key - Cache key
|
|
129
|
+
* @returns True if key was deleted
|
|
130
|
+
*/ delete(key) {
|
|
131
|
+
return this.invalidate(key, 'delete');
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Invalidate cache entry
|
|
135
|
+
*
|
|
136
|
+
* @param key - Cache key
|
|
137
|
+
* @param trigger - Invalidation trigger
|
|
138
|
+
* @returns True if entry was invalidated
|
|
139
|
+
*/ invalidate(key, trigger = 'manual') {
|
|
140
|
+
const deleted = this.cache.delete(key);
|
|
141
|
+
if (deleted) {
|
|
142
|
+
this.invalidations++;
|
|
143
|
+
this.logger.debug('Cache invalidated', {
|
|
144
|
+
key,
|
|
145
|
+
trigger
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
return deleted;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Invalidate multiple keys by pattern
|
|
152
|
+
*
|
|
153
|
+
* @param pattern - Key pattern (supports wildcards)
|
|
154
|
+
* @returns Number of keys invalidated
|
|
155
|
+
*/ invalidatePattern(pattern) {
|
|
156
|
+
const regex = this.patternToRegex(pattern);
|
|
157
|
+
let count = 0;
|
|
158
|
+
for (const key of this.cache.keys()){
|
|
159
|
+
if (regex.test(key)) {
|
|
160
|
+
this.invalidate(key, 'manual');
|
|
161
|
+
count++;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
this.logger.info('Pattern invalidation', {
|
|
165
|
+
pattern,
|
|
166
|
+
count
|
|
167
|
+
});
|
|
168
|
+
return count;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Clear entire cache
|
|
172
|
+
*/ clear() {
|
|
173
|
+
const size = this.cache.size;
|
|
174
|
+
this.cache.clear();
|
|
175
|
+
this.invalidations += size;
|
|
176
|
+
this.logger.info('Cache cleared', {
|
|
177
|
+
entriesCleared: size
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Get cache metrics
|
|
182
|
+
*
|
|
183
|
+
* @returns Cache metrics
|
|
184
|
+
*/ getMetrics() {
|
|
185
|
+
const totalRequests = this.hits + this.misses;
|
|
186
|
+
const hitRatio = totalRequests > 0 ? this.hits / totalRequests : 0;
|
|
187
|
+
return {
|
|
188
|
+
hits: this.hits,
|
|
189
|
+
misses: this.misses,
|
|
190
|
+
hitRatio,
|
|
191
|
+
size: this.cache.size,
|
|
192
|
+
maxSize: this.maxSize,
|
|
193
|
+
evictions: this.evictions,
|
|
194
|
+
invalidations: this.invalidations
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Reset cache metrics
|
|
199
|
+
*/ resetMetrics() {
|
|
200
|
+
this.hits = 0;
|
|
201
|
+
this.misses = 0;
|
|
202
|
+
this.evictions = 0;
|
|
203
|
+
this.invalidations = 0;
|
|
204
|
+
this.logger.info('Cache metrics reset');
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Warm cache with common patterns
|
|
208
|
+
*
|
|
209
|
+
* @param dataLoader - Function to load data for warming
|
|
210
|
+
*/ async warm(dataLoader) {
|
|
211
|
+
if (!this.warmingEnabled || this.warmingPatterns.length === 0) {
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
this.logger.info('Cache warming started', {
|
|
215
|
+
patterns: this.warmingPatterns
|
|
216
|
+
});
|
|
217
|
+
for (const pattern of this.warmingPatterns){
|
|
218
|
+
try {
|
|
219
|
+
const data = await dataLoader(pattern);
|
|
220
|
+
for (const [key, value] of data.entries()){
|
|
221
|
+
this.set(key, value);
|
|
222
|
+
}
|
|
223
|
+
this.logger.debug('Pattern warmed', {
|
|
224
|
+
pattern,
|
|
225
|
+
count: data.size
|
|
226
|
+
});
|
|
227
|
+
} catch (error) {
|
|
228
|
+
this.logger.warn('Cache warming failed for pattern', {
|
|
229
|
+
pattern,
|
|
230
|
+
error
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
this.logger.info('Cache warming completed');
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Evict least recently used entry
|
|
238
|
+
*/ evictLRU() {
|
|
239
|
+
// Map maintains insertion order, so first entry is LRU
|
|
240
|
+
const firstKey = this.cache.keys().next().value;
|
|
241
|
+
if (firstKey) {
|
|
242
|
+
this.cache.delete(firstKey);
|
|
243
|
+
this.evictions++;
|
|
244
|
+
this.logger.debug('LRU eviction', {
|
|
245
|
+
key: firstKey
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Check if entry is expired
|
|
251
|
+
*/ isExpired(entry) {
|
|
252
|
+
const now = Date.now();
|
|
253
|
+
const createdAt = entry.createdAt.getTime();
|
|
254
|
+
return now - createdAt > entry.ttl;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Convert pattern to regex
|
|
258
|
+
*/ patternToRegex(pattern) {
|
|
259
|
+
// Escape special regex characters except *
|
|
260
|
+
const escaped = pattern.replace(/[.+?^${}()|[\]\\]/g, '\\$&');
|
|
261
|
+
// Convert * to .*
|
|
262
|
+
const regexPattern = escaped.replace(/\*/g, '.*');
|
|
263
|
+
return new RegExp(`^${regexPattern}$`);
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Start periodic TTL cleanup
|
|
267
|
+
*/ startTTLCleanup() {
|
|
268
|
+
// Run cleanup every minute
|
|
269
|
+
this.cleanupTimer = setInterval(()=>{
|
|
270
|
+
this.cleanupExpired();
|
|
271
|
+
}, 60 * 1000);
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Destroy cache and clean up resources
|
|
275
|
+
*
|
|
276
|
+
* Clears the interval timer to prevent memory leaks and clears all cache entries.
|
|
277
|
+
*/ destroy() {
|
|
278
|
+
if (this.cleanupTimer) {
|
|
279
|
+
clearInterval(this.cleanupTimer);
|
|
280
|
+
this.cleanupTimer = null;
|
|
281
|
+
}
|
|
282
|
+
this.clear();
|
|
283
|
+
this.logger.info('Cache destroyed and cleanup timer stopped');
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Clean up expired entries
|
|
287
|
+
*/ cleanupExpired() {
|
|
288
|
+
let count = 0;
|
|
289
|
+
for (const [key, entry] of this.cache.entries()){
|
|
290
|
+
if (this.isExpired(entry)) {
|
|
291
|
+
this.invalidate(key, 'ttl');
|
|
292
|
+
count++;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
if (count > 0) {
|
|
296
|
+
this.logger.debug('TTL cleanup', {
|
|
297
|
+
expired: count
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Create correlation cache instance
|
|
304
|
+
*
|
|
305
|
+
* @param config - Cache configuration
|
|
306
|
+
* @returns Correlation cache instance
|
|
307
|
+
*/ export function createCorrelationCache(config) {
|
|
308
|
+
return new CorrelationCache(config);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
//# sourceMappingURL=correlation-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/correlation-cache.ts"],"sourcesContent":["/**\r\n * Correlation Cache Layer\r\n *\r\n * Provides LRU caching for correlation key queries with TTL and invalidation.\r\n * Part of Task 3.3: Query Correlation Key Layer\r\n *\r\n * @example\r\n * ```typescript\r\n * const cache = new CorrelationCache({\r\n * maxSize: 100,\r\n * ttlMinutes: 5,\r\n * });\r\n *\r\n * cache.set('task:abc123', { data: 'value' });\r\n * const value = cache.get('task:abc123'); // { data: 'value' }\r\n * ```\r\n */\r\n\r\nimport { createLogger, Logger } from './logging.js';\r\n\r\n/**\r\n * Cache entry with metadata\r\n */\r\nexport interface CacheEntry<T = any> {\r\n /** Cached value */\r\n value: T;\r\n /** Entry creation timestamp */\r\n createdAt: Date;\r\n /** Last accessed timestamp */\r\n lastAccessed: Date;\r\n /** Access count */\r\n accessCount: number;\r\n /** TTL in milliseconds */\r\n ttl: number;\r\n}\r\n\r\n/**\r\n * Cache metrics\r\n */\r\nexport interface CacheMetrics {\r\n /** Total cache hits */\r\n hits: number;\r\n /** Total cache misses */\r\n misses: number;\r\n /** Cache hit ratio (0.0-1.0) */\r\n hitRatio: number;\r\n /** Current cache size */\r\n size: number;\r\n /** Maximum cache size */\r\n maxSize: number;\r\n /** Total evictions */\r\n evictions: number;\r\n /** Total invalidations */\r\n invalidations: number;\r\n}\r\n\r\n/**\r\n * Cache configuration\r\n */\r\nexport interface CacheConfig {\r\n /** Maximum cache size (default: 100) */\r\n maxSize?: number;\r\n /** TTL in minutes (default: 5) */\r\n ttlMinutes?: number;\r\n /** Enable cache warming (default: false) */\r\n enableWarming?: boolean;\r\n /** Common patterns for cache warming */\r\n warmingPatterns?: string[];\r\n /** Logger instance (optional) */\r\n logger?: Logger;\r\n}\r\n\r\n/**\r\n * Cache invalidation trigger\r\n */\r\nexport type InvalidationTrigger = 'write' | 'delete' | 'manual' | 'ttl';\r\n\r\n/**\r\n * LRU Cache for correlation key queries\r\n *\r\n * Implements Least Recently Used eviction policy with TTL and metrics tracking.\r\n */\r\nexport class CorrelationCache {\r\n private cache: Map<string, CacheEntry>;\r\n private maxSize: number;\r\n private ttlMinutes: number;\r\n private logger: Logger;\r\n\r\n // Metrics\r\n private hits: number = 0;\r\n private misses: number = 0;\r\n private evictions: number = 0;\r\n private invalidations: number = 0;\r\n\r\n // Cache warming\r\n private warmingEnabled: boolean;\r\n private warmingPatterns: string[];\r\n\r\n // Timer cleanup\r\n private cleanupTimer: NodeJS.Timeout | null = null;\r\n\r\n constructor(config: CacheConfig = {}) {\r\n this.cache = new Map();\r\n this.maxSize = config.maxSize || 100;\r\n this.ttlMinutes = config.ttlMinutes || 5;\r\n this.warmingEnabled = config.enableWarming || false;\r\n this.warmingPatterns = config.warmingPatterns || [];\r\n this.logger = config.logger || createLogger('correlation-cache');\r\n\r\n // Start periodic TTL cleanup\r\n this.startTTLCleanup();\r\n }\r\n\r\n /**\r\n * Get value from cache\r\n *\r\n * @param key - Cache key\r\n * @returns Cached value or undefined\r\n */\r\n get<T = any>(key: string): T | undefined {\r\n const entry = this.cache.get(key);\r\n\r\n if (!entry) {\r\n this.misses++;\r\n this.logger.debug('Cache miss', { key });\r\n return undefined;\r\n }\r\n\r\n // Check TTL\r\n if (this.isExpired(entry)) {\r\n this.invalidate(key, 'ttl');\r\n this.misses++;\r\n this.logger.debug('Cache miss (expired)', { key });\r\n return undefined;\r\n }\r\n\r\n // Update LRU metadata\r\n entry.lastAccessed = new Date();\r\n entry.accessCount++;\r\n\r\n // Move to end (most recently used)\r\n this.cache.delete(key);\r\n this.cache.set(key, entry);\r\n\r\n this.hits++;\r\n this.logger.debug('Cache hit', { key, accessCount: entry.accessCount });\r\n\r\n return entry.value as T;\r\n }\r\n\r\n /**\r\n * Set value in cache\r\n *\r\n * @param key - Cache key\r\n * @param value - Value to cache\r\n * @param ttlMinutes - Optional TTL override\r\n */\r\n set<T = any>(key: string, value: T, ttlMinutes?: number): void {\r\n const ttl = (ttlMinutes || this.ttlMinutes) * 60 * 1000; // Convert to milliseconds\r\n\r\n const entry: CacheEntry<T> = {\r\n value,\r\n createdAt: new Date(),\r\n lastAccessed: new Date(),\r\n accessCount: 0,\r\n ttl,\r\n };\r\n\r\n // Check if we need to evict\r\n if (this.cache.size >= this.maxSize && !this.cache.has(key)) {\r\n this.evictLRU();\r\n }\r\n\r\n // Add/update entry\r\n this.cache.set(key, entry);\r\n\r\n this.logger.debug('Cache set', { key, ttl });\r\n }\r\n\r\n /**\r\n * Check if key exists in cache\r\n *\r\n * @param key - Cache key\r\n * @returns True if key exists and not expired\r\n */\r\n has(key: string): boolean {\r\n const entry = this.cache.get(key);\r\n\r\n if (!entry) {\r\n return false;\r\n }\r\n\r\n if (this.isExpired(entry)) {\r\n this.invalidate(key, 'ttl');\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Delete key from cache\r\n *\r\n * @param key - Cache key\r\n * @returns True if key was deleted\r\n */\r\n delete(key: string): boolean {\r\n return this.invalidate(key, 'delete');\r\n }\r\n\r\n /**\r\n * Invalidate cache entry\r\n *\r\n * @param key - Cache key\r\n * @param trigger - Invalidation trigger\r\n * @returns True if entry was invalidated\r\n */\r\n invalidate(key: string, trigger: InvalidationTrigger = 'manual'): boolean {\r\n const deleted = this.cache.delete(key);\r\n\r\n if (deleted) {\r\n this.invalidations++;\r\n this.logger.debug('Cache invalidated', { key, trigger });\r\n }\r\n\r\n return deleted;\r\n }\r\n\r\n /**\r\n * Invalidate multiple keys by pattern\r\n *\r\n * @param pattern - Key pattern (supports wildcards)\r\n * @returns Number of keys invalidated\r\n */\r\n invalidatePattern(pattern: string): number {\r\n const regex = this.patternToRegex(pattern);\r\n let count = 0;\r\n\r\n for (const key of this.cache.keys()) {\r\n if (regex.test(key)) {\r\n this.invalidate(key, 'manual');\r\n count++;\r\n }\r\n }\r\n\r\n this.logger.info('Pattern invalidation', { pattern, count });\r\n\r\n return count;\r\n }\r\n\r\n /**\r\n * Clear entire cache\r\n */\r\n clear(): void {\r\n const size = this.cache.size;\r\n this.cache.clear();\r\n this.invalidations += size;\r\n this.logger.info('Cache cleared', { entriesCleared: size });\r\n }\r\n\r\n /**\r\n * Get cache metrics\r\n *\r\n * @returns Cache metrics\r\n */\r\n getMetrics(): CacheMetrics {\r\n const totalRequests = this.hits + this.misses;\r\n const hitRatio = totalRequests > 0 ? this.hits / totalRequests : 0;\r\n\r\n return {\r\n hits: this.hits,\r\n misses: this.misses,\r\n hitRatio,\r\n size: this.cache.size,\r\n maxSize: this.maxSize,\r\n evictions: this.evictions,\r\n invalidations: this.invalidations,\r\n };\r\n }\r\n\r\n /**\r\n * Reset cache metrics\r\n */\r\n resetMetrics(): void {\r\n this.hits = 0;\r\n this.misses = 0;\r\n this.evictions = 0;\r\n this.invalidations = 0;\r\n this.logger.info('Cache metrics reset');\r\n }\r\n\r\n /**\r\n * Warm cache with common patterns\r\n *\r\n * @param dataLoader - Function to load data for warming\r\n */\r\n async warm(dataLoader: (pattern: string) => Promise<Map<string, any>>): Promise<void> {\r\n if (!this.warmingEnabled || this.warmingPatterns.length === 0) {\r\n return;\r\n }\r\n\r\n this.logger.info('Cache warming started', { patterns: this.warmingPatterns });\r\n\r\n for (const pattern of this.warmingPatterns) {\r\n try {\r\n const data = await dataLoader(pattern);\r\n\r\n for (const [key, value] of data.entries()) {\r\n this.set(key, value);\r\n }\r\n\r\n this.logger.debug('Pattern warmed', { pattern, count: data.size });\r\n } catch (error) {\r\n this.logger.warn('Cache warming failed for pattern', { pattern, error });\r\n }\r\n }\r\n\r\n this.logger.info('Cache warming completed');\r\n }\r\n\r\n /**\r\n * Evict least recently used entry\r\n */\r\n private evictLRU(): void {\r\n // Map maintains insertion order, so first entry is LRU\r\n const firstKey = this.cache.keys().next().value;\r\n\r\n if (firstKey) {\r\n this.cache.delete(firstKey);\r\n this.evictions++;\r\n this.logger.debug('LRU eviction', { key: firstKey });\r\n }\r\n }\r\n\r\n /**\r\n * Check if entry is expired\r\n */\r\n private isExpired(entry: CacheEntry): boolean {\r\n const now = Date.now();\r\n const createdAt = entry.createdAt.getTime();\r\n return now - createdAt > entry.ttl;\r\n }\r\n\r\n /**\r\n * Convert pattern to regex\r\n */\r\n private patternToRegex(pattern: string): RegExp {\r\n // Escape special regex characters except *\r\n const escaped = pattern.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n // Convert * to .*\r\n const regexPattern = escaped.replace(/\\*/g, '.*');\r\n return new RegExp(`^${regexPattern}$`);\r\n }\r\n\r\n /**\r\n * Start periodic TTL cleanup\r\n */\r\n private startTTLCleanup(): void {\r\n // Run cleanup every minute\r\n this.cleanupTimer = setInterval(() => {\r\n this.cleanupExpired();\r\n }, 60 * 1000);\r\n }\r\n\r\n /**\r\n * Destroy cache and clean up resources\r\n *\r\n * Clears the interval timer to prevent memory leaks and clears all cache entries.\r\n */\r\n destroy(): void {\r\n if (this.cleanupTimer) {\r\n clearInterval(this.cleanupTimer);\r\n this.cleanupTimer = null;\r\n }\r\n this.clear();\r\n this.logger.info('Cache destroyed and cleanup timer stopped');\r\n }\r\n\r\n /**\r\n * Clean up expired entries\r\n */\r\n private cleanupExpired(): void {\r\n let count = 0;\r\n\r\n for (const [key, entry] of this.cache.entries()) {\r\n if (this.isExpired(entry)) {\r\n this.invalidate(key, 'ttl');\r\n count++;\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n this.logger.debug('TTL cleanup', { expired: count });\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Create correlation cache instance\r\n *\r\n * @param config - Cache configuration\r\n * @returns Correlation cache instance\r\n */\r\nexport function createCorrelationCache(config?: CacheConfig): CorrelationCache {\r\n return new CorrelationCache(config);\r\n}\r\n"],"names":["createLogger","CorrelationCache","cache","maxSize","ttlMinutes","logger","hits","misses","evictions","invalidations","warmingEnabled","warmingPatterns","cleanupTimer","config","Map","enableWarming","startTTLCleanup","get","key","entry","debug","undefined","isExpired","invalidate","lastAccessed","Date","accessCount","delete","set","value","ttl","createdAt","size","has","evictLRU","trigger","deleted","invalidatePattern","pattern","regex","patternToRegex","count","keys","test","info","clear","entriesCleared","getMetrics","totalRequests","hitRatio","resetMetrics","warm","dataLoader","length","patterns","data","entries","error","warn","firstKey","next","now","getTime","escaped","replace","regexPattern","RegExp","setInterval","cleanupExpired","destroy","clearInterval","expired","createCorrelationCache"],"mappings":"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"}
|