claude-flow-novice 2.15.11 → 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 (636) 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/coordinators/cfn-frontend-coordinator.md +1 -0
  150. package/claude-assets/agents/cfn-dev-team/coordinators/consensus-builder.md +1 -0
  151. package/claude-assets/agents/cfn-dev-team/coordinators/handoff-coordinator.md +1 -0
  152. package/claude-assets/agents/cfn-dev-team/coordinators/multi-sprint-coordinator.md +1 -0
  153. package/claude-assets/agents/cfn-dev-team/dev-ops/devops-engineer.md +10 -0
  154. package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +56 -33
  155. package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +46 -36
  156. package/claude-assets/agents/cfn-dev-team/dev-ops/monitoring-specialist.md +9 -0
  157. package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +17 -17
  158. package/claude-assets/agents/cfn-dev-team/developers/backend-developer.md +40 -58
  159. package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +18 -20
  160. package/claude-assets/agents/cfn-dev-team/developers/database/database-architect.md +19 -28
  161. package/claude-assets/agents/cfn-dev-team/developers/frontend/mobile-dev.md +15 -19
  162. package/claude-assets/agents/cfn-dev-team/developers/frontend/react-frontend-engineer.md +15 -10
  163. package/claude-assets/agents/cfn-dev-team/developers/frontend/typescript-specialist.md +15 -10
  164. package/claude-assets/agents/cfn-dev-team/developers/frontend/ui-designer.md +15 -25
  165. package/claude-assets/agents/cfn-dev-team/developers/graphql-specialist.md +17 -21
  166. package/claude-assets/agents/cfn-dev-team/developers/rust-developer.md +17 -21
  167. package/claude-assets/agents/cfn-dev-team/product-owners/product-owner.md +1 -5
  168. package/claude-assets/agents/cfn-dev-team/reviewers/code-reviewer.md +20 -51
  169. package/claude-assets/agents/cfn-dev-team/reviewers/quality/code-quality-validator.md +22 -71
  170. package/claude-assets/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +21 -64
  171. package/claude-assets/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +22 -67
  172. package/claude-assets/agents/cfn-dev-team/reviewers/quality/security-specialist.md +23 -67
  173. package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +7 -35
  174. package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +8 -37
  175. package/claude-assets/agents/cfn-dev-team/testers/contract-tester.md +16 -54
  176. package/claude-assets/agents/cfn-dev-team/testers/integration-tester.md +17 -55
  177. package/claude-assets/agents/cfn-dev-team/testers/interaction-tester.md +9 -37
  178. package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +17 -55
  179. package/claude-assets/agents/cfn-dev-team/testers/mutation-testing-specialist.md +17 -48
  180. package/claude-assets/agents/cfn-dev-team/testers/playwright-tester.md +8 -37
  181. package/claude-assets/agents/cfn-dev-team/testers/tester.md +7 -27
  182. package/claude-assets/agents/cfn-dev-team/utility/analyst.md +12 -28
  183. package/claude-assets/agents/cfn-dev-team/utility/code-booster.md +13 -13
  184. package/claude-assets/agents/cfn-dev-team/utility/context-curator.md +7 -2
  185. package/claude-assets/agents/cfn-dev-team/utility/epic-creator.md +5 -10
  186. package/claude-assets/agents/cfn-dev-team/utility/memory-leak-specialist.md +120 -714
  187. package/claude-assets/agents/cfn-dev-team/utility/researcher.md +12 -21
  188. package/claude-assets/agents/cfn-dev-team/utility/z-ai-specialist.md +146 -572
  189. package/claude-assets/agents/custom/cfn-docker-expert.md +102 -0
  190. package/claude-assets/agents/custom/cfn-loops-cli-expert.md +129 -0
  191. package/claude-assets/cfn-extras/agents/cfn-v3-coordinator.md +517 -0
  192. package/claude-assets/commands/cfn-loop-cli.md +158 -464
  193. package/claude-assets/commands/cfn-loop-trigger.md +114 -0
  194. package/claude-assets/hooks/SKILL.md +518 -0
  195. package/claude-assets/hooks/SKILL.md.backup +471 -0
  196. package/claude-assets/hooks/cfn-invoke-post-edit-ts.sh +100 -0
  197. package/claude-assets/hooks/cfn-invoke-post-edit-ts.sh.backup +78 -0
  198. package/claude-assets/hooks/cfn-invoke-post-edit.sh +22 -0
  199. package/claude-assets/hooks/cfn-invoke-post-edit.sh.backup +87 -0
  200. package/claude-assets/hooks/cfn-invoke-pre-edit-ts.sh +116 -0
  201. package/claude-assets/hooks/cfn-invoke-pre-edit-ts.sh.backup +94 -0
  202. package/claude-assets/hooks/cfn-invoke-pre-edit.sh +22 -0
  203. package/claude-assets/hooks/cfn-invoke-pre-edit.sh.backup +88 -0
  204. package/claude-assets/skills/cfn-agent-selection-with-fallback/DELIVERABLES.md +409 -0
  205. package/claude-assets/skills/cfn-agent-selection-with-fallback/IMPLEMENTATION_SUMMARY.md +396 -0
  206. package/claude-assets/skills/cfn-agent-selection-with-fallback/INTEGRATION_GUIDE.md +308 -0
  207. package/claude-assets/skills/cfn-agent-selection-with-fallback/QUICK_REFERENCE.md +239 -0
  208. package/claude-assets/skills/cfn-agent-selection-with-fallback/SKILL.md +107 -1
  209. package/claude-assets/skills/cfn-agent-selection-with-fallback/SKILL.md.backup +302 -0
  210. package/claude-assets/skills/cfn-agent-selection-with-fallback/TYPESCRIPT_MIGRATION.md +295 -0
  211. package/claude-assets/skills/cfn-agent-selection-with-fallback/dist/agent-selector.cjs +297 -0
  212. package/claude-assets/skills/cfn-agent-selection-with-fallback/dist/agent-selector.js +297 -0
  213. package/claude-assets/skills/cfn-agent-selection-with-fallback/dist/cli.cjs +96 -0
  214. package/claude-assets/skills/cfn-agent-selection-with-fallback/dist/cli.js +96 -0
  215. package/claude-assets/skills/cfn-agent-selection-with-fallback/select-agents-ts.sh +45 -0
  216. package/claude-assets/skills/cfn-agent-selection-with-fallback/select-agents-ts.sh.backup +23 -0
  217. package/claude-assets/skills/cfn-agent-selection-with-fallback/select-agents.sh +22 -0
  218. package/claude-assets/skills/cfn-agent-selection-with-fallback/select-agents.sh.backup +173 -0
  219. package/claude-assets/skills/cfn-agent-selection-with-fallback/src/agent-selector.test.ts +357 -0
  220. package/claude-assets/skills/cfn-agent-selection-with-fallback/src/agent-selector.ts +350 -0
  221. package/claude-assets/skills/cfn-agent-selection-with-fallback/src/cli.ts +74 -0
  222. package/claude-assets/skills/cfn-agent-selection-with-fallback/task-classifier.sh +22 -0
  223. package/claude-assets/skills/cfn-agent-selection-with-fallback/task-classifier.sh.backup +71 -0
  224. package/claude-assets/skills/cfn-agent-selection-with-fallback/tsconfig.json +18 -0
  225. package/claude-assets/skills/cfn-agent-spawning/SKILL.md +48 -1
  226. package/claude-assets/skills/cfn-agent-spawning/SKILL.md.backup +135 -0
  227. package/claude-assets/skills/cfn-agent-spawning/TYPESCRIPT_MIGRATION.md +567 -0
  228. package/claude-assets/skills/cfn-agent-spawning/check-dependencies.sh +22 -0
  229. package/claude-assets/skills/cfn-agent-spawning/check-dependencies.sh.backup +30 -0
  230. package/claude-assets/skills/cfn-agent-spawning/get-agent-provider-env.sh +22 -0
  231. package/claude-assets/skills/cfn-agent-spawning/get-agent-provider-env.sh.backup +127 -0
  232. package/claude-assets/skills/cfn-agent-spawning/parse-agent-provider.sh +22 -0
  233. package/claude-assets/skills/cfn-agent-spawning/parse-agent-provider.sh.backup +59 -0
  234. package/claude-assets/skills/cfn-agent-spawning/spawn-agent-wrapper.sh +63 -0
  235. package/claude-assets/skills/cfn-agent-spawning/spawn-agent-wrapper.sh.backup +41 -0
  236. package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh +26 -1
  237. package/claude-assets/skills/cfn-agent-spawning/spawn-templates.sh +22 -0
  238. package/claude-assets/skills/cfn-agent-spawning/spawn-templates.sh.backup +613 -0
  239. package/claude-assets/skills/cfn-agent-spawning/spawn-worker.sh +22 -0
  240. package/claude-assets/skills/cfn-agent-spawning/spawn-worker.sh.backup +176 -0
  241. package/claude-assets/skills/cfn-coordination/agent-completion.sh.backup +36 -0
  242. package/claude-assets/skills/cfn-coordination/coordination-signal.sh.backup +36 -0
  243. package/claude-assets/skills/cfn-coordination/coordination-wait.sh.backup +36 -0
  244. package/claude-assets/skills/cfn-dependency-ingestion/README.md +101 -0
  245. package/claude-assets/skills/cfn-dependency-ingestion/SKILL.md +369 -0
  246. package/claude-assets/skills/cfn-dependency-ingestion/build.sh +23 -0
  247. package/claude-assets/skills/cfn-dependency-ingestion/dist/ingest-dependencies.js +478 -0
  248. package/claude-assets/skills/cfn-dependency-ingestion/ingest-dependencies.sh +295 -0
  249. package/claude-assets/skills/cfn-dependency-ingestion/src/ingest-dependencies.ts +563 -0
  250. package/claude-assets/skills/cfn-loop-orchestration/.backups/unknown/1763619700_33aff4a69b99159e4e849107ebc4d09f/metadata.json +8 -0
  251. package/claude-assets/skills/cfn-loop-orchestration/.backups/unknown/1763619700_33aff4a69b99159e4e849107ebc4d09f/original +271 -0
  252. package/claude-assets/skills/cfn-loop-orchestration/.backups/unknown/1763619700_33aff4a69b99159e4e849107ebc4d09f/revert.sh +7 -0
  253. package/claude-assets/skills/cfn-loop-orchestration/.backups/unknown/1763671642_06496e8c399a79db08167cc00ed4b31e/metadata.json +8 -0
  254. package/claude-assets/skills/cfn-loop-orchestration/.backups/unknown/1763671642_06496e8c399a79db08167cc00ed4b31e/original +325 -0
  255. package/claude-assets/skills/cfn-loop-orchestration/.backups/unknown/1763671642_06496e8c399a79db08167cc00ed4b31e/revert.sh +7 -0
  256. package/claude-assets/skills/cfn-loop-orchestration/CLI_IMPLEMENTATION_SUMMARY.md +330 -0
  257. package/claude-assets/skills/cfn-loop-orchestration/CONFIGURATION_IMPROVEMENTS.md +318 -0
  258. package/claude-assets/skills/cfn-loop-orchestration/CONTEXT_LOOKUP_MIGRATION.md +308 -0
  259. package/claude-assets/skills/cfn-loop-orchestration/CONTEXT_LOOKUP_QUICK_START.md +378 -0
  260. package/claude-assets/skills/cfn-loop-orchestration/E2E_VALIDATION_REPORT.md +262 -0
  261. package/claude-assets/skills/cfn-loop-orchestration/IMPLEMENTATION_SUMMARY.md +319 -519
  262. package/claude-assets/skills/cfn-loop-orchestration/NORTH_STAR_E2E_REPORT.md +299 -0
  263. package/claude-assets/skills/cfn-loop-orchestration/NORTH_STAR_EXECUTION_SUMMARY.md +403 -0
  264. package/claude-assets/skills/cfn-loop-orchestration/NORTH_STAR_INDEX.md +323 -0
  265. package/claude-assets/skills/cfn-loop-orchestration/SKILL.md +159 -48
  266. package/claude-assets/skills/cfn-loop-orchestration/SPAWN_AGENTS_IMPLEMENTATION.md +188 -0
  267. package/claude-assets/skills/cfn-loop-orchestration/TEST_COVERAGE_REPORT.md +335 -0
  268. package/claude-assets/skills/cfn-loop-orchestration/TEST_COVERAGE_SUMMARY.md +456 -0
  269. package/claude-assets/skills/cfn-loop-orchestration/TYPESCRIPT_INTEGRATION_REPORT.md +709 -0
  270. package/claude-assets/skills/cfn-loop-orchestration/TYPESCRIPT_INTEGRATION_SUMMARY.md +257 -0
  271. package/claude-assets/skills/cfn-loop-orchestration/VALIDATION_REPORT.md +572 -0
  272. package/claude-assets/skills/cfn-loop-orchestration/VALIDATION_SUMMARY.txt +196 -0
  273. package/claude-assets/skills/cfn-loop-orchestration/VALIDATOR_MODULE_GUIDE.md +526 -0
  274. package/claude-assets/skills/cfn-loop-orchestration/archive/legacy-bash/README.md +167 -0
  275. package/claude-assets/skills/cfn-loop-orchestration/archive/legacy-bash/orchestrate-enhanced.sh +548 -0
  276. package/{.claude/skills/cfn-loop-orchestration → claude-assets/skills/cfn-loop-orchestration/archive/legacy-bash}/orchestrate-wrapper.sh +11 -1
  277. package/claude-assets/skills/cfn-loop-orchestration/archive/legacy-bash/orchestrate.sh +182 -0
  278. package/claude-assets/skills/cfn-loop-orchestration/e2e-validation-fixed.js +240 -0
  279. package/claude-assets/skills/cfn-loop-orchestration/e2e-validation.js +213 -0
  280. package/claude-assets/skills/cfn-loop-orchestration/package-lock.json +3 -0
  281. package/claude-assets/skills/cfn-loop-orchestration/package.json +4 -0
  282. package/claude-assets/skills/cfn-loop-orchestration/run-north-star-e2e.ts +210 -0
  283. package/claude-assets/skills/cfn-loop-orchestration/src/cli/orchestrator-cli.ts +396 -0
  284. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/CONFIDENCE_AGGREGATOR.md +564 -0
  285. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/CONFIDENCE_AGGREGATOR_QUICK_REF.md +241 -0
  286. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/CONTEXT_INJECTOR_IMPLEMENTATION.md +375 -0
  287. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/CONTEXT_INJECTOR_QUICK_REFERENCE.md +362 -0
  288. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/CONTEXT_INJECTOR_README.md +307 -0
  289. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/CONTEXT_INJECTOR_USAGE_GUIDE.md +508 -0
  290. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/confidence-aggregator.ts +473 -0
  291. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/consensus.ts +1 -1
  292. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/context-injector.ts +349 -0
  293. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/context-lookup.ts +486 -0
  294. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/deliverable-verifier.ts +6 -2
  295. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/gate-check.ts +1 -1
  296. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/product-owner-decision.ts +316 -0
  297. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/spawn-agents.ts +357 -0
  298. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/validator.ts +276 -0
  299. package/claude-assets/skills/cfn-loop-orchestration/src/index.ts +2 -0
  300. package/claude-assets/skills/cfn-loop-orchestration/src/orchestrate.ts +743 -2
  301. package/claude-assets/skills/cfn-loop-orchestration/src/types.ts +56 -0
  302. package/claude-assets/skills/cfn-loop-orchestration/test-cli.sh +92 -0
  303. package/claude-assets/skills/cfn-loop-orchestration/test-typescript-integration.sh +442 -0
  304. package/claude-assets/skills/cfn-loop-orchestration/tests/agent-spawner.test.ts +124 -0
  305. package/claude-assets/skills/cfn-loop-orchestration/tests/confidence-aggregator.test.ts +604 -0
  306. package/claude-assets/skills/cfn-loop-orchestration/tests/context-injector.test.ts +561 -0
  307. package/claude-assets/skills/cfn-loop-orchestration/tests/context-lookup.test.ts +661 -0
  308. package/claude-assets/skills/cfn-loop-orchestration/tests/deliverable-verifier.test.ts +2 -2
  309. package/claude-assets/skills/cfn-loop-orchestration/tests/gate-check-edge-cases.test.ts +422 -0
  310. package/claude-assets/skills/cfn-loop-orchestration/tests/gate-checker.test.ts +276 -0
  311. package/claude-assets/skills/cfn-loop-orchestration/tests/logger.test.ts +291 -0
  312. package/claude-assets/skills/cfn-loop-orchestration/tests/north-star-e2e.test.ts +334 -0
  313. package/claude-assets/skills/cfn-loop-orchestration/tests/redis-coordinator.test.ts +321 -0
  314. package/claude-assets/skills/cfn-loop-orchestration/tests/spawn-agents.test.ts +284 -0
  315. package/claude-assets/skills/cfn-loop-orchestration/tests/validator.test.ts +643 -0
  316. package/claude-assets/skills/cfn-loop-output-processing/.eslintrc.json +33 -0
  317. package/claude-assets/skills/cfn-loop-output-processing/DELIVERY_SUMMARY.txt +462 -0
  318. package/claude-assets/skills/cfn-loop-output-processing/DEPRECATION_NOTICE.md +183 -0
  319. package/claude-assets/skills/cfn-loop-output-processing/EXAMPLES.md +609 -0
  320. package/claude-assets/skills/cfn-loop-output-processing/IMPLEMENTATION_SUMMARY.md +418 -0
  321. package/claude-assets/skills/cfn-loop-output-processing/INDEX.md +531 -0
  322. package/claude-assets/skills/cfn-loop-output-processing/MIGRATION.md +362 -0
  323. package/claude-assets/skills/cfn-loop-output-processing/README.md +114 -0
  324. package/claude-assets/skills/cfn-loop-output-processing/SKILL.md +633 -0
  325. package/{.claude/skills/cfn-docker-redis-coordination → claude-assets/skills/cfn-loop-output-processing}/jest.config.js +7 -15
  326. package/claude-assets/skills/cfn-loop-output-processing/package.json +50 -0
  327. package/claude-assets/skills/cfn-loop-output-processing/src/cli/process-loop2.ts +195 -0
  328. package/claude-assets/skills/cfn-loop-output-processing/src/cli/process-loop3.ts +157 -0
  329. package/claude-assets/skills/cfn-loop-output-processing/src/output-processor.ts +632 -0
  330. package/claude-assets/skills/cfn-loop-output-processing/tests/output-processor.test.ts +617 -0
  331. package/claude-assets/skills/{cfn-docker-redis-coordination → cfn-loop-output-processing}/tsconfig.json +16 -7
  332. package/claude-assets/skills/cfn-loop-validation/IMPLEMENTATION_SUMMARY.md +672 -0
  333. package/claude-assets/skills/cfn-loop-validation/INDEX.md +531 -0
  334. package/claude-assets/skills/cfn-loop-validation/README_TYPESCRIPT.md +454 -0
  335. package/claude-assets/skills/cfn-loop-validation/SKILL.md +48 -1
  336. package/claude-assets/skills/cfn-loop-validation/SKILL.md.backup +353 -0
  337. package/claude-assets/skills/cfn-loop-validation/SKILL_TYPESCRIPT.md +782 -0
  338. package/claude-assets/skills/cfn-loop-validation/VAPOR_DETECTION_EXAMPLES.md +598 -0
  339. package/claude-assets/skills/cfn-loop-validation/check-dependencies.sh +22 -0
  340. package/claude-assets/skills/cfn-loop-validation/check-dependencies.sh.backup +31 -0
  341. package/claude-assets/skills/cfn-loop-validation/detect-vapor.sh +59 -0
  342. package/claude-assets/skills/cfn-loop-validation/detect-vapor.sh.backup +37 -0
  343. package/claude-assets/skills/cfn-loop-validation/dist/.tsbuildinfo +1 -0
  344. package/claude-assets/skills/cfn-loop-validation/dist/cli/detect-vapor.d.ts +14 -0
  345. package/claude-assets/skills/cfn-loop-validation/dist/cli/detect-vapor.d.ts.map +1 -0
  346. package/claude-assets/skills/cfn-loop-validation/dist/cli/detect-vapor.js +185 -0
  347. package/claude-assets/skills/cfn-loop-validation/dist/cli/detect-vapor.js.map +1 -0
  348. package/claude-assets/skills/cfn-loop-validation/dist/cli/validate-deliverables.d.ts +14 -0
  349. package/claude-assets/skills/cfn-loop-validation/dist/cli/validate-deliverables.d.ts.map +1 -0
  350. package/claude-assets/skills/cfn-loop-validation/dist/cli/validate-deliverables.js +176 -0
  351. package/claude-assets/skills/cfn-loop-validation/dist/cli/validate-deliverables.js.map +1 -0
  352. package/claude-assets/skills/cfn-loop-validation/dist/cli/validate-gate.d.ts +19 -0
  353. package/claude-assets/skills/cfn-loop-validation/dist/cli/validate-gate.d.ts.map +1 -0
  354. package/claude-assets/skills/cfn-loop-validation/dist/cli/validate-gate.js +123 -0
  355. package/claude-assets/skills/cfn-loop-validation/dist/cli/validate-gate.js.map +1 -0
  356. package/claude-assets/skills/cfn-loop-validation/dist/types.d.ts +156 -0
  357. package/claude-assets/skills/cfn-loop-validation/dist/types.d.ts.map +1 -0
  358. package/claude-assets/skills/cfn-loop-validation/dist/types.js +66 -0
  359. package/claude-assets/skills/cfn-loop-validation/dist/types.js.map +1 -0
  360. package/claude-assets/skills/cfn-loop-validation/dist/validator.d.ts +85 -0
  361. package/claude-assets/skills/cfn-loop-validation/dist/validator.d.ts.map +1 -0
  362. package/claude-assets/skills/cfn-loop-validation/dist/validator.js +411 -0
  363. package/claude-assets/skills/cfn-loop-validation/dist/validator.js.map +1 -0
  364. package/claude-assets/skills/cfn-loop-validation/orchestrate-cfn-loop.sh +22 -0
  365. package/claude-assets/skills/cfn-loop-validation/orchestrate-cfn-loop.sh.backup +252 -0
  366. package/claude-assets/skills/cfn-loop-validation/package.json +93 -0
  367. package/claude-assets/skills/cfn-loop-validation/src/cli/detect-vapor.ts +177 -0
  368. package/claude-assets/skills/cfn-loop-validation/src/cli/validate-deliverables.ts +161 -0
  369. package/claude-assets/skills/cfn-loop-validation/src/cli/validate-gate.ts +139 -0
  370. package/claude-assets/skills/cfn-loop-validation/src/types.ts +215 -0
  371. package/claude-assets/skills/cfn-loop-validation/src/validator.ts +503 -0
  372. package/claude-assets/skills/cfn-loop-validation/tests/validator.test.ts +537 -0
  373. package/claude-assets/skills/{cfn-redis-coordination → cfn-loop-validation}/tsconfig.json +34 -31
  374. package/claude-assets/skills/cfn-loop-validation/validate-deliverables.sh +59 -0
  375. package/claude-assets/skills/cfn-loop-validation/validate-deliverables.sh.backup +37 -0
  376. package/claude-assets/skills/cfn-loop-validation/validate-gate.sh +63 -0
  377. package/claude-assets/skills/cfn-loop-validation/validate-gate.sh.backup +41 -0
  378. package/claude-assets/skills/cfn-loop-validation/validate-iteration.sh +22 -0
  379. package/claude-assets/skills/cfn-loop-validation/validate-iteration.sh.backup +134 -0
  380. package/claude-assets/skills/cfn-product-owner-decision/SKILL.md +479 -147
  381. package/claude-assets/skills/cfn-product-owner-decision/TYPESCRIPT_IMPLEMENTATION.md +653 -0
  382. package/{.claude/skills/cfn-product-owner-decision → claude-assets/skills/cfn-product-owner-decision/archive/legacy-bash}/execute-decision.sh +24 -2
  383. package/claude-assets/skills/cfn-provider-routing/README.md +129 -0
  384. package/claude-assets/skills/cfn-provider-routing/SKILL.md +192 -0
  385. package/claude-assets/skills/cfn-provider-routing/resolve-provider-model.ts +223 -0
  386. package/claude-assets/skills/pre-edit-backup/SKILL.md +324 -0
  387. package/claude-assets/skills/pre-edit-backup/SKILL.md.backup +277 -0
  388. package/claude-assets/skills/pre-edit-backup/backup.sh +22 -0
  389. package/claude-assets/skills/pre-edit-backup/backup.sh.backup +107 -0
  390. package/dist/agents/agent-loader.js +146 -165
  391. package/dist/agents/agent-loader.js.map +1 -1
  392. package/dist/api/auth-endpoints.js +415 -0
  393. package/dist/api/auth-endpoints.js.map +1 -0
  394. package/dist/api/task-endpoints.js +562 -0
  395. package/dist/api/task-endpoints.js.map +1 -0
  396. package/dist/backend/server.js +418 -0
  397. package/dist/backend/server.js.map +1 -0
  398. package/dist/cfn-loop/product-owner/decision-parser.js +356 -0
  399. package/dist/cfn-loop/product-owner/decision-parser.js.map +1 -0
  400. package/dist/cfn-loop/product-owner/index.js +1 -0
  401. package/dist/cfn-loop/product-owner/index.js.map +1 -1
  402. package/dist/cli/agent-command.js +1 -1
  403. package/dist/cli/agent-command.js.map +1 -1
  404. package/dist/cli/agent-completion.js +273 -0
  405. package/dist/cli/agent-completion.js.map +1 -0
  406. package/dist/cli/agent-prompt-builder.js +83 -48
  407. package/dist/cli/agent-prompt-builder.js.map +1 -1
  408. package/dist/cli/agent-spawner.js +499 -0
  409. package/dist/cli/agent-spawner.js.map +1 -0
  410. package/dist/cli/anthropic-client.js +10 -3
  411. package/dist/cli/anthropic-client.js.map +1 -1
  412. package/dist/cli/config-manager.js +91 -109
  413. package/dist/cli/index.js +11 -0
  414. package/dist/cli/index.js.map +1 -1
  415. package/dist/cli/parse-decision-cli.js +268 -0
  416. package/dist/cli/parse-decision-cli.js.map +1 -0
  417. package/dist/cli/post-edit-hook.js +83 -0
  418. package/dist/cli/post-edit-hook.js.map +1 -0
  419. package/dist/cli/pre-edit-hook.js +77 -0
  420. package/dist/cli/pre-edit-hook.js.map +1 -0
  421. package/dist/cli/spawn-agent-cli.js +209 -0
  422. package/dist/cli/spawn-agent-cli.js.map +1 -0
  423. package/dist/coordination/coordination-wrapper.js +383 -0
  424. package/dist/coordination/coordination-wrapper.js.map +1 -0
  425. package/dist/coordination/store-success-criteria.js +68 -0
  426. package/dist/coordination/store-success-criteria.js.map +1 -0
  427. package/dist/coordination/store-task-context.js +65 -0
  428. package/dist/coordination/store-task-context.js.map +1 -0
  429. package/dist/hooks/backup-manager.js +273 -0
  430. package/dist/hooks/backup-manager.js.map +1 -0
  431. package/dist/hooks/post-edit-validator.js +388 -0
  432. package/dist/hooks/post-edit-validator.js.map +1 -0
  433. package/dist/integration/index.js +19 -0
  434. package/dist/integration/index.js.map +1 -0
  435. package/dist/integration/task-mode-adapter.js +297 -0
  436. package/dist/integration/task-mode-adapter.js.map +1 -0
  437. package/dist/integration/trigger-dev-client.js +253 -0
  438. package/dist/integration/trigger-dev-client.js.map +1 -0
  439. package/dist/integration/trigger-dev-webhooks.js +362 -0
  440. package/dist/integration/trigger-dev-webhooks.js.map +1 -0
  441. package/dist/lib/path-validator.js +14 -5
  442. package/dist/lib/path-validator.js.map +1 -1
  443. package/dist/lib/redis-queue-manager.js +5 -1
  444. package/dist/lib/redis-queue-manager.js.map +1 -1
  445. package/dist/middleware/authentication.js +317 -0
  446. package/dist/middleware/authentication.js.map +1 -0
  447. package/dist/services/authentication.js +669 -0
  448. package/dist/services/authentication.js.map +1 -0
  449. package/dist/services/session-management.js +436 -0
  450. package/dist/services/session-management.js.map +1 -0
  451. package/dist/services/skill-deployment.js +8 -6
  452. package/dist/services/skill-deployment.js.map +1 -1
  453. package/dist/services/user-service.js +710 -0
  454. package/dist/services/user-service.js.map +1 -0
  455. package/dist/types/trigger-dev-events.d.js +10 -0
  456. package/dist/types/trigger-dev-events.d.js.map +1 -0
  457. package/docs/README.md +240 -0
  458. package/package.json +13 -4
  459. package/scripts/compare-workflow-performance.sh +556 -0
  460. package/scripts/migrate-to-optimized-workflows.sh +438 -0
  461. package/scripts/organize-docs.sh +338 -0
  462. package/scripts/trigger-dev-setup.sh +267 -0
  463. package/.claude/skills/cfn-docker-redis-coordination/MIGRATION_SUMMARY.md +0 -348
  464. package/.claude/skills/cfn-docker-redis-coordination/README.md +0 -294
  465. package/.claude/skills/cfn-docker-redis-coordination/SKILL.md +0 -435
  466. package/.claude/skills/cfn-docker-redis-coordination/coordinate.sh +0 -650
  467. package/.claude/skills/cfn-docker-redis-coordination/coordinate.sh.backup-1763145142 +0 -641
  468. package/.claude/skills/cfn-docker-redis-coordination/package-lock.json +0 -5259
  469. package/.claude/skills/cfn-docker-redis-coordination/package.json +0 -40
  470. package/.claude/skills/cfn-docker-redis-coordination/src/coordinator.ts +0 -801
  471. package/.claude/skills/cfn-docker-redis-coordination/src/index.ts +0 -42
  472. package/.claude/skills/cfn-docker-redis-coordination/src/types.ts +0 -351
  473. package/.claude/skills/cfn-docker-redis-coordination/tests/coordinator.test.ts +0 -1464
  474. package/.claude/skills/cfn-docker-redis-coordination/tsconfig.json +0 -30
  475. package/.claude/skills/cfn-loop-orchestration/helpers/auto-tune-timeouts.sh +0 -228
  476. package/.claude/skills/cfn-loop-orchestration/helpers/consensus-ts.sh +0 -104
  477. package/.claude/skills/cfn-loop-orchestration/helpers/consensus.sh +0 -94
  478. package/.claude/skills/cfn-loop-orchestration/helpers/context-injection.sh +0 -142
  479. package/.claude/skills/cfn-loop-orchestration/helpers/context-lookup.sh +0 -359
  480. package/.claude/skills/cfn-loop-orchestration/helpers/deliverable-verifier-ts.sh +0 -123
  481. package/.claude/skills/cfn-loop-orchestration/helpers/deliverable-verifier.sh +0 -71
  482. package/.claude/skills/cfn-loop-orchestration/helpers/gate-check.sh +0 -56
  483. package/.claude/skills/cfn-loop-orchestration/helpers/iteration-manager-ts.sh +0 -89
  484. package/.claude/skills/cfn-loop-orchestration/helpers/iteration-manager.sh +0 -87
  485. package/.claude/skills/cfn-loop-orchestration/helpers/orchestrate-ts.sh +0 -104
  486. package/.claude/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +0 -56
  487. package/.claude/skills/cfn-loop-orchestration/helpers/spawn-agents.sh +0 -290
  488. package/.claude/skills/cfn-loop-orchestration/helpers/timeout-calculator-ts.sh +0 -47
  489. package/.claude/skills/cfn-loop-orchestration/helpers/timeout-calculator.sh +0 -51
  490. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +0 -1345
  491. package/.claude/skills/cfn-redis-coordination/AGENT_LOGGING.md +0 -280
  492. package/.claude/skills/cfn-redis-coordination/BZPOPMIN_FIX_SUMMARY.md +0 -209
  493. package/.claude/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +0 -319
  494. package/.claude/skills/cfn-redis-coordination/agent-log.sh.bak +0 -124
  495. package/.claude/skills/cfn-redis-coordination/config.json +0 -61
  496. package/.claude/skills/cfn-redis-coordination/demos/phase4-wake-queue-test-report.md +0 -82
  497. package/.claude/skills/cfn-redis-coordination/demos/test-bzpopmin-fix.sh +0 -274
  498. package/.claude/skills/cfn-redis-coordination/demos/test-cancel-swarm.sh +0 -0
  499. package/.claude/skills/cfn-redis-coordination/docs/migration/PHASE_3_REDIS_COORDINATION_COMPLETION_REPORT.md +0 -553
  500. package/.claude/skills/cfn-redis-coordination/jest.config.js +0 -23
  501. package/.claude/skills/cfn-redis-coordination/package-lock.json +0 -5272
  502. package/.claude/skills/cfn-redis-coordination/package.json +0 -45
  503. package/.claude/skills/cfn-redis-coordination/src/agent-logger.ts +0 -446
  504. package/.claude/skills/cfn-redis-coordination/src/agent-recovery.ts +0 -454
  505. package/.claude/skills/cfn-redis-coordination/src/completion-reporter.ts +0 -396
  506. package/.claude/skills/cfn-redis-coordination/src/context-manager.ts +0 -327
  507. package/.claude/skills/cfn-redis-coordination/src/index.ts +0 -82
  508. package/.claude/skills/cfn-redis-coordination/src/mode-detector.ts +0 -155
  509. package/.claude/skills/cfn-redis-coordination/src/redis/redis-client.ts +0 -305
  510. package/.claude/skills/cfn-redis-coordination/src/redis/redis-functions.ts +0 -283
  511. package/.claude/skills/cfn-redis-coordination/src/redis-client.ts +0 -654
  512. package/.claude/skills/cfn-redis-coordination/src/result-collector.ts +0 -437
  513. package/.claude/skills/cfn-redis-coordination/src/swarm-manager.ts +0 -494
  514. package/.claude/skills/cfn-redis-coordination/src/task-analyzer.ts +0 -404
  515. package/.claude/skills/cfn-redis-coordination/src/task-executor.ts +0 -423
  516. package/.claude/skills/cfn-redis-coordination/src/types.ts +0 -235
  517. package/.claude/skills/cfn-redis-coordination/src/waiting-coordinator.ts +0 -587
  518. package/.claude/skills/cfn-redis-coordination/store-success-criteria.sh +0 -85
  519. package/.claude/skills/cfn-redis-coordination/test-connection-attempts.js +0 -70
  520. package/.claude/skills/cfn-redis-coordination/test-mode-simple.js +0 -121
  521. package/.claude/skills/cfn-redis-coordination/test-redis-check.js +0 -84
  522. package/.claude/skills/cfn-redis-coordination/test-task-mode-redis.cjs +0 -391
  523. package/.claude/skills/cfn-redis-coordination/tests/coordination.test.ts +0 -788
  524. package/.claude/skills/cfn-redis-coordination/update-all-scripts.sh +0 -67
  525. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +0 -980
  526. package/claude-assets/agents/typescript-specialist.md +0 -280
  527. package/claude-assets/skills/cfn-docker-redis-coordination/MIGRATION_SUMMARY.md +0 -348
  528. package/claude-assets/skills/cfn-docker-redis-coordination/README.md +0 -294
  529. package/claude-assets/skills/cfn-docker-redis-coordination/SKILL.md +0 -435
  530. package/claude-assets/skills/cfn-docker-redis-coordination/coordinate.sh +0 -650
  531. package/claude-assets/skills/cfn-docker-redis-coordination/coordinate.sh.backup-1763145142 +0 -641
  532. package/claude-assets/skills/cfn-docker-redis-coordination/jest.config.js +0 -37
  533. package/claude-assets/skills/cfn-docker-redis-coordination/package-lock.json +0 -5259
  534. package/claude-assets/skills/cfn-docker-redis-coordination/package.json +0 -40
  535. package/claude-assets/skills/cfn-docker-redis-coordination/src/coordinator.ts +0 -801
  536. package/claude-assets/skills/cfn-docker-redis-coordination/src/index.ts +0 -42
  537. package/claude-assets/skills/cfn-docker-redis-coordination/src/types.ts +0 -351
  538. package/claude-assets/skills/cfn-docker-redis-coordination/tests/coordinator.test.ts +0 -1464
  539. package/claude-assets/skills/cfn-loop-orchestration/helpers/auto-tune-timeouts.sh +0 -228
  540. package/claude-assets/skills/cfn-loop-orchestration/helpers/consensus-ts.sh +0 -104
  541. package/claude-assets/skills/cfn-loop-orchestration/helpers/consensus.sh +0 -94
  542. package/claude-assets/skills/cfn-loop-orchestration/helpers/context-injection.sh +0 -142
  543. package/claude-assets/skills/cfn-loop-orchestration/helpers/context-lookup.sh +0 -359
  544. package/claude-assets/skills/cfn-loop-orchestration/helpers/deliverable-verifier-ts.sh +0 -123
  545. package/claude-assets/skills/cfn-loop-orchestration/helpers/deliverable-verifier.sh +0 -71
  546. package/claude-assets/skills/cfn-loop-orchestration/helpers/gate-check.sh +0 -56
  547. package/claude-assets/skills/cfn-loop-orchestration/helpers/iteration-manager-ts.sh +0 -89
  548. package/claude-assets/skills/cfn-loop-orchestration/helpers/iteration-manager.sh +0 -87
  549. package/claude-assets/skills/cfn-loop-orchestration/helpers/orchestrate-ts.sh +0 -104
  550. package/claude-assets/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +0 -56
  551. package/claude-assets/skills/cfn-loop-orchestration/helpers/spawn-agents.sh +0 -290
  552. package/claude-assets/skills/cfn-loop-orchestration/helpers/timeout-calculator-ts.sh +0 -47
  553. package/claude-assets/skills/cfn-loop-orchestration/helpers/timeout-calculator.sh +0 -51
  554. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +0 -1345
  555. package/claude-assets/skills/cfn-redis-cleanup/cleanup-redis.sh +0 -130
  556. package/claude-assets/skills/cfn-redis-coordination/AGENT_LOGGING.md +0 -280
  557. package/claude-assets/skills/cfn-redis-coordination/BZPOPMIN_FIX_SUMMARY.md +0 -209
  558. package/claude-assets/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +0 -319
  559. package/claude-assets/skills/cfn-redis-coordination/agent-log.sh.bak +0 -124
  560. package/claude-assets/skills/cfn-redis-coordination/config.json +0 -61
  561. package/claude-assets/skills/cfn-redis-coordination/demos/phase4-wake-queue-test-report.md +0 -82
  562. package/claude-assets/skills/cfn-redis-coordination/demos/test-bzpopmin-fix.sh +0 -274
  563. package/claude-assets/skills/cfn-redis-coordination/demos/test-cancel-swarm.sh +0 -0
  564. package/claude-assets/skills/cfn-redis-coordination/docs/migration/PHASE_3_REDIS_COORDINATION_COMPLETION_REPORT.md +0 -553
  565. package/claude-assets/skills/cfn-redis-coordination/jest.config.js +0 -23
  566. package/claude-assets/skills/cfn-redis-coordination/package-lock.json +0 -5272
  567. package/claude-assets/skills/cfn-redis-coordination/package.json +0 -45
  568. package/claude-assets/skills/cfn-redis-coordination/src/agent-logger.ts +0 -446
  569. package/claude-assets/skills/cfn-redis-coordination/src/agent-recovery.ts +0 -454
  570. package/claude-assets/skills/cfn-redis-coordination/src/completion-reporter.ts +0 -396
  571. package/claude-assets/skills/cfn-redis-coordination/src/context-manager.ts +0 -327
  572. package/claude-assets/skills/cfn-redis-coordination/src/index.ts +0 -82
  573. package/claude-assets/skills/cfn-redis-coordination/src/mode-detector.ts +0 -155
  574. package/claude-assets/skills/cfn-redis-coordination/src/redis/redis-client.ts +0 -305
  575. package/claude-assets/skills/cfn-redis-coordination/src/redis/redis-functions.ts +0 -283
  576. package/claude-assets/skills/cfn-redis-coordination/src/redis-client.ts +0 -654
  577. package/claude-assets/skills/cfn-redis-coordination/src/result-collector.ts +0 -437
  578. package/claude-assets/skills/cfn-redis-coordination/src/swarm-manager.ts +0 -494
  579. package/claude-assets/skills/cfn-redis-coordination/src/task-analyzer.ts +0 -404
  580. package/claude-assets/skills/cfn-redis-coordination/src/task-executor.ts +0 -423
  581. package/claude-assets/skills/cfn-redis-coordination/src/types.ts +0 -235
  582. package/claude-assets/skills/cfn-redis-coordination/src/waiting-coordinator.ts +0 -587
  583. package/claude-assets/skills/cfn-redis-coordination/store-success-criteria.sh +0 -85
  584. package/claude-assets/skills/cfn-redis-coordination/test-connection-attempts.js +0 -70
  585. package/claude-assets/skills/cfn-redis-coordination/test-mode-simple.js +0 -121
  586. package/claude-assets/skills/cfn-redis-coordination/test-redis-check.js +0 -84
  587. package/claude-assets/skills/cfn-redis-coordination/test-task-mode-redis.cjs +0 -391
  588. package/claude-assets/skills/cfn-redis-coordination/tests/coordination.test.ts +0 -788
  589. package/claude-assets/skills/cfn-redis-coordination/update-all-scripts.sh +0 -67
  590. package/claude-assets/skills/cfn-redis-data-extraction/SKILL.md +0 -442
  591. package/claude-assets/skills/cfn-redis-data-extraction/extract.sh +0 -306
  592. package/dist/coordination/index.js +0 -25
  593. package/dist/coordination/index.js.map +0 -1
  594. package/docs/BUG_19_MEMORY_LEAK_TASK_MODE.md +0 -405
  595. package/docs/MEMORY_CLEANUP_GUIDE.md +0 -358
  596. package/docs/MEMORY_LEAK_FIX_SUMMARY.md +0 -322
  597. package/docs/REDIS_CLEANUP_EXECUTIVE_SUMMARY.md +0 -319
  598. package/docs/REDIS_CLEANUP_VERIFICATION_REPORT.md +0 -574
  599. /package/.claude/skills/cfn-loop-orchestration/{inject-loop-context.sh → archive/legacy-bash/inject-loop-context.sh} +0 -0
  600. /package/.claude/skills/cfn-loop-orchestration/{monitor-execution.sh → archive/legacy-bash/monitor-execution.sh} +0 -0
  601. /package/.claude/skills/cfn-redis-coordination/{agent-log.sh → agent-log.sh.backup} +0 -0
  602. /package/.claude/skills/cfn-redis-coordination/{agent-recovery.sh → agent-recovery.sh.backup} +0 -0
  603. /package/.claude/skills/cfn-redis-coordination/{analyze-task-complexity.sh → analyze-task-complexity.sh.backup} +0 -0
  604. /package/.claude/skills/cfn-redis-coordination/bash-wrappers/{store-context.sh → store-context.sh.backup} +0 -0
  605. /package/.claude/skills/cfn-redis-coordination/{cancel-swarm.sh → cancel-swarm.sh.backup} +0 -0
  606. /package/.claude/skills/cfn-redis-coordination/{cfn-loop-exec.sh → cfn-loop-exec.sh.backup} +0 -0
  607. /package/.claude/skills/cfn-redis-coordination/{cfn-loop-relaunch.sh → cfn-loop-relaunch.sh.backup} +0 -0
  608. /package/.claude/skills/cfn-redis-coordination/{collect-confidence-scores.sh → collect-confidence-scores.sh.backup} +0 -0
  609. /package/.claude/skills/cfn-redis-coordination/{collect-results.sh → collect-results.sh.backup} +0 -0
  610. /package/.claude/skills/cfn-redis-coordination/{complete-swarm.sh → complete-swarm.sh.backup} +0 -0
  611. /package/.claude/skills/cfn-redis-coordination/{get-context.sh → get-context.sh.backup} +0 -0
  612. /package/.claude/skills/cfn-redis-coordination/{get-success-criteria.sh → get-success-criteria.sh.backup} +0 -0
  613. /package/.claude/skills/cfn-redis-coordination/{invoke-waiting-mode.sh → invoke-waiting-mode.sh.backup} +0 -0
  614. /package/.claude/skills/cfn-redis-coordination/{redis-cli-wrapper.sh → redis-cli-wrapper.sh.backup} +0 -0
  615. /package/.claude/skills/cfn-redis-coordination/{redis-functions.sh → redis-functions.sh.backup} +0 -0
  616. /package/.claude/skills/cfn-redis-coordination/{report-completion.sh → report-completion.sh.backup} +0 -0
  617. /package/.claude/skills/cfn-redis-coordination/{store-context.sh → store-context.sh.backup} +0 -0
  618. /package/claude-assets/skills/cfn-loop-orchestration/{inject-loop-context.sh → archive/legacy-bash/inject-loop-context.sh} +0 -0
  619. /package/claude-assets/skills/cfn-loop-orchestration/{monitor-execution.sh → archive/legacy-bash/monitor-execution.sh} +0 -0
  620. /package/claude-assets/skills/cfn-redis-coordination/{agent-log.sh → agent-log.sh.backup} +0 -0
  621. /package/claude-assets/skills/cfn-redis-coordination/{agent-recovery.sh → agent-recovery.sh.backup} +0 -0
  622. /package/claude-assets/skills/cfn-redis-coordination/{analyze-task-complexity.sh → analyze-task-complexity.sh.backup} +0 -0
  623. /package/claude-assets/skills/cfn-redis-coordination/bash-wrappers/{store-context.sh → store-context.sh.backup} +0 -0
  624. /package/claude-assets/skills/cfn-redis-coordination/{cancel-swarm.sh → cancel-swarm.sh.backup} +0 -0
  625. /package/claude-assets/skills/cfn-redis-coordination/{cfn-loop-exec.sh → cfn-loop-exec.sh.backup} +0 -0
  626. /package/claude-assets/skills/cfn-redis-coordination/{cfn-loop-relaunch.sh → cfn-loop-relaunch.sh.backup} +0 -0
  627. /package/claude-assets/skills/cfn-redis-coordination/{collect-confidence-scores.sh → collect-confidence-scores.sh.backup} +0 -0
  628. /package/claude-assets/skills/cfn-redis-coordination/{collect-results.sh → collect-results.sh.backup} +0 -0
  629. /package/claude-assets/skills/cfn-redis-coordination/{complete-swarm.sh → complete-swarm.sh.backup} +0 -0
  630. /package/claude-assets/skills/cfn-redis-coordination/{get-context.sh → get-context.sh.backup} +0 -0
  631. /package/claude-assets/skills/cfn-redis-coordination/{get-success-criteria.sh → get-success-criteria.sh.backup} +0 -0
  632. /package/claude-assets/skills/cfn-redis-coordination/{invoke-waiting-mode.sh → invoke-waiting-mode.sh.backup} +0 -0
  633. /package/claude-assets/skills/cfn-redis-coordination/{redis-cli-wrapper.sh → redis-cli-wrapper.sh.backup} +0 -0
  634. /package/claude-assets/skills/cfn-redis-coordination/{redis-functions.sh → redis-functions.sh.backup} +0 -0
  635. /package/claude-assets/skills/cfn-redis-coordination/{report-completion.sh → report-completion.sh.backup} +0 -0
  636. /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);