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,811 @@
1
+ /**
2
+ * Performance Monitor Service
3
+ *
4
+ * Real-time performance baseline monitoring with SLA tracking and alerting.
5
+ * Part of Phase 2, Task P2-4.2: Performance Baseline Monitoring
6
+ *
7
+ * Features:
8
+ * - Record performance metrics for all critical operations
9
+ * - Calculate performance baselines from historical data (P50, P95, P99)
10
+ * - Track SLA compliance and violations
11
+ * - Detect performance degradation automatically
12
+ * - Generate alerts on violations and degradation
13
+ * - Provide metrics for dashboards (Grafana integration)
14
+ * - Forecast future performance trends
15
+ *
16
+ * Performance Targets:
17
+ * - Metric recording: <10ms overhead
18
+ * - Baseline calculation: <5s
19
+ * - SLA check: <50ms
20
+ */ import * as fs from 'fs';
21
+ import * as path from 'path';
22
+ import * as yaml from 'js-yaml';
23
+ import { StandardError, ErrorCode } from '../lib/errors.js';
24
+ import { createLogger } from '../lib/logging.js';
25
+ import { v4 as uuidv4 } from 'uuid';
26
+ const logger = createLogger('performance-monitor');
27
+ /**
28
+ * Performance Monitor Service
29
+ */ export class PerformanceMonitor {
30
+ dbService;
31
+ slaConfigPath;
32
+ slaDefinitions = new Map();
33
+ baselineCache = new Map();
34
+ lastBaselineTime = new Map();
35
+ metricsRetentionDays;
36
+ baselineCalculationDays;
37
+ degradationTracker = new Map();
38
+ initialized = false;
39
+ constructor(config){
40
+ this.dbService = config.dbService;
41
+ this.slaConfigPath = config.slaConfigPath || path.join(process.cwd(), 'config/sla-definitions.yml');
42
+ this.metricsRetentionDays = config.metricsRetentionDays || 90;
43
+ this.baselineCalculationDays = config.baselineCalculationDays || 30;
44
+ }
45
+ /**
46
+ * Initialize performance monitor
47
+ */ async init() {
48
+ try {
49
+ await this.createTables();
50
+ await this.loadSLADefinitions();
51
+ this.initialized = true;
52
+ logger.info('Performance monitor initialized');
53
+ } catch (error) {
54
+ throw new StandardError(ErrorCode.CONFIGURATION_ERROR, 'Failed to initialize performance monitor', {
55
+ cause: error
56
+ });
57
+ }
58
+ }
59
+ /**
60
+ * Create necessary database tables
61
+ */ async createTables() {
62
+ try {
63
+ const sqliteAdapter = this.dbService.getAdapter('sqlite');
64
+ // Performance metrics table
65
+ await sqliteAdapter.raw(`
66
+ CREATE TABLE IF NOT EXISTS performance_metrics (
67
+ id TEXT PRIMARY KEY,
68
+ operation TEXT NOT NULL,
69
+ duration_ms REAL NOT NULL,
70
+ timestamp DATETIME NOT NULL,
71
+ metadata TEXT,
72
+ is_sla_violation INTEGER DEFAULT 0,
73
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP
74
+ )
75
+ `);
76
+ // Create index for query performance
77
+ await sqliteAdapter.raw(`
78
+ CREATE INDEX IF NOT EXISTS idx_performance_metrics_operation_timestamp
79
+ ON performance_metrics(operation, timestamp)
80
+ `);
81
+ // SLA violation tracking
82
+ await sqliteAdapter.raw(`
83
+ CREATE TABLE IF NOT EXISTS sla_violations (
84
+ id TEXT PRIMARY KEY,
85
+ operation TEXT NOT NULL,
86
+ metric_id TEXT NOT NULL,
87
+ duration_ms REAL NOT NULL,
88
+ sla_target_ms REAL NOT NULL,
89
+ violation_percent REAL NOT NULL,
90
+ timestamp DATETIME NOT NULL,
91
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
92
+ FOREIGN KEY (metric_id) REFERENCES performance_metrics(id)
93
+ )
94
+ `);
95
+ // Create index for violations
96
+ await sqliteAdapter.raw(`
97
+ CREATE INDEX IF NOT EXISTS idx_sla_violations_operation_timestamp
98
+ ON sla_violations(operation, timestamp)
99
+ `);
100
+ // Alert events table
101
+ await sqliteAdapter.raw(`
102
+ CREATE TABLE IF NOT EXISTS performance_alerts (
103
+ id TEXT PRIMARY KEY,
104
+ operation TEXT NOT NULL,
105
+ level TEXT NOT NULL,
106
+ message TEXT NOT NULL,
107
+ timestamp DATETIME NOT NULL,
108
+ resolved_at DATETIME,
109
+ resolved_reason TEXT,
110
+ metadata TEXT,
111
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP
112
+ )
113
+ `);
114
+ // Create index for alerts
115
+ await sqliteAdapter.raw(`
116
+ CREATE INDEX IF NOT EXISTS idx_performance_alerts_operation_timestamp
117
+ ON performance_alerts(operation, timestamp)
118
+ `);
119
+ // Baseline metrics cache
120
+ await sqliteAdapter.raw(`
121
+ CREATE TABLE IF NOT EXISTS baseline_metrics (
122
+ id TEXT PRIMARY KEY,
123
+ operation TEXT NOT NULL UNIQUE,
124
+ min REAL NOT NULL,
125
+ p50 REAL NOT NULL,
126
+ p95 REAL NOT NULL,
127
+ p99 REAL NOT NULL,
128
+ max REAL NOT NULL,
129
+ avg REAL NOT NULL,
130
+ count INTEGER NOT NULL,
131
+ period_days INTEGER NOT NULL,
132
+ calculated_at DATETIME NOT NULL,
133
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
134
+ )
135
+ `);
136
+ logger.debug('Database tables created');
137
+ } catch (error) {
138
+ // Table creation errors are non-fatal if tables already exist
139
+ logger.debug('Table creation error (may already exist):', error);
140
+ }
141
+ }
142
+ /**
143
+ * Load SLA definitions from configuration file
144
+ */ async loadSLADefinitions() {
145
+ try {
146
+ if (!fs.existsSync(this.slaConfigPath)) {
147
+ logger.warn(`SLA config not found at ${this.slaConfigPath}, using defaults`);
148
+ this.loadDefaultSLAs();
149
+ return;
150
+ }
151
+ const configContent = fs.readFileSync(this.slaConfigPath, 'utf-8');
152
+ const config = yaml.load(configContent);
153
+ if (config.slas) {
154
+ for (const [operation, sla] of Object.entries(config.slas)){
155
+ this.slaDefinitions.set(operation, sla);
156
+ }
157
+ }
158
+ logger.debug(`Loaded ${this.slaDefinitions.size} SLA definitions`);
159
+ } catch (error) {
160
+ throw new StandardError(ErrorCode.CONFIGURATION_ERROR, 'Failed to load SLA definitions', {
161
+ path: this.slaConfigPath,
162
+ cause: error
163
+ });
164
+ }
165
+ }
166
+ /**
167
+ * Load default SLA definitions
168
+ */ loadDefaultSLAs() {
169
+ this.slaDefinitions.set('agent_startup', {
170
+ target: 2000,
171
+ p95: 2000,
172
+ p99: 5000,
173
+ enabled: true,
174
+ alert_threshold: 1.2
175
+ });
176
+ this.slaDefinitions.set('query_execution', {
177
+ target: 5000,
178
+ p95: 5000,
179
+ p99: 10000,
180
+ enabled: true,
181
+ alert_threshold: 1.2
182
+ });
183
+ this.slaDefinitions.set('skill_execution', {
184
+ target: 30000,
185
+ p95: 30000,
186
+ p99: 60000,
187
+ enabled: true,
188
+ alert_threshold: 1.2
189
+ });
190
+ this.slaDefinitions.set('transaction_commit', {
191
+ target: 5000,
192
+ p95: 5000,
193
+ p99: 10000,
194
+ enabled: true,
195
+ alert_threshold: 1.2
196
+ });
197
+ }
198
+ /**
199
+ * Record a performance metric
200
+ */ async recordMetric(metric) {
201
+ if (!this.initialized) {
202
+ throw new StandardError(ErrorCode.CONFIGURATION_ERROR, 'Performance monitor not initialized');
203
+ }
204
+ // Validate metric
205
+ this.validateMetric(metric);
206
+ const metricId = uuidv4();
207
+ const sqliteAdapter = this.dbService.getAdapter('sqlite');
208
+ const alerts = [];
209
+ try {
210
+ // Check if metric violates SLA
211
+ const isViolation = !await this.isWithinSLA(metric);
212
+ // Record metric
213
+ await sqliteAdapter.raw(`INSERT INTO performance_metrics (id, operation, duration_ms, timestamp, metadata, is_sla_violation)
214
+ VALUES (?, ?, ?, ?, ?, ?)`, [
215
+ metricId,
216
+ metric.operation,
217
+ metric.duration_ms,
218
+ metric.timestamp.toISOString(),
219
+ JSON.stringify(metric.metadata || {}),
220
+ isViolation ? 1 : 0
221
+ ]);
222
+ // Record violation if applicable
223
+ if (isViolation) {
224
+ const sla = this.slaDefinitions.get(metric.operation);
225
+ if (sla) {
226
+ const violationPercent = (metric.duration_ms - sla.target) / sla.target * 100;
227
+ const violationId = uuidv4();
228
+ await sqliteAdapter.raw(`INSERT INTO sla_violations (id, operation, metric_id, duration_ms, sla_target_ms, violation_percent, timestamp)
229
+ VALUES (?, ?, ?, ?, ?, ?, ?)`, [
230
+ violationId,
231
+ metric.operation,
232
+ metricId,
233
+ metric.duration_ms,
234
+ sla.target,
235
+ violationPercent,
236
+ metric.timestamp.toISOString()
237
+ ]);
238
+ // Create alert
239
+ const alert = {
240
+ id: `alert-${metricId}`,
241
+ operation: metric.operation,
242
+ level: violationPercent > 200 ? 'critical' : 'warning',
243
+ message: `SLA violation: ${metric.duration_ms}ms exceeds target of ${sla.target}ms`,
244
+ timestamp: new Date(),
245
+ metadata: {
246
+ duration_ms: metric.duration_ms,
247
+ sla_target_ms: sla.target,
248
+ violation_percent: violationPercent
249
+ }
250
+ };
251
+ await this.recordAlert(alert);
252
+ alerts.push(alert);
253
+ }
254
+ }
255
+ return alerts;
256
+ } catch (error) {
257
+ logger.error('Error recording metric:', error);
258
+ throw new StandardError(ErrorCode.DB_QUERY_FAILED, 'Failed to record performance metric', {
259
+ operation: metric.operation,
260
+ cause: error instanceof Error ? error.message : String(error)
261
+ });
262
+ }
263
+ }
264
+ /**
265
+ * Record multiple metrics in batch
266
+ */ async recordMetrics(metrics) {
267
+ for (const metric of metrics){
268
+ await this.recordMetric(metric);
269
+ }
270
+ }
271
+ /**
272
+ * Check if metric is within SLA
273
+ */ async isWithinSLA(metric) {
274
+ const sla = this.slaDefinitions.get(metric.operation);
275
+ if (!sla || !sla.enabled) {
276
+ return true; // No SLA defined, assume compliance
277
+ }
278
+ return metric.duration_ms <= sla.target;
279
+ }
280
+ /**
281
+ * Get SLA violations for an operation
282
+ */ async getSLAViolations(operation, options) {
283
+ const sqliteAdapter = this.dbService.getAdapter('sqlite');
284
+ const periodDays = this.getPeriodDays(options?.period || '1h');
285
+ const cutoffDate = new Date(Date.now() - periodDays * 24 * 60 * 60 * 1000);
286
+ const limit = options?.limit || 1000;
287
+ try {
288
+ const result = await sqliteAdapter.raw(`SELECT pm.id, pm.operation, pm.duration_ms, pm.timestamp, pm.metadata
289
+ FROM performance_metrics pm
290
+ WHERE pm.operation = ? AND pm.is_sla_violation = 1 AND pm.timestamp >= ?
291
+ ORDER BY pm.timestamp DESC
292
+ LIMIT ?`, [
293
+ operation,
294
+ cutoffDate.toISOString(),
295
+ limit
296
+ ]);
297
+ const rows = Array.isArray(result) ? result : [];
298
+ return rows.map((row)=>({
299
+ operation: row.operation,
300
+ duration_ms: row.duration_ms,
301
+ timestamp: new Date(row.timestamp),
302
+ metadata: JSON.parse(row.metadata || '{}')
303
+ }));
304
+ } catch (error) {
305
+ throw new StandardError(ErrorCode.DB_QUERY_FAILED, 'Failed to get SLA violations', {
306
+ operation,
307
+ cause: error
308
+ });
309
+ }
310
+ }
311
+ /**
312
+ * Calculate baseline metrics from historical data
313
+ */ async calculateBaseline(operation, days = 30) {
314
+ // Check cache first (5 minute TTL)
315
+ const cached = this.baselineCache.get(operation);
316
+ const lastTime = this.lastBaselineTime.get(operation) || 0;
317
+ if (cached && Date.now() - lastTime < 5 * 60 * 1000) {
318
+ return cached;
319
+ }
320
+ const sqliteAdapter = this.dbService.getAdapter('sqlite');
321
+ const startTime = Date.now();
322
+ try {
323
+ const startDate = new Date(Date.now() - days * 24 * 60 * 60 * 1000);
324
+ const result = await sqliteAdapter.raw(`SELECT
325
+ MIN(duration_ms) as min_duration,
326
+ MAX(duration_ms) as max_duration,
327
+ AVG(duration_ms) as avg_duration,
328
+ COUNT(*) as count
329
+ FROM performance_metrics
330
+ WHERE operation = ? AND timestamp >= ?`, [
331
+ operation,
332
+ startDate.toISOString()
333
+ ]);
334
+ const rows = Array.isArray(result) ? result : [];
335
+ if (rows.length === 0 || rows[0].count === 0) {
336
+ throw new StandardError(ErrorCode.DB_NOT_FOUND, `No metrics found for operation: ${operation}`, {
337
+ days
338
+ });
339
+ }
340
+ // Get percentile values
341
+ const percentiles = await this.calculatePercentiles(operation, startDate);
342
+ const baseline = {
343
+ operation,
344
+ min: rows[0].min_duration,
345
+ p50: percentiles.p50,
346
+ p95: percentiles.p95,
347
+ p99: percentiles.p99,
348
+ max: rows[0].max_duration,
349
+ avg: rows[0].avg_duration,
350
+ count: rows[0].count,
351
+ calculated_at: new Date(),
352
+ period_days: days
353
+ };
354
+ // Cache baseline
355
+ this.baselineCache.set(operation, baseline);
356
+ this.lastBaselineTime.set(operation, Date.now());
357
+ const duration = Date.now() - startTime;
358
+ if (duration > 5000) {
359
+ logger.warn(`Baseline calculation took ${duration}ms (target: <5s)`);
360
+ }
361
+ return baseline;
362
+ } catch (error) {
363
+ throw new StandardError(ErrorCode.DB_QUERY_FAILED, 'Failed to calculate baseline', {
364
+ operation,
365
+ days,
366
+ cause: error
367
+ });
368
+ }
369
+ }
370
+ /**
371
+ * Calculate percentile values
372
+ */ async calculatePercentiles(operation, startDate) {
373
+ const sqliteAdapter = this.dbService.getAdapter('sqlite');
374
+ try {
375
+ // Get all durations and sort them in application
376
+ const result = await sqliteAdapter.raw(`SELECT duration_ms
377
+ FROM performance_metrics
378
+ WHERE operation = ? AND timestamp >= ?
379
+ ORDER BY duration_ms ASC`, [
380
+ operation,
381
+ startDate.toISOString()
382
+ ]);
383
+ const rows = Array.isArray(result) ? result : [];
384
+ if (rows.length === 0) {
385
+ return {
386
+ p50: 0,
387
+ p95: 0,
388
+ p99: 0
389
+ };
390
+ }
391
+ const durations = rows.map((row)=>row.duration_ms);
392
+ durations.sort((a, b)=>a - b);
393
+ const len = durations.length;
394
+ const p50Index = Math.floor(len * 0.50);
395
+ const p95Index = Math.floor(len * 0.95);
396
+ const p99Index = Math.floor(len * 0.99);
397
+ return {
398
+ p50: durations[p50Index] || 0,
399
+ p95: durations[p95Index] || 0,
400
+ p99: durations[p99Index] || 0
401
+ };
402
+ } catch (error) {
403
+ logger.error('Error calculating percentiles:', error);
404
+ return {
405
+ p50: 0,
406
+ p95: 0,
407
+ p99: 0
408
+ };
409
+ }
410
+ }
411
+ /**
412
+ * Get SLA compliance percentage for an operation
413
+ */ async getSLACompliance(operation, period) {
414
+ const sqliteAdapter = this.dbService.getAdapter('sqlite');
415
+ const periodDays = this.getPeriodDays(period);
416
+ const cutoffDate = new Date(Date.now() - periodDays * 24 * 60 * 60 * 1000);
417
+ try {
418
+ const result = await sqliteAdapter.raw(`SELECT
419
+ COUNT(*) as total,
420
+ SUM(CASE WHEN is_sla_violation = 0 THEN 1 ELSE 0 END) as compliant
421
+ FROM performance_metrics
422
+ WHERE operation = ? AND timestamp >= ?`, [
423
+ operation,
424
+ cutoffDate.toISOString()
425
+ ]);
426
+ const rows = Array.isArray(result) ? result : [];
427
+ if (rows.length === 0) {
428
+ return 1.0; // No metrics, assume 100% compliant
429
+ }
430
+ const row = rows[0];
431
+ if (row.total === 0) {
432
+ return 1.0; // No metrics, assume 100% compliant
433
+ }
434
+ return row.compliant / row.total;
435
+ } catch (error) {
436
+ throw new StandardError(ErrorCode.DB_QUERY_FAILED, 'Failed to calculate SLA compliance', {
437
+ operation,
438
+ period,
439
+ cause: error
440
+ });
441
+ }
442
+ }
443
+ /**
444
+ * Detect performance degradation
445
+ */ async detectDegradation(operation, options) {
446
+ const threshold = options?.threshold_percent || 20;
447
+ const windowMinutes = options?.window_minutes || 5;
448
+ try {
449
+ const baseline = await this.calculateBaseline(operation, 30);
450
+ const sqliteAdapter = this.dbService.getAdapter('sqlite');
451
+ const windowStart = new Date(Date.now() - windowMinutes * 60 * 1000);
452
+ const result = await sqliteAdapter.raw(`SELECT AVG(duration_ms) as avg_duration, COUNT(*) as count
453
+ FROM performance_metrics
454
+ WHERE operation = ? AND timestamp >= ?`, [
455
+ operation,
456
+ windowStart.toISOString()
457
+ ]);
458
+ const rows = Array.isArray(result) ? result : [];
459
+ if (rows.length === 0) {
460
+ return false; // No metrics, assume no degradation
461
+ }
462
+ const row = rows[0];
463
+ if (row.count < 5) {
464
+ return false; // Need at least 5 samples
465
+ }
466
+ const degradationPercent = (row.avg_duration - baseline.p50) / baseline.p50 * 100;
467
+ return degradationPercent > threshold;
468
+ } catch (error) {
469
+ logger.error(`Failed to detect degradation for ${operation}:`, error);
470
+ return false;
471
+ }
472
+ }
473
+ /**
474
+ * Get metrics with optional filtering
475
+ */ async getMetrics(operation, options) {
476
+ const sqliteAdapter = this.dbService.getAdapter('sqlite');
477
+ const limit = options?.limit || 1000;
478
+ const offset = options?.offset || 0;
479
+ let whereClause = 'operation = ?';
480
+ const params = [
481
+ operation
482
+ ];
483
+ if (options?.period) {
484
+ const periodDays = this.getPeriodDays(options.period);
485
+ const cutoffDate = new Date(Date.now() - periodDays * 24 * 60 * 60 * 1000);
486
+ whereClause += ' AND timestamp >= ?';
487
+ params.push(cutoffDate.toISOString());
488
+ }
489
+ try {
490
+ const result = await sqliteAdapter.raw(`SELECT id, operation, duration_ms, timestamp, metadata
491
+ FROM performance_metrics
492
+ WHERE ${whereClause}
493
+ ORDER BY timestamp DESC
494
+ LIMIT ? OFFSET ?`, [
495
+ ...params,
496
+ limit,
497
+ offset
498
+ ]);
499
+ const rows = Array.isArray(result) ? result : [];
500
+ return rows.map((row)=>({
501
+ operation: row.operation,
502
+ duration_ms: row.duration_ms,
503
+ timestamp: new Date(row.timestamp),
504
+ metadata: options?.includeMetadata ? JSON.parse(row.metadata || '{}') : undefined
505
+ }));
506
+ } catch (error) {
507
+ throw new StandardError(ErrorCode.DB_QUERY_FAILED, 'Failed to get metrics', {
508
+ operation,
509
+ cause: error
510
+ });
511
+ }
512
+ }
513
+ /**
514
+ * Get compliance report for an operation
515
+ */ async getComplianceReport(operation, options) {
516
+ const period = options?.period || '1d';
517
+ const compliance = await this.getSLACompliance(operation, period);
518
+ const violations = await this.getSLAViolations(operation, {
519
+ period
520
+ });
521
+ const metrics = await this.getMetrics(operation, {
522
+ period,
523
+ limit: 10000
524
+ });
525
+ const sla = this.slaDefinitions.get(operation);
526
+ const avgDuration = metrics.length > 0 ? metrics.reduce((sum, m)=>sum + m.duration_ms, 0) / metrics.length : 0;
527
+ // Calculate percentiles
528
+ const sortedDurations = metrics.map((m)=>m.duration_ms).sort((a, b)=>a - b);
529
+ const p95Index = Math.floor(sortedDurations.length * 0.95);
530
+ const p99Index = Math.floor(sortedDurations.length * 0.99);
531
+ return {
532
+ operation,
533
+ period,
534
+ total_metrics: metrics.length,
535
+ violations_count: violations.length,
536
+ compliance_percentage: compliance * 100,
537
+ sla_target_ms: sla?.target || 0,
538
+ avg_duration_ms: avgDuration,
539
+ p95_duration_ms: sortedDurations[p95Index] || 0,
540
+ p99_duration_ms: sortedDurations[p99Index] || 0
541
+ };
542
+ }
543
+ /**
544
+ * Record an alert
545
+ */ async recordAlert(alert) {
546
+ const sqliteAdapter = this.dbService.getAdapter('sqlite');
547
+ try {
548
+ await sqliteAdapter.raw(`INSERT INTO performance_alerts (id, operation, level, message, timestamp, metadata)
549
+ VALUES (?, ?, ?, ?, ?, ?)`, [
550
+ alert.id,
551
+ alert.operation,
552
+ alert.level,
553
+ alert.message,
554
+ alert.timestamp.toISOString(),
555
+ JSON.stringify(alert.metadata || {})
556
+ ]);
557
+ } catch (error) {
558
+ throw new StandardError(ErrorCode.DB_QUERY_FAILED, 'Failed to record alert', {
559
+ operation: alert.operation,
560
+ cause: error
561
+ });
562
+ }
563
+ }
564
+ /**
565
+ * Get alerts for an operation
566
+ */ async getAlerts(operation, options) {
567
+ const sqliteAdapter = this.dbService.getAdapter('sqlite');
568
+ let whereClauses = [
569
+ 'operation = ?'
570
+ ];
571
+ const params = [
572
+ operation
573
+ ];
574
+ if (options?.activeOnly) {
575
+ whereClauses.push('resolved_at IS NULL');
576
+ }
577
+ if (options?.minSeverity) {
578
+ const severities = [
579
+ 'info',
580
+ 'warning',
581
+ 'critical'
582
+ ];
583
+ const minIndex = severities.indexOf(options.minSeverity);
584
+ const validSeverities = severities.slice(minIndex).map(()=>'?').join(',');
585
+ whereClauses.push(`level IN (${validSeverities})`);
586
+ params.push(...severities.slice(minIndex));
587
+ }
588
+ const whereClause = whereClauses.join(' AND ');
589
+ const limit = options?.limit || 1000;
590
+ try {
591
+ const result = await sqliteAdapter.raw(`SELECT id, operation, level, message, timestamp, resolved_at, resolved_reason, metadata
592
+ FROM performance_alerts
593
+ WHERE ${whereClause}
594
+ ORDER BY timestamp DESC
595
+ LIMIT ?`, [
596
+ ...params,
597
+ limit
598
+ ]);
599
+ const rows = Array.isArray(result) ? result : [];
600
+ return rows.map((row)=>({
601
+ id: row.id,
602
+ operation: row.operation,
603
+ level: row.level,
604
+ message: row.message,
605
+ timestamp: new Date(row.timestamp),
606
+ resolved_at: row.resolved_at ? new Date(row.resolved_at) : undefined,
607
+ resolved_reason: row.resolved_reason,
608
+ metadata: JSON.parse(row.metadata || '{}')
609
+ }));
610
+ } catch (error) {
611
+ throw new StandardError(ErrorCode.DB_QUERY_FAILED, 'Failed to get alerts', {
612
+ operation,
613
+ cause: error
614
+ });
615
+ }
616
+ }
617
+ /**
618
+ * Resolve an alert
619
+ */ async resolveAlert(alertId, reason) {
620
+ const sqliteAdapter = this.dbService.getAdapter('sqlite');
621
+ try {
622
+ await sqliteAdapter.raw(`UPDATE performance_alerts
623
+ SET resolved_at = ?, resolved_reason = ?
624
+ WHERE id = ?`, [
625
+ new Date().toISOString(),
626
+ reason,
627
+ alertId
628
+ ]);
629
+ } catch (error) {
630
+ throw new StandardError(ErrorCode.DB_QUERY_FAILED, 'Failed to resolve alert', {
631
+ alertId,
632
+ cause: error
633
+ });
634
+ }
635
+ }
636
+ /**
637
+ * Get dashboard metrics
638
+ */ async getDashboardMetrics(options) {
639
+ const period = options?.time_range || '24h';
640
+ const periodDays = this.getPeriodDays(period);
641
+ const cutoffDate = new Date(Date.now() - periodDays * 24 * 60 * 60 * 1000);
642
+ const sqliteAdapter = this.dbService.getAdapter('sqlite');
643
+ try {
644
+ const result = await sqliteAdapter.raw(`SELECT operation, duration_ms, timestamp, is_sla_violation
645
+ FROM performance_metrics
646
+ WHERE timestamp >= ?
647
+ ORDER BY timestamp`, [
648
+ cutoffDate.toISOString()
649
+ ]);
650
+ const rows = Array.isArray(result) ? result : [];
651
+ const metrics = rows.map((row)=>({
652
+ operation: row.operation,
653
+ timestamp: new Date(row.timestamp),
654
+ duration_ms: row.duration_ms,
655
+ is_violation: row.is_sla_violation === 1
656
+ }));
657
+ const timestamps = [
658
+ ...new Set(metrics.map((m)=>m.timestamp.toISOString()))
659
+ ].sort().map((t)=>new Date(t));
660
+ // Calculate compliance rates per operation
661
+ const complianceRates = {};
662
+ const operations = [
663
+ ...new Set(metrics.map((m)=>m.operation))
664
+ ];
665
+ for (const op of operations){
666
+ complianceRates[op] = await this.getSLACompliance(op, period);
667
+ }
668
+ // Get active alerts
669
+ const allAlerts = await Promise.all(operations.map((op)=>this.getAlerts(op, {
670
+ activeOnly: true
671
+ })));
672
+ const activeAlerts = allAlerts.flat();
673
+ return {
674
+ metrics,
675
+ timestamps,
676
+ compliance_rates: complianceRates,
677
+ active_alerts: activeAlerts
678
+ };
679
+ } catch (error) {
680
+ throw new StandardError(ErrorCode.DB_QUERY_FAILED, 'Failed to get dashboard metrics', {
681
+ cause: error
682
+ });
683
+ }
684
+ }
685
+ /**
686
+ * Get SLA trends over time
687
+ */ async getSLATrends(operation, options) {
688
+ const period = options?.period || '7d';
689
+ const periodDays = this.getPeriodDays(period);
690
+ const cutoffDate = new Date(Date.now() - periodDays * 24 * 60 * 60 * 1000);
691
+ const sqliteAdapter = this.dbService.getAdapter('sqlite');
692
+ try {
693
+ const result = await sqliteAdapter.raw(`SELECT
694
+ DATE(timestamp) as date,
695
+ COUNT(*) as total,
696
+ SUM(CASE WHEN is_sla_violation = 0 THEN 1 ELSE 0 END) as compliant,
697
+ AVG(duration_ms) as avg_duration,
698
+ SUM(CASE WHEN is_sla_violation = 1 THEN 1 ELSE 0 END) as violations
699
+ FROM performance_metrics
700
+ WHERE operation = ? AND timestamp >= ?
701
+ GROUP BY DATE(timestamp)
702
+ ORDER BY date ASC`, [
703
+ operation,
704
+ cutoffDate.toISOString()
705
+ ]);
706
+ const rows = Array.isArray(result) ? result : [];
707
+ return rows.map((row)=>({
708
+ date: new Date(row.date),
709
+ compliance: row.compliant && row.total ? row.compliant / row.total : 1.0,
710
+ avg_duration_ms: row.avg_duration || 0,
711
+ violations_count: row.violations || 0
712
+ }));
713
+ } catch (error) {
714
+ throw new StandardError(ErrorCode.DB_QUERY_FAILED, 'Failed to get SLA trends', {
715
+ operation,
716
+ cause: error
717
+ });
718
+ }
719
+ }
720
+ /**
721
+ * Forecast future performance
722
+ */ async forecastPerformance(operation, options) {
723
+ const daysAhead = options?.days_ahead || 7;
724
+ try {
725
+ const baseline = await this.calculateBaseline(operation, 30);
726
+ const trends = await this.getSLATrends(operation, {
727
+ period: '7d',
728
+ interval: '1d'
729
+ });
730
+ // Simple trend analysis
731
+ let trend = 'stable';
732
+ if (trends.length >= 2) {
733
+ const recentAvg = trends.slice(-3).reduce((sum, t)=>sum + t.avg_duration_ms, 0) / 3;
734
+ const olderAvg = trends.slice(0, 3).reduce((sum, t)=>sum + t.avg_duration_ms, 0) / 3;
735
+ if (recentAvg < olderAvg * 0.95) {
736
+ trend = 'improving';
737
+ } else if (recentAvg > olderAvg * 1.05) {
738
+ trend = 'degrading';
739
+ }
740
+ }
741
+ // Calculate confidence interval
742
+ const stdDev = this.calculateStdDev(trends.map((t)=>t.avg_duration_ms));
743
+ const margin = 1.96 * (stdDev / Math.sqrt(trends.length)); // 95% CI
744
+ return {
745
+ operation,
746
+ forecasted_duration_ms: baseline.p50,
747
+ confidence_interval_lower: Math.max(baseline.p50 - margin, 0),
748
+ confidence_interval_upper: baseline.p50 + margin,
749
+ trend,
750
+ forecast_date: new Date(Date.now() + daysAhead * 24 * 60 * 60 * 1000)
751
+ };
752
+ } catch (error) {
753
+ throw new StandardError(ErrorCode.DB_QUERY_FAILED, 'Failed to forecast performance', {
754
+ operation,
755
+ cause: error
756
+ });
757
+ }
758
+ }
759
+ /**
760
+ * Get SLA definitions
761
+ */ async getSLADefinitions() {
762
+ const result = {};
763
+ for (const [op, sla] of this.slaDefinitions.entries()){
764
+ result[op] = sla;
765
+ }
766
+ return result;
767
+ }
768
+ /**
769
+ * Get SLA definition for an operation
770
+ */ async getSLADefinition(operation) {
771
+ return this.slaDefinitions.get(operation);
772
+ }
773
+ /**
774
+ * Validate performance metric
775
+ */ validateMetric(metric) {
776
+ if (!metric.operation) {
777
+ throw new StandardError(ErrorCode.VALIDATION_FAILED, 'Metric operation is required');
778
+ }
779
+ if (typeof metric.duration_ms !== 'number' || metric.duration_ms < 0) {
780
+ throw new StandardError(ErrorCode.VALIDATION_FAILED, 'Metric duration_ms must be a non-negative number');
781
+ }
782
+ if (!metric.timestamp) {
783
+ throw new StandardError(ErrorCode.VALIDATION_FAILED, 'Metric timestamp is required');
784
+ }
785
+ }
786
+ /**
787
+ * Get period duration in days
788
+ */ getPeriodDays(period) {
789
+ const match = period.match(/^(\d+)([hmd])$/);
790
+ if (!match) {
791
+ return 1;
792
+ }
793
+ const [, value, unit] = match;
794
+ const unitMap = {
795
+ h: 1 / 24,
796
+ m: 1 / (24 * 60),
797
+ d: 1
798
+ };
799
+ return parseInt(value) * unitMap[unit];
800
+ }
801
+ /**
802
+ * Calculate standard deviation
803
+ */ calculateStdDev(values) {
804
+ if (values.length === 0) return 0;
805
+ const mean = values.reduce((a, b)=>a + b) / values.length;
806
+ const variance = values.reduce((sum, val)=>sum + Math.pow(val - mean, 2), 0) / values.length;
807
+ return Math.sqrt(variance);
808
+ }
809
+ }
810
+
811
+ //# sourceMappingURL=performance-monitor.js.map