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.
Files changed (533) hide show
  1. package/.claude/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
  2. package/.claude/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
  3. package/.claude/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
  4. package/.claude/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
  5. package/.claude/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
  6. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
  7. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
  8. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
  9. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
  10. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
  11. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
  12. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
  13. package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
  14. package/.claude/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
  15. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
  16. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
  17. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
  18. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
  19. package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
  20. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
  21. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
  22. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
  23. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
  24. package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
  25. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
  26. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
  27. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
  28. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
  29. package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
  30. package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
  31. package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
  32. package/.claude/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
  33. package/.claude/commands/cfn-loop-cli.md +16 -2
  34. package/.claude/commands/switch-api.md +31 -10
  35. package/.claude/hooks/cfn-BACKUP_USAGE.md +243 -243
  36. package/.claude/hooks/cfn-invoke-security-validation.sh +69 -69
  37. package/.claude/hooks/cfn-lint-sql-injection.sh +61 -0
  38. package/.claude/hooks/cfn-post-edit-cfn-retrospective.sh +109 -78
  39. package/.claude/hooks/cfn-post-edit.config.json +44 -44
  40. package/.claude/hooks/cfn-pre-edit-security-warning.sh +40 -0
  41. package/.claude/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
  42. package/.claude/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
  43. package/.claude/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
  44. package/.claude/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
  45. package/.claude/skills/cfn-hybrid-routing/check-dependencies.sh +51 -51
  46. package/.claude/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
  47. package/.claude/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
  48. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +184 -23
  49. package/.claude/skills/cfn-loop-orchestration/security_utils.sh +24 -0
  50. package/.claude/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
  51. package/.claude/skills/cfn-loop-validation/orchestrate-cfn-loop.sh +252 -252
  52. package/.claude/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
  53. package/.claude/skills/cfn-redis-coordination/agent-log.sh +4 -0
  54. package/.claude/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
  55. package/.claude/skills/cfn-redis-coordination/agent-recovery.sh +74 -74
  56. package/.claude/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
  57. package/.claude/skills/cfn-redis-coordination/get-context.sh +145 -112
  58. package/.claude/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
  59. package/.claude/skills/cfn-redis-coordination/invoke-waiting-mode.sh +3 -0
  60. package/.claude/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
  61. package/.claude/skills/cfn-redis-coordination/redis-functions.sh +33 -0
  62. package/.claude/skills/cfn-redis-coordination/report-completion.sh +24 -31
  63. package/.claude/skills/cfn-redis-coordination/store-context.sh +4 -0
  64. package/.claude/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
  65. package/.claude/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
  66. package/.claude/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
  67. package/.claude/skills/cfn-transparency-middleware/middleware-config.sh +28 -28
  68. package/.claude/skills/cfn-transparency-middleware/performance-benchmark.sh +78 -78
  69. package/.claude/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
  70. package/.claude/skills/cfn-transparency-middleware/test-integration.sh +161 -161
  71. package/.claude/skills/cfn-transparency-middleware/test-transparency-skill.sh +367 -367
  72. package/.claude/skills/cfn-transparency-middleware/tests/input-validation.sh +107 -92
  73. package/.claude/skills/cfn-transparency-middleware/wrap-agent.sh +131 -131
  74. package/README.md +116 -475
  75. package/claude-assets/agents/cfn-dev-team/README.md +103 -0
  76. package/claude-assets/agents/cfn-dev-team/architecture/goal-planner.md +1 -1
  77. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +77 -15
  78. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +355 -6
  79. package/claude-assets/agents/cfn-dev-team/coordinators/consensus-builder.md +82 -1
  80. package/claude-assets/agents/cfn-dev-team/coordinators/handoff-coordinator.md +82 -1
  81. package/claude-assets/agents/cfn-dev-team/coordinators/multi-sprint-coordinator.md +77 -15
  82. package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +99 -12
  83. package/claude-assets/agents/cfn-dev-team/dev-ops/github-commit-agent.md +1 -1
  84. package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +97 -0
  85. package/claude-assets/agents/cfn-dev-team/dev-ops/monitoring-specialist.md +20 -1
  86. package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +97 -0
  87. package/claude-assets/agents/cfn-dev-team/developers/backend-developer.md +110 -13
  88. package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +106 -15
  89. package/claude-assets/agents/cfn-dev-team/developers/database/database-architect.md +115 -11
  90. package/claude-assets/agents/cfn-dev-team/developers/frontend/mobile-dev.md +94 -7
  91. package/claude-assets/agents/cfn-dev-team/developers/frontend/react-frontend-engineer.md +87 -9
  92. package/claude-assets/agents/cfn-dev-team/developers/frontend/typescript-specialist.md +85 -7
  93. package/claude-assets/agents/cfn-dev-team/developers/frontend/ui-designer.md +160 -28
  94. package/claude-assets/agents/cfn-dev-team/developers/graphql-specialist.md +101 -19
  95. package/claude-assets/agents/cfn-dev-team/developers/rust-developer.md +108 -14
  96. package/claude-assets/agents/cfn-dev-team/reviewers/{reviewer.md → code-reviewer.md} +95 -8
  97. package/claude-assets/agents/cfn-dev-team/reviewers/quality/code-quality-validator.md +107 -7
  98. package/claude-assets/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +98 -7
  99. package/claude-assets/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +95 -7
  100. package/claude-assets/agents/cfn-dev-team/reviewers/quality/security-specialist.md +136 -9
  101. package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +108 -1
  102. package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +107 -13
  103. package/claude-assets/agents/cfn-dev-team/testers/contract-tester.md +737 -0
  104. package/claude-assets/agents/cfn-dev-team/testers/e2e/playwright-tester.md +1 -1
  105. package/claude-assets/agents/cfn-dev-team/testers/integration-tester.md +828 -0
  106. package/claude-assets/agents/cfn-dev-team/testers/interaction-tester.md +106 -7
  107. package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +77 -0
  108. package/claude-assets/agents/cfn-dev-team/testers/mutation-testing-specialist.md +684 -0
  109. package/claude-assets/agents/cfn-dev-team/testers/playwright-tester.md +110 -1
  110. package/claude-assets/agents/cfn-dev-team/testers/tester.md +94 -7
  111. package/claude-assets/agents/cfn-dev-team/utility/code-booster.md +1 -3
  112. package/claude-assets/agents/cfn-dev-team/utility/epic-creator.md +87 -13
  113. package/claude-assets/agents/cfn-dev-team/utility/memory-leak-specialist.md +103 -7
  114. package/claude-assets/agents/cfn-dev-team/utility/researcher.md +1 -3
  115. package/claude-assets/agents/cfn-dev-team/utility/z-ai-specialist.md +94 -7
  116. package/claude-assets/agents/docker-coordinators/cfn-docker-v3-coordinator.md +46 -0
  117. package/claude-assets/agents/project-only-agents/npm-package-specialist.md +1 -1
  118. package/claude-assets/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
  119. package/claude-assets/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
  120. package/claude-assets/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
  121. package/claude-assets/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
  122. package/claude-assets/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
  123. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
  124. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
  125. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
  126. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
  127. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
  128. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
  129. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
  130. package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
  131. package/claude-assets/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
  132. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
  133. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
  134. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
  135. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
  136. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
  137. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
  138. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
  139. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
  140. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
  141. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
  142. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
  143. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
  144. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
  145. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
  146. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
  147. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
  148. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
  149. package/claude-assets/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
  150. package/claude-assets/commands/cfn-loop-cli.md +16 -2
  151. package/claude-assets/commands/switch-api.md +31 -10
  152. package/claude-assets/hooks/cfn-BACKUP_USAGE.md +243 -243
  153. package/claude-assets/hooks/cfn-invoke-security-validation.sh +69 -69
  154. package/claude-assets/hooks/cfn-lint-sql-injection.sh +61 -0
  155. package/claude-assets/hooks/cfn-post-edit-cfn-retrospective.sh +109 -78
  156. package/claude-assets/hooks/cfn-post-edit.config.json +44 -44
  157. package/claude-assets/hooks/cfn-post-execution/memory-cleanup.sh +19 -19
  158. package/claude-assets/hooks/cfn-pre-edit-security-warning.sh +40 -0
  159. package/claude-assets/hooks/cfn-pre-execution/memory-check.sh +19 -19
  160. package/claude-assets/hooks/detect-hardcoded-credentials.sh +212 -0
  161. package/claude-assets/skills/SKILL_TEMPLATE.md +774 -0
  162. package/claude-assets/skills/agent-lifecycle/execute-lifecycle-hook.sh +543 -572
  163. package/claude-assets/skills/agent-lifecycle/simple-audit.sh +57 -30
  164. package/claude-assets/skills/agent-template-generator/SKILL.md +440 -0
  165. package/claude-assets/skills/agent-template-generator/generate-agent.sh +405 -0
  166. package/claude-assets/skills/agent-validation-linter/SKILL.md +589 -0
  167. package/claude-assets/skills/agent-validation-linter/lint-agents.sh +271 -0
  168. package/claude-assets/skills/bootstrap/bash-fundamentals.md +786 -0
  169. package/claude-assets/skills/bootstrap/database-connection.md +464 -0
  170. package/claude-assets/skills/bootstrap/error-handling.md +580 -0
  171. package/claude-assets/skills/bootstrap/file-operations.md +699 -0
  172. package/claude-assets/skills/bootstrap/skill-loader.md +616 -0
  173. package/claude-assets/skills/bootstrap/sqlite-params.sh +287 -0
  174. package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
  175. package/claude-assets/skills/cfn-automatic-memory-persistence/persist-agent-output.sh +48 -48
  176. package/claude-assets/skills/cfn-automatic-memory-persistence/query-agent-history.sh +34 -34
  177. package/claude-assets/skills/cfn-automatic-memory-persistence/test-memory-persistence.sh +17 -16
  178. package/claude-assets/skills/cfn-deliverable-validation/confidence-calculator.sh +261 -261
  179. package/claude-assets/skills/cfn-deployment/SKILL.md +293 -0
  180. package/claude-assets/skills/cfn-deployment/execute.sh +21 -0
  181. package/claude-assets/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
  182. package/claude-assets/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
  183. package/claude-assets/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
  184. package/claude-assets/skills/cfn-environment-sanitization/sanitize-environment.sh +38 -0
  185. package/claude-assets/skills/cfn-error-batching-strategy/lib/core-functions.sh +47 -47
  186. package/claude-assets/skills/cfn-expert-update/update-expert.sh +345 -345
  187. package/claude-assets/skills/cfn-file-operations/SKILL.md +290 -0
  188. package/claude-assets/skills/cfn-file-operations/execute.sh +129 -0
  189. package/claude-assets/skills/cfn-file-operations/lib/atomic-write.sh +294 -0
  190. package/claude-assets/skills/cfn-file-operations/lib/lock.sh +361 -0
  191. package/claude-assets/skills/cfn-file-operations/test.sh +369 -0
  192. package/claude-assets/skills/cfn-hybrid-routing/check-dependencies.sh +51 -51
  193. package/claude-assets/skills/cfn-intervention-detector/detect-intervention.sh +110 -110
  194. package/claude-assets/skills/cfn-intervention-orchestrator/execute-intervention.sh +58 -58
  195. package/claude-assets/skills/cfn-log-operations/SKILL.md +308 -0
  196. package/claude-assets/skills/cfn-log-operations/execute.sh +420 -0
  197. package/claude-assets/skills/cfn-log-operations/lib/rotate.sh +406 -0
  198. package/claude-assets/skills/cfn-log-operations/lib/search.sh +448 -0
  199. package/claude-assets/skills/cfn-log-operations/test.sh +394 -0
  200. package/claude-assets/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
  201. package/claude-assets/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
  202. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +184 -23
  203. package/claude-assets/skills/cfn-loop-orchestration/security_utils.sh +24 -0
  204. package/claude-assets/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
  205. package/claude-assets/skills/cfn-loop-validation/orchestrate-cfn-loop.sh +252 -252
  206. package/claude-assets/skills/cfn-loop2-output-processing/process-validator-output.sh +275 -275
  207. package/claude-assets/skills/cfn-memory-management/check-memory.sh +159 -159
  208. package/claude-assets/skills/cfn-memory-management/cleanup-memory.sh +196 -196
  209. package/claude-assets/skills/cfn-node-heap-sizer/task-mode-heap-limiter.sh +325 -325
  210. package/claude-assets/skills/cfn-parameterized-queries/SKILL.md +339 -0
  211. package/claude-assets/skills/cfn-playbook/query-playbook.sh +19 -15
  212. package/claude-assets/skills/cfn-playbook/update-playbook.sh +25 -14
  213. package/claude-assets/skills/cfn-playbook-auto-update/auto-update-playbook.sh +85 -85
  214. package/claude-assets/skills/cfn-process-instrumentation/instrument-process.sh +44 -0
  215. package/claude-assets/skills/cfn-promotion/SKILL.md +305 -0
  216. package/claude-assets/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
  217. package/claude-assets/skills/cfn-redis-coordination/agent-log.sh +4 -0
  218. package/claude-assets/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
  219. package/claude-assets/skills/cfn-redis-coordination/agent-recovery.sh +74 -74
  220. package/claude-assets/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
  221. package/claude-assets/skills/cfn-redis-coordination/get-context.sh +145 -112
  222. package/claude-assets/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
  223. package/claude-assets/skills/cfn-redis-coordination/invoke-waiting-mode.sh +3 -0
  224. package/claude-assets/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
  225. package/claude-assets/skills/cfn-redis-coordination/redis-functions.sh +33 -0
  226. package/claude-assets/skills/cfn-redis-coordination/report-completion.sh +24 -31
  227. package/claude-assets/skills/cfn-redis-coordination/store-context.sh +4 -0
  228. package/claude-assets/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
  229. package/claude-assets/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
  230. package/claude-assets/skills/cfn-scope-simplifier/simplify-scope.sh +67 -67
  231. package/claude-assets/skills/cfn-skill-loader/SKILL.md +466 -0
  232. package/claude-assets/skills/cfn-skill-loader/execute.sh +344 -0
  233. package/claude-assets/skills/cfn-specialist-injection/recommend-specialist.sh +56 -56
  234. package/claude-assets/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
  235. package/claude-assets/skills/cfn-standardized-error-handling/capture-agent-error.sh +86 -86
  236. package/claude-assets/skills/cfn-standardized-error-handling/test-error-handling.sh +165 -165
  237. package/claude-assets/skills/cfn-task-audit/get-audit-data.sh +42 -21
  238. package/claude-assets/skills/cfn-task-audit/store-task-audit.sh +17 -10
  239. package/claude-assets/skills/cfn-task-config-init/initialize-config.sh +264 -264
  240. package/claude-assets/skills/cfn-task-decomposition/task-decomposer.sh +278 -278
  241. package/claude-assets/skills/cfn-test-runner/detect-regressions.sh +17 -14
  242. package/claude-assets/skills/cfn-test-runner/detect-regressions.sh.backup-1763392821 +55 -0
  243. package/claude-assets/skills/cfn-test-runner/store-benchmarks.sh +17 -19
  244. package/claude-assets/skills/cfn-transparency-middleware/middleware-config.sh +28 -28
  245. package/claude-assets/skills/cfn-transparency-middleware/performance-benchmark.sh +78 -78
  246. package/claude-assets/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
  247. package/claude-assets/skills/cfn-transparency-middleware/test-integration.sh +161 -161
  248. package/claude-assets/skills/cfn-transparency-middleware/test-transparency-skill.sh +367 -367
  249. package/claude-assets/skills/cfn-transparency-middleware/tests/input-validation.sh +107 -92
  250. package/claude-assets/skills/cfn-transparency-middleware/wrap-agent.sh +131 -131
  251. package/claude-assets/skills/cfn-utilities/SKILL.md +237 -0
  252. package/claude-assets/skills/cfn-utilities/execute.sh +32 -0
  253. package/claude-assets/skills/cfn-utilities/lib/errors.sh +56 -0
  254. package/claude-assets/skills/cfn-utilities/lib/file-ops.sh +164 -0
  255. package/claude-assets/skills/cfn-utilities/lib/logging.sh +77 -0
  256. package/claude-assets/skills/cfn-utilities/lib/retry.sh +127 -0
  257. package/claude-assets/skills/cfn-utilities/test.sh +317 -0
  258. package/claude-assets/skills/docker-build/SKILL.md +96 -203
  259. package/claude-assets/skills/docker-build/build.sh +73 -73
  260. package/claude-assets/skills/integration/agent-handoff.sh +492 -0
  261. package/claude-assets/skills/integration/file-operations.sh +414 -0
  262. package/claude-assets/skills/json-validation/SKILL.md +431 -0
  263. package/claude-assets/skills/json-validation/test-validate-success-criteria.sh +421 -0
  264. package/claude-assets/skills/json-validation/validate-success-criteria.sh +197 -0
  265. package/claude-assets/skills/redis-coordination/validate-parameters.sh +34 -0
  266. package/claude-assets/skills/workflow-codification/APPROVAL_WORKFLOW.md +806 -0
  267. package/claude-assets/skills/workflow-codification/COST_TRACKING.md +637 -0
  268. package/claude-assets/skills/workflow-codification/DEPLOY_QUICK_REFERENCE.md +106 -0
  269. package/claude-assets/skills/workflow-codification/EDGE_CASE_TRACKING.md +404 -0
  270. package/claude-assets/skills/workflow-codification/PROPAGATE_UPDATE_QUICK_REFERENCE.md +366 -0
  271. package/claude-assets/skills/workflow-codification/README_PHASE4.md +457 -0
  272. package/claude-assets/skills/workflow-codification/SKILL.md +110 -0
  273. package/claude-assets/skills/workflow-codification/analyze-patterns.sh +899 -0
  274. package/claude-assets/skills/workflow-codification/approval-workflow.sh +514 -0
  275. package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh +481 -0
  276. package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh.backup-1763392820 +512 -0
  277. package/claude-assets/skills/workflow-codification/generate-skill-update.sh +525 -0
  278. package/claude-assets/skills/workflow-codification/lib/security-utils.sh +204 -0
  279. package/claude-assets/skills/workflow-codification/propagate-skill-update.sh +648 -0
  280. package/claude-assets/skills/workflow-codification/propagate-skill-update.sh.backup-1763392820 +664 -0
  281. package/claude-assets/skills/workflow-codification/review-skill.sh +643 -0
  282. package/claude-assets/skills/workflow-codification/templates/email-notification.txt +114 -0
  283. package/claude-assets/skills/workflow-codification/templates/slack-notification.md +85 -0
  284. package/claude-assets/skills/workflow-codification/test-integration.sh +296 -0
  285. package/claude-assets/skills/workflow-codification/test-metadata-update.sh +350 -0
  286. package/claude-assets/skills/workflow-codification/track-cost-savings.sh +486 -0
  287. package/claude-assets/skills/workflow-codification/track-cost-savings.sh.backup-1763392821 +445 -0
  288. package/claude-assets/skills/workflow-codification/track-edge-case.sh +290 -0
  289. package/claude-assets/skills/workflow-codification/workflow-codification.db +0 -0
  290. package/dist/ace/ace-curator.js +10 -2
  291. package/dist/ace/ace-curator.js.map +1 -1
  292. package/dist/ace/ace-generator.js +4 -0
  293. package/dist/ace/ace-generator.js.map +1 -1
  294. package/dist/ace/ace-reflector.js +1 -1
  295. package/dist/ace/ace-reflector.js.map +1 -1
  296. package/dist/ace/context-injection.js +24 -2
  297. package/dist/ace/context-injection.js.map +1 -1
  298. package/dist/agents/agent-loader.js +146 -165
  299. package/dist/agents/agent-loader.js.map +1 -1
  300. package/dist/agents/task-agent-integration.js +1 -1
  301. package/dist/agents/task-agent-integration.js.map +1 -1
  302. package/dist/api/health-endpoints.js +390 -0
  303. package/dist/api/health-endpoints.js.map +1 -0
  304. package/dist/cli/agent-executor.js +4 -1
  305. package/dist/cli/agent-executor.js.map +1 -1
  306. package/dist/cli/agent-prompt-builder.js +89 -1
  307. package/dist/cli/agent-prompt-builder.js.map +1 -1
  308. package/dist/cli/agent-spawn.js +130 -37
  309. package/dist/cli/agent-spawn.js.map +1 -1
  310. package/dist/cli/config-manager.js +91 -109
  311. package/dist/cli/config-manager.js.map +1 -1
  312. package/dist/cli/skill-cache-validator.js +412 -0
  313. package/dist/cli/skill-cache-validator.js.map +1 -0
  314. package/dist/cli/skill-cli.js +991 -0
  315. package/dist/cli/skill-cli.js.map +1 -0
  316. package/dist/cli/skill-execution-logger.js +284 -0
  317. package/dist/cli/skill-execution-logger.js.map +1 -0
  318. package/dist/cli/skill-loader.js +457 -0
  319. package/dist/cli/skill-loader.js.map +1 -0
  320. package/dist/coordination/event-bus.js +2 -2
  321. package/dist/coordination/event-bus.js.map +1 -1
  322. package/dist/coordination/fleet-manager.js +1 -1
  323. package/dist/coordination/fleet-manager.js.map +1 -1
  324. package/dist/coordination/index.js +23 -9
  325. package/dist/coordination/index.js.map +1 -1
  326. package/dist/coordination/types/fleet-manager.types.js.map +1 -1
  327. package/dist/db/migration-manager.js +483 -0
  328. package/dist/db/migration-manager.js.map +1 -0
  329. package/dist/db/skills-query.js +535 -0
  330. package/dist/db/skills-query.js.map +1 -0
  331. package/dist/integration/DatabaseHandoff.js +507 -0
  332. package/dist/integration/DatabaseHandoff.js.map +1 -0
  333. package/dist/integration/StandardAdapter.js +291 -0
  334. package/dist/integration/StandardAdapter.js.map +1 -0
  335. package/dist/jobs/edge-case-analyzer.js +367 -0
  336. package/dist/jobs/edge-case-analyzer.js.map +1 -0
  337. package/dist/jobs/promotion-sla-enforcer.js +288 -0
  338. package/dist/jobs/promotion-sla-enforcer.js.map +1 -0
  339. package/dist/lib/agent-output-parser.js +518 -0
  340. package/dist/lib/agent-output-parser.js.map +1 -0
  341. package/dist/lib/agent-output-validator.js +950 -0
  342. package/dist/lib/agent-output-validator.js.map +1 -0
  343. package/dist/lib/agent-workspace.js +281 -0
  344. package/dist/lib/agent-workspace.js.map +1 -0
  345. package/dist/lib/artifact-registry.js +443 -0
  346. package/dist/lib/artifact-registry.js.map +1 -0
  347. package/dist/lib/atomic-file-writer.js +377 -0
  348. package/dist/lib/atomic-file-writer.js.map +1 -0
  349. package/dist/lib/backup-manager.js +779 -0
  350. package/dist/lib/backup-manager.js.map +1 -0
  351. package/dist/lib/checkpoint-manager.js +837 -0
  352. package/dist/lib/checkpoint-manager.js.map +1 -0
  353. package/dist/lib/circuit-breaker.js +340 -0
  354. package/dist/lib/circuit-breaker.js.map +1 -0
  355. package/dist/lib/completion-signal-handler.js +243 -0
  356. package/dist/lib/completion-signal-handler.js.map +1 -0
  357. package/dist/lib/config-manager.js +312 -0
  358. package/dist/lib/config-manager.js.map +1 -0
  359. package/dist/lib/config-migrator.js +386 -0
  360. package/dist/lib/config-migrator.js.map +1 -0
  361. package/dist/lib/config-validator.js +687 -0
  362. package/dist/lib/config-validator.js.map +1 -0
  363. package/dist/lib/correlation-cache.js +311 -0
  364. package/dist/lib/correlation-cache.js.map +1 -0
  365. package/dist/lib/correlation.js +263 -0
  366. package/dist/lib/correlation.js.map +1 -0
  367. package/dist/lib/database-service/connection-pool-manager.js +520 -0
  368. package/dist/lib/database-service/connection-pool-manager.js.map +1 -0
  369. package/dist/lib/database-service/correlation.js +329 -0
  370. package/dist/lib/database-service/correlation.js.map +1 -0
  371. package/dist/lib/database-service/errors.js +120 -0
  372. package/dist/lib/database-service/errors.js.map +1 -0
  373. package/dist/lib/database-service/index.js +168 -0
  374. package/dist/lib/database-service/index.js.map +1 -0
  375. package/dist/lib/database-service/postgres-adapter.js +526 -0
  376. package/dist/lib/database-service/postgres-adapter.js.map +1 -0
  377. package/dist/lib/database-service/redis-adapter.js +360 -0
  378. package/dist/lib/database-service/redis-adapter.js.map +1 -0
  379. package/dist/lib/database-service/sqlite-adapter.js +544 -0
  380. package/dist/lib/database-service/sqlite-adapter.js.map +1 -0
  381. package/dist/lib/database-service/transaction-manager.js +773 -0
  382. package/dist/lib/database-service/transaction-manager.js.map +1 -0
  383. package/dist/lib/database-service/types.js +23 -0
  384. package/dist/lib/database-service/types.js.map +1 -0
  385. package/dist/lib/deadlock-resolver.js +292 -0
  386. package/dist/lib/deadlock-resolver.js.map +1 -0
  387. package/dist/lib/distributed-lock.js +451 -0
  388. package/dist/lib/distributed-lock.js.map +1 -0
  389. package/dist/lib/edge-case-deduplicator.js +227 -0
  390. package/dist/lib/edge-case-deduplicator.js.map +1 -0
  391. package/dist/lib/encryption-manager.js +322 -0
  392. package/dist/lib/encryption-manager.js.map +1 -0
  393. package/dist/lib/error-aggregator.js +234 -0
  394. package/dist/lib/error-aggregator.js.map +1 -0
  395. package/dist/lib/errors.js +287 -0
  396. package/dist/lib/errors.js.map +1 -0
  397. package/dist/lib/file-lock-manager.js +578 -0
  398. package/dist/lib/file-lock-manager.js.map +1 -0
  399. package/dist/lib/file-operations.js +367 -0
  400. package/dist/lib/file-operations.js.map +1 -0
  401. package/dist/lib/idempotent-write.js +237 -0
  402. package/dist/lib/idempotent-write.js.map +1 -0
  403. package/dist/lib/integration-schema-validator.js +522 -0
  404. package/dist/lib/integration-schema-validator.js.map +1 -0
  405. package/dist/lib/lock-health-monitor.js +298 -0
  406. package/dist/lib/lock-health-monitor.js.map +1 -0
  407. package/dist/lib/log-shipper.js +422 -0
  408. package/dist/lib/log-shipper.js.map +1 -0
  409. package/dist/lib/logging.js +146 -0
  410. package/dist/lib/logging.js.map +1 -0
  411. package/dist/lib/message-deduplicator.js +439 -0
  412. package/dist/lib/message-deduplicator.js.map +1 -0
  413. package/dist/lib/multi-system-query.js +604 -0
  414. package/dist/lib/multi-system-query.js.map +1 -0
  415. package/dist/lib/orphan-detector.js +332 -0
  416. package/dist/lib/orphan-detector.js.map +1 -0
  417. package/dist/lib/password-generator.js +166 -0
  418. package/dist/lib/password-generator.js.map +1 -0
  419. package/dist/lib/path-validator.js +429 -0
  420. package/dist/lib/path-validator.js.map +1 -0
  421. package/dist/lib/query-translator.js +905 -0
  422. package/dist/lib/query-translator.js.map +1 -0
  423. package/dist/lib/queue-recovery.js +469 -0
  424. package/dist/lib/queue-recovery.js.map +1 -0
  425. package/dist/lib/redis-queue-manager.js +512 -0
  426. package/dist/lib/redis-queue-manager.js.map +1 -0
  427. package/dist/lib/reflection-archiver.js +272 -0
  428. package/dist/lib/reflection-archiver.js.map +1 -0
  429. package/dist/lib/retry-manager.js +453 -0
  430. package/dist/lib/retry-manager.js.map +1 -0
  431. package/dist/lib/retry.js +262 -0
  432. package/dist/lib/retry.js.map +1 -0
  433. package/dist/lib/schema-transform.js +695 -0
  434. package/dist/lib/schema-transform.js.map +1 -0
  435. package/dist/lib/schema-validator.js +491 -0
  436. package/dist/lib/schema-validator.js.map +1 -0
  437. package/dist/lib/skill-cache.js +297 -0
  438. package/dist/lib/skill-cache.js.map +1 -0
  439. package/dist/lib/skill-content-manager.js +337 -0
  440. package/dist/lib/skill-content-manager.js.map +1 -0
  441. package/dist/lib/skill-frontmatter-parser.js +237 -0
  442. package/dist/lib/skill-frontmatter-parser.js.map +1 -0
  443. package/dist/lib/skill-git-integration.js +275 -0
  444. package/dist/lib/skill-git-integration.js.map +1 -0
  445. package/dist/lib/skill-markdown-validator.js +396 -0
  446. package/dist/lib/skill-markdown-validator.js.map +1 -0
  447. package/dist/lib/skill-output-parser.js +312 -0
  448. package/dist/lib/skill-output-parser.js.map +1 -0
  449. package/dist/lib/unified-query-api.js +467 -0
  450. package/dist/lib/unified-query-api.js.map +1 -0
  451. package/dist/middleware/auth-middleware.js +350 -0
  452. package/dist/middleware/auth-middleware.js.map +1 -0
  453. package/dist/middleware/schema-validation.js +347 -0
  454. package/dist/middleware/schema-validation.js.map +1 -0
  455. package/dist/providers/anthropic-provider.js +1 -1
  456. package/dist/providers/anthropic-provider.js.map +1 -1
  457. package/dist/providers/provider-factory.js +2 -2
  458. package/dist/providers/provider-factory.js.map +1 -1
  459. package/dist/services/edge-case-analyzer.js +321 -0
  460. package/dist/services/edge-case-analyzer.js.map +1 -0
  461. package/dist/services/edge-case-deduplicator.js +266 -0
  462. package/dist/services/edge-case-deduplicator.js.map +1 -0
  463. package/dist/services/edge-case-detector.js +337 -0
  464. package/dist/services/edge-case-detector.js.map +1 -0
  465. package/dist/services/edge-case-tracker.js +547 -0
  466. package/dist/services/edge-case-tracker.js.map +1 -0
  467. package/dist/services/health-check-system.js +586 -0
  468. package/dist/services/health-check-system.js.map +1 -0
  469. package/dist/services/metrics-logger.js +412 -0
  470. package/dist/services/metrics-logger.js.map +1 -0
  471. package/dist/services/patch-generator.js +378 -0
  472. package/dist/services/patch-generator.js.map +1 -0
  473. package/dist/services/patch-validator.js +337 -0
  474. package/dist/services/patch-validator.js.map +1 -0
  475. package/dist/services/performance-monitor.js +811 -0
  476. package/dist/services/performance-monitor.js.map +1 -0
  477. package/dist/services/promotion-pipeline.js +918 -0
  478. package/dist/services/promotion-pipeline.js.map +1 -0
  479. package/dist/services/promotion-validator.js +394 -0
  480. package/dist/services/promotion-validator.js.map +1 -0
  481. package/dist/services/reflection-logger.js +388 -0
  482. package/dist/services/reflection-logger.js.map +1 -0
  483. package/dist/services/skill-deployment.js +472 -0
  484. package/dist/services/skill-deployment.js.map +1 -0
  485. package/dist/services/skill-loader.js +427 -0
  486. package/dist/services/skill-loader.js.map +1 -0
  487. package/dist/services/skill-promotion.js +372 -0
  488. package/dist/services/skill-promotion.js.map +1 -0
  489. package/dist/services/skill-validator.js +454 -0
  490. package/dist/services/skill-validator.js.map +1 -0
  491. package/dist/services/skill-versioning.js +244 -0
  492. package/dist/services/skill-versioning.js.map +1 -0
  493. package/dist/services/workspace-supervisor.js +597 -0
  494. package/dist/services/workspace-supervisor.js.map +1 -0
  495. package/dist/types/agent-output.js +44 -0
  496. package/dist/types/agent-output.js.map +1 -0
  497. package/dist/types/config.js +28 -0
  498. package/dist/types/config.js.map +1 -0
  499. package/dist/types/edge-case.js +45 -0
  500. package/dist/types/edge-case.js.map +1 -0
  501. package/package.json +201 -176
  502. package/readme/README.md +19 -4
  503. package/scripts/artifact-cleanup.sh +392 -0
  504. package/scripts/backup-cleanup.sh +627 -0
  505. package/scripts/cleanup-workspaces.sh +412 -0
  506. package/scripts/cleanup-yaml-configs.sh +141 -0
  507. package/scripts/deploy-approved-skills.sh +263 -0
  508. package/scripts/deploy-production.sh +355 -355
  509. package/scripts/docker-playwright-fix.sh +311 -311
  510. package/scripts/docker-rebuild-all-agents.sh +127 -127
  511. package/scripts/health-check.sh +447 -0
  512. package/scripts/log-aggregator.sh +554 -0
  513. package/scripts/log-monitor.sh +629 -0
  514. package/scripts/manage-agent-workspaces.sh +434 -0
  515. package/scripts/memory-leak-prevention.sh +305 -305
  516. package/scripts/migrate-artifacts.sh +563 -0
  517. package/scripts/migrate-schema.sh +533 -0
  518. package/scripts/migrate-yaml-to-json.sh +465 -0
  519. package/scripts/promote-staged-skills.sh +423 -0
  520. package/scripts/run-marketing-tests.sh +42 -42
  521. package/scripts/update_paths.sh +46 -46
  522. package/scripts/verify-no-secrets.sh +88 -35
  523. package/.claude/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
  524. package/.claude/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
  525. package/.claude/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
  526. package/.claude/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
  527. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
  528. package/README.md.backup_before_replace +0 -781
  529. package/claude-assets/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
  530. package/claude-assets/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
  531. package/claude-assets/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
  532. package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
  533. 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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"}