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,360 @@
1
+ /**
2
+ * Redis Database Adapter
3
+ *
4
+ * Implements IDatabaseAdapter for Redis key-value store.
5
+ * Part of Task 0.4: Database Query Abstraction Layer (MVP)
6
+ *
7
+ * UPDATED: Now uses ConnectionPoolManager for proper connection pool initialization,
8
+ * health checks, automatic reconnection with exponential backoff, and connection metrics.
9
+ *
10
+ * SECURITY: Supports Redis authentication via requirepass with secure password handling
11
+ */ import { randomUUID } from 'crypto';
12
+ import { DatabaseErrorCode, createDatabaseError, createSuccessResult, createFailedResult, mapRedisError } from './errors.js';
13
+ import { ConnectionPoolManager } from './connection-pool-manager.js';
14
+ import { v4 as uuidv4 } from 'uuid';
15
+ export class RedisAdapter {
16
+ poolManager = null;
17
+ client = null;
18
+ config;
19
+ connected = false;
20
+ errorAggregator;
21
+ correlationId;
22
+ constructor(config, errorAggregator){
23
+ this.config = config;
24
+ this.errorAggregator = errorAggregator;
25
+ this.correlationId = uuidv4();
26
+ }
27
+ /**
28
+ * Track error with error aggregator
29
+ * @private
30
+ */ trackError(error, operation, context) {
31
+ if (this.errorAggregator) {
32
+ const dbError = error.code ? error : createDatabaseError(DatabaseErrorCode.QUERY_FAILED, `Redis ${operation} failed`, error instanceof Error ? error : new Error(String(error)), context);
33
+ this.errorAggregator.addError('redis', dbError, {
34
+ ...context,
35
+ operation,
36
+ correlationId: this.correlationId
37
+ });
38
+ }
39
+ }
40
+ /**
41
+ * Record successful operation with error aggregator
42
+ * @private
43
+ */ recordSuccess() {
44
+ if (this.errorAggregator) {
45
+ this.errorAggregator.recordSuccess('redis');
46
+ }
47
+ }
48
+ getType() {
49
+ return 'redis';
50
+ }
51
+ async connect() {
52
+ try {
53
+ // Initialize connection pool manager
54
+ this.poolManager = new ConnectionPoolManager(this.config);
55
+ await this.poolManager.initialize();
56
+ // Get the Redis client from pool manager
57
+ this.client = await this.poolManager.acquire();
58
+ // Start health checks (ping every 30s)
59
+ this.poolManager.startHealthChecks();
60
+ this.connected = true;
61
+ this.recordSuccess();
62
+ } catch (err) {
63
+ const error = createDatabaseError(DatabaseErrorCode.CONNECTION_FAILED, 'Failed to connect to Redis', err instanceof Error ? err : new Error(String(err)), {
64
+ config: this.config,
65
+ correlationId: this.correlationId
66
+ });
67
+ this.trackError(error, 'connect');
68
+ throw error;
69
+ }
70
+ }
71
+ async disconnect() {
72
+ if (this.poolManager) {
73
+ await this.poolManager.shutdown();
74
+ this.poolManager = null;
75
+ this.client = null;
76
+ this.connected = false;
77
+ }
78
+ }
79
+ isConnected() {
80
+ return this.connected && this.poolManager !== null && this.client !== null;
81
+ }
82
+ /**
83
+ * Get connection pool statistics
84
+ */ getPoolStats() {
85
+ return this.poolManager?.getStats();
86
+ }
87
+ async get(key) {
88
+ this.ensureConnected();
89
+ try {
90
+ const value = await this.client.get(key);
91
+ if (value === null) {
92
+ return null;
93
+ }
94
+ // Try to parse as JSON, fall back to raw string
95
+ try {
96
+ this.recordSuccess();
97
+ return JSON.parse(value);
98
+ } catch {
99
+ this.recordSuccess();
100
+ return value;
101
+ }
102
+ } catch (err) {
103
+ const errorCode = mapRedisError(err instanceof Error ? err : new Error(String(err)));
104
+ const error = createDatabaseError(errorCode, `Failed to get key: ${key}`, err instanceof Error ? err : new Error(String(err)), {
105
+ key,
106
+ correlationId: this.correlationId
107
+ });
108
+ this.trackError(error, 'get', {
109
+ key
110
+ });
111
+ throw error;
112
+ }
113
+ }
114
+ async list(pattern, options) {
115
+ this.ensureConnected();
116
+ try {
117
+ const keys = await this.client.keys(pattern);
118
+ if (keys.length === 0) {
119
+ return [];
120
+ }
121
+ const values = await this.client.mGet(keys);
122
+ const results = values.map((value, index)=>{
123
+ if (value === null) {
124
+ return null;
125
+ }
126
+ try {
127
+ return JSON.parse(value);
128
+ } catch {
129
+ return value;
130
+ }
131
+ }).filter((v)=>v !== null);
132
+ // Apply limit and offset
133
+ const start = options?.offset || 0;
134
+ const end = options?.limit ? start + options.limit : undefined;
135
+ this.recordSuccess();
136
+ return results.slice(start, end);
137
+ } catch (err) {
138
+ const errorCode = mapRedisError(err instanceof Error ? err : new Error(String(err)));
139
+ const error = createDatabaseError(errorCode, `Failed to list keys: ${pattern}`, err instanceof Error ? err : new Error(String(err)), {
140
+ pattern,
141
+ options,
142
+ correlationId: this.correlationId
143
+ });
144
+ this.trackError(error, 'list', {
145
+ pattern
146
+ });
147
+ throw error;
148
+ }
149
+ }
150
+ async query(pattern, filters) {
151
+ // For Redis, query is similar to list but with additional filtering
152
+ const results = await this.list(pattern);
153
+ // Apply filters
154
+ return results.filter((item)=>{
155
+ return filters.every((filter)=>{
156
+ const value = item[filter.field];
157
+ switch(filter.operator){
158
+ case 'eq':
159
+ return value === filter.value;
160
+ case 'ne':
161
+ return value !== filter.value;
162
+ case 'gt':
163
+ return value > filter.value;
164
+ case 'gte':
165
+ return value >= filter.value;
166
+ case 'lt':
167
+ return value < filter.value;
168
+ case 'lte':
169
+ return value <= filter.value;
170
+ case 'in':
171
+ return Array.isArray(filter.value) && filter.value.includes(value);
172
+ case 'like':
173
+ return String(value).includes(String(filter.value));
174
+ default:
175
+ return true;
176
+ }
177
+ });
178
+ });
179
+ }
180
+ async insert(key, data) {
181
+ this.ensureConnected();
182
+ try {
183
+ const value = typeof data === 'string' ? data : JSON.stringify(data);
184
+ await this.client.set(key, value);
185
+ this.recordSuccess();
186
+ return createSuccessResult(data, 1);
187
+ } catch (err) {
188
+ const errorCode = mapRedisError(err instanceof Error ? err : new Error(String(err)));
189
+ const error = createDatabaseError(errorCode, `Failed to insert key: ${key}`, err instanceof Error ? err : new Error(String(err)), {
190
+ key,
191
+ data,
192
+ correlationId: this.correlationId
193
+ });
194
+ this.trackError(error, 'insert', {
195
+ key
196
+ });
197
+ return createFailedResult(error);
198
+ }
199
+ }
200
+ async insertMany(pattern, data) {
201
+ this.ensureConnected();
202
+ try {
203
+ const pipeline = this.client.multi();
204
+ data.forEach((item, index)=>{
205
+ const key = `${pattern}:${index}`;
206
+ const value = typeof item === 'string' ? item : JSON.stringify(item);
207
+ pipeline.set(key, value);
208
+ });
209
+ await pipeline.exec();
210
+ this.recordSuccess();
211
+ return createSuccessResult(data, data.length);
212
+ } catch (err) {
213
+ const errorCode = mapRedisError(err instanceof Error ? err : new Error(String(err)));
214
+ const error = createDatabaseError(errorCode, `Failed to insert multiple keys with pattern: ${pattern}`, err instanceof Error ? err : new Error(String(err)), {
215
+ pattern,
216
+ count: data.length,
217
+ correlationId: this.correlationId
218
+ });
219
+ this.trackError(error, 'insertMany', {
220
+ pattern,
221
+ count: data.length
222
+ });
223
+ return createFailedResult(error);
224
+ }
225
+ }
226
+ async update(key, data) {
227
+ this.ensureConnected();
228
+ try {
229
+ // Get existing data
230
+ const existing = await this.get(key);
231
+ if (existing === null) {
232
+ const error = createDatabaseError(DatabaseErrorCode.NOT_FOUND, `Key not found: ${key}`, undefined, {
233
+ key,
234
+ correlationId: this.correlationId
235
+ });
236
+ this.trackError(error, 'update', {
237
+ key
238
+ });
239
+ return createFailedResult(error);
240
+ }
241
+ // Merge with updates
242
+ const updated = {
243
+ ...existing,
244
+ ...data
245
+ };
246
+ const value = JSON.stringify(updated);
247
+ await this.client.set(key, value);
248
+ this.recordSuccess();
249
+ return createSuccessResult(updated, 1);
250
+ } catch (err) {
251
+ const errorCode = mapRedisError(err instanceof Error ? err : new Error(String(err)));
252
+ const error = createDatabaseError(errorCode, `Failed to update key: ${key}`, err instanceof Error ? err : new Error(String(err)), {
253
+ key,
254
+ data,
255
+ correlationId: this.correlationId
256
+ });
257
+ this.trackError(error, 'update', {
258
+ key
259
+ });
260
+ return createFailedResult(error);
261
+ }
262
+ }
263
+ async delete(_table, key) {
264
+ this.ensureConnected();
265
+ try {
266
+ const count = await this.client.del(key);
267
+ if (count === 0) {
268
+ const error = createDatabaseError(DatabaseErrorCode.NOT_FOUND, `Key not found: ${key}`, undefined, {
269
+ key,
270
+ correlationId: this.correlationId
271
+ });
272
+ this.trackError(error, 'delete', {
273
+ key
274
+ });
275
+ return createFailedResult(error);
276
+ }
277
+ this.recordSuccess();
278
+ return createSuccessResult(undefined, count);
279
+ } catch (err) {
280
+ const errorCode = mapRedisError(err instanceof Error ? err : new Error(String(err)));
281
+ const error = createDatabaseError(errorCode, `Failed to delete key: ${key}`, err instanceof Error ? err : new Error(String(err)), {
282
+ key,
283
+ correlationId: this.correlationId
284
+ });
285
+ this.trackError(error, 'delete', {
286
+ key
287
+ });
288
+ return createFailedResult(error);
289
+ }
290
+ }
291
+ async raw(command, params) {
292
+ this.ensureConnected();
293
+ try {
294
+ const result = await this.client.sendCommand([
295
+ command,
296
+ ...params || []
297
+ ]);
298
+ this.recordSuccess();
299
+ return result;
300
+ } catch (err) {
301
+ const errorCode = mapRedisError(err instanceof Error ? err : new Error(String(err)));
302
+ const error = createDatabaseError(errorCode, `Failed to execute raw command: ${command}`, err instanceof Error ? err : new Error(String(err)), {
303
+ command,
304
+ params,
305
+ correlationId: this.correlationId
306
+ });
307
+ this.trackError(error, 'raw', {
308
+ command
309
+ });
310
+ throw error;
311
+ }
312
+ }
313
+ async beginTransaction() {
314
+ return {
315
+ id: `redis-tx-${randomUUID()}`,
316
+ databases: [
317
+ 'redis'
318
+ ],
319
+ startTime: new Date(),
320
+ status: 'pending'
321
+ };
322
+ }
323
+ async prepareTransaction(context) {
324
+ try {
325
+ // Redis doesn't support traditional two-phase commit
326
+ // PREPARE validation: Check if Redis is available and can accept commands
327
+ this.ensureConnected();
328
+ // Test connection and command execution
329
+ await this.client.ping();
330
+ // Mark as prepared
331
+ context.status = 'prepared';
332
+ context.preparedAt = new Date();
333
+ return true;
334
+ } catch (err) {
335
+ // Prepare failed - typically due to connection issues
336
+ throw createDatabaseError(DatabaseErrorCode.TRANSACTION_FAILED, 'Failed to prepare transaction - Redis unavailable', err instanceof Error ? err : new Error(String(err)), {
337
+ transactionId: context.id
338
+ });
339
+ }
340
+ }
341
+ async commitTransaction(context) {
342
+ // Redis transactions are handled via MULTI/EXEC
343
+ // This is a placeholder for cross-database transaction support
344
+ context.status = 'committed';
345
+ }
346
+ async rollbackTransaction(context) {
347
+ // Redis doesn't support traditional rollback
348
+ // This is a placeholder for cross-database transaction support
349
+ context.status = 'rolled_back';
350
+ }
351
+ ensureConnected() {
352
+ if (!this.isConnected()) {
353
+ throw createDatabaseError(DatabaseErrorCode.CONNECTION_FAILED, 'Not connected to Redis', undefined, {
354
+ config: this.config
355
+ });
356
+ }
357
+ }
358
+ }
359
+
360
+ //# sourceMappingURL=redis-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/database-service/redis-adapter.ts"],"sourcesContent":["/**\r\n * Redis Database Adapter\r\n *\r\n * Implements IDatabaseAdapter for Redis key-value store.\r\n * Part of Task 0.4: Database Query Abstraction Layer (MVP)\r\n *\r\n * UPDATED: Now uses ConnectionPoolManager for proper connection pool initialization,\r\n * health checks, automatic reconnection with exponential backoff, and connection metrics.\r\n *\r\n * SECURITY: Supports Redis authentication via requirepass with secure password handling\r\n */\r\n\r\nimport { createClient, RedisClientType } from 'redis';\r\nimport { randomUUID } from 'crypto';\r\nimport {\r\n IDatabaseAdapter,\r\n DatabaseConfig,\r\n QueryOptions,\r\n QueryFilter,\r\n OperationResult,\r\n TransactionContext,\r\n} from './types.js';\r\nimport {\r\n DatabaseErrorCode,\r\n createDatabaseError,\r\n createSuccessResult,\r\n createFailedResult,\r\n mapRedisError,\r\n} from './errors.js';\r\nimport { ConnectionPoolManager } from './connection-pool-manager.js';\r\nimport { ErrorAggregator } from '../error-aggregator.js';\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\nexport class RedisAdapter implements IDatabaseAdapter {\r\n private poolManager: ConnectionPoolManager | null = null;\r\n private client: RedisClientType | null = null;\r\n private config: DatabaseConfig;\r\n private connected: boolean = false;\r\n private errorAggregator?: ErrorAggregator;\r\n private correlationId: string;\r\n\r\n constructor(config: DatabaseConfig, errorAggregator?: ErrorAggregator) {\r\n this.config = config;\r\n this.errorAggregator = errorAggregator;\r\n this.correlationId = uuidv4();\r\n }\r\n\r\n /**\r\n * Track error with error aggregator\r\n * @private\r\n */\r\n private trackError(error: any, operation: string, context?: Record<string, any>): void {\r\n if (this.errorAggregator) {\r\n const dbError = error.code ? error : createDatabaseError(\r\n DatabaseErrorCode.QUERY_FAILED,\r\n `Redis ${operation} failed`,\r\n error instanceof Error ? error : new Error(String(error)),\r\n context\r\n );\r\n\r\n this.errorAggregator.addError('redis', dbError, {\r\n ...context,\r\n operation,\r\n correlationId: this.correlationId,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Record successful operation with error aggregator\r\n * @private\r\n */\r\n private recordSuccess(): void {\r\n if (this.errorAggregator) {\r\n this.errorAggregator.recordSuccess('redis');\r\n }\r\n }\r\n\r\n getType(): 'redis' {\r\n return 'redis';\r\n }\r\n\r\n async connect(): Promise<void> {\r\n try {\r\n // Initialize connection pool manager\r\n this.poolManager = new ConnectionPoolManager(this.config);\r\n await this.poolManager.initialize();\r\n\r\n // Get the Redis client from pool manager\r\n this.client = await this.poolManager.acquire();\r\n\r\n // Start health checks (ping every 30s)\r\n this.poolManager.startHealthChecks();\r\n\r\n this.connected = true;\r\n this.recordSuccess();\r\n } catch (err) {\r\n const error = createDatabaseError(\r\n DatabaseErrorCode.CONNECTION_FAILED,\r\n 'Failed to connect to Redis',\r\n err instanceof Error ? err : new Error(String(err)),\r\n { config: this.config, correlationId: this.correlationId }\r\n );\r\n this.trackError(error, 'connect');\r\n throw error;\r\n }\r\n }\r\n\r\n async disconnect(): Promise<void> {\r\n if (this.poolManager) {\r\n await this.poolManager.shutdown();\r\n this.poolManager = null;\r\n this.client = null;\r\n this.connected = false;\r\n }\r\n }\r\n\r\n isConnected(): boolean {\r\n return this.connected && this.poolManager !== null && this.client !== null;\r\n }\r\n\r\n /**\r\n * Get connection pool statistics\r\n */\r\n getPoolStats() {\r\n return this.poolManager?.getStats();\r\n }\r\n\r\n async get<T = any>(key: string): Promise<T | null> {\r\n this.ensureConnected();\r\n\r\n try {\r\n const value = await this.client!.get(key);\r\n\r\n if (value === null) {\r\n return null;\r\n }\r\n\r\n // Try to parse as JSON, fall back to raw string\r\n try {\r\n this.recordSuccess();\r\n return JSON.parse(value) as T;\r\n } catch {\r\n this.recordSuccess();\r\n return value as unknown as T;\r\n }\r\n } catch (err) {\r\n const errorCode = mapRedisError(err instanceof Error ? err : new Error(String(err)));\r\n const error = createDatabaseError(\r\n errorCode,\r\n `Failed to get key: ${key}`,\r\n err instanceof Error ? err : new Error(String(err)),\r\n { key, correlationId: this.correlationId }\r\n );\r\n this.trackError(error, 'get', { key });\r\n throw error;\r\n }\r\n }\r\n\r\n async list<T = any>(pattern: string, options?: QueryOptions<T>): Promise<T[]> {\r\n this.ensureConnected();\r\n\r\n try {\r\n const keys = await this.client!.keys(pattern);\r\n\r\n if (keys.length === 0) {\r\n return [];\r\n }\r\n\r\n const values = await this.client!.mGet(keys);\r\n\r\n const results = values\r\n .map((value, index) => {\r\n if (value === null) {\r\n return null;\r\n }\r\n\r\n try {\r\n return JSON.parse(value) as T;\r\n } catch {\r\n return value as unknown as T;\r\n }\r\n })\r\n .filter((v): v is T => v !== null);\r\n\r\n // Apply limit and offset\r\n const start = options?.offset || 0;\r\n const end = options?.limit ? start + options.limit : undefined;\r\n\r\n this.recordSuccess();\r\n return results.slice(start, end);\r\n } catch (err) {\r\n const errorCode = mapRedisError(err instanceof Error ? err : new Error(String(err)));\r\n const error = createDatabaseError(\r\n errorCode,\r\n `Failed to list keys: ${pattern}`,\r\n err instanceof Error ? err : new Error(String(err)),\r\n { pattern, options, correlationId: this.correlationId }\r\n );\r\n this.trackError(error, 'list', { pattern });\r\n throw error;\r\n }\r\n }\r\n\r\n async query<T = any>(pattern: string, filters: QueryFilter<T>[]): Promise<T[]> {\r\n // For Redis, query is similar to list but with additional filtering\r\n const results = await this.list<T>(pattern);\r\n\r\n // Apply filters\r\n return results.filter(item => {\r\n return filters.every(filter => {\r\n const value = (item as any)[filter.field];\r\n\r\n switch (filter.operator) {\r\n case 'eq':\r\n return value === filter.value;\r\n case 'ne':\r\n return value !== filter.value;\r\n case 'gt':\r\n return value > filter.value;\r\n case 'gte':\r\n return value >= filter.value;\r\n case 'lt':\r\n return value < filter.value;\r\n case 'lte':\r\n return value <= filter.value;\r\n case 'in':\r\n return Array.isArray(filter.value) && filter.value.includes(value);\r\n case 'like':\r\n return String(value).includes(String(filter.value));\r\n default:\r\n return true;\r\n }\r\n });\r\n });\r\n }\r\n\r\n async insert<T = any>(key: string, data: T): Promise<OperationResult<T>> {\r\n this.ensureConnected();\r\n\r\n try {\r\n const value = typeof data === 'string' ? data : JSON.stringify(data);\r\n await this.client!.set(key, value);\r\n\r\n this.recordSuccess();\r\n return createSuccessResult(data, 1);\r\n } catch (err) {\r\n const errorCode = mapRedisError(err instanceof Error ? err : new Error(String(err)));\r\n const error = createDatabaseError(\r\n errorCode,\r\n `Failed to insert key: ${key}`,\r\n err instanceof Error ? err : new Error(String(err)),\r\n { key, data, correlationId: this.correlationId }\r\n );\r\n this.trackError(error, 'insert', { key });\r\n return createFailedResult(error);\r\n }\r\n }\r\n\r\n async insertMany<T = any>(pattern: string, data: T[]): Promise<OperationResult<T[]>> {\r\n this.ensureConnected();\r\n\r\n try {\r\n const pipeline = this.client!.multi();\r\n\r\n data.forEach((item, index) => {\r\n const key = `${pattern}:${index}`;\r\n const value = typeof item === 'string' ? item : JSON.stringify(item);\r\n pipeline.set(key, value);\r\n });\r\n\r\n await pipeline.exec();\r\n\r\n this.recordSuccess();\r\n return createSuccessResult(data, data.length);\r\n } catch (err) {\r\n const errorCode = mapRedisError(err instanceof Error ? err : new Error(String(err)));\r\n const error = createDatabaseError(\r\n errorCode,\r\n `Failed to insert multiple keys with pattern: ${pattern}`,\r\n err instanceof Error ? err : new Error(String(err)),\r\n { pattern, count: data.length, correlationId: this.correlationId }\r\n );\r\n this.trackError(error, 'insertMany', { pattern, count: data.length });\r\n return createFailedResult(error);\r\n }\r\n }\r\n\r\n async update<T = any>(key: string, data: Partial<T>): Promise<OperationResult<T>> {\r\n this.ensureConnected();\r\n\r\n try {\r\n // Get existing data\r\n const existing = await this.get<T>(key);\r\n\r\n if (existing === null) {\r\n const error = createDatabaseError(\r\n DatabaseErrorCode.NOT_FOUND,\r\n `Key not found: ${key}`,\r\n undefined,\r\n { key, correlationId: this.correlationId }\r\n );\r\n this.trackError(error, 'update', { key });\r\n return createFailedResult(error);\r\n }\r\n\r\n // Merge with updates\r\n const updated = { ...existing, ...data } as T;\r\n const value = JSON.stringify(updated);\r\n\r\n await this.client!.set(key, value);\r\n\r\n this.recordSuccess();\r\n return createSuccessResult(updated, 1);\r\n } catch (err) {\r\n const errorCode = mapRedisError(err instanceof Error ? err : new Error(String(err)));\r\n const error = createDatabaseError(\r\n errorCode,\r\n `Failed to update key: ${key}`,\r\n err instanceof Error ? err : new Error(String(err)),\r\n { key, data, correlationId: this.correlationId }\r\n );\r\n this.trackError(error, 'update', { key });\r\n return createFailedResult(error);\r\n }\r\n }\r\n\r\n async delete(_table: string, key: string): Promise<OperationResult<void>> {\r\n this.ensureConnected();\r\n\r\n try {\r\n const count = await this.client!.del(key);\r\n\r\n if (count === 0) {\r\n const error = createDatabaseError(\r\n DatabaseErrorCode.NOT_FOUND,\r\n `Key not found: ${key}`,\r\n undefined,\r\n { key, correlationId: this.correlationId }\r\n );\r\n this.trackError(error, 'delete', { key });\r\n return createFailedResult(error);\r\n }\r\n\r\n this.recordSuccess();\r\n return createSuccessResult(undefined, count);\r\n } catch (err) {\r\n const errorCode = mapRedisError(err instanceof Error ? err : new Error(String(err)));\r\n const error = createDatabaseError(\r\n errorCode,\r\n `Failed to delete key: ${key}`,\r\n err instanceof Error ? err : new Error(String(err)),\r\n { key, correlationId: this.correlationId }\r\n );\r\n this.trackError(error, 'delete', { key });\r\n return createFailedResult(error);\r\n }\r\n }\r\n\r\n async raw<T = any>(command: string, params?: any[]): Promise<T> {\r\n this.ensureConnected();\r\n\r\n try {\r\n const result = await this.client!.sendCommand([command, ...(params || [])]);\r\n this.recordSuccess();\r\n return result as T;\r\n } catch (err) {\r\n const errorCode = mapRedisError(err instanceof Error ? err : new Error(String(err)));\r\n const error = createDatabaseError(\r\n errorCode,\r\n `Failed to execute raw command: ${command}`,\r\n err instanceof Error ? err : new Error(String(err)),\r\n { command, params, correlationId: this.correlationId }\r\n );\r\n this.trackError(error, 'raw', { command });\r\n throw error;\r\n }\r\n }\r\n\r\n async beginTransaction(): Promise<TransactionContext> {\r\n return {\r\n id: `redis-tx-${randomUUID()}`,\r\n databases: ['redis'],\r\n startTime: new Date(),\r\n status: 'pending',\r\n };\r\n }\r\n\r\n async prepareTransaction(context: TransactionContext): Promise<boolean> {\r\n try {\r\n // Redis doesn't support traditional two-phase commit\r\n // PREPARE validation: Check if Redis is available and can accept commands\r\n this.ensureConnected();\r\n\r\n // Test connection and command execution\r\n await this.client!.ping();\r\n\r\n // Mark as prepared\r\n context.status = 'prepared';\r\n context.preparedAt = new Date();\r\n\r\n return true;\r\n } catch (err) {\r\n // Prepare failed - typically due to connection issues\r\n throw createDatabaseError(\r\n DatabaseErrorCode.TRANSACTION_FAILED,\r\n 'Failed to prepare transaction - Redis unavailable',\r\n err instanceof Error ? err : new Error(String(err)),\r\n { transactionId: context.id }\r\n );\r\n }\r\n }\r\n\r\n async commitTransaction(context: TransactionContext): Promise<void> {\r\n // Redis transactions are handled via MULTI/EXEC\r\n // This is a placeholder for cross-database transaction support\r\n context.status = 'committed';\r\n }\r\n\r\n async rollbackTransaction(context: TransactionContext): Promise<void> {\r\n // Redis doesn't support traditional rollback\r\n // This is a placeholder for cross-database transaction support\r\n context.status = 'rolled_back';\r\n }\r\n\r\n private ensureConnected(): void {\r\n if (!this.isConnected()) {\r\n throw createDatabaseError(\r\n DatabaseErrorCode.CONNECTION_FAILED,\r\n 'Not connected to Redis',\r\n undefined,\r\n { config: this.config }\r\n );\r\n }\r\n }\r\n}\r\n"],"names":["randomUUID","DatabaseErrorCode","createDatabaseError","createSuccessResult","createFailedResult","mapRedisError","ConnectionPoolManager","v4","uuidv4","RedisAdapter","poolManager","client","config","connected","errorAggregator","correlationId","trackError","error","operation","context","dbError","code","QUERY_FAILED","Error","String","addError","recordSuccess","getType","connect","initialize","acquire","startHealthChecks","err","CONNECTION_FAILED","disconnect","shutdown","isConnected","getPoolStats","getStats","get","key","ensureConnected","value","JSON","parse","errorCode","list","pattern","options","keys","length","values","mGet","results","map","index","filter","v","start","offset","end","limit","undefined","slice","query","filters","item","every","field","operator","Array","isArray","includes","insert","data","stringify","set","insertMany","pipeline","multi","forEach","exec","count","update","existing","NOT_FOUND","updated","delete","_table","del","raw","command","params","result","sendCommand","beginTransaction","id","databases","startTime","Date","status","prepareTransaction","ping","preparedAt","TRANSACTION_FAILED","transactionId","commitTransaction","rollbackTransaction"],"mappings":"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"}