claude-flow-novice 2.15.10 → 2.16.0

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 (652) hide show
  1. package/.claude/cfn-extras/agents/cfn-v3-coordinator.md +517 -0
  2. package/.claude/commands/cfn-loop-cli.md +158 -464
  3. package/.claude/commands/cfn-loop-trigger.md +114 -0
  4. package/.claude/hooks/cfn-invoke-post-edit-ts.sh +100 -0
  5. package/.claude/hooks/cfn-invoke-post-edit-ts.sh.backup +78 -0
  6. package/.claude/hooks/cfn-invoke-post-edit.sh +22 -0
  7. package/.claude/hooks/cfn-invoke-post-edit.sh.backup +87 -0
  8. package/.claude/hooks/cfn-invoke-pre-edit-ts.sh +116 -0
  9. package/.claude/hooks/cfn-invoke-pre-edit-ts.sh.backup +94 -0
  10. package/.claude/hooks/cfn-invoke-pre-edit.sh +22 -0
  11. package/.claude/hooks/cfn-invoke-pre-edit.sh.backup +88 -0
  12. package/.claude/skills/cfn-agent-spawning/SKILL.md +48 -1
  13. package/.claude/skills/cfn-agent-spawning/SKILL.md.backup +135 -0
  14. package/.claude/skills/cfn-agent-spawning/TYPESCRIPT_MIGRATION.md +567 -0
  15. package/.claude/skills/cfn-agent-spawning/check-dependencies.sh +22 -0
  16. package/.claude/skills/{cfn-redis-coordination/check-dependencies.sh → cfn-agent-spawning/check-dependencies.sh.backup} +3 -5
  17. package/.claude/skills/cfn-agent-spawning/get-agent-provider-env.sh +22 -0
  18. package/.claude/skills/cfn-agent-spawning/get-agent-provider-env.sh.backup +127 -0
  19. package/.claude/skills/cfn-agent-spawning/parse-agent-provider.sh +22 -0
  20. package/.claude/skills/cfn-agent-spawning/parse-agent-provider.sh.backup +59 -0
  21. package/.claude/skills/cfn-agent-spawning/spawn-agent-wrapper.sh +63 -0
  22. package/.claude/skills/cfn-agent-spawning/spawn-agent-wrapper.sh.backup +41 -0
  23. package/.claude/skills/cfn-agent-spawning/spawn-agent.sh +26 -1
  24. package/.claude/skills/cfn-agent-spawning/spawn-templates.sh +22 -0
  25. package/.claude/skills/cfn-agent-spawning/spawn-templates.sh.backup +613 -0
  26. package/.claude/skills/cfn-agent-spawning/spawn-worker.sh +22 -0
  27. package/.claude/skills/cfn-agent-spawning/spawn-worker.sh.backup +176 -0
  28. package/.claude/skills/cfn-loop-orchestration/.backups/unknown/1763619700_33aff4a69b99159e4e849107ebc4d09f/metadata.json +8 -0
  29. package/.claude/skills/cfn-loop-orchestration/.backups/unknown/1763619700_33aff4a69b99159e4e849107ebc4d09f/original +271 -0
  30. package/.claude/skills/cfn-loop-orchestration/.backups/unknown/1763619700_33aff4a69b99159e4e849107ebc4d09f/revert.sh +7 -0
  31. package/.claude/skills/cfn-loop-orchestration/.backups/unknown/1763671642_06496e8c399a79db08167cc00ed4b31e/metadata.json +8 -0
  32. package/.claude/skills/cfn-loop-orchestration/.backups/unknown/1763671642_06496e8c399a79db08167cc00ed4b31e/original +325 -0
  33. package/.claude/skills/cfn-loop-orchestration/.backups/unknown/1763671642_06496e8c399a79db08167cc00ed4b31e/revert.sh +7 -0
  34. package/.claude/skills/cfn-loop-orchestration/CLI_IMPLEMENTATION_SUMMARY.md +330 -0
  35. package/.claude/skills/cfn-loop-orchestration/CONFIGURATION_IMPROVEMENTS.md +318 -0
  36. package/.claude/skills/cfn-loop-orchestration/CONTEXT_LOOKUP_MIGRATION.md +308 -0
  37. package/.claude/skills/cfn-loop-orchestration/CONTEXT_LOOKUP_QUICK_START.md +378 -0
  38. package/.claude/skills/cfn-loop-orchestration/E2E_VALIDATION_REPORT.md +262 -0
  39. package/.claude/skills/cfn-loop-orchestration/IMPLEMENTATION_SUMMARY.md +319 -519
  40. package/.claude/skills/cfn-loop-orchestration/NORTH_STAR_E2E_REPORT.md +299 -0
  41. package/.claude/skills/cfn-loop-orchestration/NORTH_STAR_EXECUTION_SUMMARY.md +403 -0
  42. package/.claude/skills/cfn-loop-orchestration/NORTH_STAR_INDEX.md +323 -0
  43. package/.claude/skills/cfn-loop-orchestration/SKILL.md +159 -48
  44. package/.claude/skills/cfn-loop-orchestration/SPAWN_AGENTS_IMPLEMENTATION.md +188 -0
  45. package/.claude/skills/cfn-loop-orchestration/TEST_COVERAGE_REPORT.md +335 -0
  46. package/.claude/skills/cfn-loop-orchestration/TEST_COVERAGE_SUMMARY.md +456 -0
  47. package/.claude/skills/cfn-loop-orchestration/TYPESCRIPT_INTEGRATION_REPORT.md +709 -0
  48. package/.claude/skills/cfn-loop-orchestration/TYPESCRIPT_INTEGRATION_SUMMARY.md +257 -0
  49. package/.claude/skills/cfn-loop-orchestration/VALIDATION_REPORT.md +572 -0
  50. package/.claude/skills/cfn-loop-orchestration/VALIDATION_SUMMARY.txt +196 -0
  51. package/.claude/skills/cfn-loop-orchestration/VALIDATOR_MODULE_GUIDE.md +526 -0
  52. package/.claude/skills/cfn-loop-orchestration/archive/legacy-bash/README.md +167 -0
  53. package/.claude/skills/cfn-loop-orchestration/archive/legacy-bash/orchestrate-enhanced.sh +548 -0
  54. package/{claude-assets/skills/cfn-loop-orchestration → .claude/skills/cfn-loop-orchestration/archive/legacy-bash}/orchestrate-wrapper.sh +11 -1
  55. package/.claude/skills/cfn-loop-orchestration/archive/legacy-bash/orchestrate.sh +182 -0
  56. package/.claude/skills/cfn-loop-orchestration/e2e-validation-fixed.js +240 -0
  57. package/.claude/skills/cfn-loop-orchestration/e2e-validation.js +213 -0
  58. package/.claude/skills/cfn-loop-orchestration/package-lock.json +3 -0
  59. package/.claude/skills/cfn-loop-orchestration/package.json +4 -0
  60. package/.claude/skills/cfn-loop-orchestration/run-north-star-e2e.ts +210 -0
  61. package/.claude/skills/cfn-loop-orchestration/src/cli/orchestrator-cli.ts +396 -0
  62. package/.claude/skills/cfn-loop-orchestration/src/helpers/CONFIDENCE_AGGREGATOR.md +564 -0
  63. package/.claude/skills/cfn-loop-orchestration/src/helpers/CONFIDENCE_AGGREGATOR_QUICK_REF.md +241 -0
  64. package/.claude/skills/cfn-loop-orchestration/src/helpers/CONTEXT_INJECTOR_IMPLEMENTATION.md +375 -0
  65. package/.claude/skills/cfn-loop-orchestration/src/helpers/CONTEXT_INJECTOR_QUICK_REFERENCE.md +362 -0
  66. package/.claude/skills/cfn-loop-orchestration/src/helpers/CONTEXT_INJECTOR_README.md +307 -0
  67. package/.claude/skills/cfn-loop-orchestration/src/helpers/CONTEXT_INJECTOR_USAGE_GUIDE.md +508 -0
  68. package/.claude/skills/cfn-loop-orchestration/src/helpers/confidence-aggregator.ts +473 -0
  69. package/.claude/skills/cfn-loop-orchestration/src/helpers/consensus.ts +1 -1
  70. package/.claude/skills/cfn-loop-orchestration/src/helpers/context-injector.ts +349 -0
  71. package/.claude/skills/cfn-loop-orchestration/src/helpers/context-lookup.ts +486 -0
  72. package/.claude/skills/cfn-loop-orchestration/src/helpers/deliverable-verifier.ts +6 -2
  73. package/.claude/skills/cfn-loop-orchestration/src/helpers/gate-check.ts +1 -1
  74. package/.claude/skills/cfn-loop-orchestration/src/helpers/product-owner-decision.ts +316 -0
  75. package/.claude/skills/cfn-loop-orchestration/src/helpers/spawn-agents.ts +357 -0
  76. package/.claude/skills/cfn-loop-orchestration/src/helpers/validator.ts +276 -0
  77. package/.claude/skills/cfn-loop-orchestration/src/index.ts +2 -0
  78. package/.claude/skills/cfn-loop-orchestration/src/orchestrate.ts +743 -2
  79. package/.claude/skills/cfn-loop-orchestration/src/types.ts +56 -0
  80. package/.claude/skills/cfn-loop-orchestration/test-cli.sh +92 -0
  81. package/.claude/skills/cfn-loop-orchestration/test-typescript-integration.sh +442 -0
  82. package/.claude/skills/cfn-loop-orchestration/tests/agent-spawner.test.ts +124 -0
  83. package/.claude/skills/cfn-loop-orchestration/tests/confidence-aggregator.test.ts +604 -0
  84. package/.claude/skills/cfn-loop-orchestration/tests/context-injector.test.ts +561 -0
  85. package/.claude/skills/cfn-loop-orchestration/tests/context-lookup.test.ts +661 -0
  86. package/.claude/skills/cfn-loop-orchestration/tests/deliverable-verifier.test.ts +2 -2
  87. package/.claude/skills/cfn-loop-orchestration/tests/gate-check-edge-cases.test.ts +422 -0
  88. package/.claude/skills/cfn-loop-orchestration/tests/gate-checker.test.ts +276 -0
  89. package/.claude/skills/cfn-loop-orchestration/tests/logger.test.ts +291 -0
  90. package/.claude/skills/cfn-loop-orchestration/tests/north-star-e2e.test.ts +334 -0
  91. package/.claude/skills/cfn-loop-orchestration/tests/redis-coordinator.test.ts +321 -0
  92. package/.claude/skills/cfn-loop-orchestration/tests/spawn-agents.test.ts +284 -0
  93. package/.claude/skills/cfn-loop-orchestration/tests/validator.test.ts +643 -0
  94. package/.claude/skills/cfn-loop-validation/IMPLEMENTATION_SUMMARY.md +672 -0
  95. package/.claude/skills/cfn-loop-validation/INDEX.md +531 -0
  96. package/.claude/skills/cfn-loop-validation/README_TYPESCRIPT.md +454 -0
  97. package/.claude/skills/cfn-loop-validation/SKILL.md +48 -1
  98. package/.claude/skills/cfn-loop-validation/SKILL.md.backup +353 -0
  99. package/.claude/skills/cfn-loop-validation/SKILL_TYPESCRIPT.md +782 -0
  100. package/.claude/skills/cfn-loop-validation/VAPOR_DETECTION_EXAMPLES.md +598 -0
  101. package/.claude/skills/cfn-loop-validation/check-dependencies.sh +22 -0
  102. package/{claude-assets/skills/cfn-redis-coordination/check-dependencies.sh → .claude/skills/cfn-loop-validation/check-dependencies.sh.backup} +4 -5
  103. package/.claude/skills/cfn-loop-validation/detect-vapor.sh +59 -0
  104. package/.claude/skills/cfn-loop-validation/detect-vapor.sh.backup +37 -0
  105. package/.claude/skills/cfn-loop-validation/dist/.tsbuildinfo +1 -0
  106. package/.claude/skills/cfn-loop-validation/dist/cli/detect-vapor.d.ts +14 -0
  107. package/.claude/skills/cfn-loop-validation/dist/cli/detect-vapor.d.ts.map +1 -0
  108. package/.claude/skills/cfn-loop-validation/dist/cli/detect-vapor.js +185 -0
  109. package/.claude/skills/cfn-loop-validation/dist/cli/detect-vapor.js.map +1 -0
  110. package/.claude/skills/cfn-loop-validation/dist/cli/validate-deliverables.d.ts +14 -0
  111. package/.claude/skills/cfn-loop-validation/dist/cli/validate-deliverables.d.ts.map +1 -0
  112. package/.claude/skills/cfn-loop-validation/dist/cli/validate-deliverables.js +176 -0
  113. package/.claude/skills/cfn-loop-validation/dist/cli/validate-deliverables.js.map +1 -0
  114. package/.claude/skills/cfn-loop-validation/dist/cli/validate-gate.d.ts +19 -0
  115. package/.claude/skills/cfn-loop-validation/dist/cli/validate-gate.d.ts.map +1 -0
  116. package/.claude/skills/cfn-loop-validation/dist/cli/validate-gate.js +123 -0
  117. package/.claude/skills/cfn-loop-validation/dist/cli/validate-gate.js.map +1 -0
  118. package/.claude/skills/cfn-loop-validation/dist/types.d.ts +156 -0
  119. package/.claude/skills/cfn-loop-validation/dist/types.d.ts.map +1 -0
  120. package/.claude/skills/cfn-loop-validation/dist/types.js +66 -0
  121. package/.claude/skills/cfn-loop-validation/dist/types.js.map +1 -0
  122. package/.claude/skills/cfn-loop-validation/dist/validator.d.ts +85 -0
  123. package/.claude/skills/cfn-loop-validation/dist/validator.d.ts.map +1 -0
  124. package/.claude/skills/cfn-loop-validation/dist/validator.js +411 -0
  125. package/.claude/skills/cfn-loop-validation/dist/validator.js.map +1 -0
  126. package/.claude/skills/cfn-loop-validation/orchestrate-cfn-loop.sh +22 -0
  127. package/.claude/skills/cfn-loop-validation/orchestrate-cfn-loop.sh.backup +252 -0
  128. package/.claude/skills/cfn-loop-validation/package.json +93 -0
  129. package/.claude/skills/cfn-loop-validation/src/cli/detect-vapor.ts +177 -0
  130. package/.claude/skills/cfn-loop-validation/src/cli/validate-deliverables.ts +161 -0
  131. package/.claude/skills/cfn-loop-validation/src/cli/validate-gate.ts +139 -0
  132. package/.claude/skills/cfn-loop-validation/src/types.ts +215 -0
  133. package/.claude/skills/cfn-loop-validation/src/validator.ts +503 -0
  134. package/.claude/skills/cfn-loop-validation/tests/validator.test.ts +537 -0
  135. package/.claude/skills/{cfn-redis-coordination → cfn-loop-validation}/tsconfig.json +34 -31
  136. package/.claude/skills/cfn-loop-validation/validate-deliverables.sh +59 -0
  137. package/.claude/skills/cfn-loop-validation/validate-deliverables.sh.backup +37 -0
  138. package/.claude/skills/cfn-loop-validation/validate-gate.sh +63 -0
  139. package/.claude/skills/cfn-loop-validation/validate-gate.sh.backup +41 -0
  140. package/.claude/skills/cfn-loop-validation/validate-iteration.sh +22 -0
  141. package/.claude/skills/cfn-loop-validation/validate-iteration.sh.backup +134 -0
  142. package/.claude/skills/cfn-product-owner-decision/SKILL.md +479 -147
  143. package/.claude/skills/cfn-product-owner-decision/TYPESCRIPT_IMPLEMENTATION.md +653 -0
  144. package/{claude-assets/skills/cfn-product-owner-decision → .claude/skills/cfn-product-owner-decision/archive/legacy-bash}/execute-decision.sh +24 -2
  145. package/.claude/skills/pre-edit-backup/SKILL.md +324 -0
  146. package/.claude/skills/pre-edit-backup/SKILL.md.backup +277 -0
  147. package/.claude/skills/pre-edit-backup/backup.sh +22 -0
  148. package/.claude/skills/pre-edit-backup/backup.sh.backup +107 -0
  149. package/claude-assets/agents/cfn-dev-team/CLAUDE.md +9 -81
  150. package/claude-assets/agents/cfn-dev-team/architecture/base-template-generator.md +4 -4
  151. package/claude-assets/agents/cfn-dev-team/architecture/planner.md +4 -4
  152. package/claude-assets/agents/cfn-dev-team/architecture/system-architect.md +5 -5
  153. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +1 -0
  154. package/claude-assets/agents/cfn-dev-team/coordinators/consensus-builder.md +1 -0
  155. package/claude-assets/agents/cfn-dev-team/coordinators/handoff-coordinator.md +1 -0
  156. package/claude-assets/agents/cfn-dev-team/coordinators/multi-sprint-coordinator.md +1 -0
  157. package/claude-assets/agents/cfn-dev-team/dev-ops/devops-engineer.md +14 -4
  158. package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +63 -70
  159. package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +50 -70
  160. package/claude-assets/agents/cfn-dev-team/dev-ops/monitoring-specialist.md +13 -4
  161. package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +27 -58
  162. package/claude-assets/agents/cfn-dev-team/developers/backend-developer.md +40 -58
  163. package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +18 -20
  164. package/claude-assets/agents/cfn-dev-team/developers/database/database-architect.md +19 -28
  165. package/claude-assets/agents/cfn-dev-team/developers/frontend/mobile-dev.md +15 -19
  166. package/claude-assets/agents/cfn-dev-team/developers/frontend/react-frontend-engineer.md +15 -10
  167. package/claude-assets/agents/cfn-dev-team/developers/frontend/typescript-specialist.md +15 -10
  168. package/claude-assets/agents/cfn-dev-team/developers/frontend/ui-designer.md +15 -25
  169. package/claude-assets/agents/cfn-dev-team/developers/graphql-specialist.md +17 -21
  170. package/claude-assets/agents/cfn-dev-team/developers/rust-developer.md +17 -21
  171. package/claude-assets/agents/cfn-dev-team/product-owners/accessibility-advocate-persona.md +4 -4
  172. package/claude-assets/agents/cfn-dev-team/product-owners/cto-agent.md +4 -4
  173. package/claude-assets/agents/cfn-dev-team/product-owners/power-user-persona.md +4 -4
  174. package/claude-assets/agents/cfn-dev-team/product-owners/product-owner.md +19 -27
  175. package/claude-assets/agents/cfn-dev-team/reviewers/code-reviewer.md +20 -51
  176. package/claude-assets/agents/cfn-dev-team/reviewers/quality/code-quality-validator.md +22 -71
  177. package/claude-assets/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +21 -64
  178. package/claude-assets/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +22 -67
  179. package/claude-assets/agents/cfn-dev-team/reviewers/quality/security-specialist.md +23 -67
  180. package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +14 -70
  181. package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +25 -73
  182. package/claude-assets/agents/cfn-dev-team/testers/contract-tester.md +26 -65
  183. package/claude-assets/agents/cfn-dev-team/testers/e2e/playwright-tester.md +5 -5
  184. package/claude-assets/agents/cfn-dev-team/testers/integration-tester.md +27 -67
  185. package/claude-assets/agents/cfn-dev-team/testers/interaction-tester.md +16 -73
  186. package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +27 -67
  187. package/claude-assets/agents/cfn-dev-team/testers/mutation-testing-specialist.md +27 -60
  188. package/claude-assets/agents/cfn-dev-team/testers/playwright-tester.md +15 -74
  189. package/claude-assets/agents/cfn-dev-team/testers/tester.md +14 -60
  190. package/claude-assets/agents/cfn-dev-team/testers/unit/tdd-london-unit-swarm.md +5 -5
  191. package/claude-assets/agents/cfn-dev-team/testers/validation/validation-production-validator.md +4 -4
  192. package/claude-assets/agents/cfn-dev-team/testing/test-validation-agent.md +4 -4
  193. package/claude-assets/agents/cfn-dev-team/utility/agent-builder.md +16 -16
  194. package/claude-assets/agents/cfn-dev-team/utility/analyst.md +16 -32
  195. package/claude-assets/agents/cfn-dev-team/utility/code-booster.md +17 -17
  196. package/claude-assets/agents/cfn-dev-team/utility/context-curator.md +10 -5
  197. package/claude-assets/agents/cfn-dev-team/utility/epic-creator.md +12 -102
  198. package/claude-assets/agents/cfn-dev-team/utility/memory-leak-specialist.md +127 -814
  199. package/claude-assets/agents/cfn-dev-team/utility/researcher.md +16 -25
  200. package/claude-assets/agents/cfn-dev-team/utility/z-ai-specialist.md +157 -667
  201. package/claude-assets/agents/custom/cfn-docker-expert.md +102 -0
  202. package/claude-assets/agents/custom/cfn-loops-cli-expert.md +129 -0
  203. package/claude-assets/cfn-extras/agents/cfn-v3-coordinator.md +517 -0
  204. package/claude-assets/commands/cfn-loop-cli.md +158 -464
  205. package/claude-assets/commands/cfn-loop-trigger.md +114 -0
  206. package/claude-assets/hooks/SKILL.md +518 -0
  207. package/claude-assets/hooks/SKILL.md.backup +471 -0
  208. package/claude-assets/hooks/cfn-invoke-post-edit-ts.sh +100 -0
  209. package/claude-assets/hooks/cfn-invoke-post-edit-ts.sh.backup +78 -0
  210. package/claude-assets/hooks/cfn-invoke-post-edit.sh +22 -0
  211. package/claude-assets/hooks/cfn-invoke-post-edit.sh.backup +87 -0
  212. package/claude-assets/hooks/cfn-invoke-pre-edit-ts.sh +116 -0
  213. package/claude-assets/hooks/cfn-invoke-pre-edit-ts.sh.backup +94 -0
  214. package/claude-assets/hooks/cfn-invoke-pre-edit.sh +22 -0
  215. package/claude-assets/hooks/cfn-invoke-pre-edit.sh.backup +88 -0
  216. package/claude-assets/skills/cfn-agent-selection-with-fallback/DELIVERABLES.md +409 -0
  217. package/claude-assets/skills/cfn-agent-selection-with-fallback/IMPLEMENTATION_SUMMARY.md +396 -0
  218. package/claude-assets/skills/cfn-agent-selection-with-fallback/INTEGRATION_GUIDE.md +308 -0
  219. package/claude-assets/skills/cfn-agent-selection-with-fallback/QUICK_REFERENCE.md +239 -0
  220. package/claude-assets/skills/cfn-agent-selection-with-fallback/SKILL.md +107 -1
  221. package/claude-assets/skills/cfn-agent-selection-with-fallback/SKILL.md.backup +302 -0
  222. package/claude-assets/skills/cfn-agent-selection-with-fallback/TYPESCRIPT_MIGRATION.md +295 -0
  223. package/claude-assets/skills/cfn-agent-selection-with-fallback/dist/agent-selector.cjs +297 -0
  224. package/claude-assets/skills/cfn-agent-selection-with-fallback/dist/agent-selector.js +297 -0
  225. package/claude-assets/skills/cfn-agent-selection-with-fallback/dist/cli.cjs +96 -0
  226. package/claude-assets/skills/cfn-agent-selection-with-fallback/dist/cli.js +96 -0
  227. package/claude-assets/skills/cfn-agent-selection-with-fallback/select-agents-ts.sh +45 -0
  228. package/claude-assets/skills/cfn-agent-selection-with-fallback/select-agents-ts.sh.backup +23 -0
  229. package/claude-assets/skills/cfn-agent-selection-with-fallback/select-agents.sh +22 -0
  230. package/claude-assets/skills/cfn-agent-selection-with-fallback/select-agents.sh.backup +173 -0
  231. package/claude-assets/skills/cfn-agent-selection-with-fallback/src/agent-selector.test.ts +357 -0
  232. package/claude-assets/skills/cfn-agent-selection-with-fallback/src/agent-selector.ts +350 -0
  233. package/claude-assets/skills/cfn-agent-selection-with-fallback/src/cli.ts +74 -0
  234. package/claude-assets/skills/cfn-agent-selection-with-fallback/task-classifier.sh +22 -0
  235. package/claude-assets/skills/cfn-agent-selection-with-fallback/task-classifier.sh.backup +71 -0
  236. package/claude-assets/skills/cfn-agent-selection-with-fallback/tsconfig.json +18 -0
  237. package/claude-assets/skills/cfn-agent-spawning/SKILL.md +48 -1
  238. package/claude-assets/skills/cfn-agent-spawning/SKILL.md.backup +135 -0
  239. package/claude-assets/skills/cfn-agent-spawning/TYPESCRIPT_MIGRATION.md +567 -0
  240. package/claude-assets/skills/cfn-agent-spawning/check-dependencies.sh +22 -0
  241. package/claude-assets/skills/cfn-agent-spawning/check-dependencies.sh.backup +30 -0
  242. package/claude-assets/skills/cfn-agent-spawning/get-agent-provider-env.sh +22 -0
  243. package/claude-assets/skills/cfn-agent-spawning/get-agent-provider-env.sh.backup +127 -0
  244. package/claude-assets/skills/cfn-agent-spawning/parse-agent-provider.sh +22 -0
  245. package/claude-assets/skills/cfn-agent-spawning/parse-agent-provider.sh.backup +59 -0
  246. package/claude-assets/skills/cfn-agent-spawning/spawn-agent-wrapper.sh +63 -0
  247. package/claude-assets/skills/cfn-agent-spawning/spawn-agent-wrapper.sh.backup +41 -0
  248. package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh +26 -1
  249. package/claude-assets/skills/cfn-agent-spawning/spawn-templates.sh +22 -0
  250. package/claude-assets/skills/cfn-agent-spawning/spawn-templates.sh.backup +613 -0
  251. package/claude-assets/skills/cfn-agent-spawning/spawn-worker.sh +22 -0
  252. package/claude-assets/skills/cfn-agent-spawning/spawn-worker.sh.backup +176 -0
  253. package/claude-assets/skills/cfn-coordination/agent-completion.sh.backup +36 -0
  254. package/claude-assets/skills/cfn-coordination/coordination-signal.sh.backup +36 -0
  255. package/claude-assets/skills/cfn-coordination/coordination-wait.sh.backup +36 -0
  256. package/claude-assets/skills/cfn-dependency-ingestion/README.md +101 -0
  257. package/claude-assets/skills/cfn-dependency-ingestion/SKILL.md +369 -0
  258. package/claude-assets/skills/cfn-dependency-ingestion/build.sh +23 -0
  259. package/claude-assets/skills/cfn-dependency-ingestion/dist/ingest-dependencies.js +478 -0
  260. package/claude-assets/skills/cfn-dependency-ingestion/ingest-dependencies.sh +295 -0
  261. package/claude-assets/skills/cfn-dependency-ingestion/src/ingest-dependencies.ts +563 -0
  262. package/claude-assets/skills/cfn-loop-orchestration/.backups/unknown/1763619700_33aff4a69b99159e4e849107ebc4d09f/metadata.json +8 -0
  263. package/claude-assets/skills/cfn-loop-orchestration/.backups/unknown/1763619700_33aff4a69b99159e4e849107ebc4d09f/original +271 -0
  264. package/claude-assets/skills/cfn-loop-orchestration/.backups/unknown/1763619700_33aff4a69b99159e4e849107ebc4d09f/revert.sh +7 -0
  265. package/claude-assets/skills/cfn-loop-orchestration/.backups/unknown/1763671642_06496e8c399a79db08167cc00ed4b31e/metadata.json +8 -0
  266. package/claude-assets/skills/cfn-loop-orchestration/.backups/unknown/1763671642_06496e8c399a79db08167cc00ed4b31e/original +325 -0
  267. package/claude-assets/skills/cfn-loop-orchestration/.backups/unknown/1763671642_06496e8c399a79db08167cc00ed4b31e/revert.sh +7 -0
  268. package/claude-assets/skills/cfn-loop-orchestration/CLI_IMPLEMENTATION_SUMMARY.md +330 -0
  269. package/claude-assets/skills/cfn-loop-orchestration/CONFIGURATION_IMPROVEMENTS.md +318 -0
  270. package/claude-assets/skills/cfn-loop-orchestration/CONTEXT_LOOKUP_MIGRATION.md +308 -0
  271. package/claude-assets/skills/cfn-loop-orchestration/CONTEXT_LOOKUP_QUICK_START.md +378 -0
  272. package/claude-assets/skills/cfn-loop-orchestration/E2E_VALIDATION_REPORT.md +262 -0
  273. package/claude-assets/skills/cfn-loop-orchestration/IMPLEMENTATION_SUMMARY.md +319 -519
  274. package/claude-assets/skills/cfn-loop-orchestration/NORTH_STAR_E2E_REPORT.md +299 -0
  275. package/claude-assets/skills/cfn-loop-orchestration/NORTH_STAR_EXECUTION_SUMMARY.md +403 -0
  276. package/claude-assets/skills/cfn-loop-orchestration/NORTH_STAR_INDEX.md +323 -0
  277. package/claude-assets/skills/cfn-loop-orchestration/SKILL.md +159 -48
  278. package/claude-assets/skills/cfn-loop-orchestration/SPAWN_AGENTS_IMPLEMENTATION.md +188 -0
  279. package/claude-assets/skills/cfn-loop-orchestration/TEST_COVERAGE_REPORT.md +335 -0
  280. package/claude-assets/skills/cfn-loop-orchestration/TEST_COVERAGE_SUMMARY.md +456 -0
  281. package/claude-assets/skills/cfn-loop-orchestration/TYPESCRIPT_INTEGRATION_REPORT.md +709 -0
  282. package/claude-assets/skills/cfn-loop-orchestration/TYPESCRIPT_INTEGRATION_SUMMARY.md +257 -0
  283. package/claude-assets/skills/cfn-loop-orchestration/VALIDATION_REPORT.md +572 -0
  284. package/claude-assets/skills/cfn-loop-orchestration/VALIDATION_SUMMARY.txt +196 -0
  285. package/claude-assets/skills/cfn-loop-orchestration/VALIDATOR_MODULE_GUIDE.md +526 -0
  286. package/claude-assets/skills/cfn-loop-orchestration/archive/legacy-bash/README.md +167 -0
  287. package/claude-assets/skills/cfn-loop-orchestration/archive/legacy-bash/orchestrate-enhanced.sh +548 -0
  288. package/{.claude/skills/cfn-loop-orchestration → claude-assets/skills/cfn-loop-orchestration/archive/legacy-bash}/orchestrate-wrapper.sh +11 -1
  289. package/claude-assets/skills/cfn-loop-orchestration/archive/legacy-bash/orchestrate.sh +182 -0
  290. package/claude-assets/skills/cfn-loop-orchestration/e2e-validation-fixed.js +240 -0
  291. package/claude-assets/skills/cfn-loop-orchestration/e2e-validation.js +213 -0
  292. package/claude-assets/skills/cfn-loop-orchestration/package-lock.json +3 -0
  293. package/claude-assets/skills/cfn-loop-orchestration/package.json +4 -0
  294. package/claude-assets/skills/cfn-loop-orchestration/run-north-star-e2e.ts +210 -0
  295. package/claude-assets/skills/cfn-loop-orchestration/src/cli/orchestrator-cli.ts +396 -0
  296. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/CONFIDENCE_AGGREGATOR.md +564 -0
  297. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/CONFIDENCE_AGGREGATOR_QUICK_REF.md +241 -0
  298. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/CONTEXT_INJECTOR_IMPLEMENTATION.md +375 -0
  299. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/CONTEXT_INJECTOR_QUICK_REFERENCE.md +362 -0
  300. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/CONTEXT_INJECTOR_README.md +307 -0
  301. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/CONTEXT_INJECTOR_USAGE_GUIDE.md +508 -0
  302. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/confidence-aggregator.ts +473 -0
  303. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/consensus.ts +1 -1
  304. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/context-injector.ts +349 -0
  305. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/context-lookup.ts +486 -0
  306. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/deliverable-verifier.ts +6 -2
  307. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/gate-check.ts +1 -1
  308. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/product-owner-decision.ts +316 -0
  309. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/spawn-agents.ts +357 -0
  310. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/validator.ts +276 -0
  311. package/claude-assets/skills/cfn-loop-orchestration/src/index.ts +2 -0
  312. package/claude-assets/skills/cfn-loop-orchestration/src/orchestrate.ts +743 -2
  313. package/claude-assets/skills/cfn-loop-orchestration/src/types.ts +56 -0
  314. package/claude-assets/skills/cfn-loop-orchestration/test-cli.sh +92 -0
  315. package/claude-assets/skills/cfn-loop-orchestration/test-typescript-integration.sh +442 -0
  316. package/claude-assets/skills/cfn-loop-orchestration/tests/agent-spawner.test.ts +124 -0
  317. package/claude-assets/skills/cfn-loop-orchestration/tests/confidence-aggregator.test.ts +604 -0
  318. package/claude-assets/skills/cfn-loop-orchestration/tests/context-injector.test.ts +561 -0
  319. package/claude-assets/skills/cfn-loop-orchestration/tests/context-lookup.test.ts +661 -0
  320. package/claude-assets/skills/cfn-loop-orchestration/tests/deliverable-verifier.test.ts +2 -2
  321. package/claude-assets/skills/cfn-loop-orchestration/tests/gate-check-edge-cases.test.ts +422 -0
  322. package/claude-assets/skills/cfn-loop-orchestration/tests/gate-checker.test.ts +276 -0
  323. package/claude-assets/skills/cfn-loop-orchestration/tests/logger.test.ts +291 -0
  324. package/claude-assets/skills/cfn-loop-orchestration/tests/north-star-e2e.test.ts +334 -0
  325. package/claude-assets/skills/cfn-loop-orchestration/tests/redis-coordinator.test.ts +321 -0
  326. package/claude-assets/skills/cfn-loop-orchestration/tests/spawn-agents.test.ts +284 -0
  327. package/claude-assets/skills/cfn-loop-orchestration/tests/validator.test.ts +643 -0
  328. package/claude-assets/skills/cfn-loop-output-processing/.eslintrc.json +33 -0
  329. package/claude-assets/skills/cfn-loop-output-processing/DELIVERY_SUMMARY.txt +462 -0
  330. package/claude-assets/skills/cfn-loop-output-processing/DEPRECATION_NOTICE.md +183 -0
  331. package/claude-assets/skills/cfn-loop-output-processing/EXAMPLES.md +609 -0
  332. package/claude-assets/skills/cfn-loop-output-processing/IMPLEMENTATION_SUMMARY.md +418 -0
  333. package/claude-assets/skills/cfn-loop-output-processing/INDEX.md +531 -0
  334. package/claude-assets/skills/cfn-loop-output-processing/MIGRATION.md +362 -0
  335. package/claude-assets/skills/cfn-loop-output-processing/README.md +114 -0
  336. package/claude-assets/skills/cfn-loop-output-processing/SKILL.md +633 -0
  337. package/{.claude/skills/cfn-docker-redis-coordination → claude-assets/skills/cfn-loop-output-processing}/jest.config.js +7 -15
  338. package/claude-assets/skills/cfn-loop-output-processing/package.json +50 -0
  339. package/claude-assets/skills/cfn-loop-output-processing/src/cli/process-loop2.ts +195 -0
  340. package/claude-assets/skills/cfn-loop-output-processing/src/cli/process-loop3.ts +157 -0
  341. package/claude-assets/skills/cfn-loop-output-processing/src/output-processor.ts +632 -0
  342. package/claude-assets/skills/cfn-loop-output-processing/tests/output-processor.test.ts +617 -0
  343. package/claude-assets/skills/{cfn-docker-redis-coordination → cfn-loop-output-processing}/tsconfig.json +16 -7
  344. package/claude-assets/skills/cfn-loop-validation/IMPLEMENTATION_SUMMARY.md +672 -0
  345. package/claude-assets/skills/cfn-loop-validation/INDEX.md +531 -0
  346. package/claude-assets/skills/cfn-loop-validation/README_TYPESCRIPT.md +454 -0
  347. package/claude-assets/skills/cfn-loop-validation/SKILL.md +48 -1
  348. package/claude-assets/skills/cfn-loop-validation/SKILL.md.backup +353 -0
  349. package/claude-assets/skills/cfn-loop-validation/SKILL_TYPESCRIPT.md +782 -0
  350. package/claude-assets/skills/cfn-loop-validation/VAPOR_DETECTION_EXAMPLES.md +598 -0
  351. package/claude-assets/skills/cfn-loop-validation/check-dependencies.sh +22 -0
  352. package/claude-assets/skills/cfn-loop-validation/check-dependencies.sh.backup +31 -0
  353. package/claude-assets/skills/cfn-loop-validation/detect-vapor.sh +59 -0
  354. package/claude-assets/skills/cfn-loop-validation/detect-vapor.sh.backup +37 -0
  355. package/claude-assets/skills/cfn-loop-validation/dist/.tsbuildinfo +1 -0
  356. package/claude-assets/skills/cfn-loop-validation/dist/cli/detect-vapor.d.ts +14 -0
  357. package/claude-assets/skills/cfn-loop-validation/dist/cli/detect-vapor.d.ts.map +1 -0
  358. package/claude-assets/skills/cfn-loop-validation/dist/cli/detect-vapor.js +185 -0
  359. package/claude-assets/skills/cfn-loop-validation/dist/cli/detect-vapor.js.map +1 -0
  360. package/claude-assets/skills/cfn-loop-validation/dist/cli/validate-deliverables.d.ts +14 -0
  361. package/claude-assets/skills/cfn-loop-validation/dist/cli/validate-deliverables.d.ts.map +1 -0
  362. package/claude-assets/skills/cfn-loop-validation/dist/cli/validate-deliverables.js +176 -0
  363. package/claude-assets/skills/cfn-loop-validation/dist/cli/validate-deliverables.js.map +1 -0
  364. package/claude-assets/skills/cfn-loop-validation/dist/cli/validate-gate.d.ts +19 -0
  365. package/claude-assets/skills/cfn-loop-validation/dist/cli/validate-gate.d.ts.map +1 -0
  366. package/claude-assets/skills/cfn-loop-validation/dist/cli/validate-gate.js +123 -0
  367. package/claude-assets/skills/cfn-loop-validation/dist/cli/validate-gate.js.map +1 -0
  368. package/claude-assets/skills/cfn-loop-validation/dist/types.d.ts +156 -0
  369. package/claude-assets/skills/cfn-loop-validation/dist/types.d.ts.map +1 -0
  370. package/claude-assets/skills/cfn-loop-validation/dist/types.js +66 -0
  371. package/claude-assets/skills/cfn-loop-validation/dist/types.js.map +1 -0
  372. package/claude-assets/skills/cfn-loop-validation/dist/validator.d.ts +85 -0
  373. package/claude-assets/skills/cfn-loop-validation/dist/validator.d.ts.map +1 -0
  374. package/claude-assets/skills/cfn-loop-validation/dist/validator.js +411 -0
  375. package/claude-assets/skills/cfn-loop-validation/dist/validator.js.map +1 -0
  376. package/claude-assets/skills/cfn-loop-validation/orchestrate-cfn-loop.sh +22 -0
  377. package/claude-assets/skills/cfn-loop-validation/orchestrate-cfn-loop.sh.backup +252 -0
  378. package/claude-assets/skills/cfn-loop-validation/package.json +93 -0
  379. package/claude-assets/skills/cfn-loop-validation/src/cli/detect-vapor.ts +177 -0
  380. package/claude-assets/skills/cfn-loop-validation/src/cli/validate-deliverables.ts +161 -0
  381. package/claude-assets/skills/cfn-loop-validation/src/cli/validate-gate.ts +139 -0
  382. package/claude-assets/skills/cfn-loop-validation/src/types.ts +215 -0
  383. package/claude-assets/skills/cfn-loop-validation/src/validator.ts +503 -0
  384. package/claude-assets/skills/cfn-loop-validation/tests/validator.test.ts +537 -0
  385. package/claude-assets/skills/{cfn-redis-coordination → cfn-loop-validation}/tsconfig.json +34 -31
  386. package/claude-assets/skills/cfn-loop-validation/validate-deliverables.sh +59 -0
  387. package/claude-assets/skills/cfn-loop-validation/validate-deliverables.sh.backup +37 -0
  388. package/claude-assets/skills/cfn-loop-validation/validate-gate.sh +63 -0
  389. package/claude-assets/skills/cfn-loop-validation/validate-gate.sh.backup +41 -0
  390. package/claude-assets/skills/cfn-loop-validation/validate-iteration.sh +22 -0
  391. package/claude-assets/skills/cfn-loop-validation/validate-iteration.sh.backup +134 -0
  392. package/claude-assets/skills/cfn-product-owner-decision/SKILL.md +479 -147
  393. package/claude-assets/skills/cfn-product-owner-decision/TYPESCRIPT_IMPLEMENTATION.md +653 -0
  394. package/{.claude/skills/cfn-product-owner-decision → claude-assets/skills/cfn-product-owner-decision/archive/legacy-bash}/execute-decision.sh +24 -2
  395. package/claude-assets/skills/cfn-provider-routing/README.md +129 -0
  396. package/claude-assets/skills/cfn-provider-routing/SKILL.md +192 -0
  397. package/claude-assets/skills/cfn-provider-routing/resolve-provider-model.ts +223 -0
  398. package/claude-assets/skills/pre-edit-backup/SKILL.md +324 -0
  399. package/claude-assets/skills/pre-edit-backup/SKILL.md.backup +277 -0
  400. package/claude-assets/skills/pre-edit-backup/backup.sh +22 -0
  401. package/claude-assets/skills/pre-edit-backup/backup.sh.backup +107 -0
  402. package/dist/agents/agent-loader.js +146 -165
  403. package/dist/agents/agent-loader.js.map +1 -1
  404. package/dist/api/auth-endpoints.js +415 -0
  405. package/dist/api/auth-endpoints.js.map +1 -0
  406. package/dist/api/task-endpoints.js +562 -0
  407. package/dist/api/task-endpoints.js.map +1 -0
  408. package/dist/backend/server.js +418 -0
  409. package/dist/backend/server.js.map +1 -0
  410. package/dist/cfn-loop/product-owner/decision-parser.js +356 -0
  411. package/dist/cfn-loop/product-owner/decision-parser.js.map +1 -0
  412. package/dist/cfn-loop/product-owner/index.js +1 -0
  413. package/dist/cfn-loop/product-owner/index.js.map +1 -1
  414. package/dist/cli/agent-command.js +1 -1
  415. package/dist/cli/agent-command.js.map +1 -1
  416. package/dist/cli/agent-completion.js +273 -0
  417. package/dist/cli/agent-completion.js.map +1 -0
  418. package/dist/cli/agent-definition-parser.js +37 -4
  419. package/dist/cli/agent-definition-parser.js.map +1 -1
  420. package/dist/cli/agent-executor.js +32 -2
  421. package/dist/cli/agent-executor.js.map +1 -1
  422. package/dist/cli/agent-prompt-builder.js +83 -48
  423. package/dist/cli/agent-prompt-builder.js.map +1 -1
  424. package/dist/cli/agent-spawner.js +499 -0
  425. package/dist/cli/agent-spawner.js.map +1 -0
  426. package/dist/cli/anthropic-client.js +10 -3
  427. package/dist/cli/anthropic-client.js.map +1 -1
  428. package/dist/cli/config-manager.js.map +1 -1
  429. package/dist/cli/index.js +11 -0
  430. package/dist/cli/index.js.map +1 -1
  431. package/dist/cli/parse-decision-cli.js +268 -0
  432. package/dist/cli/parse-decision-cli.js.map +1 -0
  433. package/dist/cli/post-edit-hook.js +83 -0
  434. package/dist/cli/post-edit-hook.js.map +1 -0
  435. package/dist/cli/pre-edit-hook.js +77 -0
  436. package/dist/cli/pre-edit-hook.js.map +1 -0
  437. package/dist/cli/spawn-agent-cli.js +209 -0
  438. package/dist/cli/spawn-agent-cli.js.map +1 -0
  439. package/dist/coordination/coordination-wrapper.js +383 -0
  440. package/dist/coordination/coordination-wrapper.js.map +1 -0
  441. package/dist/coordination/store-success-criteria.js +68 -0
  442. package/dist/coordination/store-success-criteria.js.map +1 -0
  443. package/dist/coordination/store-task-context.js +65 -0
  444. package/dist/coordination/store-task-context.js.map +1 -0
  445. package/dist/hooks/backup-manager.js +273 -0
  446. package/dist/hooks/backup-manager.js.map +1 -0
  447. package/dist/hooks/post-edit-validator.js +388 -0
  448. package/dist/hooks/post-edit-validator.js.map +1 -0
  449. package/dist/integration/index.js +19 -0
  450. package/dist/integration/index.js.map +1 -0
  451. package/dist/integration/task-mode-adapter.js +297 -0
  452. package/dist/integration/task-mode-adapter.js.map +1 -0
  453. package/dist/integration/trigger-dev-client.js +253 -0
  454. package/dist/integration/trigger-dev-client.js.map +1 -0
  455. package/dist/integration/trigger-dev-webhooks.js +362 -0
  456. package/dist/integration/trigger-dev-webhooks.js.map +1 -0
  457. package/dist/lib/path-validator.js +14 -5
  458. package/dist/lib/path-validator.js.map +1 -1
  459. package/dist/lib/redis-queue-manager.js +5 -1
  460. package/dist/lib/redis-queue-manager.js.map +1 -1
  461. package/dist/middleware/authentication.js +317 -0
  462. package/dist/middleware/authentication.js.map +1 -0
  463. package/dist/services/authentication.js +669 -0
  464. package/dist/services/authentication.js.map +1 -0
  465. package/dist/services/session-management.js +436 -0
  466. package/dist/services/session-management.js.map +1 -0
  467. package/dist/services/skill-deployment.js +8 -6
  468. package/dist/services/skill-deployment.js.map +1 -1
  469. package/dist/services/user-service.js +710 -0
  470. package/dist/services/user-service.js.map +1 -0
  471. package/dist/types/trigger-dev-events.d.js +10 -0
  472. package/dist/types/trigger-dev-events.d.js.map +1 -0
  473. package/docs/README.md +240 -0
  474. package/package.json +13 -4
  475. package/scripts/compare-workflow-performance.sh +556 -0
  476. package/scripts/migrate-to-optimized-workflows.sh +438 -0
  477. package/scripts/organize-docs.sh +338 -0
  478. package/scripts/trigger-dev-setup.sh +267 -0
  479. package/.claude/skills/cfn-docker-redis-coordination/MIGRATION_SUMMARY.md +0 -348
  480. package/.claude/skills/cfn-docker-redis-coordination/README.md +0 -294
  481. package/.claude/skills/cfn-docker-redis-coordination/SKILL.md +0 -435
  482. package/.claude/skills/cfn-docker-redis-coordination/coordinate.sh +0 -650
  483. package/.claude/skills/cfn-docker-redis-coordination/coordinate.sh.backup-1763145142 +0 -641
  484. package/.claude/skills/cfn-docker-redis-coordination/package-lock.json +0 -5259
  485. package/.claude/skills/cfn-docker-redis-coordination/package.json +0 -40
  486. package/.claude/skills/cfn-docker-redis-coordination/src/coordinator.ts +0 -801
  487. package/.claude/skills/cfn-docker-redis-coordination/src/index.ts +0 -42
  488. package/.claude/skills/cfn-docker-redis-coordination/src/types.ts +0 -351
  489. package/.claude/skills/cfn-docker-redis-coordination/tests/coordinator.test.ts +0 -1464
  490. package/.claude/skills/cfn-docker-redis-coordination/tsconfig.json +0 -30
  491. package/.claude/skills/cfn-loop-orchestration/helpers/auto-tune-timeouts.sh +0 -228
  492. package/.claude/skills/cfn-loop-orchestration/helpers/consensus-ts.sh +0 -104
  493. package/.claude/skills/cfn-loop-orchestration/helpers/consensus.sh +0 -94
  494. package/.claude/skills/cfn-loop-orchestration/helpers/context-injection.sh +0 -142
  495. package/.claude/skills/cfn-loop-orchestration/helpers/context-lookup.sh +0 -359
  496. package/.claude/skills/cfn-loop-orchestration/helpers/deliverable-verifier-ts.sh +0 -123
  497. package/.claude/skills/cfn-loop-orchestration/helpers/deliverable-verifier.sh +0 -71
  498. package/.claude/skills/cfn-loop-orchestration/helpers/gate-check.sh +0 -56
  499. package/.claude/skills/cfn-loop-orchestration/helpers/iteration-manager-ts.sh +0 -89
  500. package/.claude/skills/cfn-loop-orchestration/helpers/iteration-manager.sh +0 -87
  501. package/.claude/skills/cfn-loop-orchestration/helpers/orchestrate-ts.sh +0 -104
  502. package/.claude/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +0 -56
  503. package/.claude/skills/cfn-loop-orchestration/helpers/spawn-agents.sh +0 -290
  504. package/.claude/skills/cfn-loop-orchestration/helpers/timeout-calculator-ts.sh +0 -47
  505. package/.claude/skills/cfn-loop-orchestration/helpers/timeout-calculator.sh +0 -51
  506. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +0 -1345
  507. package/.claude/skills/cfn-redis-coordination/AGENT_LOGGING.md +0 -280
  508. package/.claude/skills/cfn-redis-coordination/BZPOPMIN_FIX_SUMMARY.md +0 -209
  509. package/.claude/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +0 -319
  510. package/.claude/skills/cfn-redis-coordination/agent-log.sh.bak +0 -124
  511. package/.claude/skills/cfn-redis-coordination/config.json +0 -61
  512. package/.claude/skills/cfn-redis-coordination/demos/phase4-wake-queue-test-report.md +0 -82
  513. package/.claude/skills/cfn-redis-coordination/demos/test-bzpopmin-fix.sh +0 -274
  514. package/.claude/skills/cfn-redis-coordination/demos/test-cancel-swarm.sh +0 -0
  515. package/.claude/skills/cfn-redis-coordination/docs/migration/PHASE_3_REDIS_COORDINATION_COMPLETION_REPORT.md +0 -553
  516. package/.claude/skills/cfn-redis-coordination/jest.config.js +0 -23
  517. package/.claude/skills/cfn-redis-coordination/package-lock.json +0 -5272
  518. package/.claude/skills/cfn-redis-coordination/package.json +0 -45
  519. package/.claude/skills/cfn-redis-coordination/src/agent-logger.ts +0 -446
  520. package/.claude/skills/cfn-redis-coordination/src/agent-recovery.ts +0 -454
  521. package/.claude/skills/cfn-redis-coordination/src/completion-reporter.ts +0 -396
  522. package/.claude/skills/cfn-redis-coordination/src/context-manager.ts +0 -327
  523. package/.claude/skills/cfn-redis-coordination/src/index.ts +0 -82
  524. package/.claude/skills/cfn-redis-coordination/src/mode-detector.ts +0 -155
  525. package/.claude/skills/cfn-redis-coordination/src/redis/redis-client.ts +0 -305
  526. package/.claude/skills/cfn-redis-coordination/src/redis/redis-functions.ts +0 -283
  527. package/.claude/skills/cfn-redis-coordination/src/redis-client.ts +0 -654
  528. package/.claude/skills/cfn-redis-coordination/src/result-collector.ts +0 -437
  529. package/.claude/skills/cfn-redis-coordination/src/swarm-manager.ts +0 -494
  530. package/.claude/skills/cfn-redis-coordination/src/task-analyzer.ts +0 -404
  531. package/.claude/skills/cfn-redis-coordination/src/task-executor.ts +0 -423
  532. package/.claude/skills/cfn-redis-coordination/src/types.ts +0 -235
  533. package/.claude/skills/cfn-redis-coordination/src/waiting-coordinator.ts +0 -587
  534. package/.claude/skills/cfn-redis-coordination/store-success-criteria.sh +0 -85
  535. package/.claude/skills/cfn-redis-coordination/test-connection-attempts.js +0 -70
  536. package/.claude/skills/cfn-redis-coordination/test-mode-simple.js +0 -121
  537. package/.claude/skills/cfn-redis-coordination/test-redis-check.js +0 -84
  538. package/.claude/skills/cfn-redis-coordination/test-task-mode-redis.cjs +0 -391
  539. package/.claude/skills/cfn-redis-coordination/tests/coordination.test.ts +0 -788
  540. package/.claude/skills/cfn-redis-coordination/update-all-scripts.sh +0 -67
  541. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +0 -976
  542. package/claude-assets/agents/typescript-specialist.md +0 -280
  543. package/claude-assets/skills/cfn-docker-redis-coordination/MIGRATION_SUMMARY.md +0 -348
  544. package/claude-assets/skills/cfn-docker-redis-coordination/README.md +0 -294
  545. package/claude-assets/skills/cfn-docker-redis-coordination/SKILL.md +0 -435
  546. package/claude-assets/skills/cfn-docker-redis-coordination/coordinate.sh +0 -650
  547. package/claude-assets/skills/cfn-docker-redis-coordination/coordinate.sh.backup-1763145142 +0 -641
  548. package/claude-assets/skills/cfn-docker-redis-coordination/jest.config.js +0 -37
  549. package/claude-assets/skills/cfn-docker-redis-coordination/package-lock.json +0 -5259
  550. package/claude-assets/skills/cfn-docker-redis-coordination/package.json +0 -40
  551. package/claude-assets/skills/cfn-docker-redis-coordination/src/coordinator.ts +0 -801
  552. package/claude-assets/skills/cfn-docker-redis-coordination/src/index.ts +0 -42
  553. package/claude-assets/skills/cfn-docker-redis-coordination/src/types.ts +0 -351
  554. package/claude-assets/skills/cfn-docker-redis-coordination/tests/coordinator.test.ts +0 -1464
  555. package/claude-assets/skills/cfn-loop-orchestration/helpers/auto-tune-timeouts.sh +0 -228
  556. package/claude-assets/skills/cfn-loop-orchestration/helpers/consensus-ts.sh +0 -104
  557. package/claude-assets/skills/cfn-loop-orchestration/helpers/consensus.sh +0 -94
  558. package/claude-assets/skills/cfn-loop-orchestration/helpers/context-injection.sh +0 -142
  559. package/claude-assets/skills/cfn-loop-orchestration/helpers/context-lookup.sh +0 -359
  560. package/claude-assets/skills/cfn-loop-orchestration/helpers/deliverable-verifier-ts.sh +0 -123
  561. package/claude-assets/skills/cfn-loop-orchestration/helpers/deliverable-verifier.sh +0 -71
  562. package/claude-assets/skills/cfn-loop-orchestration/helpers/gate-check.sh +0 -56
  563. package/claude-assets/skills/cfn-loop-orchestration/helpers/iteration-manager-ts.sh +0 -89
  564. package/claude-assets/skills/cfn-loop-orchestration/helpers/iteration-manager.sh +0 -87
  565. package/claude-assets/skills/cfn-loop-orchestration/helpers/orchestrate-ts.sh +0 -104
  566. package/claude-assets/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +0 -56
  567. package/claude-assets/skills/cfn-loop-orchestration/helpers/spawn-agents.sh +0 -290
  568. package/claude-assets/skills/cfn-loop-orchestration/helpers/timeout-calculator-ts.sh +0 -47
  569. package/claude-assets/skills/cfn-loop-orchestration/helpers/timeout-calculator.sh +0 -51
  570. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +0 -1345
  571. package/claude-assets/skills/cfn-redis-cleanup/cleanup-redis.sh +0 -130
  572. package/claude-assets/skills/cfn-redis-coordination/AGENT_LOGGING.md +0 -280
  573. package/claude-assets/skills/cfn-redis-coordination/BZPOPMIN_FIX_SUMMARY.md +0 -209
  574. package/claude-assets/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +0 -319
  575. package/claude-assets/skills/cfn-redis-coordination/agent-log.sh.bak +0 -124
  576. package/claude-assets/skills/cfn-redis-coordination/config.json +0 -61
  577. package/claude-assets/skills/cfn-redis-coordination/demos/phase4-wake-queue-test-report.md +0 -82
  578. package/claude-assets/skills/cfn-redis-coordination/demos/test-bzpopmin-fix.sh +0 -274
  579. package/claude-assets/skills/cfn-redis-coordination/demos/test-cancel-swarm.sh +0 -0
  580. package/claude-assets/skills/cfn-redis-coordination/docs/migration/PHASE_3_REDIS_COORDINATION_COMPLETION_REPORT.md +0 -553
  581. package/claude-assets/skills/cfn-redis-coordination/jest.config.js +0 -23
  582. package/claude-assets/skills/cfn-redis-coordination/package-lock.json +0 -5272
  583. package/claude-assets/skills/cfn-redis-coordination/package.json +0 -45
  584. package/claude-assets/skills/cfn-redis-coordination/src/agent-logger.ts +0 -446
  585. package/claude-assets/skills/cfn-redis-coordination/src/agent-recovery.ts +0 -454
  586. package/claude-assets/skills/cfn-redis-coordination/src/completion-reporter.ts +0 -396
  587. package/claude-assets/skills/cfn-redis-coordination/src/context-manager.ts +0 -327
  588. package/claude-assets/skills/cfn-redis-coordination/src/index.ts +0 -82
  589. package/claude-assets/skills/cfn-redis-coordination/src/mode-detector.ts +0 -155
  590. package/claude-assets/skills/cfn-redis-coordination/src/redis/redis-client.ts +0 -305
  591. package/claude-assets/skills/cfn-redis-coordination/src/redis/redis-functions.ts +0 -283
  592. package/claude-assets/skills/cfn-redis-coordination/src/redis-client.ts +0 -654
  593. package/claude-assets/skills/cfn-redis-coordination/src/result-collector.ts +0 -437
  594. package/claude-assets/skills/cfn-redis-coordination/src/swarm-manager.ts +0 -494
  595. package/claude-assets/skills/cfn-redis-coordination/src/task-analyzer.ts +0 -404
  596. package/claude-assets/skills/cfn-redis-coordination/src/task-executor.ts +0 -423
  597. package/claude-assets/skills/cfn-redis-coordination/src/types.ts +0 -235
  598. package/claude-assets/skills/cfn-redis-coordination/src/waiting-coordinator.ts +0 -587
  599. package/claude-assets/skills/cfn-redis-coordination/store-success-criteria.sh +0 -85
  600. package/claude-assets/skills/cfn-redis-coordination/test-connection-attempts.js +0 -70
  601. package/claude-assets/skills/cfn-redis-coordination/test-mode-simple.js +0 -121
  602. package/claude-assets/skills/cfn-redis-coordination/test-redis-check.js +0 -84
  603. package/claude-assets/skills/cfn-redis-coordination/test-task-mode-redis.cjs +0 -391
  604. package/claude-assets/skills/cfn-redis-coordination/tests/coordination.test.ts +0 -788
  605. package/claude-assets/skills/cfn-redis-coordination/update-all-scripts.sh +0 -67
  606. package/claude-assets/skills/cfn-redis-data-extraction/SKILL.md +0 -442
  607. package/claude-assets/skills/cfn-redis-data-extraction/extract.sh +0 -306
  608. package/dist/coordination/index.js +0 -25
  609. package/dist/coordination/index.js.map +0 -1
  610. package/docs/BUG_19_MEMORY_LEAK_TASK_MODE.md +0 -405
  611. package/docs/MEMORY_CLEANUP_GUIDE.md +0 -358
  612. package/docs/MEMORY_LEAK_FIX_SUMMARY.md +0 -322
  613. package/docs/REDIS_CLEANUP_EXECUTIVE_SUMMARY.md +0 -319
  614. package/docs/REDIS_CLEANUP_VERIFICATION_REPORT.md +0 -574
  615. /package/.claude/skills/cfn-loop-orchestration/{inject-loop-context.sh → archive/legacy-bash/inject-loop-context.sh} +0 -0
  616. /package/.claude/skills/cfn-loop-orchestration/{monitor-execution.sh → archive/legacy-bash/monitor-execution.sh} +0 -0
  617. /package/.claude/skills/cfn-redis-coordination/{agent-log.sh → agent-log.sh.backup} +0 -0
  618. /package/.claude/skills/cfn-redis-coordination/{agent-recovery.sh → agent-recovery.sh.backup} +0 -0
  619. /package/.claude/skills/cfn-redis-coordination/{analyze-task-complexity.sh → analyze-task-complexity.sh.backup} +0 -0
  620. /package/.claude/skills/cfn-redis-coordination/bash-wrappers/{store-context.sh → store-context.sh.backup} +0 -0
  621. /package/.claude/skills/cfn-redis-coordination/{cancel-swarm.sh → cancel-swarm.sh.backup} +0 -0
  622. /package/.claude/skills/cfn-redis-coordination/{cfn-loop-exec.sh → cfn-loop-exec.sh.backup} +0 -0
  623. /package/.claude/skills/cfn-redis-coordination/{cfn-loop-relaunch.sh → cfn-loop-relaunch.sh.backup} +0 -0
  624. /package/.claude/skills/cfn-redis-coordination/{collect-confidence-scores.sh → collect-confidence-scores.sh.backup} +0 -0
  625. /package/.claude/skills/cfn-redis-coordination/{collect-results.sh → collect-results.sh.backup} +0 -0
  626. /package/.claude/skills/cfn-redis-coordination/{complete-swarm.sh → complete-swarm.sh.backup} +0 -0
  627. /package/.claude/skills/cfn-redis-coordination/{get-context.sh → get-context.sh.backup} +0 -0
  628. /package/.claude/skills/cfn-redis-coordination/{get-success-criteria.sh → get-success-criteria.sh.backup} +0 -0
  629. /package/.claude/skills/cfn-redis-coordination/{invoke-waiting-mode.sh → invoke-waiting-mode.sh.backup} +0 -0
  630. /package/.claude/skills/cfn-redis-coordination/{redis-cli-wrapper.sh → redis-cli-wrapper.sh.backup} +0 -0
  631. /package/.claude/skills/cfn-redis-coordination/{redis-functions.sh → redis-functions.sh.backup} +0 -0
  632. /package/.claude/skills/cfn-redis-coordination/{report-completion.sh → report-completion.sh.backup} +0 -0
  633. /package/.claude/skills/cfn-redis-coordination/{store-context.sh → store-context.sh.backup} +0 -0
  634. /package/claude-assets/skills/cfn-loop-orchestration/{inject-loop-context.sh → archive/legacy-bash/inject-loop-context.sh} +0 -0
  635. /package/claude-assets/skills/cfn-loop-orchestration/{monitor-execution.sh → archive/legacy-bash/monitor-execution.sh} +0 -0
  636. /package/claude-assets/skills/cfn-redis-coordination/{agent-log.sh → agent-log.sh.backup} +0 -0
  637. /package/claude-assets/skills/cfn-redis-coordination/{agent-recovery.sh → agent-recovery.sh.backup} +0 -0
  638. /package/claude-assets/skills/cfn-redis-coordination/{analyze-task-complexity.sh → analyze-task-complexity.sh.backup} +0 -0
  639. /package/claude-assets/skills/cfn-redis-coordination/bash-wrappers/{store-context.sh → store-context.sh.backup} +0 -0
  640. /package/claude-assets/skills/cfn-redis-coordination/{cancel-swarm.sh → cancel-swarm.sh.backup} +0 -0
  641. /package/claude-assets/skills/cfn-redis-coordination/{cfn-loop-exec.sh → cfn-loop-exec.sh.backup} +0 -0
  642. /package/claude-assets/skills/cfn-redis-coordination/{cfn-loop-relaunch.sh → cfn-loop-relaunch.sh.backup} +0 -0
  643. /package/claude-assets/skills/cfn-redis-coordination/{collect-confidence-scores.sh → collect-confidence-scores.sh.backup} +0 -0
  644. /package/claude-assets/skills/cfn-redis-coordination/{collect-results.sh → collect-results.sh.backup} +0 -0
  645. /package/claude-assets/skills/cfn-redis-coordination/{complete-swarm.sh → complete-swarm.sh.backup} +0 -0
  646. /package/claude-assets/skills/cfn-redis-coordination/{get-context.sh → get-context.sh.backup} +0 -0
  647. /package/claude-assets/skills/cfn-redis-coordination/{get-success-criteria.sh → get-success-criteria.sh.backup} +0 -0
  648. /package/claude-assets/skills/cfn-redis-coordination/{invoke-waiting-mode.sh → invoke-waiting-mode.sh.backup} +0 -0
  649. /package/claude-assets/skills/cfn-redis-coordination/{redis-cli-wrapper.sh → redis-cli-wrapper.sh.backup} +0 -0
  650. /package/claude-assets/skills/cfn-redis-coordination/{redis-functions.sh → redis-functions.sh.backup} +0 -0
  651. /package/claude-assets/skills/cfn-redis-coordination/{report-completion.sh → report-completion.sh.backup} +0 -0
  652. /package/claude-assets/skills/cfn-redis-coordination/{store-context.sh → store-context.sh.backup} +0 -0
