claude-flow-novice 2.15.3 → 2.15.5

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