claude-flow-novice 2.15.4 → 2.15.6

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 (456) hide show
  1. package/.claude/cfn-extras/.gs-api-quota.json +16 -0
  2. package/.claude/cfn-extras/.gs-progress-state.json +22 -0
  3. package/.claude/cfn-extras/GOOGLE_SHEETS_IMPLEMENTATION_SUMMARY.md +414 -0
  4. package/.claude/cfn-extras/agents/google-sheets/README.md +114 -0
  5. package/.claude/cfn-extras/agents/google-sheets/google-sheets-advanced-analytics-specialist.md +288 -0
  6. package/.claude/cfn-extras/agents/google-sheets/google-sheets-api-integrator.md +127 -0
  7. package/.claude/cfn-extras/agents/google-sheets/google-sheets-automation-scripting-specialist.md +195 -0
  8. package/.claude/cfn-extras/agents/google-sheets/google-sheets-business-validator.md +179 -0
  9. package/.claude/cfn-extras/agents/google-sheets/google-sheets-collaboration-security-specialist.md +240 -0
  10. package/.claude/cfn-extras/agents/google-sheets/google-sheets-coordinator.md +214 -0
  11. package/.claude/cfn-extras/agents/google-sheets/google-sheets-data-transformer.md +127 -0
  12. package/.claude/cfn-extras/agents/google-sheets/google-sheets-data-validation-quality-specialist.md +177 -0
  13. package/.claude/cfn-extras/agents/google-sheets/google-sheets-data-validator.md +119 -0
  14. package/.claude/cfn-extras/agents/google-sheets/google-sheets-data-visualization-specialist.md +135 -0
  15. package/.claude/cfn-extras/agents/google-sheets/google-sheets-design-layout-specialist.md +109 -0
  16. package/.claude/cfn-extras/agents/google-sheets/google-sheets-formula-engineer.md +127 -0
  17. package/.claude/cfn-extras/agents/google-sheets/google-sheets-formula-engineering-specialist.md +138 -0
  18. package/.claude/cfn-extras/agents/google-sheets/google-sheets-formula-validator.md +128 -0
  19. package/.claude/cfn-extras/agents/google-sheets/google-sheets-generalist.md +645 -0
  20. package/.claude/cfn-extras/agents/google-sheets/google-sheets-integration-api-specialist.md +258 -0
  21. package/.claude/cfn-extras/agents/google-sheets/google-sheets-performance-analyst.md +125 -0
  22. package/.claude/cfn-extras/agents/google-sheets/google-sheets-performance-optimization-specialist.md +211 -0
  23. package/.claude/cfn-extras/agents/google-sheets/google-sheets-schema-designer.md +130 -0
  24. package/.claude/cfn-extras/agents/google-sheets/google-sheets-template-architecture-specialist.md +259 -0
  25. package/.claude/cfn-extras/docs/GOOGLE_SHEETS_CFN_LOOP.md +617 -0
  26. package/.claude/cfn-extras/skills/GOOGLE_SHEETS_SKILLS_README.md +453 -0
  27. package/.claude/cfn-extras/skills/google-sheets-api-coordinator/SKILL.md +272 -0
  28. package/.claude/cfn-extras/skills/google-sheets-api-coordinator/api-call.sh +254 -0
  29. package/.claude/cfn-extras/skills/google-sheets-api-coordinator/test.sh +174 -0
  30. package/.claude/cfn-extras/skills/google-sheets-api-coordinator/validate.sh +98 -0
  31. package/.claude/cfn-extras/skills/google-sheets-decomposition/SKILL.md +269 -0
  32. package/.claude/cfn-extras/skills/google-sheets-decomposition/decompose.sh +313 -0
  33. package/.claude/cfn-extras/skills/google-sheets-formula-builder/SKILL.md +237 -0
  34. package/.claude/cfn-extras/skills/google-sheets-formula-builder/build-formula.sh +220 -0
  35. package/.claude/cfn-extras/skills/google-sheets-formula-builder/test.sh +172 -0
  36. package/.claude/cfn-extras/skills/google-sheets-formula-builder/validate.sh +98 -0
  37. package/.claude/cfn-extras/skills/google-sheets-progress/SKILL.md +287 -0
  38. package/.claude/cfn-extras/skills/google-sheets-progress/test.sh +385 -0
  39. package/.claude/cfn-extras/skills/google-sheets-progress/track-progress.sh +516 -0
  40. package/.claude/cfn-extras/skills/google-sheets-progress/validate.sh +119 -0
  41. package/.claude/cfn-extras/skills/google-sheets-sprint-order/SKILL.md +277 -0
  42. package/.claude/cfn-extras/skills/google-sheets-sprint-order/order-sprints.sh +233 -0
  43. package/.claude/cfn-extras/skills/google-sheets-validation/SKILL.md +352 -0
  44. package/.claude/cfn-extras/skills/google-sheets-validation/test.sh +355 -0
  45. package/.claude/cfn-extras/skills/google-sheets-validation/validate-state.sh +374 -0
  46. package/.claude/cfn-extras/skills/google-sheets-validation/validate.sh +128 -0
  47. package/.claude/commands/cfn-context.md +10 -0
  48. package/.claude/commands/cfn-loop-cli.md +44 -14
  49. package/.claude/commands/google-sheets/google-sheets-loop.md +289 -0
  50. package/.claude/skills/cfn-agent-selector/SKILL.md +143 -0
  51. package/.claude/skills/cfn-agent-selector/select-agents.sh +94 -0
  52. package/.claude/skills/cfn-agent-spawning/get-agent-provider-env.sh +22 -2
  53. package/.claude/skills/cfn-docker-agent-spawning/spawn-agent.sh +21 -2
  54. package/.claude/skills/cfn-docker-loop-orchestration/orchestrate.sh +11 -5
  55. package/.claude/skills/cfn-docker-redis-coordination/MIGRATION_SUMMARY.md +348 -0
  56. package/.claude/skills/cfn-docker-redis-coordination/README.md +294 -0
  57. package/.claude/skills/cfn-docker-redis-coordination/jest.config.js +37 -0
  58. package/.claude/skills/cfn-docker-redis-coordination/package-lock.json +5259 -0
  59. package/.claude/skills/cfn-docker-redis-coordination/package.json +40 -0
  60. package/.claude/skills/cfn-docker-redis-coordination/src/coordinator.ts +801 -0
  61. package/.claude/skills/cfn-docker-redis-coordination/src/index.ts +42 -0
  62. package/.claude/skills/cfn-docker-redis-coordination/src/types.ts +351 -0
  63. package/.claude/skills/cfn-docker-redis-coordination/tests/coordinator.test.ts +1464 -0
  64. package/.claude/skills/cfn-docker-redis-coordination/tsconfig.json +30 -0
  65. package/.claude/skills/cfn-loop-orchestration/.eslintrc.js +56 -0
  66. package/.claude/skills/cfn-loop-orchestration/.prettierrc.json +18 -0
  67. package/.claude/skills/cfn-loop-orchestration/README.md +149 -41
  68. package/.claude/skills/cfn-loop-orchestration/jest.config.js +67 -0
  69. package/.claude/skills/cfn-loop-orchestration/orchestrate-wrapper.sh +268 -0
  70. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +147 -16
  71. package/.claude/skills/cfn-loop-orchestration/package-lock.json +5470 -0
  72. package/.claude/skills/cfn-loop-orchestration/package.json +49 -0
  73. package/.claude/skills/cfn-loop-orchestration/src/agent-spawner/agent-spawner.ts +34 -0
  74. package/.claude/skills/cfn-loop-orchestration/src/gate-checker/gate-checker.ts +36 -0
  75. package/.claude/skills/cfn-loop-orchestration/src/index.ts +14 -0
  76. package/.claude/skills/cfn-loop-orchestration/src/orchestrator/orchestrator.ts +31 -0
  77. package/.claude/skills/cfn-loop-orchestration/src/redis/redis-coordinator.ts +72 -0
  78. package/.claude/skills/cfn-loop-orchestration/src/types.ts +188 -0
  79. package/.claude/skills/cfn-loop-orchestration/src/utils/logger.ts +32 -0
  80. package/.claude/skills/cfn-loop-orchestration/tests/setup.ts +22 -0
  81. package/.claude/skills/cfn-loop-orchestration/tests/types.test.ts +132 -0
  82. package/.claude/skills/cfn-loop-orchestration/tsconfig.json +54 -0
  83. package/.claude/skills/cfn-redis-coordination/bash-wrappers/store-context.sh +23 -0
  84. package/.claude/skills/cfn-redis-coordination/dist/agent-logger.d.ts +92 -0
  85. package/.claude/skills/cfn-redis-coordination/dist/agent-logger.d.ts.map +1 -0
  86. package/.claude/skills/cfn-redis-coordination/dist/agent-logger.js +329 -0
  87. package/.claude/skills/cfn-redis-coordination/dist/agent-logger.js.map +1 -0
  88. package/.claude/skills/cfn-redis-coordination/dist/agent-recovery.d.ts +75 -0
  89. package/.claude/skills/cfn-redis-coordination/dist/agent-recovery.d.ts.map +1 -0
  90. package/.claude/skills/cfn-redis-coordination/dist/agent-recovery.js +302 -0
  91. package/.claude/skills/cfn-redis-coordination/dist/agent-recovery.js.map +1 -0
  92. package/.claude/skills/cfn-redis-coordination/dist/completion-reporter.d.ts +58 -0
  93. package/.claude/skills/cfn-redis-coordination/dist/completion-reporter.d.ts.map +1 -0
  94. package/.claude/skills/cfn-redis-coordination/dist/completion-reporter.js +237 -0
  95. package/.claude/skills/cfn-redis-coordination/dist/completion-reporter.js.map +1 -0
  96. package/.claude/skills/cfn-redis-coordination/dist/context-manager.d.ts +63 -0
  97. package/.claude/skills/cfn-redis-coordination/dist/context-manager.d.ts.map +1 -0
  98. package/.claude/skills/cfn-redis-coordination/dist/context-manager.js +230 -0
  99. package/.claude/skills/cfn-redis-coordination/dist/context-manager.js.map +1 -0
  100. package/.claude/skills/cfn-redis-coordination/dist/index.d.ts +45 -0
  101. package/.claude/skills/cfn-redis-coordination/dist/index.d.ts.map +1 -0
  102. package/.claude/skills/cfn-redis-coordination/dist/index.js +114 -0
  103. package/.claude/skills/cfn-redis-coordination/dist/index.js.map +1 -0
  104. package/.claude/skills/cfn-redis-coordination/dist/mode-detector.d.ts +31 -0
  105. package/.claude/skills/cfn-redis-coordination/dist/mode-detector.d.ts.map +1 -0
  106. package/.claude/skills/cfn-redis-coordination/dist/mode-detector.js +185 -0
  107. package/.claude/skills/cfn-redis-coordination/dist/mode-detector.js.map +1 -0
  108. package/.claude/skills/cfn-redis-coordination/dist/redis-client.d.ts +191 -0
  109. package/.claude/skills/cfn-redis-coordination/dist/redis-client.d.ts.map +1 -0
  110. package/.claude/skills/cfn-redis-coordination/dist/redis-client.js +509 -0
  111. package/.claude/skills/cfn-redis-coordination/dist/redis-client.js.map +1 -0
  112. package/.claude/skills/cfn-redis-coordination/dist/result-collector.d.ts +75 -0
  113. package/.claude/skills/cfn-redis-coordination/dist/result-collector.d.ts.map +1 -0
  114. package/.claude/skills/cfn-redis-coordination/dist/result-collector.js +281 -0
  115. package/.claude/skills/cfn-redis-coordination/dist/result-collector.js.map +1 -0
  116. package/.claude/skills/cfn-redis-coordination/dist/swarm-manager.d.ts +75 -0
  117. package/.claude/skills/cfn-redis-coordination/dist/swarm-manager.d.ts.map +1 -0
  118. package/.claude/skills/cfn-redis-coordination/dist/swarm-manager.js +354 -0
  119. package/.claude/skills/cfn-redis-coordination/dist/swarm-manager.js.map +1 -0
  120. package/.claude/skills/cfn-redis-coordination/dist/task-analyzer.d.ts +62 -0
  121. package/.claude/skills/cfn-redis-coordination/dist/task-analyzer.d.ts.map +1 -0
  122. package/.claude/skills/cfn-redis-coordination/dist/task-analyzer.js +305 -0
  123. package/.claude/skills/cfn-redis-coordination/dist/task-analyzer.js.map +1 -0
  124. package/.claude/skills/cfn-redis-coordination/dist/task-executor.d.ts +97 -0
  125. package/.claude/skills/cfn-redis-coordination/dist/task-executor.d.ts.map +1 -0
  126. package/.claude/skills/cfn-redis-coordination/dist/task-executor.js +283 -0
  127. package/.claude/skills/cfn-redis-coordination/dist/task-executor.js.map +1 -0
  128. package/.claude/skills/cfn-redis-coordination/dist/types.d.ts +176 -0
  129. package/.claude/skills/cfn-redis-coordination/dist/types.d.ts.map +1 -0
  130. package/.claude/skills/cfn-redis-coordination/dist/types.js +81 -0
  131. package/.claude/skills/cfn-redis-coordination/dist/types.js.map +1 -0
  132. package/.claude/skills/cfn-redis-coordination/dist/waiting-coordinator.d.ts +86 -0
  133. package/.claude/skills/cfn-redis-coordination/dist/waiting-coordinator.d.ts.map +1 -0
  134. package/.claude/skills/cfn-redis-coordination/dist/waiting-coordinator.js +419 -0
  135. package/.claude/skills/cfn-redis-coordination/dist/waiting-coordinator.js.map +1 -0
  136. package/.claude/skills/cfn-redis-coordination/docs/migration/PHASE_3_REDIS_COORDINATION_COMPLETION_REPORT.md +553 -0
  137. package/.claude/skills/cfn-redis-coordination/invoke-waiting-mode.sh +3 -2
  138. package/.claude/skills/cfn-redis-coordination/jest.config.js +23 -0
  139. package/.claude/skills/cfn-redis-coordination/package-lock.json +5272 -0
  140. package/.claude/skills/cfn-redis-coordination/package.json +45 -0
  141. package/.claude/skills/cfn-redis-coordination/redis-cli-wrapper.sh +21 -8
  142. package/.claude/skills/cfn-redis-coordination/redis-functions.sh +3 -2
  143. package/.claude/skills/cfn-redis-coordination/src/agent-logger.ts +446 -0
  144. package/.claude/skills/cfn-redis-coordination/src/agent-recovery.ts +454 -0
  145. package/.claude/skills/cfn-redis-coordination/src/completion-reporter.ts +396 -0
  146. package/.claude/skills/cfn-redis-coordination/src/context-manager.ts +327 -0
  147. package/.claude/skills/cfn-redis-coordination/src/index.ts +82 -0
  148. package/.claude/skills/cfn-redis-coordination/src/mode-detector.ts +155 -0
  149. package/.claude/skills/cfn-redis-coordination/src/redis/redis-client.ts +305 -0
  150. package/.claude/skills/cfn-redis-coordination/src/redis/redis-functions.ts +283 -0
  151. package/.claude/skills/cfn-redis-coordination/src/redis-client.ts +654 -0
  152. package/.claude/skills/cfn-redis-coordination/src/result-collector.ts +437 -0
  153. package/.claude/skills/cfn-redis-coordination/src/swarm-manager.ts +494 -0
  154. package/.claude/skills/cfn-redis-coordination/src/task-analyzer.ts +404 -0
  155. package/.claude/skills/cfn-redis-coordination/src/task-executor.ts +423 -0
  156. package/.claude/skills/cfn-redis-coordination/src/types.ts +235 -0
  157. package/.claude/skills/cfn-redis-coordination/src/waiting-coordinator.ts +587 -0
  158. package/.claude/skills/cfn-redis-coordination/test-connection-attempts.js +70 -0
  159. package/.claude/skills/cfn-redis-coordination/test-mode-simple.js +121 -0
  160. package/.claude/skills/cfn-redis-coordination/test-redis-check.js +84 -0
  161. package/.claude/skills/cfn-redis-coordination/test-task-mode-redis.cjs +391 -0
  162. package/.claude/skills/cfn-redis-coordination/tests/coordination.test.ts +779 -0
  163. package/.claude/skills/cfn-redis-coordination/tsconfig.json +31 -0
  164. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +172 -2
  165. package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +1 -1
  166. package/claude-assets/agents/custom/cfn-redis-operations.md +530 -0
  167. package/claude-assets/agents/custom/cfn-system-expert.md +77 -0
  168. package/claude-assets/cfn-extras/.gs-api-quota.json +16 -0
  169. package/claude-assets/cfn-extras/.gs-progress-state.json +22 -0
  170. package/claude-assets/cfn-extras/GOOGLE_SHEETS_IMPLEMENTATION_SUMMARY.md +414 -0
  171. package/claude-assets/cfn-extras/agents/google-sheets/README.md +114 -0
  172. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-advanced-analytics-specialist.md +288 -0
  173. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-api-integrator.md +127 -0
  174. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-automation-scripting-specialist.md +195 -0
  175. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-business-validator.md +179 -0
  176. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-collaboration-security-specialist.md +240 -0
  177. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-coordinator.md +214 -0
  178. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-data-transformer.md +127 -0
  179. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-data-validation-quality-specialist.md +177 -0
  180. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-data-validator.md +119 -0
  181. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-data-visualization-specialist.md +135 -0
  182. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-design-layout-specialist.md +109 -0
  183. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-formula-engineer.md +127 -0
  184. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-formula-engineering-specialist.md +138 -0
  185. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-formula-validator.md +128 -0
  186. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-generalist.md +645 -0
  187. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-integration-api-specialist.md +258 -0
  188. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-performance-analyst.md +125 -0
  189. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-performance-optimization-specialist.md +211 -0
  190. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-schema-designer.md +130 -0
  191. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-template-architecture-specialist.md +259 -0
  192. package/claude-assets/cfn-extras/docs/GOOGLE_SHEETS_CFN_LOOP.md +617 -0
  193. package/claude-assets/cfn-extras/skills/GOOGLE_SHEETS_SKILLS_README.md +453 -0
  194. package/claude-assets/cfn-extras/skills/google-sheets-api-coordinator/SKILL.md +272 -0
  195. package/claude-assets/cfn-extras/skills/google-sheets-api-coordinator/api-call.sh +254 -0
  196. package/claude-assets/cfn-extras/skills/google-sheets-api-coordinator/test.sh +174 -0
  197. package/claude-assets/cfn-extras/skills/google-sheets-api-coordinator/validate.sh +98 -0
  198. package/claude-assets/cfn-extras/skills/google-sheets-decomposition/SKILL.md +269 -0
  199. package/claude-assets/cfn-extras/skills/google-sheets-decomposition/decompose.sh +313 -0
  200. package/claude-assets/cfn-extras/skills/google-sheets-formula-builder/SKILL.md +237 -0
  201. package/claude-assets/cfn-extras/skills/google-sheets-formula-builder/build-formula.sh +220 -0
  202. package/claude-assets/cfn-extras/skills/google-sheets-formula-builder/test.sh +172 -0
  203. package/claude-assets/cfn-extras/skills/google-sheets-formula-builder/validate.sh +98 -0
  204. package/claude-assets/cfn-extras/skills/google-sheets-progress/SKILL.md +287 -0
  205. package/claude-assets/cfn-extras/skills/google-sheets-progress/test.sh +385 -0
  206. package/claude-assets/cfn-extras/skills/google-sheets-progress/track-progress.sh +516 -0
  207. package/claude-assets/cfn-extras/skills/google-sheets-progress/validate.sh +119 -0
  208. package/claude-assets/cfn-extras/skills/google-sheets-sprint-order/SKILL.md +277 -0
  209. package/claude-assets/cfn-extras/skills/google-sheets-sprint-order/order-sprints.sh +233 -0
  210. package/claude-assets/cfn-extras/skills/google-sheets-validation/SKILL.md +352 -0
  211. package/claude-assets/cfn-extras/skills/google-sheets-validation/test.sh +355 -0
  212. package/claude-assets/cfn-extras/skills/google-sheets-validation/validate-state.sh +374 -0
  213. package/claude-assets/cfn-extras/skills/google-sheets-validation/validate.sh +128 -0
  214. package/claude-assets/commands/cfn-context.md +10 -0
  215. package/claude-assets/commands/cfn-loop-cli.md +44 -14
  216. package/claude-assets/commands/google-sheets/google-sheets-loop.md +289 -0
  217. package/claude-assets/hooks/cfn-pre-execution/SESSION_START_README.md +87 -0
  218. package/claude-assets/hooks/cfn-pre-execution/TEST_SESSION_START.md +128 -0
  219. package/claude-assets/hooks/cfn-pre-execution/session-start-context.sh +111 -0
  220. package/claude-assets/skills/cfn-agent-selection-with-fallback/INTEGRATION_EXAMPLE.md +209 -0
  221. package/claude-assets/skills/cfn-agent-selection-with-fallback/README.md +130 -0
  222. package/claude-assets/skills/cfn-agent-selection-with-fallback/SKILL.md +243 -0
  223. package/claude-assets/skills/cfn-agent-selection-with-fallback/agent-mappings.json +142 -0
  224. package/claude-assets/skills/cfn-agent-selection-with-fallback/select-agents.sh +173 -0
  225. package/claude-assets/skills/cfn-agent-selection-with-fallback/task-classifier.sh +71 -0
  226. package/claude-assets/skills/cfn-agent-selection-with-fallback/test-agent-selection.sh +282 -0
  227. package/claude-assets/skills/cfn-agent-selector/SKILL.md +143 -0
  228. package/claude-assets/skills/cfn-agent-selector/select-agents.sh +94 -0
  229. package/claude-assets/skills/cfn-agent-spawning/get-agent-provider-env.sh +22 -2
  230. package/claude-assets/skills/cfn-docker-agent-spawning/spawn-agent.sh +21 -2
  231. package/claude-assets/skills/cfn-docker-coordination/.eslintrc.json +33 -0
  232. package/claude-assets/skills/cfn-docker-coordination/README.md +349 -0
  233. package/claude-assets/skills/cfn-docker-coordination/docker-helpers.sh +433 -0
  234. package/claude-assets/skills/cfn-docker-coordination/jest.config.js +25 -0
  235. package/claude-assets/skills/cfn-docker-coordination/package-lock.json +6827 -0
  236. package/claude-assets/skills/cfn-docker-coordination/package.json +38 -0
  237. package/claude-assets/skills/cfn-docker-coordination/src/agent-container.ts +471 -0
  238. package/claude-assets/skills/cfn-docker-coordination/src/docker-client.ts +483 -0
  239. package/claude-assets/skills/cfn-docker-coordination/src/health-checker.ts +418 -0
  240. package/claude-assets/skills/cfn-docker-coordination/src/index.ts +45 -0
  241. package/claude-assets/skills/cfn-docker-coordination/src/network-manager.ts +377 -0
  242. package/claude-assets/skills/cfn-docker-coordination/src/types.ts +412 -0
  243. package/claude-assets/skills/cfn-docker-coordination/src/volume-manager.ts +389 -0
  244. package/claude-assets/skills/cfn-docker-coordination/tests/agent-container.test.ts +379 -0
  245. package/claude-assets/skills/cfn-docker-coordination/tests/docker-client.test.ts +345 -0
  246. package/claude-assets/skills/cfn-docker-coordination/tests/health-checker.test.ts +535 -0
  247. package/claude-assets/skills/cfn-docker-coordination/tests/integration.test.ts +193 -0
  248. package/claude-assets/skills/cfn-docker-coordination/tests/network-manager.test.ts +352 -0
  249. package/claude-assets/skills/cfn-docker-coordination/tests/setup.ts +36 -0
  250. package/claude-assets/skills/cfn-docker-coordination/tsconfig.json +29 -0
  251. package/claude-assets/skills/cfn-docker-logging/INTEGRATION.md +268 -0
  252. package/claude-assets/skills/cfn-docker-logging/SAMPLE_OUTPUTS.md +237 -0
  253. package/claude-assets/skills/cfn-docker-logging/SKILL.md +442 -0
  254. package/claude-assets/skills/cfn-docker-logging/capture-container-logs.sh +120 -0
  255. package/claude-assets/skills/cfn-docker-logging/enable-logging.sh +430 -0
  256. package/claude-assets/skills/cfn-docker-logging/init-hybrid-logging.sh +210 -0
  257. package/claude-assets/skills/cfn-docker-logging/queries/analytics-summary.sh +87 -0
  258. package/claude-assets/skills/cfn-docker-logging/queries/query-agent-timeline.sh +51 -0
  259. package/claude-assets/skills/cfn-docker-logging/queries/query-consensus-history.sh +56 -0
  260. package/claude-assets/skills/cfn-docker-logging/queries/query-coordination-timeline.sh +39 -0
  261. package/claude-assets/skills/cfn-docker-logging/queries/query-failed-containers.sh +40 -0
  262. package/claude-assets/skills/cfn-docker-logging/queries/query-gate-checks.sh +39 -0
  263. package/claude-assets/skills/cfn-docker-logging/schema.sql +111 -0
  264. package/claude-assets/skills/cfn-docker-logging/sqlite-helpers.sh +240 -0
  265. package/claude-assets/skills/cfn-docker-logging/test-hybrid-logging.sh +331 -0
  266. package/claude-assets/skills/cfn-docker-loop-orchestration/orchestrate.sh +11 -5
  267. package/claude-assets/skills/cfn-docker-redis-coordination/MIGRATION_SUMMARY.md +348 -0
  268. package/claude-assets/skills/cfn-docker-redis-coordination/README.md +294 -0
  269. package/claude-assets/skills/cfn-docker-redis-coordination/jest.config.js +37 -0
  270. package/claude-assets/skills/cfn-docker-redis-coordination/package-lock.json +5259 -0
  271. package/claude-assets/skills/cfn-docker-redis-coordination/package.json +40 -0
  272. package/claude-assets/skills/cfn-docker-redis-coordination/src/coordinator.ts +801 -0
  273. package/claude-assets/skills/cfn-docker-redis-coordination/src/index.ts +42 -0
  274. package/claude-assets/skills/cfn-docker-redis-coordination/src/types.ts +351 -0
  275. package/claude-assets/skills/cfn-docker-redis-coordination/tests/coordinator.test.ts +1464 -0
  276. package/claude-assets/skills/cfn-docker-redis-coordination/tsconfig.json +30 -0
  277. package/claude-assets/skills/cfn-error-logging/.eslintrc.json +57 -0
  278. package/claude-assets/skills/cfn-error-logging/.prettierrc.json +10 -0
  279. package/claude-assets/skills/cfn-error-logging/MIGRATION_SUMMARY.md +485 -0
  280. package/claude-assets/skills/cfn-error-logging/package.json +47 -0
  281. package/claude-assets/skills/cfn-error-logging/src/error-logger.ts +1042 -0
  282. package/claude-assets/skills/cfn-error-logging/src/index.ts +12 -0
  283. package/claude-assets/skills/cfn-error-logging/src/types.ts +456 -0
  284. package/claude-assets/skills/cfn-error-logging/tests/error-logger.test.ts +1302 -0
  285. package/claude-assets/skills/cfn-error-logging/tsconfig.json +38 -0
  286. package/claude-assets/skills/cfn-loop-orchestration/.eslintrc.js +56 -0
  287. package/claude-assets/skills/cfn-loop-orchestration/.prettierrc.json +18 -0
  288. package/claude-assets/skills/cfn-loop-orchestration/README.md +149 -41
  289. package/claude-assets/skills/cfn-loop-orchestration/jest.config.js +67 -0
  290. package/claude-assets/skills/cfn-loop-orchestration/orchestrate-wrapper.sh +268 -0
  291. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +147 -16
  292. package/claude-assets/skills/cfn-loop-orchestration/package-lock.json +5470 -0
  293. package/claude-assets/skills/cfn-loop-orchestration/package.json +49 -0
  294. package/claude-assets/skills/cfn-loop-orchestration/src/agent-spawner/agent-spawner.ts +34 -0
  295. package/claude-assets/skills/cfn-loop-orchestration/src/gate-checker/gate-checker.ts +36 -0
  296. package/claude-assets/skills/cfn-loop-orchestration/src/index.ts +14 -0
  297. package/claude-assets/skills/cfn-loop-orchestration/src/orchestrator/orchestrator.ts +31 -0
  298. package/claude-assets/skills/cfn-loop-orchestration/src/redis/redis-coordinator.ts +72 -0
  299. package/claude-assets/skills/cfn-loop-orchestration/src/types.ts +188 -0
  300. package/claude-assets/skills/cfn-loop-orchestration/src/utils/logger.ts +32 -0
  301. package/claude-assets/skills/cfn-loop-orchestration/tests/setup.ts +22 -0
  302. package/claude-assets/skills/cfn-loop-orchestration/tests/types.test.ts +132 -0
  303. package/claude-assets/skills/cfn-loop-orchestration/tsconfig.json +54 -0
  304. package/claude-assets/skills/cfn-redis-coordination/bash-wrappers/store-context.sh +23 -0
  305. package/claude-assets/skills/cfn-redis-coordination/dist/agent-logger.d.ts +92 -0
  306. package/claude-assets/skills/cfn-redis-coordination/dist/agent-logger.d.ts.map +1 -0
  307. package/claude-assets/skills/cfn-redis-coordination/dist/agent-logger.js +329 -0
  308. package/claude-assets/skills/cfn-redis-coordination/dist/agent-logger.js.map +1 -0
  309. package/claude-assets/skills/cfn-redis-coordination/dist/agent-recovery.d.ts +75 -0
  310. package/claude-assets/skills/cfn-redis-coordination/dist/agent-recovery.d.ts.map +1 -0
  311. package/claude-assets/skills/cfn-redis-coordination/dist/agent-recovery.js +302 -0
  312. package/claude-assets/skills/cfn-redis-coordination/dist/agent-recovery.js.map +1 -0
  313. package/claude-assets/skills/cfn-redis-coordination/dist/completion-reporter.d.ts +58 -0
  314. package/claude-assets/skills/cfn-redis-coordination/dist/completion-reporter.d.ts.map +1 -0
  315. package/claude-assets/skills/cfn-redis-coordination/dist/completion-reporter.js +237 -0
  316. package/claude-assets/skills/cfn-redis-coordination/dist/completion-reporter.js.map +1 -0
  317. package/claude-assets/skills/cfn-redis-coordination/dist/context-manager.d.ts +63 -0
  318. package/claude-assets/skills/cfn-redis-coordination/dist/context-manager.d.ts.map +1 -0
  319. package/claude-assets/skills/cfn-redis-coordination/dist/context-manager.js +230 -0
  320. package/claude-assets/skills/cfn-redis-coordination/dist/context-manager.js.map +1 -0
  321. package/claude-assets/skills/cfn-redis-coordination/dist/index.d.ts +45 -0
  322. package/claude-assets/skills/cfn-redis-coordination/dist/index.d.ts.map +1 -0
  323. package/claude-assets/skills/cfn-redis-coordination/dist/index.js +114 -0
  324. package/claude-assets/skills/cfn-redis-coordination/dist/index.js.map +1 -0
  325. package/claude-assets/skills/cfn-redis-coordination/dist/mode-detector.d.ts +31 -0
  326. package/claude-assets/skills/cfn-redis-coordination/dist/mode-detector.d.ts.map +1 -0
  327. package/claude-assets/skills/cfn-redis-coordination/dist/mode-detector.js +185 -0
  328. package/claude-assets/skills/cfn-redis-coordination/dist/mode-detector.js.map +1 -0
  329. package/claude-assets/skills/cfn-redis-coordination/dist/redis-client.d.ts +191 -0
  330. package/claude-assets/skills/cfn-redis-coordination/dist/redis-client.d.ts.map +1 -0
  331. package/claude-assets/skills/cfn-redis-coordination/dist/redis-client.js +509 -0
  332. package/claude-assets/skills/cfn-redis-coordination/dist/redis-client.js.map +1 -0
  333. package/claude-assets/skills/cfn-redis-coordination/dist/result-collector.d.ts +75 -0
  334. package/claude-assets/skills/cfn-redis-coordination/dist/result-collector.d.ts.map +1 -0
  335. package/claude-assets/skills/cfn-redis-coordination/dist/result-collector.js +281 -0
  336. package/claude-assets/skills/cfn-redis-coordination/dist/result-collector.js.map +1 -0
  337. package/claude-assets/skills/cfn-redis-coordination/dist/swarm-manager.d.ts +75 -0
  338. package/claude-assets/skills/cfn-redis-coordination/dist/swarm-manager.d.ts.map +1 -0
  339. package/claude-assets/skills/cfn-redis-coordination/dist/swarm-manager.js +354 -0
  340. package/claude-assets/skills/cfn-redis-coordination/dist/swarm-manager.js.map +1 -0
  341. package/claude-assets/skills/cfn-redis-coordination/dist/task-analyzer.d.ts +62 -0
  342. package/claude-assets/skills/cfn-redis-coordination/dist/task-analyzer.d.ts.map +1 -0
  343. package/claude-assets/skills/cfn-redis-coordination/dist/task-analyzer.js +305 -0
  344. package/claude-assets/skills/cfn-redis-coordination/dist/task-analyzer.js.map +1 -0
  345. package/claude-assets/skills/cfn-redis-coordination/dist/task-executor.d.ts +97 -0
  346. package/claude-assets/skills/cfn-redis-coordination/dist/task-executor.d.ts.map +1 -0
  347. package/claude-assets/skills/cfn-redis-coordination/dist/task-executor.js +283 -0
  348. package/claude-assets/skills/cfn-redis-coordination/dist/task-executor.js.map +1 -0
  349. package/claude-assets/skills/cfn-redis-coordination/dist/types.d.ts +176 -0
  350. package/claude-assets/skills/cfn-redis-coordination/dist/types.d.ts.map +1 -0
  351. package/claude-assets/skills/cfn-redis-coordination/dist/types.js +81 -0
  352. package/claude-assets/skills/cfn-redis-coordination/dist/types.js.map +1 -0
  353. package/claude-assets/skills/cfn-redis-coordination/dist/waiting-coordinator.d.ts +86 -0
  354. package/claude-assets/skills/cfn-redis-coordination/dist/waiting-coordinator.d.ts.map +1 -0
  355. package/claude-assets/skills/cfn-redis-coordination/dist/waiting-coordinator.js +419 -0
  356. package/claude-assets/skills/cfn-redis-coordination/dist/waiting-coordinator.js.map +1 -0
  357. package/claude-assets/skills/cfn-redis-coordination/docs/migration/PHASE_3_REDIS_COORDINATION_COMPLETION_REPORT.md +553 -0
  358. package/claude-assets/skills/cfn-redis-coordination/invoke-waiting-mode.sh +3 -2
  359. package/claude-assets/skills/cfn-redis-coordination/jest.config.js +23 -0
  360. package/claude-assets/skills/cfn-redis-coordination/package-lock.json +5272 -0
  361. package/claude-assets/skills/cfn-redis-coordination/package.json +45 -0
  362. package/claude-assets/skills/cfn-redis-coordination/redis-cli-wrapper.sh +21 -8
  363. package/claude-assets/skills/cfn-redis-coordination/redis-functions.sh +3 -2
  364. package/claude-assets/skills/cfn-redis-coordination/src/agent-logger.ts +446 -0
  365. package/claude-assets/skills/cfn-redis-coordination/src/agent-recovery.ts +454 -0
  366. package/claude-assets/skills/cfn-redis-coordination/src/completion-reporter.ts +396 -0
  367. package/claude-assets/skills/cfn-redis-coordination/src/context-manager.ts +327 -0
  368. package/claude-assets/skills/cfn-redis-coordination/src/index.ts +82 -0
  369. package/claude-assets/skills/cfn-redis-coordination/src/mode-detector.ts +155 -0
  370. package/claude-assets/skills/cfn-redis-coordination/src/redis/redis-client.ts +305 -0
  371. package/claude-assets/skills/cfn-redis-coordination/src/redis/redis-functions.ts +283 -0
  372. package/claude-assets/skills/cfn-redis-coordination/src/redis-client.ts +654 -0
  373. package/claude-assets/skills/cfn-redis-coordination/src/result-collector.ts +437 -0
  374. package/claude-assets/skills/cfn-redis-coordination/src/swarm-manager.ts +494 -0
  375. package/claude-assets/skills/cfn-redis-coordination/src/task-analyzer.ts +404 -0
  376. package/claude-assets/skills/cfn-redis-coordination/src/task-executor.ts +423 -0
  377. package/claude-assets/skills/cfn-redis-coordination/src/types.ts +235 -0
  378. package/claude-assets/skills/cfn-redis-coordination/src/waiting-coordinator.ts +587 -0
  379. package/claude-assets/skills/cfn-redis-coordination/test-connection-attempts.js +70 -0
  380. package/claude-assets/skills/cfn-redis-coordination/test-mode-simple.js +121 -0
  381. package/claude-assets/skills/cfn-redis-coordination/test-redis-check.js +84 -0
  382. package/claude-assets/skills/cfn-redis-coordination/test-task-mode-redis.cjs +391 -0
  383. package/claude-assets/skills/cfn-redis-coordination/tests/coordination.test.ts +779 -0
  384. package/claude-assets/skills/cfn-redis-coordination/tsconfig.json +31 -0
  385. package/claude-assets/skills/cfn-skill-propagation/README.md +233 -0
  386. package/claude-assets/skills/cfn-skill-propagation/package-lock.json +5174 -0
  387. package/claude-assets/skills/cfn-skill-propagation/package.json +52 -0
  388. package/claude-assets/skills/cfn-skill-propagation/propagate-skill-update.sh +32 -0
  389. package/claude-assets/skills/cfn-skill-propagation/src/cli.ts +75 -0
  390. package/claude-assets/skills/cfn-skill-propagation/src/database-adapter.ts +239 -0
  391. package/claude-assets/skills/cfn-skill-propagation/src/file-system-adapter.ts +113 -0
  392. package/claude-assets/skills/cfn-skill-propagation/src/index.ts +72 -0
  393. package/claude-assets/skills/cfn-skill-propagation/src/logger.ts +43 -0
  394. package/claude-assets/skills/cfn-skill-propagation/src/metadata-parser.ts +154 -0
  395. package/claude-assets/skills/cfn-skill-propagation/src/skill-propagator.ts +274 -0
  396. package/claude-assets/skills/cfn-skill-propagation/src/skill-validator.ts +179 -0
  397. package/claude-assets/skills/cfn-skill-propagation/src/types.ts +143 -0
  398. package/claude-assets/skills/cfn-skill-propagation/src/version-manager.ts +118 -0
  399. package/claude-assets/skills/cfn-skill-propagation/tests/file-system-adapter.test.ts +91 -0
  400. package/claude-assets/skills/cfn-skill-propagation/tests/metadata-parser.test.ts +176 -0
  401. package/claude-assets/skills/cfn-skill-propagation/tests/skill-propagator.test.ts +209 -0
  402. package/claude-assets/skills/cfn-skill-propagation/tests/skill-validator.test.ts +203 -0
  403. package/claude-assets/skills/cfn-skill-propagation/tests/version-manager.test.ts +115 -0
  404. package/claude-assets/skills/cfn-skill-propagation/tsconfig.json +34 -0
  405. package/claude-assets/skills/task-classifier/SKILL.md +81 -0
  406. package/claude-assets/skills/task-classifier/classify-task.sh +62 -0
  407. package/claude-assets/skills/workflow-codification/package-lock.json +5170 -0
  408. package/claude-assets/skills/workflow-codification/package.json +30 -0
  409. package/claude-assets/skills/workflow-codification/src/index.ts +24 -0
  410. package/claude-assets/skills/workflow-codification/src/pattern-analyzer.ts +537 -0
  411. package/claude-assets/skills/workflow-codification/src/types.ts +180 -0
  412. package/claude-assets/skills/workflow-codification/tests/pattern-analyzer.test.ts +960 -0
  413. package/claude-assets/skills/workflow-codification/tsconfig.json +34 -0
  414. package/claude-assets/skills/workflow-codification/workflow-codification.db +0 -0
  415. package/dist/agent-spawner/agent-spawner.js +448 -0
  416. package/dist/agent-spawner/agent-spawner.js.map +1 -0
  417. package/dist/agent-spawner/index.js +10 -0
  418. package/dist/agent-spawner/index.js.map +1 -0
  419. package/dist/agent-spawner/types.js +14 -0
  420. package/dist/agent-spawner/types.js.map +1 -0
  421. package/dist/cli/agent-executor.js +47 -1
  422. package/dist/cli/agent-executor.js.map +1 -1
  423. package/dist/cli/agent-spawn.js +4 -1
  424. package/dist/cli/agent-spawn.js.map +1 -1
  425. package/dist/cli/config-manager.js +109 -91
  426. package/dist/cli/config-manager.js.map +1 -1
  427. package/dist/cli/conversation-fork-cleanup.js +201 -0
  428. package/dist/cli/conversation-fork-cleanup.js.map +1 -0
  429. package/dist/cli/conversation-fork.js +16 -3
  430. package/dist/cli/conversation-fork.js.map +1 -1
  431. package/dist/cli/tool-executor.js +3 -1
  432. package/dist/cli/tool-executor.js.map +1 -1
  433. package/dist/gate-checker/gate-checker.js +292 -0
  434. package/dist/gate-checker/gate-checker.js.map +1 -0
  435. package/dist/gate-checker/types.js +94 -0
  436. package/dist/gate-checker/types.js.map +1 -0
  437. package/dist/lib/database-service/connection-pool-manager.js +2 -1
  438. package/dist/lib/database-service/connection-pool-manager.js.map +1 -1
  439. package/dist/orchestrator/index.js +10 -0
  440. package/dist/orchestrator/index.js.map +1 -0
  441. package/dist/orchestrator/orchestrate.js +496 -0
  442. package/dist/orchestrator/orchestrate.js.map +1 -0
  443. package/dist/orchestrator/types.js +58 -0
  444. package/dist/orchestrator/types.js.map +1 -0
  445. package/docs/BUG_19_MEMORY_LEAK_TASK_MODE.md +405 -0
  446. package/docs/MEMORY_CLEANUP_GUIDE.md +358 -0
  447. package/docs/MEMORY_LEAK_FIX_SUMMARY.md +322 -0
  448. package/docs/REDIS_CLEANUP_EXECUTIVE_SUMMARY.md +319 -0
  449. package/docs/REDIS_CLEANUP_VERIFICATION_REPORT.md +574 -0
  450. package/package.json +208 -201
  451. package/readme/README.md +34 -1
  452. package/scripts/switch-api.sh +142 -4
  453. package/scripts/verify-no-secrets.sh +6 -13
  454. package/scripts/verify-redis-cleanup.sh +173 -0
  455. package/tests/README.md +201 -0
  456. package/tests/test-memory-leak-task-mode.sh +435 -0
