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,298 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lock Health Monitor
|
|
3
|
+
*
|
|
4
|
+
* Monitors distributed locks for health issues, detects deadlocks,
|
|
5
|
+
* and performs automatic cleanup of stale locks.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Deadlock detection (locks held >5x TTL)
|
|
9
|
+
* - Stale lock cleanup
|
|
10
|
+
* - Lock usage statistics
|
|
11
|
+
* - Contention hotspot detection
|
|
12
|
+
* - Background cleanup task
|
|
13
|
+
* - Incident logging
|
|
14
|
+
*
|
|
15
|
+
* Part of Phase 2, Task P2-2.2: Distributed Locking Enhancement
|
|
16
|
+
*/ import { createLogger } from './logging.js';
|
|
17
|
+
const logger = createLogger('lock-health-monitor');
|
|
18
|
+
/**
|
|
19
|
+
* Lock Health Monitor
|
|
20
|
+
*/ export class LockHealthMonitor {
|
|
21
|
+
redisClient;
|
|
22
|
+
lockManager;
|
|
23
|
+
deadlockIncidents = [];
|
|
24
|
+
cleanupStats = {
|
|
25
|
+
totalCleaned: 0,
|
|
26
|
+
cleanupRuns: 0
|
|
27
|
+
};
|
|
28
|
+
lockUsage = new Map();
|
|
29
|
+
contentionFailures = new Map();
|
|
30
|
+
backgroundCleanupTimer;
|
|
31
|
+
constructor(redisClient, lockManager){
|
|
32
|
+
this.redisClient = redisClient;
|
|
33
|
+
this.lockManager = lockManager;
|
|
34
|
+
logger.info('Lock health monitor initialized');
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Detect deadlocks in the system
|
|
38
|
+
*/ async detectDeadlocks() {
|
|
39
|
+
const deadlocks = [];
|
|
40
|
+
try {
|
|
41
|
+
// Get all lock keys from Redis
|
|
42
|
+
const lockKeys = await this.redisClient.keys('lock:*');
|
|
43
|
+
for (const lockKey of lockKeys){
|
|
44
|
+
const data = await this.redisClient.get(lockKey);
|
|
45
|
+
if (!data) continue;
|
|
46
|
+
const metadata = JSON.parse(data);
|
|
47
|
+
const acquiredAt = new Date(metadata.acquiredAt).getTime();
|
|
48
|
+
const expiresAt = new Date(metadata.expiresAt).getTime();
|
|
49
|
+
const now = Date.now();
|
|
50
|
+
const ttl = expiresAt - acquiredAt;
|
|
51
|
+
const heldDuration = now - acquiredAt;
|
|
52
|
+
// Detect stuck locks (held for >5x TTL)
|
|
53
|
+
if (heldDuration > ttl * 5) {
|
|
54
|
+
deadlocks.push({
|
|
55
|
+
lockKey,
|
|
56
|
+
metadata,
|
|
57
|
+
heldDuration,
|
|
58
|
+
detectedAt: new Date(),
|
|
59
|
+
type: 'stuck'
|
|
60
|
+
});
|
|
61
|
+
logger.warn('Deadlock detected: stuck lock', {
|
|
62
|
+
lockKey,
|
|
63
|
+
heldDuration,
|
|
64
|
+
ttl,
|
|
65
|
+
lockId: metadata.lockId
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// TODO: Advanced feature - detect circular wait deadlocks
|
|
70
|
+
// This would require tracking lock wait queues and building dependency graphs
|
|
71
|
+
return deadlocks;
|
|
72
|
+
} catch (err) {
|
|
73
|
+
logger.error('Error detecting deadlocks', err);
|
|
74
|
+
return deadlocks;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Resolve a deadlock by force-releasing the lock
|
|
79
|
+
*/ async resolveDeadlock(deadlock) {
|
|
80
|
+
try {
|
|
81
|
+
logger.warn('Resolving deadlock', {
|
|
82
|
+
lockKey: deadlock.lockKey,
|
|
83
|
+
type: deadlock.type,
|
|
84
|
+
heldDuration: deadlock.heldDuration
|
|
85
|
+
});
|
|
86
|
+
// Extract resource key from lock key (remove 'lock:' prefix)
|
|
87
|
+
const resourceKey = deadlock.lockKey.replace(/^lock:/, '');
|
|
88
|
+
// Force release the lock
|
|
89
|
+
await this.lockManager.forceRelease(resourceKey);
|
|
90
|
+
// Log incident
|
|
91
|
+
const incident = {
|
|
92
|
+
lockKey: deadlock.lockKey,
|
|
93
|
+
detectedAt: deadlock.detectedAt,
|
|
94
|
+
resolvedAt: new Date(),
|
|
95
|
+
resolutionMethod: 'force-release',
|
|
96
|
+
metadata: deadlock.metadata
|
|
97
|
+
};
|
|
98
|
+
this.deadlockIncidents.push(incident);
|
|
99
|
+
// Keep only last 100 incidents
|
|
100
|
+
if (this.deadlockIncidents.length > 100) {
|
|
101
|
+
this.deadlockIncidents.shift();
|
|
102
|
+
}
|
|
103
|
+
logger.info('Deadlock resolved', {
|
|
104
|
+
lockKey: deadlock.lockKey,
|
|
105
|
+
resolutionMethod: incident.resolutionMethod
|
|
106
|
+
});
|
|
107
|
+
} catch (err) {
|
|
108
|
+
logger.error('Error resolving deadlock', err, {
|
|
109
|
+
lockKey: deadlock.lockKey
|
|
110
|
+
});
|
|
111
|
+
throw err;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Get deadlock incident history
|
|
116
|
+
*/ getDeadlockIncidents() {
|
|
117
|
+
return [
|
|
118
|
+
...this.deadlockIncidents
|
|
119
|
+
];
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Find stale locks (expired TTL but still in Redis)
|
|
123
|
+
*/ async findStaleLocks() {
|
|
124
|
+
const staleLocks = [];
|
|
125
|
+
try {
|
|
126
|
+
const lockKeys = await this.redisClient.keys('lock:*');
|
|
127
|
+
for (const lockKey of lockKeys){
|
|
128
|
+
const ttl = await this.redisClient.pttl(lockKey);
|
|
129
|
+
// TTL < 0 means expired or no expiry set
|
|
130
|
+
if (ttl === -2) {
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
if (ttl === -1) {
|
|
134
|
+
// No expiry set - this is a stale lock!
|
|
135
|
+
staleLocks.push(lockKey);
|
|
136
|
+
logger.warn('Stale lock detected (no TTL)', {
|
|
137
|
+
lockKey
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
// Also check metadata expiration
|
|
141
|
+
const data = await this.redisClient.get(lockKey);
|
|
142
|
+
if (data) {
|
|
143
|
+
const metadata = JSON.parse(data);
|
|
144
|
+
const expiresAt = new Date(metadata.expiresAt).getTime();
|
|
145
|
+
if (Date.now() > expiresAt) {
|
|
146
|
+
staleLocks.push(lockKey);
|
|
147
|
+
logger.warn('Stale lock detected (expired metadata)', {
|
|
148
|
+
lockKey,
|
|
149
|
+
expiresAt: metadata.expiresAt
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return staleLocks;
|
|
155
|
+
} catch (err) {
|
|
156
|
+
logger.error('Error finding stale locks', err);
|
|
157
|
+
return staleLocks;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Cleanup stale locks
|
|
162
|
+
*/ async cleanupStaleLocks() {
|
|
163
|
+
let cleaned = 0;
|
|
164
|
+
try {
|
|
165
|
+
const staleLocks = await this.findStaleLocks();
|
|
166
|
+
for (const lockKey of staleLocks){
|
|
167
|
+
try {
|
|
168
|
+
await this.redisClient.del(lockKey);
|
|
169
|
+
cleaned++;
|
|
170
|
+
logger.info('Stale lock cleaned', {
|
|
171
|
+
lockKey
|
|
172
|
+
});
|
|
173
|
+
} catch (err) {
|
|
174
|
+
logger.error('Error cleaning stale lock', err, {
|
|
175
|
+
lockKey
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// Update cleanup stats
|
|
180
|
+
this.cleanupStats.totalCleaned += cleaned;
|
|
181
|
+
this.cleanupStats.lastCleanupAt = new Date();
|
|
182
|
+
this.cleanupStats.cleanupRuns++;
|
|
183
|
+
if (cleaned > 0) {
|
|
184
|
+
logger.info('Stale lock cleanup complete', {
|
|
185
|
+
cleaned,
|
|
186
|
+
totalCleaned: this.cleanupStats.totalCleaned
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
return cleaned;
|
|
190
|
+
} catch (err) {
|
|
191
|
+
logger.error('Error during stale lock cleanup', err);
|
|
192
|
+
return cleaned;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Get cleanup statistics
|
|
197
|
+
*/ getCleanupStats() {
|
|
198
|
+
return {
|
|
199
|
+
...this.cleanupStats
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Start background cleanup task
|
|
204
|
+
*/ startBackgroundCleanup(intervalMs = 60000) {
|
|
205
|
+
if (this.backgroundCleanupTimer) {
|
|
206
|
+
logger.warn('Background cleanup already running');
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
logger.info('Starting background cleanup', {
|
|
210
|
+
intervalMs
|
|
211
|
+
});
|
|
212
|
+
this.backgroundCleanupTimer = setInterval(async ()=>{
|
|
213
|
+
try {
|
|
214
|
+
await this.cleanupStaleLocks();
|
|
215
|
+
} catch (err) {
|
|
216
|
+
logger.error('Background cleanup error', err);
|
|
217
|
+
}
|
|
218
|
+
}, intervalMs);
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Stop background cleanup task
|
|
222
|
+
*/ stopBackgroundCleanup() {
|
|
223
|
+
if (this.backgroundCleanupTimer) {
|
|
224
|
+
clearInterval(this.backgroundCleanupTimer);
|
|
225
|
+
this.backgroundCleanupTimer = undefined;
|
|
226
|
+
logger.info('Background cleanup stopped');
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Track lock acquisition for usage statistics
|
|
231
|
+
*/ trackAcquisition(resource) {
|
|
232
|
+
const count = this.lockUsage.get(resource) || 0;
|
|
233
|
+
this.lockUsage.set(resource, count + 1);
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Track failed lock acquisition for contention detection
|
|
237
|
+
*/ trackFailedAcquisition(resource) {
|
|
238
|
+
const existing = this.contentionFailures.get(resource);
|
|
239
|
+
if (existing) {
|
|
240
|
+
existing.failedAttempts++;
|
|
241
|
+
existing.lastFailureAt = new Date();
|
|
242
|
+
} else {
|
|
243
|
+
this.contentionFailures.set(resource, {
|
|
244
|
+
resource,
|
|
245
|
+
failedAttempts: 1,
|
|
246
|
+
lastFailureAt: new Date()
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Get lock statistics
|
|
252
|
+
*/ getLockStatistics() {
|
|
253
|
+
return this.lockManager.getStatistics();
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Get lock usage by resource
|
|
257
|
+
*/ getLockUsageByResource() {
|
|
258
|
+
const usage = {};
|
|
259
|
+
for (const [resource, count] of this.lockUsage.entries()){
|
|
260
|
+
usage[resource] = count;
|
|
261
|
+
}
|
|
262
|
+
return usage;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Get contention hotspots (resources with high failure rates)
|
|
266
|
+
*/ getContentionHotspots() {
|
|
267
|
+
const hotspots = Array.from(this.contentionFailures.values());
|
|
268
|
+
// Sort by failed attempts (descending)
|
|
269
|
+
hotspots.sort((a, b)=>b.failedAttempts - a.failedAttempts);
|
|
270
|
+
return hotspots;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Generate health report
|
|
274
|
+
*/ async generateHealthReport() {
|
|
275
|
+
const deadlocks = await this.detectDeadlocks();
|
|
276
|
+
const staleLocks = await this.findStaleLocks();
|
|
277
|
+
const statistics = this.getLockStatistics();
|
|
278
|
+
const usage = this.getLockUsageByResource();
|
|
279
|
+
const hotspots = this.getContentionHotspots();
|
|
280
|
+
const cleanupStats = this.getCleanupStats();
|
|
281
|
+
return {
|
|
282
|
+
deadlocks,
|
|
283
|
+
staleLocks,
|
|
284
|
+
statistics,
|
|
285
|
+
usage,
|
|
286
|
+
hotspots,
|
|
287
|
+
cleanupStats
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Shutdown cleanup
|
|
292
|
+
*/ async shutdown() {
|
|
293
|
+
this.stopBackgroundCleanup();
|
|
294
|
+
logger.info('Lock health monitor shut down');
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
//# sourceMappingURL=lock-health-monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/lock-health-monitor.ts"],"sourcesContent":["/**\r\n * Lock Health Monitor\r\n *\r\n * Monitors distributed locks for health issues, detects deadlocks,\r\n * and performs automatic cleanup of stale locks.\r\n *\r\n * Features:\r\n * - Deadlock detection (locks held >5x TTL)\r\n * - Stale lock cleanup\r\n * - Lock usage statistics\r\n * - Contention hotspot detection\r\n * - Background cleanup task\r\n * - Incident logging\r\n *\r\n * Part of Phase 2, Task P2-2.2: Distributed Locking Enhancement\r\n */\r\n\r\nimport { createLogger } from './logging.js';\r\nimport { DistributedLockManager, LockMetadata } from './distributed-lock.js';\r\n\r\nconst logger = createLogger('lock-health-monitor');\r\n\r\n/**\r\n * Deadlock information\r\n */\r\nexport interface Deadlock {\r\n /** Lock key */\r\n lockKey: string;\r\n /** Lock metadata */\r\n metadata: LockMetadata;\r\n /** Duration lock has been held (ms) */\r\n heldDuration: number;\r\n /** Detection timestamp */\r\n detectedAt: Date;\r\n /** Deadlock type */\r\n type: 'stuck' | 'circular';\r\n}\r\n\r\n/**\r\n * Deadlock incident (resolved)\r\n */\r\nexport interface DeadlockIncident {\r\n /** Lock key */\r\n lockKey: string;\r\n /** Detection timestamp */\r\n detectedAt: Date;\r\n /** Resolution timestamp */\r\n resolvedAt: Date;\r\n /** Resolution method */\r\n resolutionMethod: 'force-release' | 'timeout';\r\n /** Lock metadata at detection */\r\n metadata: LockMetadata;\r\n}\r\n\r\n/**\r\n * Cleanup statistics\r\n */\r\nexport interface CleanupStats {\r\n /** Total locks cleaned */\r\n totalCleaned: number;\r\n /** Last cleanup time */\r\n lastCleanupAt?: Date;\r\n /** Cleanup runs */\r\n cleanupRuns: number;\r\n}\r\n\r\n/**\r\n * Lock usage by resource\r\n */\r\nexport interface LockUsage {\r\n [resource: string]: number;\r\n}\r\n\r\n/**\r\n * Contention hotspot\r\n */\r\nexport interface ContentionHotspot {\r\n /** Resource key */\r\n resource: string;\r\n /** Failed acquisition attempts */\r\n failedAttempts: number;\r\n /** Last failure time */\r\n lastFailureAt: Date;\r\n}\r\n\r\n/**\r\n * Lock Health Monitor\r\n */\r\nexport class LockHealthMonitor {\r\n private redisClient: any;\r\n private lockManager: DistributedLockManager;\r\n private deadlockIncidents: DeadlockIncident[] = [];\r\n private cleanupStats: CleanupStats = {\r\n totalCleaned: 0,\r\n cleanupRuns: 0,\r\n };\r\n private lockUsage: Map<string, number> = new Map();\r\n private contentionFailures: Map<string, ContentionHotspot> = new Map();\r\n private backgroundCleanupTimer?: NodeJS.Timeout;\r\n\r\n constructor(redisClient: any, lockManager: DistributedLockManager) {\r\n this.redisClient = redisClient;\r\n this.lockManager = lockManager;\r\n logger.info('Lock health monitor initialized');\r\n }\r\n\r\n /**\r\n * Detect deadlocks in the system\r\n */\r\n async detectDeadlocks(): Promise<Deadlock[]> {\r\n const deadlocks: Deadlock[] = [];\r\n\r\n try {\r\n // Get all lock keys from Redis\r\n const lockKeys = await this.redisClient.keys('lock:*');\r\n\r\n for (const lockKey of lockKeys) {\r\n const data = await this.redisClient.get(lockKey);\r\n if (!data) continue;\r\n\r\n const metadata: LockMetadata = JSON.parse(data);\r\n const acquiredAt = new Date(metadata.acquiredAt).getTime();\r\n const expiresAt = new Date(metadata.expiresAt).getTime();\r\n const now = Date.now();\r\n\r\n const ttl = expiresAt - acquiredAt;\r\n const heldDuration = now - acquiredAt;\r\n\r\n // Detect stuck locks (held for >5x TTL)\r\n if (heldDuration > ttl * 5) {\r\n deadlocks.push({\r\n lockKey,\r\n metadata,\r\n heldDuration,\r\n detectedAt: new Date(),\r\n type: 'stuck',\r\n });\r\n\r\n logger.warn('Deadlock detected: stuck lock', {\r\n lockKey,\r\n heldDuration,\r\n ttl,\r\n lockId: metadata.lockId,\r\n });\r\n }\r\n }\r\n\r\n // TODO: Advanced feature - detect circular wait deadlocks\r\n // This would require tracking lock wait queues and building dependency graphs\r\n\r\n return deadlocks;\r\n } catch (err) {\r\n logger.error('Error detecting deadlocks', err as Error);\r\n return deadlocks;\r\n }\r\n }\r\n\r\n /**\r\n * Resolve a deadlock by force-releasing the lock\r\n */\r\n async resolveDeadlock(deadlock: Deadlock): Promise<void> {\r\n try {\r\n logger.warn('Resolving deadlock', {\r\n lockKey: deadlock.lockKey,\r\n type: deadlock.type,\r\n heldDuration: deadlock.heldDuration,\r\n });\r\n\r\n // Extract resource key from lock key (remove 'lock:' prefix)\r\n const resourceKey = deadlock.lockKey.replace(/^lock:/, '');\r\n\r\n // Force release the lock\r\n await this.lockManager.forceRelease(resourceKey);\r\n\r\n // Log incident\r\n const incident: DeadlockIncident = {\r\n lockKey: deadlock.lockKey,\r\n detectedAt: deadlock.detectedAt,\r\n resolvedAt: new Date(),\r\n resolutionMethod: 'force-release',\r\n metadata: deadlock.metadata,\r\n };\r\n\r\n this.deadlockIncidents.push(incident);\r\n\r\n // Keep only last 100 incidents\r\n if (this.deadlockIncidents.length > 100) {\r\n this.deadlockIncidents.shift();\r\n }\r\n\r\n logger.info('Deadlock resolved', {\r\n lockKey: deadlock.lockKey,\r\n resolutionMethod: incident.resolutionMethod,\r\n });\r\n } catch (err) {\r\n logger.error('Error resolving deadlock', err as Error, {\r\n lockKey: deadlock.lockKey,\r\n });\r\n throw err;\r\n }\r\n }\r\n\r\n /**\r\n * Get deadlock incident history\r\n */\r\n getDeadlockIncidents(): DeadlockIncident[] {\r\n return [...this.deadlockIncidents];\r\n }\r\n\r\n /**\r\n * Find stale locks (expired TTL but still in Redis)\r\n */\r\n async findStaleLocks(): Promise<string[]> {\r\n const staleLocks: string[] = [];\r\n\r\n try {\r\n const lockKeys = await this.redisClient.keys('lock:*');\r\n\r\n for (const lockKey of lockKeys) {\r\n const ttl = await this.redisClient.pttl(lockKey);\r\n\r\n // TTL < 0 means expired or no expiry set\r\n if (ttl === -2) {\r\n // Key doesn't exist (race condition)\r\n continue;\r\n }\r\n\r\n if (ttl === -1) {\r\n // No expiry set - this is a stale lock!\r\n staleLocks.push(lockKey);\r\n logger.warn('Stale lock detected (no TTL)', { lockKey });\r\n }\r\n\r\n // Also check metadata expiration\r\n const data = await this.redisClient.get(lockKey);\r\n if (data) {\r\n const metadata: LockMetadata = JSON.parse(data);\r\n const expiresAt = new Date(metadata.expiresAt).getTime();\r\n\r\n if (Date.now() > expiresAt) {\r\n staleLocks.push(lockKey);\r\n logger.warn('Stale lock detected (expired metadata)', {\r\n lockKey,\r\n expiresAt: metadata.expiresAt,\r\n });\r\n }\r\n }\r\n }\r\n\r\n return staleLocks;\r\n } catch (err) {\r\n logger.error('Error finding stale locks', err as Error);\r\n return staleLocks;\r\n }\r\n }\r\n\r\n /**\r\n * Cleanup stale locks\r\n */\r\n async cleanupStaleLocks(): Promise<number> {\r\n let cleaned = 0;\r\n\r\n try {\r\n const staleLocks = await this.findStaleLocks();\r\n\r\n for (const lockKey of staleLocks) {\r\n try {\r\n await this.redisClient.del(lockKey);\r\n cleaned++;\r\n\r\n logger.info('Stale lock cleaned', { lockKey });\r\n } catch (err) {\r\n logger.error('Error cleaning stale lock', err as Error, { lockKey });\r\n }\r\n }\r\n\r\n // Update cleanup stats\r\n this.cleanupStats.totalCleaned += cleaned;\r\n this.cleanupStats.lastCleanupAt = new Date();\r\n this.cleanupStats.cleanupRuns++;\r\n\r\n if (cleaned > 0) {\r\n logger.info('Stale lock cleanup complete', {\r\n cleaned,\r\n totalCleaned: this.cleanupStats.totalCleaned,\r\n });\r\n }\r\n\r\n return cleaned;\r\n } catch (err) {\r\n logger.error('Error during stale lock cleanup', err as Error);\r\n return cleaned;\r\n }\r\n }\r\n\r\n /**\r\n * Get cleanup statistics\r\n */\r\n getCleanupStats(): CleanupStats {\r\n return { ...this.cleanupStats };\r\n }\r\n\r\n /**\r\n * Start background cleanup task\r\n */\r\n startBackgroundCleanup(intervalMs: number = 60000): void {\r\n if (this.backgroundCleanupTimer) {\r\n logger.warn('Background cleanup already running');\r\n return;\r\n }\r\n\r\n logger.info('Starting background cleanup', { intervalMs });\r\n\r\n this.backgroundCleanupTimer = setInterval(async () => {\r\n try {\r\n await this.cleanupStaleLocks();\r\n } catch (err) {\r\n logger.error('Background cleanup error', err as Error);\r\n }\r\n }, intervalMs);\r\n }\r\n\r\n /**\r\n * Stop background cleanup task\r\n */\r\n stopBackgroundCleanup(): void {\r\n if (this.backgroundCleanupTimer) {\r\n clearInterval(this.backgroundCleanupTimer);\r\n this.backgroundCleanupTimer = undefined;\r\n logger.info('Background cleanup stopped');\r\n }\r\n }\r\n\r\n /**\r\n * Track lock acquisition for usage statistics\r\n */\r\n trackAcquisition(resource: string): void {\r\n const count = this.lockUsage.get(resource) || 0;\r\n this.lockUsage.set(resource, count + 1);\r\n }\r\n\r\n /**\r\n * Track failed lock acquisition for contention detection\r\n */\r\n trackFailedAcquisition(resource: string): void {\r\n const existing = this.contentionFailures.get(resource);\r\n\r\n if (existing) {\r\n existing.failedAttempts++;\r\n existing.lastFailureAt = new Date();\r\n } else {\r\n this.contentionFailures.set(resource, {\r\n resource,\r\n failedAttempts: 1,\r\n lastFailureAt: new Date(),\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Get lock statistics\r\n */\r\n getLockStatistics() {\r\n return this.lockManager.getStatistics();\r\n }\r\n\r\n /**\r\n * Get lock usage by resource\r\n */\r\n getLockUsageByResource(): LockUsage {\r\n const usage: LockUsage = {};\r\n\r\n for (const [resource, count] of this.lockUsage.entries()) {\r\n usage[resource] = count;\r\n }\r\n\r\n return usage;\r\n }\r\n\r\n /**\r\n * Get contention hotspots (resources with high failure rates)\r\n */\r\n getContentionHotspots(): ContentionHotspot[] {\r\n const hotspots = Array.from(this.contentionFailures.values());\r\n\r\n // Sort by failed attempts (descending)\r\n hotspots.sort((a, b) => b.failedAttempts - a.failedAttempts);\r\n\r\n return hotspots;\r\n }\r\n\r\n /**\r\n * Generate health report\r\n */\r\n async generateHealthReport(): Promise<{\r\n deadlocks: Deadlock[];\r\n staleLocks: string[];\r\n statistics: any;\r\n usage: LockUsage;\r\n hotspots: ContentionHotspot[];\r\n cleanupStats: CleanupStats;\r\n }> {\r\n const deadlocks = await this.detectDeadlocks();\r\n const staleLocks = await this.findStaleLocks();\r\n const statistics = this.getLockStatistics();\r\n const usage = this.getLockUsageByResource();\r\n const hotspots = this.getContentionHotspots();\r\n const cleanupStats = this.getCleanupStats();\r\n\r\n return {\r\n deadlocks,\r\n staleLocks,\r\n statistics,\r\n usage,\r\n hotspots,\r\n cleanupStats,\r\n };\r\n }\r\n\r\n /**\r\n * Shutdown cleanup\r\n */\r\n async shutdown(): Promise<void> {\r\n this.stopBackgroundCleanup();\r\n logger.info('Lock health monitor shut down');\r\n }\r\n}\r\n"],"names":["createLogger","logger","LockHealthMonitor","redisClient","lockManager","deadlockIncidents","cleanupStats","totalCleaned","cleanupRuns","lockUsage","Map","contentionFailures","backgroundCleanupTimer","info","detectDeadlocks","deadlocks","lockKeys","keys","lockKey","data","get","metadata","JSON","parse","acquiredAt","Date","getTime","expiresAt","now","ttl","heldDuration","push","detectedAt","type","warn","lockId","err","error","resolveDeadlock","deadlock","resourceKey","replace","forceRelease","incident","resolvedAt","resolutionMethod","length","shift","getDeadlockIncidents","findStaleLocks","staleLocks","pttl","cleanupStaleLocks","cleaned","del","lastCleanupAt","getCleanupStats","startBackgroundCleanup","intervalMs","setInterval","stopBackgroundCleanup","clearInterval","undefined","trackAcquisition","resource","count","set","trackFailedAcquisition","existing","failedAttempts","lastFailureAt","getLockStatistics","getStatistics","getLockUsageByResource","usage","entries","getContentionHotspots","hotspots","Array","from","values","sort","a","b","generateHealthReport","statistics","shutdown"],"mappings":"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"}
|