@@ -8,7 +8,11 @@
8
8
 
9
9
  import { gateCheck, GateCheckParams } from './helpers/gate-check';
10
10
  import { collectConsensus, validateConsensus } from './helpers/consensus';
11
+ import { spawnLoop3Agents, spawnLoop2Agents, SpawnResult } from './helpers/spawn-agents';
11
12
  import { TestResult, ExecutionMode } from './types';
13
+ import { execSync } from 'child_process';
14
+ import * as path from 'path';
15
+ import * as fs from 'fs/promises';
12
16
 
13
17
  /**
14
18
  * Execution phases in the CFN Loop
@@ -20,6 +24,15 @@ export type LoopPhase = 'loop3' | 'loop2' | 'product-owner' | 'complete';
20
24
  */
21
25
  export type ProductOwnerDecision = 'PROCEED' | 'ITERATE' | 'ABORT' | null;
22
26
 
27
+ /**
28
+ * Timeout configuration for agent execution
29
+ */
30
+ export interface TimeoutConfig {
31
+ loop3Agent?: number;
32
+ loop2Agent?: number;
33
+ productOwner?: number;
34
+ }
35
+
23
36
  /**
24
37
  * Orchestration configuration
25
38
  */
@@ -28,6 +41,13 @@ export interface OrchestrationConfig {
28
41
  mode: ExecutionMode;
29
42
  maxIterations: number;
30
43
  aceReflect?: boolean;
44
+ loop3Agents?: string[];
45
+ loop2Agents?: string[];
46
+ productOwner?: string;
47
+ successCriteriaEnabled?: boolean;
48
+ timeouts?: TimeoutConfig;
49
+ workspace?: string;
50
+ taskDescription?: string;
31
51
  }