@@ -0,0 +1,587 @@
1
+ /**
2
+ * Waiting Coordinator
3
+ *
4
+ * Handles blocking coordination using Redis BLPOP for agents to wait
5
+ * for specific conditions (gate passed, consensus reached, etc).
6
+ *
7
+ * Migrated from:
8
+ * - invoke-waiting-mode.sh (223 lines)
9
+ */
10
+
11
+ import type {
12
+ TaskId,
13
+ AgentId,
14
+ Logger
15
+ } from './types';
16
+ import {
17
+ CoordinationError,
18
+ CoordinationErrorType,
19
+ isValidTaskId,
20
+ isValidAgentId
21
+ } from './types';
22
+ import { RedisCoordinator } from './redis-client';
23
+
24
+ export interface WaitResult {
25
+ condition: string;
26
+ met: boolean;
27
+ timedOut: boolean;
28
+ waitedMs: number;
29
+ metadata?: Record<string, unknown>;
30
+ }
31
+
32
+ export interface SignalResult {
33
+ agentId: AgentId;
34
+ signalType: string;
35
+ status: string;
36
+ timestamp: string;
37
+ }
38
+
39
+ export class WaitingCoordinator {
40
+ constructor(
41
+ private redis: RedisCoordinator,
42
+ private logger: Logger
43
+ ) {}
44
+
45
+ /**
46
+ * Wait for a specific condition with BLPOP (blocking)
47
+ *
48
+ * Blocks until condition is signaled or timeout occurs.
49
+ * In Task Mode: Returns immediately with false
50
+ * In CLI Mode: Blocks on Redis list
51
+ */
52
+ async waitForCompletion(
53
+ taskId: TaskId,
54
+ agentId: AgentId,
55
+ timeoutSeconds: number = 300,
56
+ namespace: string = 'swarm'
57
+ ): Promise<WaitResult> {
58
+ // Validate inputs
59
+ if (!isValidTaskId(taskId)) {
60
+ throw new CoordinationError(
61
+ CoordinationErrorType.VALIDATION_ERROR,
62
+ `Invalid task ID: ${taskId}`
63
+ );
64
+ }
65
+
66
+ if (!isValidAgentId(agentId)) {
67
+ throw new CoordinationError(
68
+ CoordinationErrorType.VALIDATION_ERROR,
69
+ `Invalid agent ID: ${agentId}`
70
+ );
71
+ }
72
+
73
+ const startTime = Date.now();
74
+
75
+ // Graceful no-op in Task Mode
76
+ if (!this.redis.canUseRedis) {
77
+ this.logger.info(`Task Mode: Wait for completion skipped (no Redis) - Agent: ${agentId}`);
78
+ return {
79
+ condition: 'agent-completion',
80
+ met: true,
81
+ timedOut: false,
82
+ waitedMs: 0
83
+ };
84
+ }
85
+
86
+ // CLI Mode: Block on Redis list
87
+ const doneKey = `${namespace}:${taskId}:${agentId}:done`;
88
+
89
+ try {
90
+ this.logger.info(`⏳ Waiting for completion: ${agentId} (timeout: ${timeoutSeconds}s)`);
91
+
92
+ // BLPOP with timeout (Redis timeout in seconds)
93
+ const result = await this.redis.blpop(doneKey, timeoutSeconds);
94
+
95
+ const waitedMs = Date.now() - startTime;
96
+
97
+ if (result) {
98
+ this.logger.info(`✅ Agent completed: ${agentId} (waited ${waitedMs}ms)`);
99
+ return {
100
+ condition: 'agent-completion',
101
+ met: true,
102
+ timedOut: false,
103
+ waitedMs,
104
+ metadata: { signal: result[1] }
105
+ };
106
+ } else {
107
+ this.logger.warn(`⏱️ Timeout waiting for agent: ${agentId} (${timeoutSeconds}s)`);
108
+ return {
109
+ condition: 'agent-completion',
110
+ met: false,
111
+ timedOut: true,
112
+ waitedMs
113
+ };
114
+ }
115
+ } catch (error) {
116
+ this.logger.error('Failed to wait for completion', error as Error);
117
+ throw new CoordinationError(
118
+ CoordinationErrorType.REDIS_UNAVAILABLE,
119
+ `Failed to wait for completion: ${(error as Error).message}`
120
+ );
121
+ }
122
+ }
123
+
124
+ /**
125
+ * Wait for gate to pass (test pass rate threshold)
126
+ *
127
+ * Blocks until gate-passed signal is received.
128
+ * In Task Mode: Returns immediately with true
129
+ * In CLI Mode: Blocks on Redis list
130
+ */
131
+ async waitForGate(
132
+ taskId: TaskId,
133
+ timeoutSeconds: number = 600,
134
+ namespace: string = 'swarm'
135
+ ): Promise<WaitResult> {
136
+ // Validate input
137
+ if (!isValidTaskId(taskId)) {
138
+ throw new CoordinationError(
139
+ CoordinationErrorType.VALIDATION_ERROR,
140
+ `Invalid task ID: ${taskId}`
141
+ );
142
+ }
143
+
144
+ const startTime = Date.now();
145
+
146
+ // Graceful no-op in Task Mode
147
+ if (!this.redis.canUseRedis) {
148
+ this.logger.info('Task Mode: Wait for gate skipped (no Redis)');
149
+ return {
150
+ condition: 'gate-passed',
151
+ met: true,
152
+ timedOut: false,
153
+ waitedMs: 0
154
+ };
155
+ }
156
+
157
+ // CLI Mode: Block on Redis list
158
+ const gateKey = `${namespace}:${taskId}:gate-passed`;
159
+
160
+ try {
161
+ this.logger.info(`⏳ Waiting for gate to pass (timeout: ${timeoutSeconds}s)`);
162
+
163
+ // BLPOP with timeout
164
+ const result = await this.redis.blpop(gateKey, timeoutSeconds);
165
+
166
+ const waitedMs = Date.now() - startTime;
167
+
168
+ if (result) {
169
+ this.logger.info(`✅ Gate passed (waited ${waitedMs}ms)`);
170
+ return {
171
+ condition: 'gate-passed',
172
+ met: true,
173
+ timedOut: false,
174
+ waitedMs,
175
+ metadata: { signal: result[1] }
176
+ };
177
+ } else {
178
+ this.logger.warn(`⏱️ Timeout waiting for gate (${timeoutSeconds}s)`);
179
+ return {
180
+ condition: 'gate-passed',
181
+ met: false,
182
+ timedOut: true,
183
+ waitedMs
184
+ };
185
+ }
186
+ } catch (error) {
187
+ this.logger.error('Failed to wait for gate', error as Error);
188
+ throw new CoordinationError(
189
+ CoordinationErrorType.REDIS_UNAVAILABLE,
190
+ `Failed to wait for gate: ${(error as Error).message}`
191
+ );
192
+ }
193
+ }
194
+
195
+ /**
196
+ * Wait for consensus to be reached from validators
197
+ *
198
+ * Blocks until consensus signal is received.
199
+ * In Task Mode: Returns immediately with true
200
+ * In CLI Mode: Blocks on Redis list
201
+ */
202
+ async waitForConsensus(
203
+ taskId: TaskId,
204
+ timeoutSeconds: number = 600,
205
+ namespace: string = 'swarm'
206
+ ): Promise<WaitResult> {
207
+ // Validate input
208
+ if (!isValidTaskId(taskId)) {
209
+ throw new CoordinationError(
210
+ CoordinationErrorType.VALIDATION_ERROR,
211
+ `Invalid task ID: ${taskId}`
212
+ );
213
+ }
214
+
215
+ const startTime = Date.now();
216
+
217
+ // Graceful no-op in Task Mode
218
+ if (!this.redis.canUseRedis) {
219
+ this.logger.info('Task Mode: Wait for consensus skipped (no Redis)');
220
+ return {
221
+ condition: 'consensus-reached',
222
+ met: true,
223
+ timedOut: false,
224
+ waitedMs: 0
225
+ };
226
+ }
227
+
228
+ // CLI Mode: Block on Redis list
229
+ const consensusKey = `${namespace}:${taskId}:consensus-reached`;
230
+
231
+ try {
232
+ this.logger.info(`⏳ Waiting for consensus (timeout: ${timeoutSeconds}s)`);
233
+
234
+ // BLPOP with timeout
235
+ const result = await this.redis.blpop(consensusKey, timeoutSeconds);
236
+
237
+ const waitedMs = Date.now() - startTime;
238
+
239
+ if (result) {
240
+ this.logger.info(`✅ Consensus reached (waited ${waitedMs}ms)`);
241
+ return {
242
+ condition: 'consensus-reached',
243
+ met: true,
244
+ timedOut: false,
245
+ waitedMs,
246
+ metadata: { signal: result[1] }
247
+ };
248
+ } else {
249
+ this.logger.warn(`⏱️ Timeout waiting for consensus (${timeoutSeconds}s)`);
250
+ return {
251
+ condition: 'consensus-reached',
252
+ met: false,
253
+ timedOut: true,
254
+ waitedMs
255
+ };
256
+ }
257
+ } catch (error) {
258
+ this.logger.error('Failed to wait for consensus', error as Error);
259
+ throw new CoordinationError(
260
+ CoordinationErrorType.REDIS_UNAVAILABLE,
261
+ `Failed to wait for consensus: ${(error as Error).message}`
262
+ );
263
+ }
264
+ }
265
+
266
+ /**
267
+ * Wait for custom condition by key name
268
+ *
269
+ * Generic wait mechanism for any condition.
270
+ * In Task Mode: Returns immediately with true
271
+ * In CLI Mode: Blocks on Redis list
272
+ */
273
+ async waitForCondition(
274
+ taskId: TaskId,
275
+ conditionName: string,
276
+ timeoutSeconds: number = 300,
277
+ namespace: string = 'swarm'
278
+ ): Promise<WaitResult> {
279
+ // Validate input
280
+ if (!isValidTaskId(taskId)) {
281
+ throw new CoordinationError(
282
+ CoordinationErrorType.VALIDATION_ERROR,
283
+ `Invalid task ID: ${taskId}`
284
+ );
285
+ }
286
+
287
+ if (!conditionName || conditionName.length === 0) {
288
+ throw new CoordinationError(
289
+ CoordinationErrorType.VALIDATION_ERROR,
290
+ 'Condition name cannot be empty'
291
+ );
292
+ }
293
+
294
+ const startTime = Date.now();
295
+
296
+ // Graceful no-op in Task Mode
297
+ if (!this.redis.canUseRedis) {
298
+ this.logger.info(`Task Mode: Wait for condition skipped (no Redis) - ${conditionName}`);
299
+ return {
300
+ condition: conditionName,
301
+ met: true,
302
+ timedOut: false,
303
+ waitedMs: 0
304
+ };
305
+ }
306
+
307
+ // CLI Mode: Block on Redis list
308
+ const conditionKey = `${namespace}:${taskId}:${conditionName}`;
309
+
310
+ try {
311
+ this.logger.info(`⏳ Waiting for condition: ${conditionName} (timeout: ${timeoutSeconds}s)`);
312
+
313
+ // BLPOP with timeout
314
+ const result = await this.redis.blpop(conditionKey, timeoutSeconds);
315
+
316
+ const waitedMs = Date.now() - startTime;
317
+
318
+ if (result) {
319
+ this.logger.info(`✅ Condition met: ${conditionName} (waited ${waitedMs}ms)`);
320
+ return {
321
+ condition: conditionName,
322
+ met: true,
323
+ timedOut: false,
324
+ waitedMs,
325
+ metadata: { signal: result[1] }
326
+ };
327
+ } else {
328
+ this.logger.warn(`⏱️ Timeout waiting for condition: ${conditionName} (${timeoutSeconds}s)`);
329
+ return {
330
+ condition: conditionName,
331
+ met: false,
332
+ timedOut: true,
333
+ waitedMs
334
+ };
335
+ }
336
+ } catch (error) {
337
+ this.logger.error('Failed to wait for condition', error as Error);
338
+ throw new CoordinationError(
339
+ CoordinationErrorType.REDIS_UNAVAILABLE,
340
+ `Failed to wait for condition ${conditionName}: ${(error as Error).message}`
341
+ );
342
+ }
343
+ }
344
+
345
+ /**
346
+ * Signal a condition to wake waiting agents
347
+ *
348
+ * In Task Mode: Logs and returns gracefully
349
+ * In CLI Mode: Pushes signal to Redis list
350
+ */
351
+ async signalCondition(
352
+ taskId: TaskId,
353
+ conditionName: string,
354
+ metadata?: Record<string, unknown>,
355
+ namespace: string = 'swarm'
356
+ ): Promise<SignalResult> {
357
+ // Validate input
358
+ if (!isValidTaskId(taskId)) {
359
+ throw new CoordinationError(
360
+ CoordinationErrorType.VALIDATION_ERROR,
361
+ `Invalid task ID: ${taskId}`
362
+ );
363
+ }
364
+
365
+ if (!conditionName || conditionName.length === 0) {
366
+ throw new CoordinationError(
367
+ CoordinationErrorType.VALIDATION_ERROR,
368
+ 'Condition name cannot be empty'
369
+ );
370
+ }
371
+
372
+ const timestamp = new Date().toISOString();
373
+
374
+ // Graceful no-op in Task Mode
375
+ if (!this.redis.canUseRedis) {
376
+ this.logger.info(`Task Mode: Condition signal skipped (no Redis) - ${conditionName}`);
377
+ return {
378
+ agentId: 'orchestrator' as AgentId,
379
+ signalType: conditionName,
380
+ status: 'signaled',
381
+ timestamp
382
+ };
383
+ }
384
+
385
+ // CLI Mode: Push signal to Redis
386
+ const conditionKey = `${namespace}:${taskId}:${conditionName}`;
387
+
388
+ try {
389
+ const payload = JSON.stringify({
390
+ conditionName,
391
+ timestamp,
392
+ metadata: metadata || {}
393
+ });
394
+
395
+ await this.redis.lpush(conditionKey, payload);
396
+
397
+ // Set TTL (1 hour - long enough for agents to see it)
398
+ await this.redis.expire(conditionKey, 3600);
399
+
400
+ this.logger.info(`✅ Signal sent: ${conditionName}`);
401
+
402
+ return {
403
+ agentId: 'orchestrator' as AgentId,
404
+ signalType: conditionName,
405
+ status: 'signaled',
406
+ timestamp
407
+ };
408
+ } catch (error) {
409
+ this.logger.error('Failed to signal condition', error as Error);
410
+ throw new CoordinationError(
411
+ CoordinationErrorType.REDIS_UNAVAILABLE,
412
+ `Failed to signal condition ${conditionName}: ${(error as Error).message}`
413
+ );
414
+ }
415
+ }
416
+
417
+ /**
418
+ * Wait for multiple agents to complete with parallel blocking
419
+ *
420
+ * In Task Mode: Returns immediately
421
+ * In CLI Mode: Blocks on multiple agent done keys
422
+ */
423
+ async waitForMultipleAgents(
424
+ taskId: TaskId,
425
+ agentIds: AgentId[],
426
+ timeoutSeconds: number = 600,
427
+ namespace: string = 'swarm'
428
+ ): Promise<{
429
+ completed: AgentId[];
430
+ timedOut: boolean;
431
+ waitedMs: number;
432
+ }> {
433
+ // Validate input
434
+ if (!isValidTaskId(taskId)) {
435
+ throw new CoordinationError(
436
+ CoordinationErrorType.VALIDATION_ERROR,
437
+ `Invalid task ID: ${taskId}`
438
+ );
439
+ }
440
+
441
+ if (!agentIds || agentIds.length === 0) {
442
+ throw new CoordinationError(
443
+ CoordinationErrorType.VALIDATION_ERROR,
444
+ 'Agent IDs list cannot be empty'
445
+ );
446
+ }
447
+
448
+ // Graceful no-op in Task Mode
449
+ if (!this.redis.canUseRedis) {
450
+ this.logger.info('Task Mode: Wait for multiple agents skipped (no Redis)');
451
+ return {
452
+ completed: agentIds,
453
+ timedOut: false,
454
+ waitedMs: 0
455
+ };
456
+ }
457
+
458
+ const startTime = Date.now();
459
+ const completed: AgentId[] = [];
460
+ const keys = agentIds.map(id => `${namespace}:${taskId}:${id}:done`);
461
+
462
+ try {
463
+ this.logger.info(`⏳ Waiting for ${agentIds.length} agents to complete (timeout: ${timeoutSeconds}s)`);
464
+
465
+ while (completed.length < agentIds.length) {
466
+ const waitedMs = Date.now() - startTime;
467
+
468
+ // Check timeout
469
+ if (waitedMs / 1000 >= timeoutSeconds) {
470
+ this.logger.warn(`⏱️ Timeout waiting for agents to complete`);
471
+ return {
472
+ completed,
473
+ timedOut: true,
474
+ waitedMs
475
+ };
476
+ }
477
+
478
+ // Calculate remaining timeout for BLPOP
479
+ const remainingSeconds = timeoutSeconds - (waitedMs / 1000);
480
+
481
+ // BLPOP on all remaining keys
482
+ const pendingKeys = agentIds
483
+ .filter(id => !completed.includes(id))
484
+ .map(id => `${namespace}:${taskId}:${id}:done`);
485
+
486
+ if (pendingKeys.length === 0) break;
487
+
488
+ // BLPOP returns [key, value] or null
489
+ const blpopArgs: Array<string | number> = [...pendingKeys, Math.ceil(remainingSeconds)];
490
+ const result = await this.redis.blpop(...blpopArgs);
491
+
492
+ if (result) {
493
+ const key = result[0];
494
+ // Extract agent ID from key: "namespace:taskId:agentId:done"
495
+ const agentId = key.split(':')[2] as AgentId;
496
+ if (!completed.includes(agentId)) {
497
+ completed.push(agentId);
498
+ this.logger.info(`✅ Agent completed: ${agentId}`);
499
+ }
500
+ }
501
+ }
502
+
503
+ const waitedMs = Date.now() - startTime;
504
+ this.logger.info(`✅ All agents completed (waited ${waitedMs}ms)`);
505
+
506
+ return {
507
+ completed,
508
+ timedOut: false,
509
+ waitedMs
510
+ };
511
+ } catch (error) {
512
+ this.logger.error('Failed to wait for multiple agents', error as Error);
513
+ throw new CoordinationError(
514
+ CoordinationErrorType.REDIS_UNAVAILABLE,
515
+ `Failed to wait for multiple agents: ${(error as Error).message}`
516
+ );
517
+ }
518
+ }
519
+
520
+ /**
521
+ * Poll for condition (non-blocking alternative to BLPOP)
522
+ *
523
+ * Useful when you can't use BLPOP (Task Mode stubbing issues).
524
+ */
525
+ async pollForCondition(
526
+ taskId: TaskId,
527
+ conditionName: string,
528
+ timeoutSeconds: number = 300,
529
+ pollIntervalMs: number = 1000,
530
+ namespace: string = 'swarm'
531
+ ): Promise<WaitResult> {
532
+ // Validate input
533
+ if (!isValidTaskId(taskId)) {
534
+ throw new CoordinationError(
535
+ CoordinationErrorType.VALIDATION_ERROR,
536
+ `Invalid task ID: ${taskId}`
537
+ );
538
+ }
539
+
540
+ const startTime = Date.now();
541
+ const conditionKey = `${namespace}:${taskId}:${conditionName}`;
542
+
543
+ try {
544
+ this.logger.info(
545
+ `⏳ Polling for condition: ${conditionName} (timeout: ${timeoutSeconds}s, poll interval: ${pollIntervalMs}ms)`
546
+ );
547
+
548
+ while (true) {
549
+ const waitedMs = Date.now() - startTime;
550
+
551
+ // Check timeout
552
+ if (waitedMs / 1000 >= timeoutSeconds) {
553
+ this.logger.warn(`⏱️ Timeout polling for condition: ${conditionName}`);
554
+ return {
555
+ condition: conditionName,
556
+ met: false,
557
+ timedOut: true,
558
+ waitedMs
559
+ };
560
+ }
561
+
562
+ // Check condition
563
+ if (this.redis.canUseRedis) {
564
+ const result = await this.redis.get(conditionKey);
565
+ if (result && result === 'true') {
566
+ this.logger.info(`✅ Condition met via polling: ${conditionName}`);
567
+ return {
568
+ condition: conditionName,
569
+ met: true,
570
+ timedOut: false,
571
+ waitedMs
572
+ };
573
+ }
574
+ }
575
+
576
+ // Wait before next poll
577
+ await new Promise(resolve => setTimeout(resolve, pollIntervalMs));
578
+ }
579
+ } catch (error) {
580
+ this.logger.error('Failed to poll for condition', error as Error);
581
+ throw new CoordinationError(
582
+ CoordinationErrorType.REDIS_UNAVAILABLE,
583
+ `Failed to poll for condition ${conditionName}: ${(error as Error).message}`
584
+ );
585
+ }
586
+ }
587
+ }
@@ -0,0 +1,70 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Test to detect connection attempts during mode detection
5
+ */
6
+
7
+ // Track network activity
8
+ let redisImportAttempts = 0;
9
+ let connectionAttempts = 0;
10
+
11
+ // Intercept require to track Redis module usage
12
+ const Module = require('module');
13
+ const originalRequire = Module.prototype.require;
14
+
15
+ Module.prototype.require = function(id) {
16
+ if (id === 'ioredis') {
17
+ redisImportAttempts++;
18
+ console.log(`🔍 Redis module import attempt #${redisImportAttempts}`);
19
+ }
20
+ return originalRequire.apply(this, arguments);
21
+ };
22
+
23
+ async function testConnectionAttempts() {
24
+ console.log('🔍 Testing Connection Attempts in Task Mode');
25
+ console.log('='.repeat(50));
26
+
27
+ // Test 1: Mode detection (this may trigger Redis availability check)
28
+ console.log('\n📍 1. Testing mode detection (may trigger Redis check):');
29
+
30
+ process.env.CFN_MODE = 'task';
31
+
32
+ const { detectMode } = require('./dist/mode-detector.js');
33
+ const detection = await detectMode();
34
+
35
+ console.log('Mode detection result:', detection);
36
+ console.log('Redis module imports during detection:', redisImportAttempts);
37
+
38
+ // Test 2: Redis coordinator initialization
39
+ console.log('\n📍 2. Testing Redis coordinator initialization:');
40
+
41
+ const { RedisCoordinator } = require('./dist/redis-client.js');
42
+ const coordinator = new RedisCoordinator();
43
+
44
+ const preInitImports = redisImportAttempts;
45
+ await coordinator.initialize();
46
+
47
+ console.log('Redis module imports during init:', redisImportAttempts - preInitImports);
48
+ console.log('Coordinator has client:', !!coordinator.client);
49
+ console.log('Can use Redis:', coordinator.canUseRedis);
50
+
51
+ // Test 3: Attempt some operations
52
+ console.log('\n📍 3. Testing Redis operations:');
53
+
54
+ const preOpImports = redisImportAttempts;
55
+ await coordinator.ping();
56
+ await coordinator.set('test', 'value');
57
+ await coordinator.get('test');
58
+
59
+ console.log('Redis module imports during operations:', redisImportAttempts - preOpImports);
60
+
61
+ console.log('\n📊 SUMMARY:');
62
+ console.log('Total Redis module imports:', redisImportAttempts);
63
+ console.log('Connection attempts made:', connectionAttempts);
64
+ console.log('Any network activity detected:', redisImportAttempts > 0);
65
+
66
+ // Clean up
67
+ await coordinator.disconnect();
68
+ }
69
+
70
+ testConnectionAttempts().catch(console.error);