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,277 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ parse_jest_output() {
5
+ local output="$1"
6
+ local total=0 passed=0 failed=0 skipped=0 duration=0
7
+ local failed_names=()
8
+
9
+ local tests_line=$(echo "$output" | grep "^Tests:" || echo "")
10
+
11
+ if [ -n "$tests_line" ]; then
12
+ [[ "$tests_line" =~ ([0-9]+)[[:space:]]*passed ]] && passed="${BASH_REMATCH[1]}"
13
+ [[ "$tests_line" =~ ([0-9]+)[[:space:]]*failed ]] && failed="${BASH_REMATCH[1]}"
14
+ [[ "$tests_line" =~ ([0-9]+)[[:space:]]*skipped ]] && skipped="${BASH_REMATCH[1]}"
15
+ [[ "$tests_line" =~ ([0-9]+)[[:space:]]*total ]] && total="${BASH_REMATCH[1]}"
16
+ fi
17
+
18
+ # OPTIMIZATION: Replace bc with BASH arithmetic (75-150ms savings)
19
+ if [[ "$output" =~ Time:[[:space:]]*([0-9.]+)[[:space:]]*s ]]; then
20
+ duration=$(awk "BEGIN {printf \"%.0f\", ${BASH_REMATCH[1]} * 1000}")
21
+ fi
22
+
23
+ while IFS= read -r line; do
24
+ [[ "$line" =~ ●[[:space:]]*(.*) ]] && failed_names+=("${BASH_REMATCH[1]}")
25
+ done <<< "$output"
26
+
27
+ # OPTIMIZATION: Replace bc with awk
28
+ local pass_rate="0.0000"
29
+ if [ "$total" -gt 0 ]; then
30
+ pass_rate=$(awk "BEGIN {printf \"%.4f\", $passed / $total}")
31
+ fi
32
+
33
+ # OPTIMIZATION: Single jq call
34
+ local failed_names_json="[]"
35
+ [ ${#failed_names[@]} -gt 0 ] && failed_names_json=$(printf '%s\n' "${failed_names[@]}" | jq -Rs 'split("\n") | map(select(length > 0))')
36
+
37
+ cat <<EOF
38
+ {"framework":"jest","total_tests":$total,"passed_tests":$passed,"failed_tests":$failed,"skipped_tests":$skipped,"pass_rate":$pass_rate,"duration_ms":$duration,"failed_test_names":$failed_names_json}
39
+ EOF
40
+ }
41
+
42
+ parse_mocha_output() {
43
+ local output="$1"
44
+ local total=0 passed=0 failed=0 skipped=0 duration=0
45
+ local failed_names=()
46
+
47
+ [[ "$output" =~ ([0-9]+)[[:space:]]*passing ]] && passed="${BASH_REMATCH[1]}"
48
+ [[ "$output" =~ ([0-9]+)[[:space:]]*failing ]] && failed="${BASH_REMATCH[1]}"
49
+ [[ "$output" =~ ([0-9]+)[[:space:]]*pending ]] && skipped="${BASH_REMATCH[1]}"
50
+ total=$((passed + failed + skipped))
51
+
52
+ # OPTIMIZATION: Replace bc with awk
53
+ if [[ "$output" =~ passing[[:space:]]*\(([0-9]+)ms\) ]]; then
54
+ duration="${BASH_REMATCH[1]}"
55
+ elif [[ "$output" =~ passing[[:space:]]*\(([0-9.]+)s\) ]]; then
56
+ duration=$(awk "BEGIN {printf \"%.0f\", ${BASH_REMATCH[1]} * 1000}")
57
+ fi
58
+
59
+ while IFS= read -r line; do
60
+ [[ "$line" =~ ^[[:space:]]*[0-9]+\)[[:space:]]*(.*): ]] && failed_names+=("${BASH_REMATCH[1]}")
61
+ done <<< "$output"
62
+
63
+ # OPTIMIZATION: Replace bc with awk
64
+ local pass_rate="0.0000"
65
+ if [ "$total" -gt 0 ]; then
66
+ pass_rate=$(awk "BEGIN {printf \"%.4f\", $passed / $total}")
67
+ fi
68
+
69
+ # OPTIMIZATION: Single jq call
70
+ local failed_names_json="[]"
71
+ [ ${#failed_names[@]} -gt 0 ] && failed_names_json=$(printf '%s\n' "${failed_names[@]}" | jq -Rs 'split("\n") | map(select(length > 0))')
72
+
73
+ cat <<EOF
74
+ {"framework":"mocha","total_tests":$total,"passed_tests":$passed,"failed_tests":$failed,"skipped_tests":$skipped,"pass_rate":$pass_rate,"duration_ms":$duration,"failed_test_names":$failed_names_json}
75
+ EOF
76
+ }
77
+
78
+ parse_pytest_output() {
79
+ local output="$1"
80
+ local total=0 passed=0 failed=0 skipped=0 duration=0
81
+ local failed_names=()
82
+
83
+ [[ "$output" =~ ([0-9]+)[[:space:]]*passed ]] && passed="${BASH_REMATCH[1]}"
84
+ [[ "$output" =~ ([0-9]+)[[:space:]]*failed ]] && failed="${BASH_REMATCH[1]}"
85
+ [[ "$output" =~ ([0-9]+)[[:space:]]*skipped ]] && skipped="${BASH_REMATCH[1]}"
86
+ total=$((passed + failed + skipped))
87
+
88
+ # OPTIMIZATION: Replace bc with awk
89
+ [[ "$output" =~ in[[:space:]]+([0-9.]+)s ]] && duration=$(awk "BEGIN {printf \"%.0f\", ${BASH_REMATCH[1]} * 1000}")
90
+
91
+ while IFS= read -r line; do
92
+ [[ "$line" =~ FAILED[[:space:]]+([^[:space:]]+) ]] && failed_names+=("${BASH_REMATCH[1]}")
93
+ done <<< "$output"
94
+
95
+ # OPTIMIZATION: Replace bc with awk
96
+ local pass_rate="0.0000"
97
+ if [ "$total" -gt 0 ]; then
98
+ pass_rate=$(awk "BEGIN {printf \"%.4f\", $passed / $total}")
99
+ fi
100
+
101
+ # OPTIMIZATION: Single jq call
102
+ local failed_names_json="[]"
103
+ [ ${#failed_names[@]} -gt 0 ] && failed_names_json=$(printf '%s\n' "${failed_names[@]}" | jq -Rs 'split("\n") | map(select(length > 0))')
104
+
105
+ cat <<EOF
106
+ {"framework":"pytest","total_tests":$total,"passed_tests":$passed,"failed_tests":$failed,"skipped_tests":$skipped,"pass_rate":$pass_rate,"duration_ms":$duration,"failed_test_names":$failed_names_json}
107
+ EOF
108
+ }
109
+
110
+ parse_tap_output() {
111
+ local output="$1"
112
+ local total=0 passed=0 failed=0 skipped=0
113
+ local failed_names=()
114
+
115
+ [[ "$output" =~ 1\.\.([0-9]+) ]] && total="${BASH_REMATCH[1]}"
116
+ passed=$(echo "$output" | grep -c "^ok " || true)
117
+ failed=$(echo "$output" | grep -c "^not ok " || true)
118
+ skipped=$(echo "$output" | grep -c "^ok .* # SKIP" || true)
119
+ passed=$((passed - skipped))
120
+
121
+ while IFS= read -r line; do
122
+ [[ "$line" =~ ^not\ ok\ [0-9]+\ (.*) ]] && failed_names+=("${BASH_REMATCH[1]}")
123
+ done <<< "$output"
124
+
125
+ # OPTIMIZATION: Replace bc with awk
126
+ local pass_rate="0.0000"
127
+ if [ "$total" -gt 0 ]; then
128
+ pass_rate=$(awk "BEGIN {printf \"%.4f\", $passed / $total}")
129
+ fi
130
+
131
+ # OPTIMIZATION: Single jq call
132
+ local failed_names_json="[]"
133
+ [ ${#failed_names[@]} -gt 0 ] && failed_names_json=$(printf '%s\n' "${failed_names[@]}" | jq -Rs 'split("\n") | map(select(length > 0))')
134
+
135
+ cat <<EOF
136
+ {"framework":"tap","total_tests":$total,"passed_tests":$passed,"failed_tests":$failed,"skipped_tests":$skipped,"pass_rate":$pass_rate,"duration_ms":0,"failed_test_names":$failed_names_json}
137
+ EOF
138
+ }
139
+
140
+ parse_junit_xml() {
141
+ local xml_file="$1"
142
+ [ ! -f "$xml_file" ] && echo '{"error":"File not found"}' && return 1
143
+
144
+ local total=0 failures=0 errors=0 skipped=0 duration=0
145
+
146
+ if command -v xmllint &>/dev/null; then
147
+ total=$(xmllint --xpath "sum(//testsuite/@tests)" "$xml_file" 2>/dev/null || echo "0")
148
+ failures=$(xmllint --xpath "sum(//testsuite/@failures)" "$xml_file" 2>/dev/null || echo "0")
149
+ errors=$(xmllint --xpath "sum(//testsuite/@errors)" "$xml_file" 2>/dev/null || echo "0")
150
+ skipped=$(xmllint --xpath "sum(//testsuite/@skipped)" "$xml_file" 2>/dev/null || echo "0")
151
+ duration=$(xmllint --xpath "sum(//testsuite/@time)" "$xml_file" 2>/dev/null || echo "0")
152
+ else
153
+ total=$(grep -oP 'tests="\K[0-9]+' "$xml_file" | awk '{s+=$1} END {print s}')
154
+ failures=$(grep -oP 'failures="\K[0-9]+' "$xml_file" | awk '{s+=$1} END {print s}')
155
+ errors=$(grep -oP 'errors="\K[0-9]+' "$xml_file" | awk '{s+=$1} END {print s}')
156
+ skipped=$(grep -oP 'skipped="\K[0-9]+' "$xml_file" | awk '{s+=$1} END {print s}')
157
+ duration=$(grep -oP 'time="\K[0-9.]+' "$xml_file" | awk '{s+=$1} END {print s}')
158
+ fi
159
+
160
+ total=${total:-0} failures=${failures:-0} errors=${errors:-0} skipped=${skipped:-0} duration=${duration:-0}
161
+ local failed=$((failures + errors))
162
+ local passed=$((total - failed - skipped))
163
+
164
+ # OPTIMIZATION: Replace bc with awk
165
+ local duration_ms=$(awk "BEGIN {printf \"%.0f\", $duration * 1000}")
166
+
167
+ local pass_rate="0.0000"
168
+ if [ "$total" -gt 0 ]; then
169
+ pass_rate=$(awk "BEGIN {printf \"%.4f\", $passed / $total}")
170
+ fi
171
+
172
+ cat <<EOF
173
+ {"framework":"junit","total_tests":$total,"passed_tests":$passed,"failed_tests":$failed,"skipped_tests":$skipped,"pass_rate":$pass_rate,"duration_ms":$duration_ms,"failed_test_names":[]}
174
+ EOF
175
+ }
176
+
177
+ parse_go_test_output() {
178
+ local output="$1"
179
+ local total=0 passed=0 failed=0 skipped=0 duration=0
180
+ local failed_names=()
181
+
182
+ passed=$(echo "$output" | grep -c "^--- PASS:" || true)
183
+ failed=$(echo "$output" | grep -c "^--- FAIL:" || true)
184
+ skipped=$(echo "$output" | grep -c "^--- SKIP:" || true)
185
+ total=$((passed + failed + skipped))
186
+
187
+ while IFS= read -r line; do
188
+ [[ "$line" =~ ^---\ FAIL:\ (.*) ]] && failed_names+=("${BASH_REMATCH[1]}")
189
+ done <<< "$output"
190
+
191
+ # OPTIMIZATION: Replace bc with awk
192
+ [[ "$output" =~ ok[[:space:]]+[^[:space:]]+[[:space:]]+([0-9.]+)s ]] && duration=$(awk "BEGIN {printf \"%.0f\", ${BASH_REMATCH[1]} * 1000}")
193
+
194
+ local pass_rate="0.0000"
195
+ if [ "$total" -gt 0 ]; then
196
+ pass_rate=$(awk "BEGIN {printf \"%.4f\", $passed / $total}")
197
+ fi
198
+
199
+ # OPTIMIZATION: Single jq call
200
+ local failed_names_json="[]"
201
+ [ ${#failed_names[@]} -gt 0 ] && failed_names_json=$(printf '%s\n' "${failed_names[@]}" | jq -Rs 'split("\n") | map(select(length > 0))')
202
+
203
+ cat <<EOF
204
+ {"framework":"go","total_tests":$total,"passed_tests":$passed,"failed_tests":$failed,"skipped_tests":$skipped,"pass_rate":$pass_rate,"duration_ms":$duration,"failed_test_names":$failed_names_json}
205
+ EOF
206
+ }
207
+
208
+ auto_detect_framework() {
209
+ local input="$1"
210
+
211
+ if [ -f "$input" ]; then
212
+ if grep -q "<testsuite" "$input" 2>/dev/null; then
213
+ echo "junit"
214
+ return 0
215
+ fi
216
+ input=$(cat "$input")
217
+ fi
218
+
219
+ if [[ "$input" =~ Test\ Suites: ]] || [[ "$input" =~ PASS[[:space:]]+.*\.test\.(js|ts) ]]; then
220
+ echo "jest"
221
+ return 0
222
+ fi
223
+
224
+ if [[ "$input" =~ [0-9]+\ passing ]] && [[ "$input" =~ [0-9]+\ failing ]]; then
225
+ echo "mocha"
226
+ return 0
227
+ fi
228
+
229
+ if [[ "$input" =~ ====.*passed.*==== ]] || [[ "$input" =~ FAILED.*\.py:: ]]; then
230
+ echo "pytest"
231
+ return 0
232
+ fi
233
+
234
+ if [[ "$input" =~ 1\.\.[0-9]+ ]] || [[ "$input" =~ ok\ [0-9]+ ]] || [[ "$input" =~ not\ ok\ [0-9]+ ]]; then
235
+ echo "tap"
236
+ return 0
237
+ fi
238
+
239
+ if [[ "$input" =~ ---\ PASS: ]] || [[ "$input" =~ ---\ FAIL: ]]; then
240
+ echo "go"
241
+ return 0
242
+ fi
243
+
244
+ echo "unknown"
245
+ return 1
246
+ }
247
+
248
+ parse_test_results() {
249
+ local framework="$1"
250
+ local input="$2"
251
+
252
+ if [ "$framework" = "auto" ]; then
253
+ framework=$(auto_detect_framework "$input")
254
+ if [ "$framework" = "unknown" ]; then
255
+ echo '{"error":"Unable to auto-detect testing framework"}'
256
+ return 1
257
+ fi
258
+ fi
259
+
260
+ local output="$input"
261
+ [ -f "$input" ] && output=$(cat "$input")
262
+
263
+ case "$framework" in
264
+ jest) parse_jest_output "$output" ;;
265
+ mocha) parse_mocha_output "$output" ;;
266
+ pytest) parse_pytest_output "$output" ;;
267
+ tap) parse_tap_output "$output" ;;
268
+ junit) parse_junit_xml "$input" ;;
269
+ go) parse_go_test_output "$output" ;;
270
+ *) echo '{"error":"Unknown framework"}' && return 1 ;;
271
+ esac
272
+ }
273
+
274
+ if [ "${BASH_SOURCE[0]}" = "${0}" ]; then
275
+ [ $# -lt 2 ] && echo "Usage: $0 <framework|auto> <output_file_or_string>" && exit 1
276
+ parse_test_results "$1" "$2"
277
+ fi
@@ -61,9 +61,34 @@ mkdir -p "$CFN_TELEMETRY_DIR"
61
61
  # shellcheck source=./security_utils.sh
62
62
  source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/security_utils.sh"
63
63
 
64
+ ##############################################################################
65
+ # Input Sanitization (Security)
66
+ ##############################################################################
67
+ sanitize_input() {
68
+ local input="$1"
69
+ local max_length="${2:-256}" # Default max length 256 chars
70
+
71
+ # Truncate to max length
72
+ input="${input:0:$max_length}"
73
+
74
+ # Remove dangerous characters (only allow alphanumeric, dash, underscore, dot, comma, colon, space, forward slash)
75
+ # This covers task IDs, agent types, file paths, and JSON-like structures
76
+ echo "$input" | sed 's/[^a-zA-Z0-9._:, /-]//g'
77
+ }
78
+
64
79
  HELPERS_DIR="$SCRIPT_DIR/helpers"
65
80
  REDIS_COORD_SKILL="$PROJECT_ROOT/.claude/skills/cfn-redis-coordination"
66
81
 
82
+ # Validate Redis connectivity
83
+ REDIS_PORT="${CFN_REDIS_PORT:-6379}"
84
+ REDIS_HOST="${CFN_REDIS_HOST:-localhost}"
85
+ if command -v redis-cli &>/dev/null; then
86
+ if ! redis-cli -h "${REDIS_HOST}" -p "${REDIS_PORT}" ping &>/dev/null; then
87
+ echo "⚠️ Warning: Redis not reachable at ${REDIS_HOST}:${REDIS_PORT}" >&2
88
+ echo " Redis coordination features may not function correctly" >&2
89
+ fi
90
+ fi
91
+
67
92
  # Configuration
68
93
  TASK_ID=""
69
94
  MODE="standard"
@@ -71,6 +96,7 @@ LOOP3_AGENTS=""
71
96
  LOOP2_AGENTS=""
72
97
  PRODUCT_OWNER=""
73
98
  MAX_ITERATIONS=10
99
+ MAX_ALLOWED_ITERATIONS=100 # Security: Prevent resource exhaustion via unbounded iterations
74
100
  MIN_QUORUM_LOOP3="0.66"
75
101
  MIN_QUORUM_LOOP2="0.66"
76
102
  EPIC_CONTEXT=""
@@ -82,8 +108,8 @@ PHASE_ID=""
82
108
  # Mode-specific thresholds
83
109
  declare -A GATE_THRESHOLD=(
84
110
  [mvp]=0.70
85
- [standard]=0.75
86
- [enterprise]=0.75
111
+ [standard]=0.95
112
+ [enterprise]=0.98
87
113
  )
88
114
 
89
115
  declare -A CONSENSUS_THRESHOLD=(
@@ -131,6 +157,10 @@ while [[ $# -gt 0 ]]; do
131
157
  echo "Error: --loop3-agents requires a value"
132
158
  exit 1
133
159
  fi
160
+ if [[ -z "$2" ]]; then
161
+ echo "Error: --loop3-agents value cannot be empty"
162
+ exit 1
163
+ fi
134
164
  validate_agent_list "$2" || { echo "Invalid Loop 3 agent list"; exit 1; }
135
165
  LOOP3_AGENTS="$2"
136
166
  shift 2
@@ -140,6 +170,10 @@ while [[ $# -gt 0 ]]; do
140
170
  echo "Error: --loop2-agents requires a value"
141
171
  exit 1
142
172
  fi
173
+ if [[ -z "$2" ]]; then
174
+ echo "Error: --loop2-agents value cannot be empty"
175
+ exit 1
176
+ fi
143
177
  validate_agent_list "$2" || { echo "Invalid Loop 2 agent list"; exit 1; }
144
178
  LOOP2_AGENTS="$2"
145
179
  shift 2
@@ -149,6 +183,10 @@ while [[ $# -gt 0 ]]; do
149
183
  echo "Error: --product-owner requires a value"
150
184
  exit 1
151
185
  fi
186
+ if [[ -z "$2" ]]; then
187
+ echo "Error: --product-owner value cannot be empty"
188
+ exit 1
189
+ fi
152
190
  PRODUCT_OWNER=$(sanitize_input "$2") || { echo "Invalid product owner"; exit 1; }
153
191
  shift 2
154
192
  ;;
@@ -162,9 +200,20 @@ while [[ $# -gt 0 ]]; do
162
200
  echo "Max iterations must be a positive integer"
163
201
  exit 1
164
202
  fi
203
+ # SECURITY FIX: Enforce upper bound to prevent resource exhaustion
204
+ if [[ "$2" -gt "$MAX_ALLOWED_ITERATIONS" ]]; then
205
+ echo "❌ MAX_ITERATIONS=$2 exceeds limit of $MAX_ALLOWED_ITERATIONS" >&2
206
+ echo " (Use --max-iterations <N> where N <= $MAX_ALLOWED_ITERATIONS)" >&2
207
+ exit 1
208
+ fi
209
+ if [[ "$2" -lt 1 ]]; then
210
+ echo "❌ MAX_ITERATIONS must be at least 1" >&2
211
+ exit 1
212
+ fi
165
213
  MAX_ITERATIONS="$2"
166
214
  shift 2
167
215
  ;;
216
+
168
217
  --min-quorum-loop3)
169
218
  if [[ $# -lt 2 ]]; then
170
219
  echo "Error: --min-quorum-loop3 requires a value"
@@ -292,11 +341,11 @@ case "$MODE" in
292
341
  CONSENSUS=${CONSENSUS_THRESHOLD[mvp]:-0.80}
293
342
  ;;
294
343
  standard)
295
- GATE=${GATE_THRESHOLD[standard]:-0.75}
344
+ GATE=${GATE_THRESHOLD[standard]:-0.95}
296
345
  CONSENSUS=${CONSENSUS_THRESHOLD[standard]:-0.90}
297
346
  ;;
298
347
  enterprise)
299
- GATE=${GATE_THRESHOLD[enterprise]:-0.85}
348
+ GATE=${GATE_THRESHOLD[enterprise]:-0.98}
300
349
  CONSENSUS=${CONSENSUS_THRESHOLD[enterprise]:-0.95}
301
350
  ;;
302
351
  *)
@@ -420,6 +469,41 @@ build_agent_context() {
420
469
 
421
470
  context="$context | Iteration: $iteration"
422
471
 
472
+ # Check if jq is available before attempting JSON parsing
473
+ if ! command -v jq &>/dev/null; then
474
+ echo "⚠️ Warning: jq not installed. Test context injection will be skipped" >&2
475
+ echo "$context"
476
+ return
477
+ fi
478
+
479
+ # Inject test failure diagnostics from previous iteration
480
+ if [ "$iteration" -gt 1 ]; then
481
+ local iteration_context_file="/tmp/cfn-iteration-context-${task_id}.json"
482
+
483
+ if [ -f "$iteration_context_file" ]; then
484
+ # Extract failed test summary from iteration context
485
+ local failed_summary=""
486
+ failed_summary=$(jq -r '
487
+ if (.pass_rate? != null)
488
+ and .failed_tests
489
+ and (.failed_tests | length > 0)
490
+ then
491
+ "Previous Test Results: Pass Rate " +
492
+ ((.pass_rate * 100) | floor | tostring) +
493
+ "% | Failed Tests: " +
494
+ ([.failed_tests[].failed_test_names[]? // empty] | join(", "))
495
+ else
496
+ empty
497
+ end
498
+ ' "$iteration_context_file" 2>/dev/null || echo "")
499
+
500
+ if [ -n "$failed_summary" ]; then
501
+ context="$context | $failed_summary"
502
+ echo "📊 Injected test diagnostics from previous iteration" >&2
503
+ fi
504
+ fi
505
+ fi
506
+
423
507
  if [[ -n "$feedback" ]]; then
424
508
  context="$context | Feedback: $feedback"
425
509
  fi
@@ -448,6 +532,32 @@ function spawn_loop3_agents() {
448
532
 
449
533
  echo "[Loop 3] Spawning implementer agents (iteration $iteration)..."
450
534
 
535
+ # Load success criteria from Redis (if available)
536
+ export AGENT_SUCCESS_CRITERIA=""
537
+ if [[ -n "$task_id" ]] && [[ -x "$SCRIPT_DIR/../cfn-redis-coordination/get-success-criteria.sh" ]]; then
538
+ SUCCESS_CRITERIA=$("$SCRIPT_DIR/../cfn-redis-coordination/get-success-criteria.sh" --task-id "$task_id" 2>/dev/null || echo "")
539
+
540
+ if [[ -n "$SUCCESS_CRITERIA" ]]; then
541
+ # SECURITY FIX: Validate JSON size before parsing (prevent DoS)
542
+ CRITERIA_SIZE=$(echo -n "$SUCCESS_CRITERIA" | wc -c)
543
+ MAX_SIZE=10485760 # 10MB
544
+
545
+ if [[ "$CRITERIA_SIZE" -gt "$MAX_SIZE" ]]; then
546
+ echo " ❌ Success criteria exceeds maximum size (10MB): ${CRITERIA_SIZE} bytes" >&2
547
+ exit 1
548
+ fi
549
+
550
+ # Validate JSON before exporting
551
+ if echo "$SUCCESS_CRITERIA" | jq empty 2>/dev/null; then
552
+ export AGENT_SUCCESS_CRITERIA="$SUCCESS_CRITERIA"
553
+ TEST_SUITE_COUNT=$(echo "$SUCCESS_CRITERIA" | jq -r '.test_suites | length' 2>/dev/null || echo "0")
554
+ echo " ✅ Success criteria loaded ($TEST_SUITE_COUNT test suites)" >&2
555
+ else
556
+ echo " ⚠️ Invalid success criteria JSON - skipping" >&2
557
+ fi
558
+ fi
559
+ fi
560
+
451
561
  # Convert comma-separated agents to array
452
562
  IFS=',' read -ra AGENT_ARRAY <<< "$agents"
453
563
 
@@ -470,32 +580,94 @@ function spawn_loop3_agents() {
470
580
  safe_agent_id=$(sanitize_input "$UNIQUE_AGENT_ID") || continue
471
581
 
472
582
  # Dual-mode agent spawning: Docker or CLI
473
- # Docker mode: CFN_DOCKER_MODE=true or Docker socket available
474
- # CLI mode: Default (uses npx)
475
- if [[ "${CFN_DOCKER_MODE:-false}" == "true" ]] || [[ -S /var/run/docker.sock ]]; then
583
+ # Mode Selection Priority:
584
+ # 1. Explicit CFN_DOCKER_MODE='true'/'false' (highest priority - user override)
585
+ # 2. Automatic Docker socket detection (if CFN_DOCKER_MODE unset)
586
+ # 3. Default CLI mode (fallback if no Docker socket)
587
+ #
588
+ # BUG FIX: Respect CFN_DOCKER_MODE='false' even when Docker socket exists
589
+ SPAWN_MODE="cli" # Default
590
+ SPAWN_REASON=""
591
+
592
+ if [[ "${CFN_DOCKER_MODE:-}" == "true" ]]; then
593
+ SPAWN_MODE="docker"
594
+ SPAWN_REASON="explicit CFN_DOCKER_MODE=true"
595
+ elif [[ "${CFN_DOCKER_MODE:-}" == "false" ]]; then
596
+ SPAWN_MODE="cli"
597
+ SPAWN_REASON="explicit CFN_DOCKER_MODE=false (overrides Docker socket detection)"
598
+ elif [[ -S /var/run/docker.sock ]]; then
599
+ SPAWN_MODE="docker"
600
+ SPAWN_REASON="automatic Docker socket detection"
601
+ else
602
+ SPAWN_MODE="cli"
603
+ SPAWN_REASON="default (no Docker socket)"
604
+ fi
605
+
606
+ if [[ "$SPAWN_MODE" == "docker" ]]; then
476
607
  # Docker-based spawning (prevents WebAssembly OOM)
477
- echo " → Docker mode: spawning via container" >&2
478
-
479
- docker run --detach \
480
- --name "agent-${safe_agent_id}" \
481
- --memory "${CFN_MEMORY_LIMIT:-2g}" \
482
- --cpus 1.5 \
483
- --network "${CFN_DOCKER_NETWORK:-mcp-network}" \
484
- --env REDIS_URL=redis://redis:6379 \
485
- --env AGENT_ID="${safe_agent_id}" \
486
- --env AGENT_TYPE="${safe_agent_type}" \
487
- --env TASK_ID="${safe_task_id}" \
488
- --env ITERATION="${iteration}" \
489
- --volume "${PROJECT_ROOT}/.claude:/app/.claude:ro" \
490
- --volume "${PROJECT_ROOT}/packages:/app/packages" \
491
- --volume "/tmp/agent-workspace-${safe_agent_id}:/app/workspace" \
492
- "${CFN_DOCKER_IMAGE:-claude-flow-novice:agent}" \
493
- sh -c "npx claude-flow-novice agent \"${safe_agent_type}\" --task-id \"${safe_task_id}\" --agent-id \"${safe_agent_id}\" --iteration \"${iteration}\"" >/dev/null 2>&1 &
608
+ echo " → Docker mode: ${SPAWN_REASON}" >&2
609
+
610
+ # SECURITY FIX: Sanitize Docker environment variables to prevent command injection
611
+ CFN_DOCKER_IMAGE_SAFE=$(sanitize_input "${CFN_DOCKER_IMAGE:-claude-flow-novice:agent}") || {
612
+ echo "❌ Invalid CFN_DOCKER_IMAGE" >&2
613
+ exit 1
614
+ }
615
+ CFN_DOCKER_NETWORK_SAFE=$(sanitize_input "${CFN_DOCKER_NETWORK:-mcp-network}") || {
616
+ echo "❌ Invalid CFN_DOCKER_NETWORK" >&2
617
+ exit 1
618
+ }
619
+ CFN_MEMORY_LIMIT_SAFE=$(sanitize_input "${CFN_MEMORY_LIMIT:-2g}") || {
620
+ echo "❌ Invalid CFN_MEMORY_LIMIT" >&2
621
+ exit 1
622
+ }
623
+
624
+ # Build Docker command as array (prevents injection, no eval needed)
625
+ DOCKER_CMD=(
626
+ docker run --detach
627
+ --name "agent-${safe_agent_id}"
628
+ --memory "$CFN_MEMORY_LIMIT_SAFE"
629
+ --cpus 1.5
630
+ --network "$CFN_DOCKER_NETWORK_SAFE"
631
+ --env REDIS_URL=redis://redis:6379
632
+ --env "AGENT_ID=${safe_agent_id}"
633
+ --env "AGENT_TYPE=${safe_agent_type}"
634
+ --env "TASK_ID=${safe_task_id}"
635
+ --env "ITERATION=${iteration}"
636
+ )
637
+
638
+ # SECURITY FIX: Base64-encode success criteria to prevent shell injection
639
+ if [[ -n "${AGENT_SUCCESS_CRITERIA:-}" ]]; then
640
+ ENCODED_CRITERIA=$(echo -n "$AGENT_SUCCESS_CRITERIA" | base64 -w 0)
641
+
642
+ # SECURITY FIX: Validate size AFTER encoding to prevent expansion bypass (10MB → 13.9MB)
643
+ ENCODED_SIZE=$(echo -n "$ENCODED_CRITERIA" | wc -c)
644
+ MAX_ENCODED_SIZE=10485760 # 10MB
645
+
646
+ if [[ "$ENCODED_SIZE" -gt "$MAX_ENCODED_SIZE" ]]; then
647
+ echo "❌ Encoded success criteria exceeds 10MB limit: ${ENCODED_SIZE} bytes" >&2
648
+ echo " (Original: $(echo -n "$AGENT_SUCCESS_CRITERIA" | wc -c) bytes, Expanded: +33% via base64)" >&2
649
+ exit 1
650
+ fi
651
+
652
+ DOCKER_CMD+=(--env "AGENT_SUCCESS_CRITERIA_B64=${ENCODED_CRITERIA}")
653
+ fi
654
+
655
+ # Add volumes and image
656
+ DOCKER_CMD+=(
657
+ --volume "${PROJECT_ROOT}/.claude:/app/.claude:ro"
658
+ --volume "${PROJECT_ROOT}/packages:/app/packages"
659
+ --volume "/tmp/agent-workspace-${safe_agent_id}:/app/workspace"
660
+ "$CFN_DOCKER_IMAGE_SAFE"
661
+ sh -c "npx claude-flow-novice agent \"${safe_agent_type}\" --task-id \"${safe_task_id}\" --agent-id \"${safe_agent_id}\" --iteration \"${iteration}\""
662
+ )
663
+
664
+ # Execute safely without eval (prevents command injection)
665
+ "${DOCKER_CMD[@]}" >/dev/null 2>&1 &
494
666
 
495
667
  AGENT_PID=$!
496
668
  else
497
669
  # CLI-based spawning (traditional approach)
498
- echo " → CLI mode: spawning via npx" >&2
670
+ echo " → CLI mode: ${SPAWN_REASON}" >&2
499
671
 
500
672
  if command -v execute_instrumented >/dev/null 2>&1; then
501
673
  execute_instrumented "npx" "$CFN_VALIDATION_TIMEOUT" "$CFN_MEMORY_LIMIT" \
@@ -534,8 +706,13 @@ function spawn_loop3_agents() {
534
706
  echo "🔍 Started monitoring for $UNIQUE_AGENT_ID (Agent PID: $AGENT_PID, Monitor PID: $MONITOR_PID)" >&2
535
707
  fi
536
708
 
537
- # Store agent ID mapping for later retrieval using Redis SADD for set storage
538
- redis-cli -h "${REDIS_HOST:-localhost}" -p "${REDIS_PORT:-6379}" SADD "swarm:${task_id}:loop3:agent_ids:iteration${iteration}" "$UNIQUE_AGENT_ID" >/dev/null
709
+ # SECURITY FIX: Atomic SADD + EXPIRE using Lua script (prevent race condition)
710
+ redis-cli -h "${REDIS_HOST:-localhost}" -p "${REDIS_PORT:-6379}" --eval - \
711
+ "swarm:${task_id}:loop3:agent_ids:iteration${iteration}" "$UNIQUE_AGENT_ID" <<'LUA' >/dev/null
712
+ redis.call('SADD', KEYS[1], ARGV[1])
713
+ redis.call('EXPIRE', KEYS[1], 86400)
714
+ return redis.call('SCARD', KEYS[1])
715
+ LUA
539
716
  done
540
717
 
541
718
  echo "[Loop 3] All agents spawned"
@@ -747,6 +924,32 @@ function spawn_loop2_agents() {
747
924
 
748
925
  echo "[Loop 2] Spawning validator agents (iteration $iteration)..."
749
926
 
927
+ # Load success criteria from Redis (if available)
928
+ export AGENT_SUCCESS_CRITERIA=""
929
+ if [[ -n "$task_id" ]] && [[ -x "$SCRIPT_DIR/../cfn-redis-coordination/get-success-criteria.sh" ]]; then
930
+ SUCCESS_CRITERIA=$("$SCRIPT_DIR/../cfn-redis-coordination/get-success-criteria.sh" --task-id "$task_id" 2>/dev/null || echo "")
931
+
932
+ if [[ -n "$SUCCESS_CRITERIA" ]]; then
933
+ # SECURITY FIX: Validate JSON size before parsing (prevent DoS)
934
+ CRITERIA_SIZE=$(echo -n "$SUCCESS_CRITERIA" | wc -c)
935
+ MAX_SIZE=10485760 # 10MB
936
+
937
+ if [[ "$CRITERIA_SIZE" -gt "$MAX_SIZE" ]]; then
938
+ echo " ❌ Success criteria exceeds maximum size (10MB): ${CRITERIA_SIZE} bytes" >&2
939
+ exit 1
940
+ fi
941
+
942
+ # Validate JSON before exporting
943
+ if echo "$SUCCESS_CRITERIA" | jq empty 2>/dev/null; then
944
+ export AGENT_SUCCESS_CRITERIA="$SUCCESS_CRITERIA"
945
+ TEST_SUITE_COUNT=$(echo "$SUCCESS_CRITERIA" | jq -r '.test_suites | length' 2>/dev/null || echo "0")
946
+ echo " ✅ Success criteria loaded ($TEST_SUITE_COUNT test suites)" >&2
947
+ else
948
+ echo " ⚠️ Invalid success criteria JSON - skipping" >&2
949
+ fi
950
+ fi
951
+ fi
952
+
750
953
  # Convert comma-separated agents to array
751
954
  IFS=',' read -ra AGENT_ARRAY <<< "$agents"
752
955
 
@@ -788,7 +991,13 @@ function spawn_loop2_agents() {
788
991
  --namespace "swarm" >/dev/null
789
992
 
790
993
  # Store agent ID mapping for later retrieval using Redis SADD for set storage
791
- redis-cli -h "${REDIS_HOST:-localhost}" -p "${REDIS_PORT:-6379}" SADD "swarm:${task_id}:loop2:agent_ids:iteration${iteration}" "$UNIQUE_VALIDATOR_ID" >/dev/null
994
+ # SECURITY FIX: Atomic SADD + EXPIRE using Lua script (prevent race condition)
995
+ redis-cli -h "${REDIS_HOST:-localhost}" -p "${REDIS_PORT:-6379}" --eval - \
996
+ "swarm:${task_id}:loop2:agent_ids:iteration${iteration}" "$UNIQUE_VALIDATOR_ID" <<'LUA' >/dev/null
997
+ redis.call('SADD', KEYS[1], ARGV[1])
998
+ redis.call('EXPIRE', KEYS[1], 86400)
999
+ return redis.call('SCARD', KEYS[1])
1000
+ LUA
792
1001
  done
793
1002
 
794
1003
  echo "[Loop 2] All agents spawned"
@@ -804,7 +1013,7 @@ function spawn_product_owner() {
804
1013
  # BLOCKER #2 FIX: Match execute-decision.sh actual parameters
805
1014
  # Required: --task-id, --agent-id, --consensus, --threshold, --iteration, --max-iterations
806
1015
  local decision_output
807
- decision_output=$("$SCRIPT_DIR/.claude/skills/cfn-product-owner-decision/execute-decision.sh" \
1016
+ decision_output=$("$PROJECT_ROOT/.claude/skills/cfn-product-owner-decision/execute-decision.sh" \
808
1017
  --task-id "$task_id" \
809
1018
  --agent-id "$PRODUCT_OWNER" \
810
1019
  --consensus "$LOOP2_FINAL_CONSENSUS" \