32
52
 
33
53
  /**
@@ -135,6 +155,14 @@ const MODE_CONFIG: Record<ExecutionMode, ModeThresholds> = {
135
155
  },
136
156
  };
137
157
 
158
+ /**
159
+ * Shell escape utility for safe command execution
160
+ */
161
+ function escapeShellArg(arg: string): string {
162
+ // Use single quotes and escape any single quotes in the argument
163
+ return `'${arg.replace(/'/g, "'\\''")}'`;
164
+ }
165
+
138
166
  /**
139
167
  * Main orchestrator class
140
168
  */
@@ -175,6 +203,30 @@ export class Orchestrator {
175
203
  if (config.maxIterations > 100) {
176
204
  throw new Error('Max iterations cannot exceed 100');
177
205
  }
206
+
207
+ // Validate timeout configuration if provided
208
+ if (config.timeouts) {
209
+ const MIN_TIMEOUT = 10;
210
+ const MAX_TIMEOUT = 3600;
211
+
212
+ if (config.timeouts.loop3Agent !== undefined) {
213
+ if (config.timeouts.loop3Agent < MIN_TIMEOUT || config.timeouts.loop3Agent > MAX_TIMEOUT) {
214
+ throw new Error(`loop3Agent timeout must be between ${MIN_TIMEOUT}-${MAX_TIMEOUT}s, got ${config.timeouts.loop3Agent}s`);
215
+ }
216
+ }
217
+
218
+ if (config.timeouts.loop2Agent !== undefined) {
219
+ if (config.timeouts.loop2Agent < MIN_TIMEOUT || config.timeouts.loop2Agent > MAX_TIMEOUT) {
220
+ throw new Error(`loop2Agent timeout must be between ${MIN_TIMEOUT}-${MAX_TIMEOUT}s, got ${config.timeouts.loop2Agent}s`);
221
+ }
222
+ }
223
+
224
+ if (config.timeouts.productOwner !== undefined) {
225
+ if (config.timeouts.productOwner < MIN_TIMEOUT || config.timeouts.productOwner > MAX_TIMEOUT) {
226
+ throw new Error(`productOwner timeout must be between ${MIN_TIMEOUT}-${MAX_TIMEOUT}s, got ${config.timeouts.productOwner}s`);
227
+ }
228
+ }
229
+ }
178
230
  }
179
231
 
180
232
  /**
@@ -237,6 +289,18 @@ export class Orchestrator {
237
289
  return MODE_CONFIG[this.config.mode].consensusThreshold;
238
290
  }
239
291
 
292
+ /**
293
+ * Get timeout configuration with defaults
294
+ * Defaults: Loop 3 = 300s, Loop 2 = 300s, Product Owner = 60s
295
+ */
296
+ public getTimeouts(): { loop3Agent: number; loop2Agent: number; productOwner: number } {
297
+ return {
298
+ loop3Agent: this.config.timeouts?.loop3Agent ?? 300,
299
+ loop2Agent: this.config.timeouts?.loop2Agent ?? 300,
300
+ productOwner: this.config.timeouts?.productOwner ?? 60,
301
+ };
302
+ }
303
+
240
304
  /**
241
305
  * Transition to next phase
242
306
  */
@@ -340,11 +404,11 @@ export class Orchestrator {
340
404
  let totalFail = 0;
341
405
  let totalSkip = 0;
342
406
 
343
- for (const result of this.testResults.values()) {
407
+ this.testResults.forEach((result) => {
344
408
  totalPass += result.pass;
345
409
  totalFail += result.fail;
346
410
  totalSkip += result.skip ?? 0;
347
- }
411
+ });
348
412
 
349
413
  const total = totalPass + totalFail + totalSkip;
350
414
  const passRate = total === 0 ? 0 : totalPass / total;
@@ -516,6 +580,338 @@ export class Orchestrator {
516
580
  return validators;
517
581
  }
518
582
 
583
+ /**
584
+ * Build task context string for agent spawning
585
+ */
586
+ private buildTaskContext(): string {
587
+ const context = {
588
+ taskId: this.config.taskId,
589
+ mode: this.config.mode,
590
+ iteration: this.state.iteration,
591
+ phase: this.state.currentPhase,
592
+ timestamp: Date.now(),
593
+ ...(this.config.workspace && { workspace: this.config.workspace }),
594
+ ...(this.config.taskDescription && { taskDescription: this.config.taskDescription }),
595
+ };
596
+ return JSON.stringify(context);
597
+ }
598
+
599
+ /**
600
+ * Wait for agents to complete via Redis coordination
601
+ * Blocks until all agents signal completion or timeout occurs
602
+ *
603
+ * @param spawnResults - Results from agent spawning
604
+ * @param timeoutSeconds - Maximum wait time (default: 300s)
605
+ * @returns Array of completed agent IDs
606
+ */
607
+ private async waitForAgentsToComplete(
608
+ spawnResults: SpawnResult[],
609
+ timeoutSeconds: number = 300
610
+ ): Promise<string[]> {
611
+ const completedAgents: string[] = [];
612
+ const startTime = Date.now();
613
+ const projectRoot = process.env.PROJECT_ROOT || process.cwd();
614
+
615
+ console.log(`Waiting for ${spawnResults.length} agents to complete (timeout: ${timeoutSeconds}s)...`);
616
+
617
+ for (const result of spawnResults) {
618
+ if (!result.success) {
619
+ console.warn(`Skipping failed agent: ${result.agentId}`);
620
+ continue;
621
+ }
622
+
623
+ const elapsedSeconds = Math.floor((Date.now() - startTime) / 1000);
624
+ const remainingTimeout = timeoutSeconds - elapsedSeconds;
625
+
626
+ if (remainingTimeout <= 0) {
627
+ console.error(`Global timeout reached. Remaining agents will not be waited for.`);
628
+ this.recordTimeout(result.agentId, timeoutSeconds);
629
+ break;
630
+ }
631
+
632
+ try {
633
+ // Agents push completion to legacy done list: swarm:{taskId}:{agentId}:done
634
+ const redisHost = process.env.CFN_REDIS_HOST || process.env.REDIS_HOST || 'localhost';
635
+ const redisPort = process.env.CFN_REDIS_PORT || process.env.REDIS_PORT || '6379';
636
+ const doneListKey = `swarm:${this.config.taskId}:${result.agentId}:done`;
637
+
638
+ const escapedHost = escapeShellArg(redisHost);
639
+ const escapedPort = escapeShellArg(redisPort);
640
+ const escapedDoneKey = escapeShellArg(doneListKey);
641
+
642
+ // Use short blocking chunks to stay under tool time limits
643
+ const chunkTimeout = Math.min(Math.max(remainingTimeout, 5), 60); // 5-60s
644
+
645
+ console.log(
646
+ `Waiting for agent ${result.agentId} via Redis BLPOP ${doneListKey} (chunk: ${chunkTimeout}s, remaining: ${remainingTimeout}s)...`
647
+ );
648
+
649
+ // First a quick length check to avoid blocking if already complete
650
+ try {
651
+ const len = parseInt(
652
+ execSync(`redis-cli -h ${escapedHost} -p ${escapedPort} LLEN ${escapedDoneKey}`, { encoding: 'utf8' }).trim(),
653
+ 10
654
+ );
655
+ if (!Number.isNaN(len) && len > 0) {
656
+ execSync(`redis-cli -h ${escapedHost} -p ${escapedPort} LPOP ${escapedDoneKey}`, { stdio: 'ignore' });
657
+ console.log(`✓ Agent ${result.agentId} completed (pre-existing done signal)`);
658
+ completedAgents.push(result.agentId);
659
+ this.markAgentComplete(result.agentId, 'loop3');
660
+ continue;
661
+ }
662
+ } catch {
663
+ // ignore LLEN errors and continue to BLPOP
664
+ }
665
+
666
+ // Blocking wait chunk
667
+ execSync(`redis-cli -h ${escapedHost} -p ${escapedPort} BLPOP ${escapedDoneKey} ${chunkTimeout}`, {
668
+ stdio: 'ignore',
669
+ timeout: chunkTimeout * 1000,
670
+ cwd: projectRoot,
671
+ });
672
+
673
+ console.log(`✓ Agent ${result.agentId} completed`);
674
+ completedAgents.push(result.agentId);
675
+ this.markAgentComplete(result.agentId, 'loop3');
676
+ } catch (error) {
677
+ const errorMsg = error instanceof Error ? error.message : String(error);
678
+ console.error(`✗ Agent ${result.agentId} failed or timed out: ${errorMsg}`);
679
+ this.recordExecutionError(result.agentId, new Error(errorMsg));
680
+ }
681
+ }
682
+
683
+ console.log(`Completed: ${completedAgents.length}/${spawnResults.length} agents`);
684
+ return completedAgents;
685
+ }
686
+
687
+ /**
688
+ * Collect agent outputs from Redis
689
+ * Retrieves test results, confidence scores, and deliverables
690
+ *
691
+ * @param agentIds - List of agent IDs to collect from
692
+ * @returns Map of agent outputs
693
+ */
694
+ private async collectAgentOutputs(
695
+ agentIds: string[]
696
+ ): Promise<Map<string, { testResult?: TestResult; confidence?: number; deliverables?: string[] }>> {
697
+ const outputs = new Map<string, { testResult?: TestResult; confidence?: number; deliverables?: string[] }>();
698
+
699
+ console.log(`Collecting outputs from ${agentIds.length} agents...`);
700
+
701
+ for (const agentId of agentIds) {
702
+ try {
703
+ // Retrieve agent output from Redis
704
+ const testResultJson = this.getRedisValue(`swarm:${this.config.taskId}:agent:${agentId}:test-result`);
705
+ const confidenceStr = this.getRedisValue(`swarm:${this.config.taskId}:agent:${agentId}:confidence`);
706
+ const deliverablesJson = this.getRedisValue(`swarm:${this.config.taskId}:agent:${agentId}:deliverables`);
707
+
708
+ const agentOutput: { testResult?: TestResult; confidence?: number; deliverables?: string[] } = {};
709
+
710
+ // Parse test results
711
+ if (testResultJson) {
712
+ try {
713
+ const testResult = JSON.parse(testResultJson) as TestResult;
714
+ agentOutput.testResult = testResult;
715
+ this.recordTestResult(agentId, testResult);
716
+ console.log(` ${agentId}: Test results collected (${testResult.pass} pass, ${testResult.fail} fail)`);
717
+ } catch (parseError) {
718
+ console.warn(` ${agentId}: Failed to parse test results: ${parseError}`);
719
+ }
720
+ }
721
+
722
+ // Parse confidence score
723
+ if (confidenceStr) {
724
+ const confidence = parseFloat(confidenceStr);
725
+ if (!isNaN(confidence) && confidence >= 0 && confidence <= 1) {
726
+ agentOutput.confidence = confidence;
727
+ console.log(` ${agentId}: Confidence score: ${(confidence * 100).toFixed(2)}%`);
728
+ }
729
+ }
730
+
731
+ // Parse deliverables
732
+ if (deliverablesJson) {
733
+ try {
734
+ const deliverables = JSON.parse(deliverablesJson) as string[];
735
+ agentOutput.deliverables = deliverables;
736
+ console.log(` ${agentId}: Deliverables: ${deliverables.length} files`);
737
+ } catch (parseError) {
738
+ console.warn(` ${agentId}: Failed to parse deliverables: ${parseError}`);
739
+ }
740
+ }
741
+
742
+ outputs.set(agentId, agentOutput);
743
+ } catch (error) {
744
+ const errorMsg = error instanceof Error ? error.message : String(error);
745
+ console.error(` ${agentId}: Failed to collect output: ${errorMsg}`);
746
+ }
747
+ }
748
+
749
+ console.log(`Successfully collected outputs from ${outputs.size}/${agentIds.length} agents`);
750
+ return outputs;
751
+ }
752
+
753
+ /**
754
+ * Get value from Redis using redis-cli
755
+ *
756
+ * @param key - Redis key
757
+ * @returns Value or null if not found
758
+ */
759
+ private getRedisValue(key: string): string | null {
760
+ try {
761
+ const redisHost = process.env.REDIS_HOST || 'localhost';
762
+ const redisPort = process.env.REDIS_PORT || '6379';
763
+
764
+ // Properly escape all user-controlled inputs to prevent shell injection
765
+ const escapedHost = escapeShellArg(redisHost);
766
+ const escapedPort = escapeShellArg(redisPort);
767
+ const escapedKey = escapeShellArg(key);
768
+
769
+ const result = execSync(`redis-cli -h ${escapedHost} -p ${escapedPort} GET ${escapedKey}`, {
770
+ encoding: 'utf8',
771
+ stdio: ['pipe', 'pipe', 'ignore'], // Suppress stderr
772
+ }).trim();
773
+
774
+ return result === '(nil)' ? null : result;
775
+ } catch (error) {
776
+ return null;
777
+ }
778
+ }
779
+
780
+ /**
781
+ * Execute tests against agent deliverables
782
+ * Runs test suite to validate actual agent work
783
+ *
784
+ * @param agentOutputs - Map of agent outputs with deliverables
785
+ * @returns Aggregated test results
786
+ */
787
+ private async executeTestsOnDeliverables(
788
+ agentOutputs: Map<string, { testResult?: TestResult; confidence?: number; deliverables?: string[] }>
789
+ ): Promise<AggregatedTestResults> {
790
+ console.log('Executing tests on agent deliverables...');
791
+
792
+ const projectRoot = process.env.PROJECT_ROOT || process.cwd();
793
+
794
+ // Validate TEST_COMMAND against allowlist to prevent shell injection (CVSS 8.5)
795
+ const ALLOWED_TEST_COMMANDS = ['npm test', 'npm run test', 'jest', 'mocha', 'yarn test'];
796
+ const ALLOWED_TEST_PATTERNS = [
797
+ /^npm run test:[a-z0-9-]+$/, // Namespaced npm scripts: npm run test:integration, test:security, etc.
798
+ /^jest [a-z0-9/_-]+\.test\.[jt]s$/, // Jest with specific test files (no path traversal)
799
+ /^mocha [a-z0-9/_-]+\.test\.[jt]s$/ // Mocha with specific test files (no path traversal)
800
+ ];
801
+ const testCommand = process.env.TEST_COMMAND || 'npm test';
802
+
803
+ // Security: Block path traversal attempts
804
+ if (testCommand.includes('..')) {
805
+ throw new Error(
806
+ `Security: Path traversal detected in TEST_COMMAND. Got: ${testCommand}`
807
+ );
808
+ }
809
+
810
+ // Check exact match first, then regex patterns
811
+ const isAllowed = ALLOWED_TEST_COMMANDS.includes(testCommand) ||
812
+ ALLOWED_TEST_PATTERNS.some(pattern => pattern.test(testCommand));
813
+
814
+ if (!isAllowed) {
815
+ throw new Error(
816
+ `Security: Invalid TEST_COMMAND value. Allowed commands: ${ALLOWED_TEST_COMMANDS.join(', ')}, ` +
817
+ `npm run test:*, jest <file>.test.[jt]s, mocha <file>.test.[jt]s. Got: ${testCommand}`
818
+ );
819
+ }
820
+
821
+ let totalPass = 0;
822
+ let totalFail = 0;
823
+ let totalSkip = 0;
824
+ let agentCount = 0;
825
+
826
+ for (const [agentId, output] of agentOutputs) {
827
+ // Verify deliverables exist
828
+ if (!output.deliverables || output.deliverables.length === 0) {
829
+ console.warn(` ${agentId}: No deliverables to test`);
830
+ continue;
831
+ }
832
+
833
+ // Validate deliverables exist on filesystem
834
+ const missingFiles: string[] = [];
835
+ for (const deliverable of output.deliverables) {
836
+ const filePath = path.join(projectRoot, deliverable);
837
+ try {
838
+ await fs.access(filePath);
839
+ } catch {
840
+ missingFiles.push(deliverable);
841
+ }
842
+ }
843
+
844
+ if (missingFiles.length > 0) {
845
+ console.warn(` ${agentId}: Missing deliverables: ${missingFiles.join(', ')}`);
846
+ const testResult: TestResult = {
847
+ pass: 0,
848
+ fail: missingFiles.length,
849
+ skip: 0,
850
+ };
851
+ this.recordTestResult(agentId, testResult);
852
+ totalFail += missingFiles.length;
853
+ agentCount++;
854
+ continue;
855
+ }
856
+
857
+ // Execute test suite
858
+ try {
859
+ console.log(` ${agentId}: Running tests on ${output.deliverables.length} deliverables...`);
860
+
861
+ const testOutput = execSync(testCommand, {
862
+ encoding: 'utf8',
863
+ cwd: projectRoot,
864
+ stdio: 'pipe',
865
+ });
866
+
867
+ // Parse test output (example for Jest format)
868
+ const passMatch = testOutput.match(/(\d+) passing/);
869
+ const failMatch = testOutput.match(/(\d+) failing/);
870
+ const skipMatch = testOutput.match(/(\d+) pending/);
871
+
872
+ const pass = passMatch && passMatch[1] ? parseInt(passMatch[1], 10) : 0;
873
+ const fail = failMatch && failMatch[1] ? parseInt(failMatch[1], 10) : 0;
874
+ const skip = skipMatch && skipMatch[1] ? parseInt(skipMatch[1], 10) : 0;
875
+
876
+ const testResult: TestResult = { pass, fail, skip };
877
+ this.recordTestResult(agentId, testResult);
878
+
879
+ totalPass += pass;
880
+ totalFail += fail;
881
+ totalSkip += skip;
882
+ agentCount++;
883
+
884
+ console.log(` ${agentId}: Tests completed (${pass} pass, ${fail} fail, ${skip} skip)`);
885
+ } catch (error) {
886
+ // Test execution failed
887
+ const errorMsg = error instanceof Error ? error.message : String(error);
888
+ console.error(` ${agentId}: Test execution failed: ${errorMsg}`);
889
+
890
+ const testResult: TestResult = {
891
+ pass: 0,
892
+ fail: output.deliverables.length,
893
+ skip: 0,
894
+ };
895
+ this.recordTestResult(agentId, testResult);
896
+ totalFail += output.deliverables.length;
897
+ agentCount++;
898
+ }
899
+ }
900
+
901
+ const total = totalPass + totalFail + totalSkip;
902
+ const passRate = total === 0 ? 0 : totalPass / total;
903
+
904
+ console.log(`Test execution complete: ${totalPass} pass, ${totalFail} fail, ${totalSkip} skip (${(passRate * 100).toFixed(2)}% pass rate)`);
905
+
906
+ return {
907
+ totalPass,
908
+ totalFail,
909
+ totalSkip,
910
+ passRate,
911
+ agentCount,
912
+ };
913
+ }
914
+
519
915
  /**
520
916
  * Build agent context for spawning
521
917
  */
@@ -593,6 +989,307 @@ export class Orchestrator {
593
989
  duration: Date.now() - this.state.startTime,
594
990
  };
595
991
  }
992
+
993
+ /**
994
+ * Execute the complete CFN Loop orchestration workflow
995
+ * Runs iterations with Loop 3 → Loop 2 → Product Owner progression
996
+ * Returns final decision (PROCEED/ITERATE/ABORT)
997
+ */
998
+ public async execute(): Promise<ProductOwnerDecision> {
999
+ const maxIterations = this.config.maxIterations;
1000
+
1001
+ // Main iteration loop
1002
+ for (let iteration = 1; iteration <= maxIterations; iteration++) {
1003
+ this.incrementIteration();
1004
+
1005
+ console.log(`\n${'='.repeat(60)}`);
1006
+ console.log(`=== ITERATION ${iteration}/${maxIterations} ===`);
1007
+ console.log(`${'='.repeat(60)}`);
1008
+
1009
+ // ===== LOOP 3: IMPLEMENTERS =====
1010
+ console.log('\nPhase: Loop 3 (Implementers)');
1011
+ this.transitionPhase('loop3');
1012
+
1013
+ const loop3AgentTypes = this.config.loop3Agents || ['backend-dev', 'coder'];
1014
+ const taskContext = this.buildTaskContext();
1015
+
1016
+ // Spawn real CLI agents
1017
+ console.log(`Spawning ${loop3AgentTypes.length} Loop 3 agents via CLI...`);
1018
+ const loop3SpawnResult = await spawnLoop3Agents(
1019
+ this.config.taskId,
1020
+ this.state.iteration,
1021
+ loop3AgentTypes,
1022
+ taskContext
1023
+ );
1024
+
1025
+ console.log(`Loop 3 spawn summary: ${loop3SpawnResult.successCount} successful, ${loop3SpawnResult.failureCount} failed`);
1026
+
1027
+ // Wait for agents to complete via Redis coordination
1028
+ const timeouts = this.getTimeouts();
1029
+ const completedAgentIds = await this.waitForAgentsToComplete(
1030
+ loop3SpawnResult.results,
1031
+ timeouts.loop3Agent
1032
+ );
1033
+
1034
+ if (completedAgentIds.length === 0) {
1035
+ console.error('No agents completed successfully. Aborting iteration.');
1036
+ this.recordDecision('ABORT');
1037
+ break;
1038
+ }
1039
+
1040
+ // Collect agent outputs (test results, confidence scores, deliverables)
1041
+ const agentOutputs = await this.collectAgentOutputs(completedAgentIds);
1042
+
1043
+ // Execute tests against actual agent deliverables
1044
+ const aggregated = await this.executeTestsOnDeliverables(agentOutputs);
1045
+ console.log(
1046
+ `Loop 3 Results: ${aggregated.totalPass} pass, ${aggregated.totalFail} fail (${aggregated.agentCount} agents, ${(aggregated.passRate * 100).toFixed(2)}% pass rate)`
1047
+ );
1048
+
1049
+ const gateResult = this.checkGate(aggregated.passRate);
1050
+ console.log(`Gate Check: ${gateResult.passed ? 'PASSED' : 'FAILED'} (threshold: ${(gateResult.threshold * 100).toFixed(2)}%)`);
1051
+
1052
+ if (!gateResult.passed) {
1053
+ console.log(`Gate failed. Iterating...`);
1054
+
1055
+ // Prepare feedback for next iteration
1056
+ this.prepareFeedback({
1057
+ gatePassRate: aggregated.passRate,
1058
+ previousFailures: Array.from(this.state.failedAgents),
1059
+ reasons: [`Gate check failed: ${(gateResult.gap * 100).toFixed(2)}% below threshold`],
1060
+ });
1061
+
1062
+ console.log(`Feedback prepared for iteration ${iteration + 1}`);
1063
+
1064
+ // Reset state for next iteration
1065
+ this.resetForIteration();
1066
+
1067
+ if (!this.canContinueIterating()) {
1068
+ console.log(`Max iterations (${maxIterations}) reached. ABORTING.`);
1069
+ this.recordDecision('ABORT');
1070
+ break;
1071
+ }
1072
+
1073
+ continue; // Go to next iteration
1074
+ }
1075
+
1076
+ // ===== LOOP 2: VALIDATORS =====
1077
+ console.log('\nPhase: Loop 2 (Validators)');
1078
+ this.transitionPhase('loop2');
1079
+
1080
+ const loop2AgentTypes = this.config.loop2Agents || ['code-reviewer', 'tester', 'security-specialist'];
1081
+
1082
+ // Spawn real CLI validators
1083
+ console.log(`Spawning ${loop2AgentTypes.length} Loop 2 validators via CLI...`);
1084
+ const loop2SpawnResult = await spawnLoop2Agents(
1085
+ this.config.taskId,
1086
+ this.state.iteration,
1087
+ loop2AgentTypes,
1088
+ taskContext
1089
+ );
1090
+
1091
+ console.log(`Loop 2 spawn summary: ${loop2SpawnResult.successCount} successful, ${loop2SpawnResult.failureCount} failed`);
1092
+
1093
+ // Wait for validators to complete via Redis coordination
1094
+ const completedValidatorIds = await this.waitForAgentsToComplete(
1095
+ loop2SpawnResult.results,
1096
+ timeouts.loop2Agent
1097
+ );
1098
+
1099
+ if (completedValidatorIds.length === 0) {
1100
+ console.error('No validators completed successfully. Iterating...');
1101
+ this.prepareFeedback({
1102
+ reasons: ['No Loop 2 validators completed'],
1103
+ });
1104
+ this.resetForIteration();
1105
+
1106
+ if (!this.canContinueIterating()) {
1107
+ console.log(`Max iterations (${maxIterations}) reached. ABORTING.`);
1108
+ this.recordDecision('ABORT');
1109
+ break;
1110
+ }
1111
+
1112
+ continue;
1113
+ }
1114
+
1115
+ // Collect validator outputs (consensus scores)
1116
+ const validatorOutputs = await this.collectAgentOutputs(completedValidatorIds);
1117
+
1118
+ // Record consensus scores from validators
1119
+ for (const [validatorId, output] of validatorOutputs) {
1120
+ if (output.confidence !== undefined) {
1121
+ this.recordConsensusScore(validatorId, output.confidence);
1122
+ }
1123
+ }
1124
+
1125
+ console.log(`Loop 2 validators completed: ${completedValidatorIds.length}/${loop2SpawnResult.totalSpawned}`);
1126
+
1127
+ // Validate consensus
1128
+ const consensusValidation = this.validateConsensus();
1129
+ console.log(
1130
+ `Loop 2 Consensus: ${(consensusValidation.average * 100).toFixed(2)}% (threshold: ${(consensusValidation.threshold * 100).toFixed(2)}%)`
1131
+ );
1132
+
1133
+ if (!consensusValidation.passed) {
1134
+ console.log(`Consensus failed. Iterating...`);
1135
+
1136
+ // Prepare feedback for next iteration
1137
+ this.prepareFeedback({
1138
+ consensusAverage: consensusValidation.average,
1139
+ reasons: [`Consensus below threshold: ${(consensusValidation.gap * 100).toFixed(2)}%`],
1140
+ });
1141
+
1142
+ console.log(`Feedback prepared for iteration ${iteration + 1}`);
1143
+
1144
+ // Reset state for next iteration
1145
+ this.resetForIteration();
1146
+
1147
+ if (!this.canContinueIterating()) {
1148
+ console.log(`Max iterations (${maxIterations}) reached. ABORTING.`);
1149
+ this.recordDecision('ABORT');
1150
+ break;
1151
+ }
1152
+
1153
+ continue; // Go to next iteration
1154
+ }
1155
+
1156
+ // ===== PRODUCT OWNER DECISION =====
1157
+ console.log('\nPhase: Product Owner Decision');
1158
+ this.transitionPhase('product-owner');
1159
+
1160
+ const ownerAgent = this.config.productOwner || 'product-owner-agent';
1161
+ console.log(`Consulting Product Owner (${ownerAgent})`);
1162
+
1163
+ // Execute Product Owner decision via skill
1164
+ let decision: ProductOwnerDecision = 'PROCEED';
1165
+ try {
1166
+ const projectRoot = path.resolve(__dirname, '../../../..');
1167
+ const skillPath = path.join(projectRoot, '.claude/skills/cfn-product-owner-decision/execute-decision.sh');
1168
+
1169
+ const poAgentId = `product-owner-${this.config.taskId}-${iteration}`;
1170
+ const poArgs = [
1171
+ '--task-id', this.config.taskId,
1172
+ '--agent-id', poAgentId,
1173
+ '--consensus', String(consensusValidation.average),
1174
+ '--threshold', String(consensusValidation.threshold),
1175
+ '--iteration', String(iteration),
1176
+ '--max-iterations', String(maxIterations),
1177
+ '--timeout', String(timeouts.productOwner),
1178
+ ];
1179
+
1180
+ if (this.config.successCriteriaEnabled) {
1181
+ poArgs.push('--success-criteria', 'enabled');
1182
+ }
1183
+
1184
+ console.log(`Executing Product Owner decision skill (timeout: ${timeouts.productOwner}s)...`);
1185
+
1186
+ const escapedArgs = [escapeShellArg(skillPath), ...poArgs.map(arg => escapeShellArg(arg))].join(' ');
1187
+ const poOutput = execSync(
1188
+ `bash ${escapedArgs}`,
1189
+ { encoding: 'utf-8', timeout: (timeouts.productOwner + 10) * 1000 }
1190
+ );
1191
+
1192
+ // Parse decision from JSON output
1193
+ const jsonMatch = poOutput.match(/\{[\s\S]*"decision":\s*"(PROCEED|ITERATE|ABORT)"[\s\S]*\}/);
1194
+ if (jsonMatch) {
1195
+ const poResult = JSON.parse(jsonMatch[0]);
1196
+ decision = poResult.decision as ProductOwnerDecision;
1197
+ console.log(`Product Owner reasoning: ${poResult.reasoning}`);
1198
+ console.log(`Product Owner confidence: ${poResult.confidence}`);
1199
+ } else {
1200
+ // Fallback: try to extract decision from plain text
1201
+ const decisionMatch = poOutput.match(/Decision:\s*(PROCEED|ITERATE|ABORT)/i);
1202
+ if (decisionMatch && decisionMatch[1]) {
1203
+ decision = decisionMatch[1].toUpperCase() as ProductOwnerDecision;
1204
+ } else {
1205
+ console.warn('Could not parse Product Owner decision, defaulting to PROCEED');
1206
+ decision = 'PROCEED';
1207
+ }
1208
+ }
1209
+ } catch (error: unknown) {
1210
+ console.error(`Product Owner execution failed: ${error instanceof Error ? error.message : String(error)}`);
1211
+ console.warn('Defaulting to PROCEED due to execution error');
1212
+ decision = 'PROCEED';
1213
+ }
1214
+
1215
+ this.recordDecision(decision);
1216
+ console.log(`Product Owner Decision: ${decision}`);
1217
+
1218
+ // ===== DECISION HANDLING =====
1219
+ if (decision === 'PROCEED') {
1220
+ console.log(`\n${'='.repeat(60)}`);
1221
+ console.log('SUCCESS: Product Owner approved. Orchestration complete.');
1222
+ console.log(`${'='.repeat(60)}`);
1223
+ break;
1224
+ } else if (decision === 'ITERATE') {
1225
+ console.log(`Product Owner requested iteration. Preparing feedback for iteration ${iteration + 1}...`);
1226
+
1227
+ // Prepare feedback for next iteration with Product Owner context
1228
+ const iterationFeedback = this.prepareFeedback({
1229
+ gatePassRate: gateResult.passRate,
1230
+ consensusAverage: consensusValidation.average,
1231
+ reasons: [
1232
+ `Product Owner requested iteration ${iteration + 1}`,
1233
+ `Gate pass rate: ${(gateResult.passRate * 100).toFixed(2)}%`,
1234
+ `Consensus: ${(consensusValidation.average * 100).toFixed(2)}%`,
1235
+ ],
1236
+ });
1237
+
1238
+ console.log('Feedback prepared:');
1239
+ console.log(` - Gate: ${(iterationFeedback.gatePassRate! * 100).toFixed(2)}%`);
1240
+ console.log(` - Consensus: ${(iterationFeedback.consensusAverage! * 100).toFixed(2)}%`);
1241
+ console.log(` - Reasons: ${iterationFeedback.reasons?.join(', ')}`);
1242
+
1243
+ // Store iteration feedback in Redis for next Loop 3 agents to access
1244
+ // Using proper escaping to prevent Redis command injection (CVSS 9.8)
1245
+ try {
1246
+ const feedbackKey = escapeShellArg(`swarm:${this.config.taskId}:iteration:${iteration + 1}:feedback`);
1247
+ const gatePassRateVal = escapeShellArg(String(iterationFeedback.gatePassRate));
1248
+ const consensusAverageVal = escapeShellArg(String(iterationFeedback.consensusAverage));
1249
+ const reasonsVal = escapeShellArg(iterationFeedback.reasons?.join('; ') || '');
1250
+
1251
+ const cmd = `redis-cli HSET ${feedbackKey} "gate_pass_rate" ${gatePassRateVal} "consensus_average" ${consensusAverageVal} "reasons" ${reasonsVal}`;
1252
+ execSync(cmd, { encoding: 'utf-8' });
1253
+
1254
+ console.log(`Iteration feedback stored in Redis for iteration ${iteration + 1}`);
1255
+ } catch (error: unknown) {
1256
+ console.warn(`Failed to store iteration feedback: ${error instanceof Error ? error.message : String(error)}`);
1257
+ }
1258
+
1259
+ // Reset state for next iteration
1260
+ this.resetForIteration();
1261
+
1262
+ if (!this.canContinueIterating()) {
1263
+ console.log(`Max iterations (${maxIterations}) reached. ABORTING.`);
1264
+ this.recordDecision('ABORT');
1265
+ break;
1266
+ }
1267
+
1268
+ console.log(`\nProceeding to iteration ${iteration + 1}...`);
1269
+ continue; // Go to next iteration
1270
+ } else if (decision === 'ABORT') {
1271
+ console.log(`\n${'='.repeat(60)}`);
1272
+ console.log('FAILURE: Product Owner rejected. Aborting orchestration.');
1273
+ console.log(`${'='.repeat(60)}`);
1274
+ break;
1275
+ }
1276
+ }
1277
+
1278
+ // Final status
1279
+ const finalDecision = this.getDecision() || 'ABORT';
1280
+ const summary = this.getSummary();
1281
+
1282
+ console.log(`\nFinal Summary:`);
1283
+ console.log(` Task ID: ${summary.taskId}`);
1284
+ console.log(` Mode: ${summary.mode}`);
1285
+ console.log(` Iterations: ${summary.iteration}/${this.config.maxIterations}`);
1286
+ console.log(` Completed Agents: ${this.state.completedAgents.size}`);
1287
+ console.log(` Failed Agents: ${this.state.failedAgents.size}`);
1288
+ console.log(` Decision: ${finalDecision}`);
1289
+ console.log(` Duration: ${(summary.duration / 1000).toFixed(2)}s`);
1290
+
1291
+ return finalDecision;
1292
+ }
596
1293
  }
597
1294
 
598
1295
  /**
@@ -605,6 +1302,10 @@ if (require.main === module) {
605
1302
  let taskId = '';
606
1303
  let mode: ExecutionMode = 'standard';
607
1304
  let maxIterations = 10;
1305
+ let loop3Agents: string[] = [];
1306
+ let loop2Agents: string[] = [];
1307
+ let productOwner = '';
1308
+ let successCriteriaEnabled = false;
608
1309
 
609
1310
  for (let i = 0; i < args.length; i++) {
610
1311
  const arg = args[i];
@@ -626,6 +1327,32 @@ if (require.main === module) {
626
1327
  if (nextArg) maxIterations = parseInt(nextArg, 10);
627
1328
  break;
628
1329
  }
1330
+ case '--loop3-agents': {
1331
+ const nextArg = args[++i];
1332
+ if (nextArg) {
1333
+ loop3Agents = nextArg.split(',').map((a) => a.trim()).filter((a) => a.length > 0);
1334
+ }
1335
+ break;
1336
+ }
1337
+ case '--loop2-agents': {
1338
+ const nextArg = args[++i];
1339
+ if (nextArg) {
1340
+ loop2Agents = nextArg.split(',').map((a) => a.trim()).filter((a) => a.length > 0);
1341
+ }
1342
+ break;
1343
+ }
1344
+ case '--product-owner': {
1345
+ const nextArg = args[++i];
1346
+ if (nextArg) productOwner = nextArg;
1347
+ break;
1348
+ }
1349
+ case '--success-criteria': {
1350
+ const nextArg = args[++i];
1351
+ if (nextArg) {
1352
+ successCriteriaEnabled = nextArg.toLowerCase() === 'enabled' || nextArg === 'true';
1353
+ }
1354
+ break;
1355
+ }
629
1356
  }
630
1357
  }
631
1358
 
@@ -640,6 +1367,20 @@ if (require.main === module) {
640
1367
  maxIterations,
641
1368
  };
642
1369
 
1370
+ // Add optional parameters only if they have values
1371
+ if (loop3Agents.length > 0) {
1372
+ config.loop3Agents = loop3Agents;
1373
+ }
1374
+ if (loop2Agents.length > 0) {
1375
+ config.loop2Agents = loop2Agents;
1376
+ }
1377
+ if (productOwner) {
1378
+ config.productOwner = productOwner;
1379
+ }
1380
+ if (successCriteriaEnabled) {
1381
+ config.successCriteriaEnabled = successCriteriaEnabled;
1382
+ }
1383
+
643
1384
  const orchestrator = new Orchestrator(config);
644
1385
  console.log(JSON.stringify(orchestrator.getState(), null, 2));
645
1386
  process.exit(0);