claude-flow-novice 2.15.0 → 2.15.2

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 (605) hide show
  1. package/.claude/cfn-extras/agents/cfn-coordinator-enterprise.md +1303 -0
  2. package/.claude/cfn-extras/agents/cfn-coordinator-mvp.md +942 -0
  3. package/.claude/cfn-extras/agents/cfn-coordinator-standard.md +1062 -0
  4. package/.claude/cfn-extras/agents/cfn-loop-coordinator.md +157 -0
  5. package/.claude/cfn-extras/agents/coordinator.md +182 -0
  6. package/.claude/cfn-extras/agents/cost-savings-cfn-loop-coordinator.md +760 -0
  7. package/.claude/cfn-extras/agents/cost-savings-coordinator.md +173 -0
  8. package/.claude/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator-enhanced.md +147 -0
  9. package/.claude/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md +162 -0
  10. package/.claude/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +161 -0
  11. package/.claude/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md +729 -0
  12. package/.claude/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +728 -0
  13. package/.claude/cfn-extras/agents/deprecated-coordinators/byzantine-coordinator.md +100 -0
  14. package/.claude/cfn-extras/agents/deprecated-coordinators/cfn-coordinator-enterprise.md +323 -0
  15. package/.claude/cfn-extras/agents/deprecated-coordinators/cfn-coordinator-mvp.md +157 -0
  16. package/.claude/cfn-extras/agents/deprecated-coordinators/cfn-coordinator-standard.md +229 -0
  17. package/.claude/cfn-extras/agents/deprecated-coordinators/cfn-coordinator-unified.md +149 -0
  18. package/.claude/cfn-extras/agents/deprecated-coordinators/coordinator-hybrid.md +231 -0
  19. package/.claude/cfn-extras/agents/deprecated-coordinators/gossip-coordinator.md +165 -0
  20. package/.claude/cfn-extras/agents/deprecated-coordinators/hierarchical-coordinator.md +95 -0
  21. package/.claude/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md +132 -0
  22. package/.claude/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +131 -0
  23. package/.claude/cfn-extras/agents/deprecated-coordinators/task-coordinator.md +109 -0
  24. package/.claude/cfn-extras/agents/deprecated-coordinators/test-coordinator.md +142 -0
  25. package/.claude/cfn-extras/agents/google-sheets-specialist.md +614 -0
  26. package/.claude/commands/cfn/create-handoff.md +224 -0
  27. package/.claude/commands/cfn-docker/CFN_DOCKER_NATIVE.md +295 -0
  28. package/.claude/commands/cfn-docker-core-test-suite.md +326 -0
  29. package/.claude/commands/cfn-loop-cli.md +1 -1
  30. package/.claude/commands/switch-api.md +20 -6
  31. package/.claude/root-claude-distribute/CFN-CLAUDE.md +177 -426
  32. package/.claude/skills/cfn-docker-agent-spawning/spawn-agent.sh +27 -18
  33. package/.claude/skills/cfn-docker-loop-orchestration/orchestrate.sh +763 -38
  34. package/.claude/skills/cfn-docker-redis-coordination/coordinate.sh +25 -10
  35. package/.claude/skills/cfn-docker-redis-coordination/coordinate.sh.backup-1763145142 +641 -0
  36. package/.claude/skills/cfn-docker-skill-mcp-selection/skill-mcp-selector.js +471 -471
  37. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +52 -23
  38. package/.claude/skills/cfn-redis-coordination/complete-swarm.sh +3 -3
  39. package/.claude/skills/cfn-redis-coordination/data/cfn-loop.db +0 -0
  40. package/.claude/skills/cfn-redis-coordination/redis-cli-wrapper.sh +9 -0
  41. package/.claude/skills/cfn-redis-coordination/report-completion.sh +7 -7
  42. package/claude-assets/agents/cfn-dev-team/architecture/api-designer-persona.md +2 -0
  43. package/claude-assets/agents/cfn-dev-team/architecture/goal-planner.md +2 -0
  44. package/claude-assets/agents/cfn-dev-team/architecture/planner.md +2 -0
  45. package/claude-assets/agents/cfn-dev-team/architecture/system-architect.md +2 -0
  46. package/claude-assets/agents/cfn-dev-team/coordinators/handoff-coordinator.md +662 -0
  47. package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +448 -563
  48. package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +2 -0
  49. package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +2 -0
  50. package/claude-assets/agents/cfn-dev-team/documentation/README-VALIDATION.md +2 -0
  51. package/claude-assets/agents/cfn-dev-team/documentation/agent-type-guidelines.md +2 -0
  52. package/claude-assets/agents/cfn-dev-team/reviewers/quality/code-quality-validator.md +1 -1
  53. package/claude-assets/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +1 -1
  54. package/claude-assets/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +2 -0
  55. package/claude-assets/agents/cfn-dev-team/reviewers/quality/quality-metrics.md +2 -0
  56. package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +2 -0
  57. package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +1 -1
  58. package/claude-assets/agents/cfn-dev-team/testers/e2e/playwright-tester.md +1 -1
  59. package/claude-assets/agents/cfn-dev-team/testers/interaction-tester.md +2 -0
  60. package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +2 -0
  61. package/claude-assets/agents/cfn-dev-team/testers/playwright-tester.md +2 -0
  62. package/claude-assets/agents/cfn-dev-team/testers/unit/tdd-london-unit-swarm.md +4 -0
  63. package/claude-assets/agents/cfn-dev-team/testers/validation/validation-production-validator.md +1 -1
  64. package/claude-assets/agents/docker-coordinators/cfn-docker-v3-coordinator.md +825 -17
  65. package/claude-assets/agents/docker-team/micro-sprint-planner.md +747 -0
  66. package/claude-assets/agents/docker-ts-fixer.md +56 -0
  67. package/claude-assets/agents/typescript-specialist.md +280 -0
  68. package/claude-assets/cfn-extras/agents/cfn-coordinator-enterprise.md +1303 -0
  69. package/claude-assets/cfn-extras/agents/cfn-coordinator-mvp.md +942 -0
  70. package/claude-assets/cfn-extras/agents/cfn-coordinator-standard.md +1062 -0
  71. package/claude-assets/cfn-extras/agents/cfn-loop-coordinator.md +157 -0
  72. package/claude-assets/cfn-extras/agents/coordinator.md +182 -0
  73. package/claude-assets/cfn-extras/agents/cost-savings-cfn-loop-coordinator.md +760 -0
  74. package/claude-assets/cfn-extras/agents/cost-savings-coordinator.md +173 -0
  75. package/claude-assets/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator-enhanced.md +147 -0
  76. package/claude-assets/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md +162 -0
  77. package/claude-assets/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +161 -0
  78. package/claude-assets/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md +729 -0
  79. package/claude-assets/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +728 -0
  80. package/claude-assets/cfn-extras/agents/deprecated-coordinators/byzantine-coordinator.md +100 -0
  81. package/claude-assets/cfn-extras/agents/deprecated-coordinators/cfn-coordinator-enterprise.md +323 -0
  82. package/claude-assets/cfn-extras/agents/deprecated-coordinators/cfn-coordinator-mvp.md +157 -0
  83. package/claude-assets/cfn-extras/agents/deprecated-coordinators/cfn-coordinator-standard.md +229 -0
  84. package/claude-assets/cfn-extras/agents/deprecated-coordinators/cfn-coordinator-unified.md +149 -0
  85. package/claude-assets/cfn-extras/agents/deprecated-coordinators/coordinator-hybrid.md +231 -0
  86. package/claude-assets/cfn-extras/agents/deprecated-coordinators/gossip-coordinator.md +165 -0
  87. package/claude-assets/cfn-extras/agents/deprecated-coordinators/hierarchical-coordinator.md +95 -0
  88. package/claude-assets/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md +132 -0
  89. package/claude-assets/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +131 -0
  90. package/claude-assets/cfn-extras/agents/deprecated-coordinators/task-coordinator.md +109 -0
  91. package/claude-assets/cfn-extras/agents/deprecated-coordinators/test-coordinator.md +142 -0
  92. package/claude-assets/cfn-extras/agents/google-sheets-specialist.md +614 -0
  93. package/claude-assets/cfn-extras/skills/advanced-features/cfn-agent-swap/SKILL.md +36 -0
  94. package/claude-assets/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +60 -0
  95. package/claude-assets/cfn-extras/skills/advanced-features/cfn-api-validation/test-endpoints.sh +54 -0
  96. package/claude-assets/cfn-extras/skills/advanced-features/cfn-context-pruner/SKILL.md +75 -0
  97. package/claude-assets/cfn-extras/skills/advanced-features/cfn-context-pruner/prune-context.sh +73 -0
  98. package/claude-assets/cfn-extras/skills/advanced-features/cfn-task-mode-safety/cli-coordination.sh +519 -0
  99. package/claude-assets/cfn-extras/skills/advanced-features/cfn-task-mode-safety/mode-detection.sh +326 -0
  100. package/claude-assets/cfn-extras/skills/advanced-features/cfn-task-mode-sanitize/task-mode-env-sanitizer.sh +267 -0
  101. package/claude-assets/cfn-extras/skills/analytics/cfn-improvement-recommender/SKILL.md +33 -0
  102. package/claude-assets/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +92 -0
  103. package/claude-assets/cfn-extras/skills/analytics/cfn-memory-monitoring/SKILL.md +531 -0
  104. package/claude-assets/cfn-extras/skills/analytics/cfn-pattern-extraction/SKILL.md +30 -0
  105. package/claude-assets/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +80 -0
  106. package/claude-assets/cfn-extras/skills/analytics/cfn-retrospective-report/SKILL.md +31 -0
  107. package/claude-assets/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +101 -0
  108. package/claude-assets/cfn-extras/skills/analytics/cfn-telemetry/collect-metrics.sh +249 -0
  109. package/claude-assets/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +111 -0
  110. package/claude-assets/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +192 -0
  111. package/claude-assets/cfn-extras/skills/deprecated/cfn-simplified-agent-lifecycle/COST_ANALYSIS.md +49 -0
  112. package/claude-assets/cfn-extras/skills/deprecated/cfn-simplified-agent-lifecycle/DESIGN.md +98 -0
  113. package/claude-assets/cfn-extras/skills/deprecated/cfn-simplified-agent-lifecycle/MIGRATION_PLAN.md +74 -0
  114. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/SKILL.md +392 -0
  115. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -0
  116. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -0
  117. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -0
  118. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -0
  119. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -0
  120. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-analytics-data/SKILL.md +124 -0
  121. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-analytics-data/operations/get-ad-performance.sh +105 -0
  122. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-analytics-data/operations/get-conversion-funnel.sh +102 -0
  123. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-analytics-data/operations/get-email-performance.sh +105 -0
  124. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-analytics-data/operations/get-social-engagement.sh +105 -0
  125. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-analytics-data/operations/get-website-traffic.sh +107 -0
  126. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/SKILL.md +340 -0
  127. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -0
  128. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -0
  129. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -0
  130. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -0
  131. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -0
  132. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-competitive-intel/SKILL.md +350 -0
  133. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-competitive-intel/operations/get-backlink-profile.sh +154 -0
  134. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-competitive-intel/operations/get-keyword-rankings.sh +173 -0
  135. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-competitive-intel/operations/get-trending-topics.sh +147 -0
  136. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-competitive-intel/operations/monitor-competitor.sh +146 -0
  137. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-competitive-intel/operations/search-brand-mentions.sh +167 -0
  138. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-crm-contacts/SKILL.md +116 -0
  139. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-crm-contacts/operations/add-to-segment.sh +78 -0
  140. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-crm-contacts/operations/create-contact.sh +113 -0
  141. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-crm-contacts/operations/get-contact.sh +86 -0
  142. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-crm-contacts/operations/remove-from-segment.sh +78 -0
  143. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-crm-contacts/operations/update-contact.sh +120 -0
  144. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-email-campaigns/SKILL.md +106 -0
  145. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-email-campaigns/operations/create-campaign.sh +123 -0
  146. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-email-campaigns/operations/get-campaign-stats.sh +66 -0
  147. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-email-campaigns/operations/list-templates.sh +68 -0
  148. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-email-campaigns/operations/schedule-campaign.sh +85 -0
  149. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-email-campaigns/operations/send-test-email.sh +81 -0
  150. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-landing-pages/SKILL.md +366 -0
  151. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-landing-pages/operations/create-ab-test.sh +231 -0
  152. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-landing-pages/operations/create-landing-page.sh +190 -0
  153. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-landing-pages/operations/get-page-performance.sh +137 -0
  154. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-landing-pages/operations/publish-page.sh +120 -0
  155. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-landing-pages/operations/unpublish-page.sh +108 -0
  156. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-media-monitoring/SKILL.md +202 -0
  157. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-media-monitoring/operations/create-crisis-alert.sh +104 -0
  158. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-media-monitoring/operations/export-report.sh +92 -0
  159. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-media-monitoring/operations/get-sentiment-analysis.sh +85 -0
  160. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-media-monitoring/operations/search-mentions.sh +86 -0
  161. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-media-outreach/SKILL.md +168 -0
  162. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-media-outreach/operations/search-journalists.sh +74 -0
  163. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-media-outreach/operations/send-pitch.sh +80 -0
  164. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-media-outreach/operations/submit-haro-response.sh +88 -0
  165. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-media-outreach/operations/track-pitch-engagement.sh +66 -0
  166. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-press-distribution/SKILL.md +159 -0
  167. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-press-distribution/operations/distribute-press-release.sh +94 -0
  168. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-press-distribution/operations/get-distribution-status.sh +59 -0
  169. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-press-distribution/operations/get-pickup-metrics.sh +72 -0
  170. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-press-distribution/operations/list-templates.sh +53 -0
  171. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/SKILL.md +429 -0
  172. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -0
  173. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -0
  174. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -0
  175. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -0
  176. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -0
  177. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-social-publishing/SKILL.md +108 -0
  178. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-social-publishing/operations/create-post.sh +104 -0
  179. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-social-publishing/operations/delete-post.sh +76 -0
  180. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-social-publishing/operations/get-post-stats.sh +66 -0
  181. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-social-publishing/operations/schedule-post.sh +85 -0
  182. package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-social-publishing/operations/upload-media.sh +88 -0
  183. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/DESIGN.md +117 -0
  184. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/SKILL.md +679 -0
  185. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/invoke-portal-agents.sh +129 -0
  186. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/invoke-portal-dashboard.sh +85 -0
  187. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/invoke-portal-events.sh +125 -0
  188. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/invoke-portal-metrics.sh +112 -0
  189. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/invoke-portal-start.sh +135 -0
  190. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/invoke-portal-stop.sh +121 -0
  191. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +51 -0
  192. package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +85 -0
  193. package/claude-assets/cfn-extras/skills/utility/cfn-environment-sanitization/SKILL.md +200 -0
  194. package/claude-assets/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +244 -0
  195. package/claude-assets/cfn-extras/skills/utility/cfn-process-instrumentation/SKILL.md +279 -0
  196. package/claude-assets/cfn-extras/skills/utility/cfn-process-instrumentation/instrument-process.sh +327 -0
  197. package/claude-assets/commands/cfn/create-handoff.md +224 -0
  198. package/claude-assets/commands/cfn-docker/CFN_DOCKER_NATIVE.md +295 -0
  199. package/claude-assets/commands/cfn-docker-core-test-suite.md +326 -0
  200. package/claude-assets/commands/cfn-loop-cli.md +1 -1
  201. package/claude-assets/commands/switch-api.md +20 -6
  202. package/claude-assets/root-claude-distribute/CFN-CLAUDE.md +177 -426
  203. package/claude-assets/skills/cfn-docker-agent-spawning/spawn-agent.sh +27 -18
  204. package/claude-assets/skills/cfn-docker-loop-orchestration/orchestrate.sh +763 -38
  205. package/claude-assets/skills/cfn-docker-redis-coordination/coordinate.sh +25 -10
  206. package/claude-assets/skills/cfn-docker-redis-coordination/coordinate.sh.backup-1763145142 +641 -0
  207. package/claude-assets/skills/cfn-docker-skill-mcp-selection/skill-mcp-selector.js +471 -471
  208. package/claude-assets/skills/cfn-docker-wave-execution/SKILL.md +936 -0
  209. package/claude-assets/skills/cfn-docker-wave-execution/cleanup-wave.sh +445 -0
  210. package/claude-assets/skills/cfn-docker-wave-execution/lib/docker-helpers.sh +804 -0
  211. package/claude-assets/skills/cfn-docker-wave-execution/monitor-wave.sh +485 -0
  212. package/claude-assets/skills/cfn-docker-wave-execution/spawn-wave.sh +547 -0
  213. package/claude-assets/skills/cfn-error-batching-strategy/README.md +323 -0
  214. package/claude-assets/skills/cfn-error-batching-strategy/SKILL.md +1016 -0
  215. package/claude-assets/skills/cfn-error-batching-strategy/analyze-errors.sh +327 -0
  216. package/claude-assets/skills/cfn-error-batching-strategy/calculate-waves.sh +256 -0
  217. package/claude-assets/skills/cfn-error-batching-strategy/cli.sh +523 -0
  218. package/claude-assets/skills/cfn-error-batching-strategy/cluster-files.sh +196 -0
  219. package/claude-assets/skills/cfn-error-batching-strategy/create-batches.sh +261 -0
  220. package/claude-assets/skills/cfn-error-batching-strategy/lib/core-functions.sh +47 -0
  221. package/claude-assets/skills/cfn-error-batching-strategy/templates/default-tiers.json +22 -0
  222. package/claude-assets/skills/cfn-error-batching-strategy/tests/test-batching-strategy.sh +498 -0
  223. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +52 -23
  224. package/claude-assets/skills/cfn-redis-coordination/complete-swarm.sh +3 -3
  225. package/claude-assets/skills/cfn-redis-coordination/data/cfn-loop.db +0 -0
  226. package/claude-assets/skills/cfn-redis-coordination/redis-cli-wrapper.sh +9 -0
  227. package/claude-assets/skills/cfn-redis-coordination/report-completion.sh +7 -7
  228. package/claude-assets/skills/cfn-wave-checkpoint/SKILL.md +333 -0
  229. package/claude-assets/skills/cfn-wave-checkpoint/cleanup-orphans.sh +374 -0
  230. package/claude-assets/skills/cfn-wave-checkpoint/resume-wave.sh +325 -0
  231. package/claude-assets/skills/cfn-wave-checkpoint/save-checkpoint.sh +284 -0
  232. package/claude-assets/skills/docker-build/SKILL.md +203 -0
  233. package/claude-assets/skills/docker-build/build.sh +73 -0
  234. package/dist/agent/skill-mcp-selector.js +1 -1
  235. package/dist/agent/skill-mcp-selector.js.map +1 -1
  236. package/dist/cli/agent-definition-parser.js +36 -16
  237. package/dist/cli/agent-definition-parser.js.map +1 -1
  238. package/dist/cli/agent-executor.js +48 -13
  239. package/dist/cli/agent-executor.js.map +1 -1
  240. package/dist/cli/agent-prompt-builder.js +28 -2
  241. package/dist/cli/agent-prompt-builder.js.map +1 -1
  242. package/dist/cli/agent-spawn.js +57 -18
  243. package/dist/cli/agent-spawn.js.map +1 -1
  244. package/dist/cli/agent-token-manager.js +5 -1
  245. package/dist/cli/agent-token-manager.js.map +1 -1
  246. package/dist/cli/anthropic-client.js +35 -4
  247. package/dist/cli/anthropic-client.js.map +1 -1
  248. package/dist/cli/cfn-context.js +9 -6
  249. package/dist/cli/cfn-context.js.map +1 -1
  250. package/dist/cli/cfn-metrics.js +8 -1
  251. package/dist/cli/cfn-metrics.js.map +1 -1
  252. package/dist/cli/cfn-redis.js +7 -0
  253. package/dist/cli/cfn-redis.js.map +1 -1
  254. package/dist/cli/conversation-fork.js +14 -11
  255. package/dist/cli/conversation-fork.js.map +1 -1
  256. package/dist/cli/index.js +6 -1
  257. package/dist/cli/index.js.map +1 -1
  258. package/dist/cli/iteration-history.js +8 -5
  259. package/dist/cli/iteration-history.js.map +1 -1
  260. package/dist/coordination/enhanced-progress-tracker.js +1 -1
  261. package/dist/coordination/enhanced-progress-tracker.js.map +1 -1
  262. package/dist/coordination/event-bus.js +1 -1
  263. package/dist/coordination/event-bus.js.map +1 -1
  264. package/dist/coordination/redis-messaging-infrastructure.js +1 -1
  265. package/dist/coordination/redis-messaging-infrastructure.js.map +1 -1
  266. package/dist/mcp/auth-middleware.js +1 -1
  267. package/dist/mcp/auth-middleware.js.map +1 -1
  268. package/dist/mcp/playwright-mcp-server-auth.js +1 -1
  269. package/dist/mcp/playwright-mcp-server-auth.js.map +1 -1
  270. package/dist/utils/secret-filter.js +145 -0
  271. package/dist/utils/secret-filter.js.map +1 -0
  272. package/package.json +5 -4
  273. package/scripts/build-linux.sh +78 -0
  274. package/scripts/docker-agent-init.sh +106 -0
  275. package/scripts/docker-rebuild-all-agents.sh +127 -0
  276. package/scripts/init-project.js +4 -4
  277. package/scripts/switch-api.sh +11 -4
  278. package/.claude/cfn-agents-ignore/cfn-seo-team/AGENT_CREATION_REPORT.md +0 -471
  279. package/.claude/cfn-agents-ignore/cfn-seo-team/AGENT_CREATION_REPORT.md.backup +0 -481
  280. package/.claude/cfn-agents-ignore/cfn-seo-team/DELEGATION_MATRIX.md.backup +0 -371
  281. package/.claude/cfn-agents-ignore/cfn-seo-team/INTEGRATION_REQUIREMENTS.md.backup +0 -637
  282. package/.claude/cfn-agents-ignore/cfn-seo-team/cfn-seo-coordinator.md.backup +0 -398
  283. package/.claude/cfn-agents-ignore/cfn-seo-team/competitive-seo-analyst.md.backup +0 -401
  284. package/.claude/cfn-agents-ignore/cfn-seo-team/content-atomization-specialist.md.backup +0 -552
  285. package/.claude/cfn-agents-ignore/cfn-seo-team/content-seo-strategist.md.backup +0 -223
  286. package/.claude/cfn-agents-ignore/cfn-seo-team/eeat-content-auditor.md.backup +0 -367
  287. package/.claude/cfn-agents-ignore/cfn-seo-team/geo-optimization-expert.md.backup +0 -247
  288. package/.claude/cfn-agents-ignore/cfn-seo-team/link-building-specialist.md.backup +0 -269
  289. package/.claude/cfn-agents-ignore/cfn-seo-team/local-seo-optimizer.md.backup +0 -311
  290. package/.claude/cfn-agents-ignore/cfn-seo-team/programmatic-seo-engineer.md.backup +0 -222
  291. package/.claude/cfn-agents-ignore/cfn-seo-team/schema-markup-engineer.md.backup +0 -408
  292. package/.claude/cfn-agents-ignore/cfn-seo-team/seo-analytics-specialist.md.backup +0 -354
  293. package/.claude/cfn-agents-ignore/cfn-seo-team/seo-validators/accessibility-validator.md.backup +0 -561
  294. package/.claude/cfn-agents-ignore/cfn-seo-team/seo-validators/audience-validator.md.backup +0 -480
  295. package/.claude/cfn-agents-ignore/cfn-seo-team/seo-validators/branding-validator.md.backup +0 -448
  296. package/.claude/cfn-agents-ignore/cfn-seo-team/seo-validators/humanizer-validator.md.backup +0 -329
  297. package/.claude/cfn-agents-ignore/cfn-seo-team/technical-seo-specialist.md.backup +0 -208
  298. package/claude-assets/agents/AGENT_LIFECYCLE.md.backup_before_replace +0 -530
  299. package/claude-assets/agents/README-AGENT_LIFECYCLE.md.backup_before_replace +0 -522
  300. package/claude-assets/agents/cfn-dev-team/test-agent.md +0 -141
  301. package/claude-assets/agents/marketing_hybrid/cost_tracker.md +0 -13
  302. package/claude-assets/agents/marketing_hybrid/docker_deployer.md +0 -13
  303. package/claude-assets/agents/marketing_hybrid/zai_worker_spawner.md +0 -13
  304. package/claude-assets/cfn-agents-ignore/cfn-seo-team/AGENT_CREATION_REPORT.md +0 -471
  305. package/claude-assets/cfn-agents-ignore/cfn-seo-team/AGENT_CREATION_REPORT.md.backup +0 -481
  306. package/claude-assets/cfn-agents-ignore/cfn-seo-team/DELEGATION_MATRIX.md.backup +0 -371
  307. package/claude-assets/cfn-agents-ignore/cfn-seo-team/INTEGRATION_REQUIREMENTS.md.backup +0 -637
  308. package/claude-assets/cfn-agents-ignore/cfn-seo-team/cfn-seo-coordinator.md.backup +0 -398
  309. package/claude-assets/cfn-agents-ignore/cfn-seo-team/competitive-seo-analyst.md.backup +0 -401
  310. package/claude-assets/cfn-agents-ignore/cfn-seo-team/content-atomization-specialist.md.backup +0 -552
  311. package/claude-assets/cfn-agents-ignore/cfn-seo-team/content-seo-strategist.md.backup +0 -223
  312. package/claude-assets/cfn-agents-ignore/cfn-seo-team/eeat-content-auditor.md.backup +0 -367
  313. package/claude-assets/cfn-agents-ignore/cfn-seo-team/geo-optimization-expert.md.backup +0 -247
  314. package/claude-assets/cfn-agents-ignore/cfn-seo-team/link-building-specialist.md.backup +0 -269
  315. package/claude-assets/cfn-agents-ignore/cfn-seo-team/local-seo-optimizer.md.backup +0 -311
  316. package/claude-assets/cfn-agents-ignore/cfn-seo-team/programmatic-seo-engineer.md.backup +0 -222
  317. package/claude-assets/cfn-agents-ignore/cfn-seo-team/schema-markup-engineer.md.backup +0 -408
  318. package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-analytics-specialist.md.backup +0 -354
  319. package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-validators/accessibility-validator.md.backup +0 -561
  320. package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-validators/audience-validator.md.backup +0 -480
  321. package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-validators/branding-validator.md.backup +0 -448
  322. package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-validators/humanizer-validator.md.backup +0 -329
  323. package/claude-assets/cfn-agents-ignore/cfn-seo-team/technical-seo-specialist.md.backup +0 -208
  324. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/DELEGATION_MATRIX.md +0 -0
  325. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/HUMANIZER_PROMPTS.md +0 -0
  326. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/INTEGRATION_REQUIREMENTS.md +0 -0
  327. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/cfn-seo-coordinator.md +0 -0
  328. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/competitive-seo-analyst.md +0 -0
  329. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/content-atomization-specialist.md +0 -0
  330. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/content-seo-strategist.md +0 -0
  331. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/eeat-content-auditor.md +0 -0
  332. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/geo-optimization-expert.md +0 -0
  333. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/link-building-specialist.md +0 -0
  334. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/local-seo-optimizer.md +0 -0
  335. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/programmatic-seo-engineer.md +0 -0
  336. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/schema-markup-engineer.md +0 -0
  337. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-analytics-specialist.md +0 -0
  338. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-validators/accessibility-validator.md +0 -0
  339. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-validators/audience-validator.md +0 -0
  340. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-validators/branding-validator.md +0 -0
  341. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-validators/humanizer-validator.md +0 -0
  342. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/technical-seo-specialist.md +0 -0
  343. /package/{claude-assets/skills → .claude/cfn-extras/skills/advanced-features}/cfn-agent-swap/SKILL.md +0 -0
  344. /package/{claude-assets/skills → .claude/cfn-extras/skills/advanced-features}/cfn-agent-swap/recommend-swap.sh +0 -0
  345. /package/{claude-assets/skills → .claude/cfn-extras/skills/advanced-features}/cfn-api-validation/test-endpoints.sh +0 -0
  346. /package/{claude-assets/skills → .claude/cfn-extras/skills/advanced-features}/cfn-context-pruner/SKILL.md +0 -0
  347. /package/{claude-assets/skills → .claude/cfn-extras/skills/advanced-features}/cfn-context-pruner/prune-context.sh +0 -0
  348. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/README.md +0 -0
  349. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/SKILL.md +0 -0
  350. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/config.json +0 -0
  351. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/eventbus-wrapper.cjs +0 -0
  352. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/invoke-event-publish.sh +0 -0
  353. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/invoke-event-subscribe.sh +0 -0
  354. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/invoke-lifecycle-track.sh +0 -0
  355. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/test-event-bus.sh +0 -0
  356. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/README.md +0 -0
  357. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/SKILL.md +0 -0
  358. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/config.json +0 -0
  359. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/invoke-fleet-allocate.sh +0 -0
  360. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/invoke-fleet-balance.sh +0 -0
  361. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/invoke-fleet-metrics.sh +0 -0
  362. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/invoke-fleet-register.sh +0 -0
  363. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/test-fleet-manager.sh +0 -0
  364. /package/{claude-assets/skills → .claude/cfn-extras/skills/advanced-features}/cfn-task-mode-safety/cli-coordination.sh +0 -0
  365. /package/{claude-assets/skills → .claude/cfn-extras/skills/advanced-features}/cfn-task-mode-safety/mode-detection.sh +0 -0
  366. /package/{claude-assets/skills → .claude/cfn-extras/skills/advanced-features}/cfn-task-mode-sanitize/task-mode-env-sanitizer.sh +0 -0
  367. /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/README.md +0 -0
  368. /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/description-refinement-guide.md +0 -0
  369. /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/log-skill-invocation.js +0 -0
  370. /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/run-production-criteria-tests.sh +0 -0
  371. /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/skill-analytics-dashboard.js +0 -0
  372. /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/skill-invocation-hook.sh +0 -0
  373. /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/skill-invocations.sql +0 -0
  374. /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/test-corpus.json +0 -0
  375. /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/test-data-generator.js +0 -0
  376. /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/test-manual-override-rate.js +0 -0
  377. /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/validate-skill-selection.js +0 -0
  378. /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-improvement-recommender/SKILL.md +0 -0
  379. /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-improvement-recommender/recommend-improvements.sh +0 -0
  380. /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-memory-monitoring/SKILL.md +0 -0
  381. /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-pattern-extraction/SKILL.md +0 -0
  382. /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-pattern-extraction/extract-patterns.sh +0 -0
  383. /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-retrospective-report/SKILL.md +0 -0
  384. /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-retrospective-report/generate-report.sh +0 -0
  385. /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-telemetry/collect-metrics.sh +0 -0
  386. /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-telemetry/start-telemetry.sh +0 -0
  387. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/SKILL.md +0 -0
  388. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/add-bullet.sh +0 -0
  389. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/analyze-anti-pattern-effectiveness.sh +0 -0
  390. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/classify-task.sh +0 -0
  391. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/export-ace-metrics.sh +0 -0
  392. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/extract-tags.sh +0 -0
  393. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/format-negative-context.sh +0 -0
  394. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/init-indexes.sql +0 -0
  395. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-curate.sh +0 -0
  396. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-inject.sh +0 -0
  397. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-query.sh +0 -0
  398. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-reflect.sh +0 -0
  399. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-stats.sh +0 -0
  400. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/log-merge.sh +0 -0
  401. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/monitor-injection-performance.sh +0 -0
  402. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/optimize-injection-pipeline.sh +0 -0
  403. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/query-anti-patterns.sh +0 -0
  404. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/query-contexts.sh +0 -0
  405. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/query-reflections.sh +0 -0
  406. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/001-create-context-reflections.sql +0 -0
  407. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/README.md +0 -0
  408. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/SCHEMA_DESIGN_SUMMARY.md +0 -0
  409. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/populate-test-data-simple.sh +0 -0
  410. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/populate-test-data.sh +0 -0
  411. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/run-migration.sh +0 -0
  412. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/validate-schema.sql +0 -0
  413. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/score-relevance-adapter.sh +0 -0
  414. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/score-relevance.sh +0 -0
  415. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/sprint-7-lessons.json +0 -0
  416. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/store-reflection.sh +0 -0
  417. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/test-ace-skill.sh +0 -0
  418. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/track-ab-test.sh +0 -0
  419. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/update-reflection.sh +0 -0
  420. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/SKILL.md +0 -0
  421. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/agents-registry-clean.json +0 -0
  422. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/agents-registry-fixed.json +0 -0
  423. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/agents-registry.json +0 -0
  424. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/discover-agents.py +0 -0
  425. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/discover-agents.sh +0 -0
  426. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/invoke-registry.sh +0 -0
  427. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/temp_script.py +0 -0
  428. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-selector/SKILL.md +0 -0
  429. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-selector/select-agents.sh +0 -0
  430. /package/{claude-assets/skills → .claude/cfn-extras/skills/deprecated}/cfn-cli-setup/validate-cli-environment.sh +0 -0
  431. /package/{claude-assets/skills → .claude/cfn-extras/skills/deprecated}/cfn-simplified-agent-lifecycle/COST_ANALYSIS.md +0 -0
  432. /package/{claude-assets/skills → .claude/cfn-extras/skills/deprecated}/cfn-simplified-agent-lifecycle/DESIGN.md +0 -0
  433. /package/{claude-assets/skills → .claude/cfn-extras/skills/deprecated}/cfn-simplified-agent-lifecycle/MIGRATION_PLAN.md +0 -0
  434. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-ad-campaigns/SKILL.md +0 -0
  435. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-ad-campaigns/operations/create-campaign.sh +0 -0
  436. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +0 -0
  437. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +0 -0
  438. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-ad-campaigns/operations/set-budget.sh +0 -0
  439. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +0 -0
  440. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-analytics-data/SKILL.md +0 -0
  441. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-analytics-data/operations/get-ad-performance.sh +0 -0
  442. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-analytics-data/operations/get-conversion-funnel.sh +0 -0
  443. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-analytics-data/operations/get-email-performance.sh +0 -0
  444. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-analytics-data/operations/get-social-engagement.sh +0 -0
  445. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-analytics-data/operations/get-website-traffic.sh +0 -0
  446. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-chatbot-conversations/SKILL.md +0 -0
  447. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +0 -0
  448. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +0 -0
  449. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +0 -0
  450. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-chatbot-conversations/operations/send-message.sh +0 -0
  451. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +0 -0
  452. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-competitive-intel/SKILL.md +0 -0
  453. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-competitive-intel/operations/get-backlink-profile.sh +0 -0
  454. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-competitive-intel/operations/get-keyword-rankings.sh +0 -0
  455. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-competitive-intel/operations/get-trending-topics.sh +0 -0
  456. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-competitive-intel/operations/monitor-competitor.sh +0 -0
  457. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-competitive-intel/operations/search-brand-mentions.sh +0 -0
  458. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-crm-contacts/SKILL.md +0 -0
  459. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-crm-contacts/operations/add-to-segment.sh +0 -0
  460. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-crm-contacts/operations/create-contact.sh +0 -0
  461. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-crm-contacts/operations/get-contact.sh +0 -0
  462. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-crm-contacts/operations/remove-from-segment.sh +0 -0
  463. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-crm-contacts/operations/update-contact.sh +0 -0
  464. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-email-campaigns/SKILL.md +0 -0
  465. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-email-campaigns/operations/create-campaign.sh +0 -0
  466. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-email-campaigns/operations/get-campaign-stats.sh +0 -0
  467. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-email-campaigns/operations/list-templates.sh +0 -0
  468. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-email-campaigns/operations/schedule-campaign.sh +0 -0
  469. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-email-campaigns/operations/send-test-email.sh +0 -0
  470. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-landing-pages/SKILL.md +0 -0
  471. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-landing-pages/operations/create-ab-test.sh +0 -0
  472. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-landing-pages/operations/create-landing-page.sh +0 -0
  473. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-landing-pages/operations/get-page-performance.sh +0 -0
  474. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-landing-pages/operations/publish-page.sh +0 -0
  475. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-landing-pages/operations/unpublish-page.sh +0 -0
  476. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-monitoring/SKILL.md +0 -0
  477. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-monitoring/operations/create-crisis-alert.sh +0 -0
  478. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-monitoring/operations/export-report.sh +0 -0
  479. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-monitoring/operations/get-sentiment-analysis.sh +0 -0
  480. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-monitoring/operations/search-mentions.sh +0 -0
  481. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-outreach/SKILL.md +0 -0
  482. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-outreach/operations/search-journalists.sh +0 -0
  483. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-outreach/operations/send-pitch.sh +0 -0
  484. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-outreach/operations/submit-haro-response.sh +0 -0
  485. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-outreach/operations/track-pitch-engagement.sh +0 -0
  486. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-press-distribution/SKILL.md +0 -0
  487. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-press-distribution/operations/distribute-press-release.sh +0 -0
  488. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-press-distribution/operations/get-distribution-status.sh +0 -0
  489. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-press-distribution/operations/get-pickup-metrics.sh +0 -0
  490. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-press-distribution/operations/list-templates.sh +0 -0
  491. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-sms-campaigns/SKILL.md +0 -0
  492. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-sms-campaigns/operations/create-campaign.sh +0 -0
  493. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +0 -0
  494. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-sms-campaigns/operations/opt-out.sh +0 -0
  495. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +0 -0
  496. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-sms-campaigns/operations/send-sms.sh +0 -0
  497. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-social-publishing/SKILL.md +0 -0
  498. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-social-publishing/operations/create-post.sh +0 -0
  499. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-social-publishing/operations/delete-post.sh +0 -0
  500. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-social-publishing/operations/get-post-stats.sh +0 -0
  501. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-social-publishing/operations/schedule-post.sh +0 -0
  502. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-social-publishing/operations/upload-media.sh +0 -0
  503. /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/DESIGN.md +0 -0
  504. /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/SKILL.md +0 -0
  505. /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/invoke-portal-agents.sh +0 -0
  506. /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/invoke-portal-dashboard.sh +0 -0
  507. /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/invoke-portal-events.sh +0 -0
  508. /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/invoke-portal-metrics.sh +0 -0
  509. /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/invoke-portal-start.sh +0 -0
  510. /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/invoke-portal-stop.sh +0 -0
  511. /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/test-web-portal-skill.sh +0 -0
  512. /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/validate-deployment.sh +0 -0
  513. /package/{claude-assets/skills → .claude/cfn-extras/skills/utility}/cfn-environment-sanitization/SKILL.md +0 -0
  514. /package/{claude-assets/skills → .claude/cfn-extras/skills/utility}/cfn-environment-sanitization/sanitize-environment.sh +0 -0
  515. /package/{claude-assets/skills → .claude/cfn-extras/skills/utility}/cfn-process-instrumentation/SKILL.md +0 -0
  516. /package/{claude-assets/skills → .claude/cfn-extras/skills/utility}/cfn-process-instrumentation/instrument-process.sh +0 -0
  517. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/DELEGATION_MATRIX.md +0 -0
  518. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/HUMANIZER_PROMPTS.md +0 -0
  519. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/INTEGRATION_REQUIREMENTS.md +0 -0
  520. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/cfn-seo-coordinator.md +0 -0
  521. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/competitive-seo-analyst.md +0 -0
  522. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/content-atomization-specialist.md +0 -0
  523. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/content-seo-strategist.md +0 -0
  524. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/eeat-content-auditor.md +0 -0
  525. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/geo-optimization-expert.md +0 -0
  526. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/link-building-specialist.md +0 -0
  527. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/local-seo-optimizer.md +0 -0
  528. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/programmatic-seo-engineer.md +0 -0
  529. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/schema-markup-engineer.md +0 -0
  530. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-analytics-specialist.md +0 -0
  531. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-validators/accessibility-validator.md +0 -0
  532. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-validators/audience-validator.md +0 -0
  533. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-validators/branding-validator.md +0 -0
  534. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-validators/humanizer-validator.md +0 -0
  535. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/technical-seo-specialist.md +0 -0
  536. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/README.md +0 -0
  537. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/SKILL.md +0 -0
  538. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/config.json +0 -0
  539. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/eventbus-wrapper.cjs +0 -0
  540. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/invoke-event-publish.sh +0 -0
  541. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/invoke-event-subscribe.sh +0 -0
  542. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/invoke-lifecycle-track.sh +0 -0
  543. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/test-event-bus.sh +0 -0
  544. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/README.md +0 -0
  545. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/SKILL.md +0 -0
  546. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/config.json +0 -0
  547. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/invoke-fleet-allocate.sh +0 -0
  548. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/invoke-fleet-balance.sh +0 -0
  549. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/invoke-fleet-metrics.sh +0 -0
  550. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/invoke-fleet-register.sh +0 -0
  551. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/test-fleet-manager.sh +0 -0
  552. /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/README.md +0 -0
  553. /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/description-refinement-guide.md +0 -0
  554. /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/log-skill-invocation.js +0 -0
  555. /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/run-production-criteria-tests.sh +0 -0
  556. /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/skill-analytics-dashboard.js +0 -0
  557. /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/skill-invocation-hook.sh +0 -0
  558. /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/skill-invocations.sql +0 -0
  559. /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/test-corpus.json +0 -0
  560. /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/test-data-generator.js +0 -0
  561. /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/test-manual-override-rate.js +0 -0
  562. /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/validate-skill-selection.js +0 -0
  563. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/SKILL.md +0 -0
  564. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/add-bullet.sh +0 -0
  565. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/analyze-anti-pattern-effectiveness.sh +0 -0
  566. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/classify-task.sh +0 -0
  567. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/export-ace-metrics.sh +0 -0
  568. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/extract-tags.sh +0 -0
  569. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/format-negative-context.sh +0 -0
  570. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/init-indexes.sql +0 -0
  571. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-curate.sh +0 -0
  572. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-inject.sh +0 -0
  573. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-query.sh +0 -0
  574. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-reflect.sh +0 -0
  575. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-stats.sh +0 -0
  576. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/log-merge.sh +0 -0
  577. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/monitor-injection-performance.sh +0 -0
  578. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/optimize-injection-pipeline.sh +0 -0
  579. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/query-anti-patterns.sh +0 -0
  580. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/query-contexts.sh +0 -0
  581. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/query-reflections.sh +0 -0
  582. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/001-create-context-reflections.sql +0 -0
  583. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/README.md +0 -0
  584. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/SCHEMA_DESIGN_SUMMARY.md +0 -0
  585. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/populate-test-data-simple.sh +0 -0
  586. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/populate-test-data.sh +0 -0
  587. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/run-migration.sh +0 -0
  588. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/validate-schema.sql +0 -0
  589. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/score-relevance-adapter.sh +0 -0
  590. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/score-relevance.sh +0 -0
  591. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/sprint-7-lessons.json +0 -0
  592. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/store-reflection.sh +0 -0
  593. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/test-ace-skill.sh +0 -0
  594. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/track-ab-test.sh +0 -0
  595. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/update-reflection.sh +0 -0
  596. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/SKILL.md +0 -0
  597. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/agents-registry-clean.json +0 -0
  598. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/agents-registry-fixed.json +0 -0
  599. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/agents-registry.json +0 -0
  600. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/discover-agents.py +0 -0
  601. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/discover-agents.sh +0 -0
  602. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/invoke-registry.sh +0 -0
  603. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/temp_script.py +0 -0
  604. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-selector/SKILL.md +0 -0
  605. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-selector/select-agents.sh +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/conversation-fork.ts"],"sourcesContent":["/**\r\n * Conversation Fork Management\r\n *\r\n * Implements application-level conversation forking for CFN Loop iterations.\r\n * Stores conversation history in Redis and allows branching at specific points.\r\n *\r\n * Sprint 4: Conversation Forking (v2.7.0)\r\n */\r\n\r\nimport { execSync } from 'child_process';\r\nimport { randomBytes } from 'crypto';\r\n\r\nexport interface Message {\r\n role: 'user' | 'assistant';\r\n content: string;\r\n iteration: number;\r\n timestamp: string;\r\n}\r\n\r\nexport interface ForkMetadata {\r\n forkId: string;\r\n taskId: string;\r\n agentId: string;\r\n createdAt: string;\r\n parentIteration: number;\r\n messageCount: number;\r\n}\r\n\r\n/**\r\n * Store a message in conversation history\r\n */\r\nexport async function storeMessage(\r\n taskId: string,\r\n agentId: string,\r\n message: Message\r\n): Promise<void> {\r\n const key = `swarm:${taskId}:${agentId}:messages`;\r\n const messageJson = JSON.stringify(message);\r\n\r\n try {\r\n execSync(`redis-cli rpush \"${key}\" '${messageJson.replace(/'/g, \"'\\\\''\")}'`, {\r\n encoding: 'utf8'\r\n });\r\n } catch (error) {\r\n console.error(`[conversation-fork] Failed to store message:`, error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Load all messages from conversation history\r\n */\r\nexport async function loadMessages(\r\n taskId: string,\r\n agentId: string,\r\n forkId?: string\r\n): Promise<Message[]> {\r\n const key = forkId\r\n ? `swarm:${taskId}:${agentId}:fork:${forkId}:messages`\r\n : `swarm:${taskId}:${agentId}:messages`;\r\n\r\n try {\r\n const output = execSync(`redis-cli lrange \"${key}\" 0 -1`, {\r\n encoding: 'utf8'\r\n }).trim();\r\n\r\n if (!output || output === '(empty array)') {\r\n return [];\r\n }\r\n\r\n // Redis returns each message on a new line\r\n const lines = output.split('\\n');\r\n return lines.map(line => JSON.parse(line));\r\n } catch (error) {\r\n console.error(`[conversation-fork] Failed to load messages:`, error);\r\n return [];\r\n }\r\n}\r\n\r\n/**\r\n * Create a fork from current conversation state\r\n * Copies all messages up to current iteration\r\n */\r\nexport async function createFork(\r\n taskId: string,\r\n agentId: string,\r\n currentIteration: number\r\n): Promise<string> {\r\n // Generate unique fork ID\r\n const forkId = `fork-${currentIteration}-${randomBytes(4).toString('hex')}`;\r\n\r\n // Load messages up to current iteration\r\n const messages = await loadMessages(taskId, agentId);\r\n const forkMessages = messages.filter(m => m.iteration <= currentIteration);\r\n\r\n if (forkMessages.length === 0) {\r\n throw new Error(`No messages found for iteration ${currentIteration}`);\r\n }\r\n\r\n // Store fork snapshot\r\n const forkKey = `swarm:${taskId}:${agentId}:fork:${forkId}:messages`;\r\n\r\n for (const message of forkMessages) {\r\n const messageJson = JSON.stringify(message);\r\n execSync(`redis-cli rpush \"${forkKey}\" '${messageJson.replace(/'/g, \"'\\\\''\")}'`, {\r\n encoding: 'utf8'\r\n });\r\n }\r\n\r\n // Store fork metadata\r\n const metadata: ForkMetadata = {\r\n forkId,\r\n taskId,\r\n agentId,\r\n createdAt: new Date().toISOString(),\r\n parentIteration: currentIteration,\r\n messageCount: forkMessages.length\r\n };\r\n\r\n const metaKey = `swarm:${taskId}:${agentId}:fork:${forkId}:meta`;\r\n execSync(`redis-cli setex \"${metaKey}\" 86400 '${JSON.stringify(metadata)}'`, {\r\n encoding: 'utf8'\r\n });\r\n\r\n // Set as current fork\r\n const currentForkKey = `swarm:${taskId}:${agentId}:current-fork`;\r\n execSync(`redis-cli setex \"${currentForkKey}\" 86400 \"${forkId}\"`, {\r\n encoding: 'utf8'\r\n });\r\n\r\n console.log(`[conversation-fork] Created fork ${forkId} with ${forkMessages.length} messages`);\r\n\r\n return forkId;\r\n}\r\n\r\n/**\r\n * Get current active fork ID\r\n */\r\nexport async function getCurrentFork(\r\n taskId: string,\r\n agentId: string\r\n): Promise<string | null> {\r\n const key = `swarm:${taskId}:${agentId}:current-fork`;\r\n\r\n try {\r\n const forkId = execSync(`redis-cli get \"${key}\"`, {\r\n encoding: 'utf8'\r\n }).trim();\r\n\r\n if (forkId === '(nil)' || !forkId) {\r\n return null;\r\n }\r\n\r\n return forkId;\r\n } catch (error) {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Get fork metadata\r\n */\r\nexport async function getForkMetadata(\r\n taskId: string,\r\n agentId: string,\r\n forkId: string\r\n): Promise<ForkMetadata | null> {\r\n const key = `swarm:${taskId}:${agentId}:fork:${forkId}:meta`;\r\n\r\n try {\r\n const metaJson = execSync(`redis-cli get \"${key}\"`, {\r\n encoding: 'utf8'\r\n }).trim();\r\n\r\n if (metaJson === '(nil)' || !metaJson) {\r\n return null;\r\n }\r\n\r\n return JSON.parse(metaJson);\r\n } catch (error) {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * List all forks for an agent\r\n */\r\nexport async function listForks(\r\n taskId: string,\r\n agentId: string\r\n): Promise<ForkMetadata[]> {\r\n const pattern = `swarm:${taskId}:${agentId}:fork:*:meta`;\r\n\r\n try {\r\n const keys = execSync(`redis-cli keys \"${pattern}\"`, {\r\n encoding: 'utf8'\r\n }).trim().split('\\n').filter(k => k);\r\n\r\n const forks: ForkMetadata[] = [];\r\n\r\n for (const key of keys) {\r\n const metaJson = execSync(`redis-cli get \"${key}\"`, {\r\n encoding: 'utf8'\r\n }).trim();\r\n\r\n if (metaJson && metaJson !== '(nil)') {\r\n forks.push(JSON.parse(metaJson));\r\n }\r\n }\r\n\r\n return forks.sort((a, b) =>\r\n new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()\r\n );\r\n } catch (error) {\r\n console.error(`[conversation-fork] Failed to list forks:`, error);\r\n return [];\r\n }\r\n}\r\n\r\n/**\r\n * Delete a fork and its messages\r\n */\r\nexport async function deleteFork(\r\n taskId: string,\r\n agentId: string,\r\n forkId: string\r\n): Promise<void> {\r\n const messagesKey = `swarm:${taskId}:${agentId}:fork:${forkId}:messages`;\r\n const metaKey = `swarm:${taskId}:${agentId}:fork:${forkId}:meta`;\r\n\r\n try {\r\n execSync(`redis-cli del \"${messagesKey}\" \"${metaKey}\"`, {\r\n encoding: 'utf8'\r\n });\r\n\r\n console.log(`[conversation-fork] Deleted fork ${forkId}`);\r\n } catch (error) {\r\n console.error(`[conversation-fork] Failed to delete fork:`, error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Clear current fork (start fresh conversation)\r\n */\r\nexport async function clearCurrentFork(\r\n taskId: string,\r\n agentId: string\r\n): Promise<void> {\r\n const key = `swarm:${taskId}:${agentId}:current-fork`;\r\n\r\n try {\r\n execSync(`redis-cli del \"${key}\"`, {\r\n encoding: 'utf8'\r\n });\r\n } catch (error) {\r\n console.error(`[conversation-fork] Failed to clear current fork:`, error);\r\n }\r\n}\r\n\r\n/**\r\n * Format messages for Anthropic API\r\n */\r\nexport function formatMessagesForAPI(messages: Message[]): Array<{role: string, content: string}> {\r\n return messages.map(m => ({\r\n role: m.role,\r\n content: m.content\r\n }));\r\n}\r\n\r\n/**\r\n * Get conversation statistics\r\n */\r\nexport async function getConversationStats(\r\n taskId: string,\r\n agentId: string,\r\n forkId?: string\r\n): Promise<{\r\n messageCount: number;\r\n userMessages: number;\r\n assistantMessages: number;\r\n iterations: number;\r\n firstMessage: string | null;\r\n lastMessage: string | null;\r\n}> {\r\n const messages = await loadMessages(taskId, agentId, forkId);\r\n\r\n if (messages.length === 0) {\r\n return {\r\n messageCount: 0,\r\n userMessages: 0,\r\n assistantMessages: 0,\r\n iterations: 0,\r\n firstMessage: null,\r\n lastMessage: null\r\n };\r\n }\r\n\r\n const userMessages = messages.filter(m => m.role === 'user').length;\r\n const assistantMessages = messages.filter(m => m.role === 'assistant').length;\r\n const iterations = Math.max(...messages.map(m => m.iteration));\r\n\r\n return {\r\n messageCount: messages.length,\r\n userMessages,\r\n assistantMessages,\r\n iterations,\r\n firstMessage: messages[0].timestamp,\r\n lastMessage: messages[messages.length - 1].timestamp\r\n };\r\n}\r\n"],"names":["execSync","randomBytes","storeMessage","taskId","agentId","message","key","messageJson","JSON","stringify","replace","encoding","error","console","loadMessages","forkId","output","trim","lines","split","map","line","parse","createFork","currentIteration","toString","messages","forkMessages","filter","m","iteration","length","Error","forkKey","metadata","createdAt","Date","toISOString","parentIteration","messageCount","metaKey","currentForkKey","log","getCurrentFork","getForkMetadata","metaJson","listForks","pattern","keys","k","forks","push","sort","a","b","getTime","deleteFork","messagesKey","clearCurrentFork","formatMessagesForAPI","role","content","getConversationStats","userMessages","assistantMessages","iterations","firstMessage","lastMessage","Math","max","timestamp"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/cli/conversation-fork.ts"],"sourcesContent":["/**\r\n * Conversation Fork Management\r\n *\r\n * Implements application-level conversation forking for CFN Loop iterations.\r\n * Stores conversation history in Redis and allows branching at specific points.\r\n *\r\n * Sprint 4: Conversation Forking (v2.7.0)\r\n */\r\n\r\nimport { execSync } from 'child_process';\r\nimport { randomBytes } from 'crypto';\r\n\r\n// Bug #6 Fix: Read Redis connection parameters from process.env\r\nconst redisHost = process.env.CFN_REDIS_HOST || 'cfn-redis';\r\nconst redisPort = process.env.CFN_REDIS_PORT || '6379';\r\n\r\nexport interface Message {\r\n role: 'user' | 'assistant';\r\n content: string;\r\n iteration: number;\r\n timestamp: string;\r\n}\r\n\r\nexport interface ForkMetadata {\r\n forkId: string;\r\n taskId: string;\r\n agentId: string;\r\n createdAt: string;\r\n parentIteration: number;\r\n messageCount: number;\r\n}\r\n\r\n/**\r\n * Store a message in conversation history\r\n */\r\nexport async function storeMessage(\r\n taskId: string,\r\n agentId: string,\r\n message: Message\r\n): Promise<void> {\r\n const key = `swarm:${taskId}:${agentId}:messages`;\r\n const messageJson = JSON.stringify(message);\r\n\r\n try {\r\n execSync(`redis-cli -h ${redisHost} -p ${redisPort} rpush \"${key}\" '${messageJson.replace(/'/g, \"'\\\\''\")}'`, {\r\n encoding: 'utf8'\r\n });\r\n } catch (error) {\r\n console.error(`[conversation-fork] Failed to store message:`, error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Load all messages from conversation history\r\n */\r\nexport async function loadMessages(\r\n taskId: string,\r\n agentId: string,\r\n forkId?: string\r\n): Promise<Message[]> {\r\n const key = forkId\r\n ? `swarm:${taskId}:${agentId}:fork:${forkId}:messages`\r\n : `swarm:${taskId}:${agentId}:messages`;\r\n\r\n try {\r\n const output = execSync(`redis-cli -h ${redisHost} -p ${redisPort} lrange \"${key}\" 0 -1`, {\r\n encoding: 'utf8'\r\n }).trim();\r\n\r\n if (!output || output === '(empty array)') {\r\n return [];\r\n }\r\n\r\n // Redis returns each message on a new line\r\n const lines = output.split('\\n');\r\n return lines.map(line => JSON.parse(line));\r\n } catch (error) {\r\n console.error(`[conversation-fork] Failed to load messages:`, error);\r\n return [];\r\n }\r\n}\r\n\r\n/**\r\n * Create a fork from current conversation state\r\n * Copies all messages up to current iteration\r\n */\r\nexport async function createFork(\r\n taskId: string,\r\n agentId: string,\r\n currentIteration: number\r\n): Promise<string> {\r\n // Generate unique fork ID\r\n const forkId = `fork-${currentIteration}-${randomBytes(4).toString('hex')}`;\r\n\r\n // Load messages up to current iteration\r\n const messages = await loadMessages(taskId, agentId);\r\n const forkMessages = messages.filter(m => m.iteration <= currentIteration);\r\n\r\n if (forkMessages.length === 0) {\r\n throw new Error(`No messages found for iteration ${currentIteration}`);\r\n }\r\n\r\n // Store fork snapshot\r\n const forkKey = `swarm:${taskId}:${agentId}:fork:${forkId}:messages`;\r\n\r\n for (const message of forkMessages) {\r\n const messageJson = JSON.stringify(message);\r\n execSync(`redis-cli -h ${redisHost} -p ${redisPort} rpush \"${forkKey}\" '${messageJson.replace(/'/g, \"'\\\\''\")}'`, {\r\n encoding: 'utf8'\r\n });\r\n }\r\n\r\n // Store fork metadata\r\n const metadata: ForkMetadata = {\r\n forkId,\r\n taskId,\r\n agentId,\r\n createdAt: new Date().toISOString(),\r\n parentIteration: currentIteration,\r\n messageCount: forkMessages.length\r\n };\r\n\r\n const metaKey = `swarm:${taskId}:${agentId}:fork:${forkId}:meta`;\r\n execSync(`redis-cli -h ${redisHost} -p ${redisPort} setex \"${metaKey}\" 86400 '${JSON.stringify(metadata)}'`, {\r\n encoding: 'utf8'\r\n });\r\n\r\n // Set as current fork\r\n const currentForkKey = `swarm:${taskId}:${agentId}:current-fork`;\r\n execSync(`redis-cli -h ${redisHost} -p ${redisPort} setex \"${currentForkKey}\" 86400 \"${forkId}\"`, {\r\n encoding: 'utf8'\r\n });\r\n\r\n console.log(`[conversation-fork] Created fork ${forkId} with ${forkMessages.length} messages`);\r\n\r\n return forkId;\r\n}\r\n\r\n/**\r\n * Get current active fork ID\r\n */\r\nexport async function getCurrentFork(\r\n taskId: string,\r\n agentId: string\r\n): Promise<string | null> {\r\n const key = `swarm:${taskId}:${agentId}:current-fork`;\r\n\r\n try {\r\n const forkId = execSync(`redis-cli -h ${redisHost} -p ${redisPort} get \"${key}\"`, {\r\n encoding: 'utf8'\r\n }).trim();\r\n\r\n if (forkId === '(nil)' || !forkId) {\r\n return null;\r\n }\r\n\r\n return forkId;\r\n } catch (error) {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Get fork metadata\r\n */\r\nexport async function getForkMetadata(\r\n taskId: string,\r\n agentId: string,\r\n forkId: string\r\n): Promise<ForkMetadata | null> {\r\n const key = `swarm:${taskId}:${agentId}:fork:${forkId}:meta`;\r\n\r\n try {\r\n const metaJson = execSync(`redis-cli -h ${redisHost} -p ${redisPort} get \"${key}\"`, {\r\n encoding: 'utf8'\r\n }).trim();\r\n\r\n if (metaJson === '(nil)' || !metaJson) {\r\n return null;\r\n }\r\n\r\n return JSON.parse(metaJson);\r\n } catch (error) {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * List all forks for an agent\r\n */\r\nexport async function listForks(\r\n taskId: string,\r\n agentId: string\r\n): Promise<ForkMetadata[]> {\r\n const pattern = `swarm:${taskId}:${agentId}:fork:*:meta`;\r\n\r\n try {\r\n const keys = execSync(`redis-cli -h ${redisHost} -p ${redisPort} keys \"${pattern}\"`, {\r\n encoding: 'utf8'\r\n }).trim().split('\\n').filter(k => k);\r\n\r\n const forks: ForkMetadata[] = [];\r\n\r\n for (const key of keys) {\r\n const metaJson = execSync(`redis-cli -h ${redisHost} -p ${redisPort} get \"${key}\"`, {\r\n encoding: 'utf8'\r\n }).trim();\r\n\r\n if (metaJson && metaJson !== '(nil)') {\r\n forks.push(JSON.parse(metaJson));\r\n }\r\n }\r\n\r\n return forks.sort((a, b) =>\r\n new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()\r\n );\r\n } catch (error) {\r\n console.error(`[conversation-fork] Failed to list forks:`, error);\r\n return [];\r\n }\r\n}\r\n\r\n/**\r\n * Delete a fork and its messages\r\n */\r\nexport async function deleteFork(\r\n taskId: string,\r\n agentId: string,\r\n forkId: string\r\n): Promise<void> {\r\n const messagesKey = `swarm:${taskId}:${agentId}:fork:${forkId}:messages`;\r\n const metaKey = `swarm:${taskId}:${agentId}:fork:${forkId}:meta`;\r\n\r\n try {\r\n execSync(`redis-cli -h ${redisHost} -p ${redisPort} del \"${messagesKey}\" \"${metaKey}\"`, {\r\n encoding: 'utf8'\r\n });\r\n\r\n console.log(`[conversation-fork] Deleted fork ${forkId}`);\r\n } catch (error) {\r\n console.error(`[conversation-fork] Failed to delete fork:`, error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Clear current fork (start fresh conversation)\r\n */\r\nexport async function clearCurrentFork(\r\n taskId: string,\r\n agentId: string\r\n): Promise<void> {\r\n const key = `swarm:${taskId}:${agentId}:current-fork`;\r\n\r\n try {\r\n execSync(`redis-cli -h ${redisHost} -p ${redisPort} del \"${key}\"`, {\r\n encoding: 'utf8'\r\n });\r\n } catch (error) {\r\n console.error(`[conversation-fork] Failed to clear current fork:`, error);\r\n }\r\n}\r\n\r\n/**\r\n * Format messages for Anthropic API\r\n */\r\nexport function formatMessagesForAPI(messages: Message[]): Array<{role: string, content: string}> {\r\n return messages.map(m => ({\r\n role: m.role,\r\n content: m.content\r\n }));\r\n}\r\n\r\n/**\r\n * Get conversation statistics\r\n */\r\nexport async function getConversationStats(\r\n taskId: string,\r\n agentId: string,\r\n forkId?: string\r\n): Promise<{\r\n messageCount: number;\r\n userMessages: number;\r\n assistantMessages: number;\r\n iterations: number;\r\n firstMessage: string | null;\r\n lastMessage: string | null;\r\n}> {\r\n const messages = await loadMessages(taskId, agentId, forkId);\r\n\r\n if (messages.length === 0) {\r\n return {\r\n messageCount: 0,\r\n userMessages: 0,\r\n assistantMessages: 0,\r\n iterations: 0,\r\n firstMessage: null,\r\n lastMessage: null\r\n };\r\n }\r\n\r\n const userMessages = messages.filter(m => m.role === 'user').length;\r\n const assistantMessages = messages.filter(m => m.role === 'assistant').length;\r\n const iterations = Math.max(...messages.map(m => m.iteration));\r\n\r\n return {\r\n messageCount: messages.length,\r\n userMessages,\r\n assistantMessages,\r\n iterations,\r\n firstMessage: messages[0].timestamp,\r\n lastMessage: messages[messages.length - 1].timestamp\r\n };\r\n}\r\n"],"names":["execSync","randomBytes","redisHost","process","env","CFN_REDIS_HOST","redisPort","CFN_REDIS_PORT","storeMessage","taskId","agentId","message","key","messageJson","JSON","stringify","replace","encoding","error","console","loadMessages","forkId","output","trim","lines","split","map","line","parse","createFork","currentIteration","toString","messages","forkMessages","filter","m","iteration","length","Error","forkKey","metadata","createdAt","Date","toISOString","parentIteration","messageCount","metaKey","currentForkKey","log","getCurrentFork","getForkMetadata","metaJson","listForks","pattern","keys","k","forks","push","sort","a","b","getTime","deleteFork","messagesKey","clearCurrentFork","formatMessagesForAPI","role","content","getConversationStats","userMessages","assistantMessages","iterations","firstMessage","lastMessage","Math","max","timestamp"],"mappings":"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"}
package/dist/cli/index.js CHANGED
@@ -31,10 +31,15 @@ import { agentCommand } from './agent-command.js';
31
31
  const command = args[0] || 'help';
32
32
  const agentType = args[1] && !args[1].startsWith('--') ? args[1] : undefined;
33
33
  const options = {};
34
- // Parse options
34
+ // Parse options and capture positional context argument
35
35
  for(let i = agentType ? 2 : 1; i < args.length; i++){
36
36
  const arg = args[i];
37
37
  const value = args[i + 1];
38
+ // Capture non-flag positional arguments as context (before any flags)
39
+ if (!arg.startsWith('--') && !options.context) {
40
+ options.context = arg;
41
+ continue;
42
+ }
38
43
  switch(arg){
39
44
  case '--task-id':
40
45
  options.taskId = value;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/index.ts"],"sourcesContent":["#!/usr/bin/env node\r\n/**\r\n * CLI Entry Point - v2.1\r\n *\r\n * Handles agent spawning commands with memory management:\r\n * npx claude-flow-novice agent <type> [options]\r\n */\r\n\r\n// Load environment variables from .env file\r\nimport 'dotenv/config';\r\n\r\n// Apply safe memory defaults if not configured\r\nif (!process.env.NODE_OPTIONS) {\r\n // Set conservative 8GB limit (reduced from default 16GB)\r\n process.env.NODE_OPTIONS = '--max-old-space-size=8192';\r\n} else if (!process.env.NODE_OPTIONS.includes('max-old-space-size')) {\r\n // Append memory limit to existing NODE_OPTIONS\r\n process.env.NODE_OPTIONS += ' --max-old-space-size=8192';\r\n}\r\n\r\n// Enable memory profiling in development/debug mode\r\nif (process.env.NODE_ENV === 'development' || process.env.CLAUDE_DEBUG) {\r\n if (!process.env.NODE_OPTIONS.includes('inspect')) {\r\n process.env.NODE_OPTIONS += ' --inspect=0.0.0.0:9229';\r\n }\r\n if (!process.env.NODE_OPTIONS.includes('heap-prof')) {\r\n process.env.NODE_OPTIONS += ' --heap-prof';\r\n }\r\n}\r\n\r\nimport { VERSION } from '../core/index.js';\r\nimport { agentCommand, AgentCommandOptions } from './agent-command.js';\r\n\r\n/**\r\n * Parse command line arguments\r\n */\r\nfunction parseArgs(args: string[]): { command: string; agentType?: string; options: AgentCommandOptions } {\r\n const command = args[0] || 'help';\r\n const agentType = args[1] && !args[1].startsWith('--') ? args[1] : undefined;\r\n const options: AgentCommandOptions = {};\r\n\r\n // Parse options\r\n for (let i = agentType ? 2 : 1; i < args.length; i++) {\r\n const arg = args[i];\r\n const value = args[i + 1];\r\n\r\n switch (arg) {\r\n case '--task-id':\r\n options.taskId = value;\r\n i++;\r\n break;\r\n case '--iteration':\r\n options.iteration = parseInt(value, 10);\r\n i++;\r\n break;\r\n case '--agent-id':\r\n options.agentId = value;\r\n i++;\r\n break;\r\n case '--context':\r\n options.context = value;\r\n i++;\r\n break;\r\n case '--mode':\r\n options.mode = value;\r\n i++;\r\n break;\r\n case '--priority':\r\n options.priority = parseInt(value, 10);\r\n i++;\r\n break;\r\n case '--parent-task-id':\r\n options.parentTaskId = value;\r\n i++;\r\n break;\r\n case '--list':\r\n options.list = true;\r\n break;\r\n case '--help':\r\n case '-h':\r\n options.help = true;\r\n break;\r\n case '--memory-limit':\r\n options.memoryLimit = parseInt(value, 10);\r\n i++;\r\n break;\r\n case '--enable-profiling':\r\n options.enableProfiling = true;\r\n break;\r\n case '--debug':\r\n options.debug = true;\r\n break;\r\n }\r\n }\r\n\r\n return { command, agentType, options };\r\n}\r\n\r\n/**\r\n * Display main CLI help\r\n */\r\nfunction displayHelp(): void {\r\n console.log(`\r\nClaude Flow Novice CLI v${VERSION}\r\n\r\nUsage:\r\n npx claude-flow-novice <command> [options]\r\n\r\nCommands:\r\n agent <type> [options] Spawn an agent for task execution\r\n --version Show version number\r\n --help Show this help message\r\n\r\nExamples:\r\n # Spawn an agent\r\n npx claude-flow-novice agent coder --context \"Implement feature\"\r\n\r\n # List available agents\r\n npx claude-flow-novice agent --list\r\n\r\n # Show version\r\n npx claude-flow-novice --version\r\n\r\nFor more information:\r\n https://github.com/yourusername/claude-flow-novice\r\n`);\r\n}\r\n\r\n/**\r\n * Main CLI entry point\r\n */\r\nasync function main() {\r\n const args = process.argv.slice(2);\r\n\r\n // Handle version flag\r\n if (args.includes('--version') || args.includes('-v')) {\r\n console.log(`Claude Flow Novice v${VERSION}`);\r\n return;\r\n }\r\n\r\n // Handle help flag\r\n if (args.length === 0 || args.includes('--help') || args.includes('-h')) {\r\n displayHelp();\r\n return;\r\n }\r\n\r\n const { command, agentType, options } = parseArgs(args);\r\n\r\n switch (command) {\r\n case 'agent':\r\n await agentCommand(agentType, options);\r\n break;\r\n\r\n default:\r\n console.error(`Unknown command: ${command}`);\r\n console.log('Run with --help for usage information');\r\n process.exit(1);\r\n }\r\n}\r\n\r\n// Run CLI\r\nmain().catch((error) => {\r\n console.error('[claude-flow-novice] Fatal error:', error);\r\n process.exit(1);\r\n});\r\n"],"names":["process","env","NODE_OPTIONS","includes","NODE_ENV","CLAUDE_DEBUG","VERSION","agentCommand","parseArgs","args","command","agentType","startsWith","undefined","options","i","length","arg","value","taskId","iteration","parseInt","agentId","context","mode","priority","parentTaskId","list","help","memoryLimit","enableProfiling","debug","displayHelp","console","log","main","argv","slice","error","exit","catch"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/cli/index.ts"],"sourcesContent":["#!/usr/bin/env node\r\n/**\r\n * CLI Entry Point - v2.1\r\n *\r\n * Handles agent spawning commands with memory management:\r\n * npx claude-flow-novice agent <type> [options]\r\n */\r\n\r\n// Load environment variables from .env file\r\nimport 'dotenv/config';\r\n\r\n// Apply safe memory defaults if not configured\r\nif (!process.env.NODE_OPTIONS) {\r\n // Set conservative 8GB limit (reduced from default 16GB)\r\n process.env.NODE_OPTIONS = '--max-old-space-size=8192';\r\n} else if (!process.env.NODE_OPTIONS.includes('max-old-space-size')) {\r\n // Append memory limit to existing NODE_OPTIONS\r\n process.env.NODE_OPTIONS += ' --max-old-space-size=8192';\r\n}\r\n\r\n// Enable memory profiling in development/debug mode\r\nif (process.env.NODE_ENV === 'development' || process.env.CLAUDE_DEBUG) {\r\n if (!process.env.NODE_OPTIONS.includes('inspect')) {\r\n process.env.NODE_OPTIONS += ' --inspect=0.0.0.0:9229';\r\n }\r\n if (!process.env.NODE_OPTIONS.includes('heap-prof')) {\r\n process.env.NODE_OPTIONS += ' --heap-prof';\r\n }\r\n}\r\n\r\nimport { VERSION } from '../core/index.js';\r\nimport { agentCommand, AgentCommandOptions } from './agent-command.js';\r\n\r\n/**\r\n * Parse command line arguments\r\n */\r\nfunction parseArgs(args: string[]): { command: string; agentType?: string; options: AgentCommandOptions } {\r\n const command = args[0] || 'help';\r\n const agentType = args[1] && !args[1].startsWith('--') ? args[1] : undefined;\r\n const options: AgentCommandOptions = {};\r\n\r\n // Parse options and capture positional context argument\r\n for (let i = agentType ? 2 : 1; i < args.length; i++) {\r\n const arg = args[i];\r\n const value = args[i + 1];\r\n\r\n // Capture non-flag positional arguments as context (before any flags)\r\n if (!arg.startsWith('--') && !options.context) {\r\n options.context = arg;\r\n continue;\r\n }\r\n\r\n switch (arg) {\r\n case '--task-id':\r\n options.taskId = value;\r\n i++;\r\n break;\r\n case '--iteration':\r\n options.iteration = parseInt(value, 10);\r\n i++;\r\n break;\r\n case '--agent-id':\r\n options.agentId = value;\r\n i++;\r\n break;\r\n case '--context':\r\n options.context = value;\r\n i++;\r\n break;\r\n case '--mode':\r\n options.mode = value;\r\n i++;\r\n break;\r\n case '--priority':\r\n options.priority = parseInt(value, 10);\r\n i++;\r\n break;\r\n case '--parent-task-id':\r\n options.parentTaskId = value;\r\n i++;\r\n break;\r\n case '--list':\r\n options.list = true;\r\n break;\r\n case '--help':\r\n case '-h':\r\n options.help = true;\r\n break;\r\n case '--memory-limit':\r\n options.memoryLimit = parseInt(value, 10);\r\n i++;\r\n break;\r\n case '--enable-profiling':\r\n options.enableProfiling = true;\r\n break;\r\n case '--debug':\r\n options.debug = true;\r\n break;\r\n }\r\n }\r\n\r\n return { command, agentType, options };\r\n}\r\n\r\n/**\r\n * Display main CLI help\r\n */\r\nfunction displayHelp(): void {\r\n console.log(`\r\nClaude Flow Novice CLI v${VERSION}\r\n\r\nUsage:\r\n npx claude-flow-novice <command> [options]\r\n\r\nCommands:\r\n agent <type> [options] Spawn an agent for task execution\r\n --version Show version number\r\n --help Show this help message\r\n\r\nExamples:\r\n # Spawn an agent\r\n npx claude-flow-novice agent coder --context \"Implement feature\"\r\n\r\n # List available agents\r\n npx claude-flow-novice agent --list\r\n\r\n # Show version\r\n npx claude-flow-novice --version\r\n\r\nFor more information:\r\n https://github.com/yourusername/claude-flow-novice\r\n`);\r\n}\r\n\r\n/**\r\n * Main CLI entry point\r\n */\r\nasync function main() {\r\n const args = process.argv.slice(2);\r\n\r\n // Handle version flag\r\n if (args.includes('--version') || args.includes('-v')) {\r\n console.log(`Claude Flow Novice v${VERSION}`);\r\n return;\r\n }\r\n\r\n // Handle help flag\r\n if (args.length === 0 || args.includes('--help') || args.includes('-h')) {\r\n displayHelp();\r\n return;\r\n }\r\n\r\n const { command, agentType, options } = parseArgs(args);\r\n\r\n switch (command) {\r\n case 'agent':\r\n await agentCommand(agentType, options);\r\n break;\r\n\r\n default:\r\n console.error(`Unknown command: ${command}`);\r\n console.log('Run with --help for usage information');\r\n process.exit(1);\r\n }\r\n}\r\n\r\n// Run CLI\r\nmain().catch((error) => {\r\n console.error('[claude-flow-novice] Fatal error:', error);\r\n process.exit(1);\r\n});\r\n"],"names":["process","env","NODE_OPTIONS","includes","NODE_ENV","CLAUDE_DEBUG","VERSION","agentCommand","parseArgs","args","command","agentType","startsWith","undefined","options","i","length","arg","value","context","taskId","iteration","parseInt","agentId","mode","priority","parentTaskId","list","help","memoryLimit","enableProfiling","debug","displayHelp","console","log","main","argv","slice","error","exit","catch"],"mappings":"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"}
@@ -10,6 +10,9 @@
10
10
  *
11
11
  * Sprint 3 - Phase 2 Implementation
12
12
  */ import { execSync } from 'child_process';
13
+ // Bug #6 Fix: Read Redis connection parameters from process.env
14
+ const redisHost = process.env.CFN_REDIS_HOST || 'cfn-redis';
15
+ const redisPort = process.env.CFN_REDIS_PORT || '6379';
13
16
  /**
14
17
  * Load iteration history for an agent from Redis
15
18
  *
@@ -24,7 +27,7 @@
24
27
  try {
25
28
  // Load result data
26
29
  const resultKey = `swarm:${taskId}:${agentId}:result:iteration-${i}`;
27
- const resultJson = execSync(`redis-cli get "${resultKey}"`, {
30
+ const resultJson = execSync(`redis-cli -h ${redisHost} -p ${redisPort} get "${resultKey}"`, {
28
31
  encoding: 'utf8'
29
32
  }).trim();
30
33
  if (resultJson === '(nil)' || !resultJson) {
@@ -35,7 +38,7 @@
35
38
  const feedbackKey = `swarm:${taskId}:${agentId}:feedback:iteration-${i}`;
36
39
  let feedback;
37
40
  try {
38
- const feedbackJson = execSync(`redis-cli get "${feedbackKey}"`, {
41
+ const feedbackJson = execSync(`redis-cli -h ${redisHost} -p ${redisPort} get "${feedbackKey}"`, {
39
42
  encoding: 'utf8'
40
43
  }).trim();
41
44
  if (feedbackJson !== '(nil)' && feedbackJson) {
@@ -79,7 +82,7 @@
79
82
  const resultJson = JSON.stringify(resultData);
80
83
  try {
81
84
  // Store with 24 hour TTL
82
- execSync(`redis-cli setex "${resultKey}" 86400 '${resultJson.replace(/'/g, "'\\''")}'`, {
85
+ execSync(`redis-cli -h ${redisHost} -p ${redisPort} setex "${resultKey}" 86400 '${resultJson.replace(/'/g, "'\\''")}'`, {
83
86
  encoding: 'utf8'
84
87
  });
85
88
  console.log(`[iteration-history] Stored result for iteration ${iteration}`);
@@ -153,7 +156,7 @@ This is your first attempt at this task. No previous iteration history available
153
156
  */ export async function hasIterationHistory(taskId, agentId) {
154
157
  try {
155
158
  const pattern = `swarm:${taskId}:${agentId}:result:iteration-*`;
156
- const keys = execSync(`redis-cli --scan --pattern "${pattern}"`, {
159
+ const keys = execSync(`redis-cli -h ${redisHost} -p ${redisPort} --scan --pattern "${pattern}"`, {
157
160
  encoding: 'utf8'
158
161
  }).trim();
159
162
  return keys.length > 0;
@@ -170,7 +173,7 @@ This is your first attempt at this task. No previous iteration history available
170
173
  */ export async function getLatestIteration(taskId, agentId) {
171
174
  try {
172
175
  const pattern = `swarm:${taskId}:${agentId}:result:iteration-*`;
173
- const keys = execSync(`redis-cli --scan --pattern "${pattern}"`, {
176
+ const keys = execSync(`redis-cli -h ${redisHost} -p ${redisPort} --scan --pattern "${pattern}"`, {
174
177
  encoding: 'utf8'
175
178
  }).trim().split('\n').filter((k)=>k.length > 0);
176
179
  if (keys.length === 0) return 0;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/iteration-history.ts"],"sourcesContent":["/**\r\n * Iteration History Management\r\n *\r\n * Loads and formats iteration history from Redis for CLI-spawned agents.\r\n * Enables agents to learn from previous attempts and feedback.\r\n *\r\n * Storage Pattern:\r\n * swarm:${TASK_ID}:${AGENT_ID}:result:iteration-${N} → Result text + confidence\r\n * swarm:${TASK_ID}:${AGENT_ID}:feedback:iteration-${N} → Validator feedback\r\n *\r\n * Sprint 3 - Phase 2 Implementation\r\n */\r\n\r\nimport { execSync } from 'child_process';\r\n\r\nexport interface IterationResult {\r\n iteration: number;\r\n result: string;\r\n confidence: number;\r\n timestamp: string;\r\n feedback?: string;\r\n}\r\n\r\n/**\r\n * Load iteration history for an agent from Redis\r\n *\r\n * @param taskId - Task identifier\r\n * @param agentId - Agent identifier\r\n * @param currentIteration - Current iteration number (loads 1 to N-1)\r\n * @returns Array of iteration results\r\n */\r\nexport async function loadIterationHistory(\r\n taskId: string,\r\n agentId: string,\r\n currentIteration: number\r\n): Promise<IterationResult[]> {\r\n const history: IterationResult[] = [];\r\n\r\n // Load previous iterations (1 to currentIteration - 1)\r\n for (let i = 1; i < currentIteration; i++) {\r\n try {\r\n // Load result data\r\n const resultKey = `swarm:${taskId}:${agentId}:result:iteration-${i}`;\r\n const resultJson = execSync(`redis-cli get \"${resultKey}\"`, { encoding: 'utf8' }).trim();\r\n\r\n if (resultJson === '(nil)' || !resultJson) {\r\n // No result for this iteration (shouldn't happen in normal flow)\r\n continue;\r\n }\r\n\r\n const resultData = JSON.parse(resultJson);\r\n\r\n // Load feedback data (may not exist for all iterations)\r\n const feedbackKey = `swarm:${taskId}:${agentId}:feedback:iteration-${i}`;\r\n let feedback: string | undefined;\r\n\r\n try {\r\n const feedbackJson = execSync(`redis-cli get \"${feedbackKey}\"`, { encoding: 'utf8' }).trim();\r\n if (feedbackJson !== '(nil)' && feedbackJson) {\r\n const feedbackData = JSON.parse(feedbackJson);\r\n feedback = feedbackData.feedback || feedbackData.comments;\r\n }\r\n } catch (err) {\r\n // Feedback may not exist for this iteration\r\n feedback = undefined;\r\n }\r\n\r\n history.push({\r\n iteration: i,\r\n result: resultData.result || resultData.output || '',\r\n confidence: resultData.confidence || 0,\r\n timestamp: resultData.timestamp || new Date().toISOString(),\r\n feedback\r\n });\r\n } catch (err) {\r\n console.error(`[iteration-history] Failed to load iteration ${i}:`, err);\r\n // Continue loading other iterations\r\n }\r\n }\r\n\r\n return history;\r\n}\r\n\r\n/**\r\n * Store iteration result in Redis\r\n *\r\n * @param taskId - Task identifier\r\n * @param agentId - Agent identifier\r\n * @param iteration - Iteration number\r\n * @param result - Result text/output\r\n * @param confidence - Confidence score (0.0-1.0)\r\n */\r\nexport async function storeIterationResult(\r\n taskId: string,\r\n agentId: string,\r\n iteration: number,\r\n result: string,\r\n confidence: number\r\n): Promise<void> {\r\n const resultKey = `swarm:${taskId}:${agentId}:result:iteration-${iteration}`;\r\n const resultData = {\r\n result,\r\n confidence,\r\n timestamp: new Date().toISOString(),\r\n iteration\r\n };\r\n\r\n const resultJson = JSON.stringify(resultData);\r\n\r\n try {\r\n // Store with 24 hour TTL\r\n execSync(`redis-cli setex \"${resultKey}\" 86400 '${resultJson.replace(/'/g, \"'\\\\''\")}'`, {\r\n encoding: 'utf8'\r\n });\r\n console.log(`[iteration-history] Stored result for iteration ${iteration}`);\r\n } catch (err) {\r\n console.error(`[iteration-history] Failed to store result:`, err);\r\n throw err;\r\n }\r\n}\r\n\r\n/**\r\n * Format iteration history as markdown for system prompt\r\n *\r\n * @param history - Array of iteration results\r\n * @param currentIteration - Current iteration number\r\n * @returns Formatted markdown string\r\n */\r\nexport function formatIterationHistory(\r\n history: IterationResult[],\r\n currentIteration: number\r\n): string {\r\n if (history.length === 0) {\r\n return `## Current Iteration: ${currentIteration}\r\n\r\nThis is your first attempt at this task. No previous iteration history available.\r\n`;\r\n }\r\n\r\n const sections: string[] = [];\r\n\r\n sections.push('## Iteration History');\r\n sections.push('');\r\n sections.push('Learn from your previous attempts and feedback:');\r\n sections.push('');\r\n\r\n // Format each iteration\r\n for (const iter of history) {\r\n sections.push(`### Iteration ${iter.iteration}`);\r\n sections.push('');\r\n\r\n sections.push('**Result:**');\r\n sections.push(iter.result.substring(0, 500)); // Truncate to 500 chars\r\n if (iter.result.length > 500) {\r\n sections.push('... (truncated)');\r\n }\r\n sections.push('');\r\n\r\n if (iter.feedback) {\r\n sections.push('**Feedback from Validators:**');\r\n sections.push(iter.feedback);\r\n sections.push('');\r\n }\r\n\r\n sections.push(`**Confidence:** ${iter.confidence.toFixed(2)}`);\r\n sections.push(`**Timestamp:** ${iter.timestamp}`);\r\n sections.push('');\r\n sections.push('---');\r\n sections.push('');\r\n }\r\n\r\n // Add current iteration context\r\n sections.push(`## Current Iteration: ${currentIteration}`);\r\n sections.push('');\r\n\r\n if (history.length > 0) {\r\n const lastIteration = history[history.length - 1];\r\n if (lastIteration.feedback) {\r\n sections.push('**Your Task:** Address the feedback from the previous iteration:');\r\n sections.push('');\r\n sections.push(lastIteration.feedback);\r\n sections.push('');\r\n } else {\r\n sections.push(`**Your Task:** Improve upon iteration ${lastIteration.iteration} (confidence: ${lastIteration.confidence.toFixed(2)})`);\r\n sections.push('');\r\n }\r\n }\r\n\r\n return sections.join('\\n');\r\n}\r\n\r\n/**\r\n * Check if iteration history exists for an agent\r\n *\r\n * @param taskId - Task identifier\r\n * @param agentId - Agent identifier\r\n * @returns True if any iteration history exists\r\n */\r\nexport async function hasIterationHistory(\r\n taskId: string,\r\n agentId: string\r\n): Promise<boolean> {\r\n try {\r\n const pattern = `swarm:${taskId}:${agentId}:result:iteration-*`;\r\n const keys = execSync(`redis-cli --scan --pattern \"${pattern}\"`, { encoding: 'utf8' }).trim();\r\n return keys.length > 0;\r\n } catch (err) {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Get the latest iteration number for an agent\r\n *\r\n * @param taskId - Task identifier\r\n * @param agentId - Agent identifier\r\n * @returns Latest iteration number (0 if no history)\r\n */\r\nexport async function getLatestIteration(\r\n taskId: string,\r\n agentId: string\r\n): Promise<number> {\r\n try {\r\n const pattern = `swarm:${taskId}:${agentId}:result:iteration-*`;\r\n const keys = execSync(`redis-cli --scan --pattern \"${pattern}\"`, { encoding: 'utf8' })\r\n .trim()\r\n .split('\\n')\r\n .filter((k) => k.length > 0);\r\n\r\n if (keys.length === 0) return 0;\r\n\r\n // Extract iteration numbers and find max\r\n const iterations = keys.map((key) => {\r\n const match = key.match(/iteration-(\\d+)$/);\r\n return match ? parseInt(match[1], 10) : 0;\r\n });\r\n\r\n return Math.max(...iterations);\r\n } catch (err) {\r\n return 0;\r\n }\r\n}\r\n"],"names":["execSync","loadIterationHistory","taskId","agentId","currentIteration","history","i","resultKey","resultJson","encoding","trim","resultData","JSON","parse","feedbackKey","feedback","feedbackJson","feedbackData","comments","err","undefined","push","iteration","result","output","confidence","timestamp","Date","toISOString","console","error","storeIterationResult","stringify","replace","log","formatIterationHistory","length","sections","iter","substring","toFixed","lastIteration","join","hasIterationHistory","pattern","keys","getLatestIteration","split","filter","k","iterations","map","key","match","parseInt","Math","max"],"mappings":"AAAA;;;;;;;;;;;CAWC,GAED,SAASA,QAAQ,QAAQ,gBAAgB;AAUzC;;;;;;;CAOC,GACD,OAAO,eAAeC,qBACpBC,MAAc,EACdC,OAAe,EACfC,gBAAwB;IAExB,MAAMC,UAA6B,EAAE;IAErC,uDAAuD;IACvD,IAAK,IAAIC,IAAI,GAAGA,IAAIF,kBAAkBE,IAAK;QACzC,IAAI;YACF,mBAAmB;YACnB,MAAMC,YAAY,CAAC,MAAM,EAAEL,OAAO,CAAC,EAAEC,QAAQ,kBAAkB,EAAEG,GAAG;YACpE,MAAME,aAAaR,SAAS,CAAC,eAAe,EAAEO,UAAU,CAAC,CAAC,EAAE;gBAAEE,UAAU;YAAO,GAAGC,IAAI;YAEtF,IAAIF,eAAe,WAAW,CAACA,YAAY;gBAEzC;YACF;YAEA,MAAMG,aAAaC,KAAKC,KAAK,CAACL;YAE9B,wDAAwD;YACxD,MAAMM,cAAc,CAAC,MAAM,EAAEZ,OAAO,CAAC,EAAEC,QAAQ,oBAAoB,EAAEG,GAAG;YACxE,IAAIS;YAEJ,IAAI;gBACF,MAAMC,eAAehB,SAAS,CAAC,eAAe,EAAEc,YAAY,CAAC,CAAC,EAAE;oBAAEL,UAAU;gBAAO,GAAGC,IAAI;gBAC1F,IAAIM,iBAAiB,WAAWA,cAAc;oBAC5C,MAAMC,eAAeL,KAAKC,KAAK,CAACG;oBAChCD,WAAWE,aAAaF,QAAQ,IAAIE,aAAaC,QAAQ;gBAC3D;YACF,EAAE,OAAOC,KAAK;gBACZ,4CAA4C;gBAC5CJ,WAAWK;YACb;YAEAf,QAAQgB,IAAI,CAAC;gBACXC,WAAWhB;gBACXiB,QAAQZ,WAAWY,MAAM,IAAIZ,WAAWa,MAAM,IAAI;gBAClDC,YAAYd,WAAWc,UAAU,IAAI;gBACrCC,WAAWf,WAAWe,SAAS,IAAI,IAAIC,OAAOC,WAAW;gBACzDb;YACF;QACF,EAAE,OAAOI,KAAK;YACZU,QAAQC,KAAK,CAAC,CAAC,6CAA6C,EAAExB,EAAE,CAAC,CAAC,EAAEa;QACpE,oCAAoC;QACtC;IACF;IAEA,OAAOd;AACT;AAEA;;;;;;;;CAQC,GACD,OAAO,eAAe0B,qBACpB7B,MAAc,EACdC,OAAe,EACfmB,SAAiB,EACjBC,MAAc,EACdE,UAAkB;IAElB,MAAMlB,YAAY,CAAC,MAAM,EAAEL,OAAO,CAAC,EAAEC,QAAQ,kBAAkB,EAAEmB,WAAW;IAC5E,MAAMX,aAAa;QACjBY;QACAE;QACAC,WAAW,IAAIC,OAAOC,WAAW;QACjCN;IACF;IAEA,MAAMd,aAAaI,KAAKoB,SAAS,CAACrB;IAElC,IAAI;QACF,yBAAyB;QACzBX,SAAS,CAAC,iBAAiB,EAAEO,UAAU,SAAS,EAAEC,WAAWyB,OAAO,CAAC,MAAM,SAAS,CAAC,CAAC,EAAE;YACtFxB,UAAU;QACZ;QACAoB,QAAQK,GAAG,CAAC,CAAC,gDAAgD,EAAEZ,WAAW;IAC5E,EAAE,OAAOH,KAAK;QACZU,QAAQC,KAAK,CAAC,CAAC,2CAA2C,CAAC,EAAEX;QAC7D,MAAMA;IACR;AACF;AAEA;;;;;;CAMC,GACD,OAAO,SAASgB,uBACd9B,OAA0B,EAC1BD,gBAAwB;IAExB,IAAIC,QAAQ+B,MAAM,KAAK,GAAG;QACxB,OAAO,CAAC,sBAAsB,EAAEhC,iBAAiB;;;AAGrD,CAAC;IACC;IAEA,MAAMiC,WAAqB,EAAE;IAE7BA,SAAShB,IAAI,CAAC;IACdgB,SAAShB,IAAI,CAAC;IACdgB,SAAShB,IAAI,CAAC;IACdgB,SAAShB,IAAI,CAAC;IAEd,wBAAwB;IACxB,KAAK,MAAMiB,QAAQjC,QAAS;QAC1BgC,SAAShB,IAAI,CAAC,CAAC,cAAc,EAAEiB,KAAKhB,SAAS,EAAE;QAC/Ce,SAAShB,IAAI,CAAC;QAEdgB,SAAShB,IAAI,CAAC;QACdgB,SAAShB,IAAI,CAACiB,KAAKf,MAAM,CAACgB,SAAS,CAAC,GAAG,OAAO,wBAAwB;QACtE,IAAID,KAAKf,MAAM,CAACa,MAAM,GAAG,KAAK;YAC5BC,SAAShB,IAAI,CAAC;QAChB;QACAgB,SAAShB,IAAI,CAAC;QAEd,IAAIiB,KAAKvB,QAAQ,EAAE;YACjBsB,SAAShB,IAAI,CAAC;YACdgB,SAAShB,IAAI,CAACiB,KAAKvB,QAAQ;YAC3BsB,SAAShB,IAAI,CAAC;QAChB;QAEAgB,SAAShB,IAAI,CAAC,CAAC,gBAAgB,EAAEiB,KAAKb,UAAU,CAACe,OAAO,CAAC,IAAI;QAC7DH,SAAShB,IAAI,CAAC,CAAC,eAAe,EAAEiB,KAAKZ,SAAS,EAAE;QAChDW,SAAShB,IAAI,CAAC;QACdgB,SAAShB,IAAI,CAAC;QACdgB,SAAShB,IAAI,CAAC;IAChB;IAEA,gCAAgC;IAChCgB,SAAShB,IAAI,CAAC,CAAC,sBAAsB,EAAEjB,kBAAkB;IACzDiC,SAAShB,IAAI,CAAC;IAEd,IAAIhB,QAAQ+B,MAAM,GAAG,GAAG;QACtB,MAAMK,gBAAgBpC,OAAO,CAACA,QAAQ+B,MAAM,GAAG,EAAE;QACjD,IAAIK,cAAc1B,QAAQ,EAAE;YAC1BsB,SAAShB,IAAI,CAAC;YACdgB,SAAShB,IAAI,CAAC;YACdgB,SAAShB,IAAI,CAACoB,cAAc1B,QAAQ;YACpCsB,SAAShB,IAAI,CAAC;QAChB,OAAO;YACLgB,SAAShB,IAAI,CAAC,CAAC,sCAAsC,EAAEoB,cAAcnB,SAAS,CAAC,cAAc,EAAEmB,cAAchB,UAAU,CAACe,OAAO,CAAC,GAAG,CAAC,CAAC;YACrIH,SAAShB,IAAI,CAAC;QAChB;IACF;IAEA,OAAOgB,SAASK,IAAI,CAAC;AACvB;AAEA;;;;;;CAMC,GACD,OAAO,eAAeC,oBACpBzC,MAAc,EACdC,OAAe;IAEf,IAAI;QACF,MAAMyC,UAAU,CAAC,MAAM,EAAE1C,OAAO,CAAC,EAAEC,QAAQ,mBAAmB,CAAC;QAC/D,MAAM0C,OAAO7C,SAAS,CAAC,4BAA4B,EAAE4C,QAAQ,CAAC,CAAC,EAAE;YAAEnC,UAAU;QAAO,GAAGC,IAAI;QAC3F,OAAOmC,KAAKT,MAAM,GAAG;IACvB,EAAE,OAAOjB,KAAK;QACZ,OAAO;IACT;AACF;AAEA;;;;;;CAMC,GACD,OAAO,eAAe2B,mBACpB5C,MAAc,EACdC,OAAe;IAEf,IAAI;QACF,MAAMyC,UAAU,CAAC,MAAM,EAAE1C,OAAO,CAAC,EAAEC,QAAQ,mBAAmB,CAAC;QAC/D,MAAM0C,OAAO7C,SAAS,CAAC,4BAA4B,EAAE4C,QAAQ,CAAC,CAAC,EAAE;YAAEnC,UAAU;QAAO,GACjFC,IAAI,GACJqC,KAAK,CAAC,MACNC,MAAM,CAAC,CAACC,IAAMA,EAAEb,MAAM,GAAG;QAE5B,IAAIS,KAAKT,MAAM,KAAK,GAAG,OAAO;QAE9B,yCAAyC;QACzC,MAAMc,aAAaL,KAAKM,GAAG,CAAC,CAACC;YAC3B,MAAMC,QAAQD,IAAIC,KAAK,CAAC;YACxB,OAAOA,QAAQC,SAASD,KAAK,CAAC,EAAE,EAAE,MAAM;QAC1C;QAEA,OAAOE,KAAKC,GAAG,IAAIN;IACrB,EAAE,OAAO/B,KAAK;QACZ,OAAO;IACT;AACF"}
1
+ {"version":3,"sources":["../../src/cli/iteration-history.ts"],"sourcesContent":["/**\r\n * Iteration History Management\r\n *\r\n * Loads and formats iteration history from Redis for CLI-spawned agents.\r\n * Enables agents to learn from previous attempts and feedback.\r\n *\r\n * Storage Pattern:\r\n * swarm:${TASK_ID}:${AGENT_ID}:result:iteration-${N} → Result text + confidence\r\n * swarm:${TASK_ID}:${AGENT_ID}:feedback:iteration-${N} → Validator feedback\r\n *\r\n * Sprint 3 - Phase 2 Implementation\r\n */\r\n\r\nimport { execSync } from 'child_process';\r\n\r\n// Bug #6 Fix: Read Redis connection parameters from process.env\r\nconst redisHost = process.env.CFN_REDIS_HOST || 'cfn-redis';\r\nconst redisPort = process.env.CFN_REDIS_PORT || '6379';\r\n\r\nexport interface IterationResult {\r\n iteration: number;\r\n result: string;\r\n confidence: number;\r\n timestamp: string;\r\n feedback?: string;\r\n}\r\n\r\n/**\r\n * Load iteration history for an agent from Redis\r\n *\r\n * @param taskId - Task identifier\r\n * @param agentId - Agent identifier\r\n * @param currentIteration - Current iteration number (loads 1 to N-1)\r\n * @returns Array of iteration results\r\n */\r\nexport async function loadIterationHistory(\r\n taskId: string,\r\n agentId: string,\r\n currentIteration: number\r\n): Promise<IterationResult[]> {\r\n const history: IterationResult[] = [];\r\n\r\n // Load previous iterations (1 to currentIteration - 1)\r\n for (let i = 1; i < currentIteration; i++) {\r\n try {\r\n // Load result data\r\n const resultKey = `swarm:${taskId}:${agentId}:result:iteration-${i}`;\r\n const resultJson = execSync(`redis-cli -h ${redisHost} -p ${redisPort} get \"${resultKey}\"`, { encoding: 'utf8' }).trim();\r\n\r\n if (resultJson === '(nil)' || !resultJson) {\r\n // No result for this iteration (shouldn't happen in normal flow)\r\n continue;\r\n }\r\n\r\n const resultData = JSON.parse(resultJson);\r\n\r\n // Load feedback data (may not exist for all iterations)\r\n const feedbackKey = `swarm:${taskId}:${agentId}:feedback:iteration-${i}`;\r\n let feedback: string | undefined;\r\n\r\n try {\r\n const feedbackJson = execSync(`redis-cli -h ${redisHost} -p ${redisPort} get \"${feedbackKey}\"`, { encoding: 'utf8' }).trim();\r\n if (feedbackJson !== '(nil)' && feedbackJson) {\r\n const feedbackData = JSON.parse(feedbackJson);\r\n feedback = feedbackData.feedback || feedbackData.comments;\r\n }\r\n } catch (err) {\r\n // Feedback may not exist for this iteration\r\n feedback = undefined;\r\n }\r\n\r\n history.push({\r\n iteration: i,\r\n result: resultData.result || resultData.output || '',\r\n confidence: resultData.confidence || 0,\r\n timestamp: resultData.timestamp || new Date().toISOString(),\r\n feedback\r\n });\r\n } catch (err) {\r\n console.error(`[iteration-history] Failed to load iteration ${i}:`, err);\r\n // Continue loading other iterations\r\n }\r\n }\r\n\r\n return history;\r\n}\r\n\r\n/**\r\n * Store iteration result in Redis\r\n *\r\n * @param taskId - Task identifier\r\n * @param agentId - Agent identifier\r\n * @param iteration - Iteration number\r\n * @param result - Result text/output\r\n * @param confidence - Confidence score (0.0-1.0)\r\n */\r\nexport async function storeIterationResult(\r\n taskId: string,\r\n agentId: string,\r\n iteration: number,\r\n result: string,\r\n confidence: number\r\n): Promise<void> {\r\n const resultKey = `swarm:${taskId}:${agentId}:result:iteration-${iteration}`;\r\n const resultData = {\r\n result,\r\n confidence,\r\n timestamp: new Date().toISOString(),\r\n iteration\r\n };\r\n\r\n const resultJson = JSON.stringify(resultData);\r\n\r\n try {\r\n // Store with 24 hour TTL\r\n execSync(`redis-cli -h ${redisHost} -p ${redisPort} setex \"${resultKey}\" 86400 '${resultJson.replace(/'/g, \"'\\\\''\")}'`, {\r\n encoding: 'utf8'\r\n });\r\n console.log(`[iteration-history] Stored result for iteration ${iteration}`);\r\n } catch (err) {\r\n console.error(`[iteration-history] Failed to store result:`, err);\r\n throw err;\r\n }\r\n}\r\n\r\n/**\r\n * Format iteration history as markdown for system prompt\r\n *\r\n * @param history - Array of iteration results\r\n * @param currentIteration - Current iteration number\r\n * @returns Formatted markdown string\r\n */\r\nexport function formatIterationHistory(\r\n history: IterationResult[],\r\n currentIteration: number\r\n): string {\r\n if (history.length === 0) {\r\n return `## Current Iteration: ${currentIteration}\r\n\r\nThis is your first attempt at this task. No previous iteration history available.\r\n`;\r\n }\r\n\r\n const sections: string[] = [];\r\n\r\n sections.push('## Iteration History');\r\n sections.push('');\r\n sections.push('Learn from your previous attempts and feedback:');\r\n sections.push('');\r\n\r\n // Format each iteration\r\n for (const iter of history) {\r\n sections.push(`### Iteration ${iter.iteration}`);\r\n sections.push('');\r\n\r\n sections.push('**Result:**');\r\n sections.push(iter.result.substring(0, 500)); // Truncate to 500 chars\r\n if (iter.result.length > 500) {\r\n sections.push('... (truncated)');\r\n }\r\n sections.push('');\r\n\r\n if (iter.feedback) {\r\n sections.push('**Feedback from Validators:**');\r\n sections.push(iter.feedback);\r\n sections.push('');\r\n }\r\n\r\n sections.push(`**Confidence:** ${iter.confidence.toFixed(2)}`);\r\n sections.push(`**Timestamp:** ${iter.timestamp}`);\r\n sections.push('');\r\n sections.push('---');\r\n sections.push('');\r\n }\r\n\r\n // Add current iteration context\r\n sections.push(`## Current Iteration: ${currentIteration}`);\r\n sections.push('');\r\n\r\n if (history.length > 0) {\r\n const lastIteration = history[history.length - 1];\r\n if (lastIteration.feedback) {\r\n sections.push('**Your Task:** Address the feedback from the previous iteration:');\r\n sections.push('');\r\n sections.push(lastIteration.feedback);\r\n sections.push('');\r\n } else {\r\n sections.push(`**Your Task:** Improve upon iteration ${lastIteration.iteration} (confidence: ${lastIteration.confidence.toFixed(2)})`);\r\n sections.push('');\r\n }\r\n }\r\n\r\n return sections.join('\\n');\r\n}\r\n\r\n/**\r\n * Check if iteration history exists for an agent\r\n *\r\n * @param taskId - Task identifier\r\n * @param agentId - Agent identifier\r\n * @returns True if any iteration history exists\r\n */\r\nexport async function hasIterationHistory(\r\n taskId: string,\r\n agentId: string\r\n): Promise<boolean> {\r\n try {\r\n const pattern = `swarm:${taskId}:${agentId}:result:iteration-*`;\r\n const keys = execSync(`redis-cli -h ${redisHost} -p ${redisPort} --scan --pattern \"${pattern}\"`, { encoding: 'utf8' }).trim();\r\n return keys.length > 0;\r\n } catch (err) {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Get the latest iteration number for an agent\r\n *\r\n * @param taskId - Task identifier\r\n * @param agentId - Agent identifier\r\n * @returns Latest iteration number (0 if no history)\r\n */\r\nexport async function getLatestIteration(\r\n taskId: string,\r\n agentId: string\r\n): Promise<number> {\r\n try {\r\n const pattern = `swarm:${taskId}:${agentId}:result:iteration-*`;\r\n const keys = execSync(`redis-cli -h ${redisHost} -p ${redisPort} --scan --pattern \"${pattern}\"`, { encoding: 'utf8' })\r\n .trim()\r\n .split('\\n')\r\n .filter((k) => k.length > 0);\r\n\r\n if (keys.length === 0) return 0;\r\n\r\n // Extract iteration numbers and find max\r\n const iterations = keys.map((key) => {\r\n const match = key.match(/iteration-(\\d+)$/);\r\n return match ? parseInt(match[1], 10) : 0;\r\n });\r\n\r\n return Math.max(...iterations);\r\n } catch (err) {\r\n return 0;\r\n }\r\n}\r\n"],"names":["execSync","redisHost","process","env","CFN_REDIS_HOST","redisPort","CFN_REDIS_PORT","loadIterationHistory","taskId","agentId","currentIteration","history","i","resultKey","resultJson","encoding","trim","resultData","JSON","parse","feedbackKey","feedback","feedbackJson","feedbackData","comments","err","undefined","push","iteration","result","output","confidence","timestamp","Date","toISOString","console","error","storeIterationResult","stringify","replace","log","formatIterationHistory","length","sections","iter","substring","toFixed","lastIteration","join","hasIterationHistory","pattern","keys","getLatestIteration","split","filter","k","iterations","map","key","match","parseInt","Math","max"],"mappings":"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"}
@@ -32,7 +32,7 @@ export class EnhancedProgressTracker extends EventEmitter {
32
32
  swarmOverviews = new Map();
33
33
  subscriptions = new Map();
34
34
  hmacSecret;
35
- constructor(redisUrl = process.env.REDIS_URL || 'redis://localhost:6379', loggerConfig, hmacSecret = process.env.HMAC_SECRET || 'default-secret'){
35
+ constructor(redisUrl = process.env.CFN_REDIS_URL || process.env.REDIS_URL || `redis://${process.env.CFN_REDIS_HOST || 'cfn-redis'}:${process.env.CFN_REDIS_PORT || 6379}`, loggerConfig, hmacSecret = process.env.HMAC_SECRET || 'default-secret'){
36
36
  super();
37
37
  this.hmacSecret = hmacSecret;
38
38
  // Initialize logger
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/coordination/enhanced-progress-tracker.ts"],"sourcesContent":["/**\n * Enhanced Progress Tracker with Granular Progress Updates and Redis Messaging\n * \n * Provides detailed progress tracking for agent tasks with real-time Redis pub/sub messaging.\n * Supports granular progress updates, confidence scoring, and comprehensive visibility\n * into agent execution states.\n */\n\nimport { EventEmitter } from 'events';\nimport { createClient, RedisClientType } from 'redis';\nimport { Logger } from '../core/logger.js';\nimport type { LoggingConfig } from '../utils/types.js';\n\n// ===== TYPE DEFINITIONS =====\n\n/**\n * Granular progress step within a task\n */\nexport interface ProgressStep {\n id: string;\n name: string;\n description: string;\n status: 'pending' | 'in_progress' | 'completed' | 'failed' | 'skipped';\n startTime?: number;\n endTime?: number;\n duration?: number;\n confidence?: number;\n metadata?: Record<string, any>;\n error?: string;\n subSteps?: ProgressStep[];\n}\n\n/**\n * Detailed task progress information\n */\nexport interface TaskProgress {\n taskId: string;\n agentId: string;\n swarmId: string;\n taskType: string;\n taskDescription: string;\n overallStatus: 'pending' | 'in_progress' | 'completed' | 'failed' | 'blocked';\n progressPercentage: number;\n currentStep?: string;\n steps: ProgressStep[];\n startTime: number;\n endTime?: number;\n estimatedCompletion?: number;\n confidence: number;\n metadata: {\n filesProcessed?: string[];\n deliverables?: string[];\n dependencies?: string[];\n blockers?: string[];\n resources?: {\n memoryUsage?: number;\n cpuUsage?: number;\n diskUsage?: number;\n };\n };\n reasoning?: {\n currentThought?: string;\n strategy?: string;\n alternatives?: string[];\n risks?: string[];\n };\n}\n\n/**\n * Progress update message for Redis pub/sub\n */\nexport interface ProgressUpdateMessage {\n type: 'progress_update' | 'step_update' | 'task_complete' | 'task_failed';\n agentId: string;\n swarmId: string;\n taskId: string;\n timestamp: number;\n data: Partial<TaskProgress> | Partial<ProgressStep>;\n signature?: string;\n}\n\n/**\n * Agent visibility information\n */\nexport interface AgentVisibility {\n agentId: string;\n agentType: string;\n status: 'idle' | 'active' | 'working' | 'blocked' | 'completed' | 'error';\n currentTask?: TaskProgress;\n recentActivity: Array<{\n timestamp: number;\n action: string;\n details: string;\n }>;\n performance: {\n tasksCompleted: number;\n averageTaskDuration: number;\n successRate: number;\n currentStreak: number;\n };\n capabilities: string[];\n availability: {\n nextAvailable?: number;\n currentLoad: number;\n maxConcurrentTasks: number;\n };\n}\n\n/**\n * Swarm-wide progress overview\n */\nexport interface SwarmProgressOverview {\n swarmId: string;\n totalAgents: number;\n activeAgents: number;\n totalTasks: number;\n completedTasks: number;\n failedTasks: number;\n overallProgress: number;\n estimatedCompletion?: number;\n bottlenecks: string[];\n healthScore: number;\n lastUpdated: number;\n}\n\n// ===== REDIS CHANNELS AND KEYS =====\n\nexport const REDIS_CHANNELS = {\n PROGRESS_UPDATES: 'progress:updates',\n AGENT_VISIBILITY: 'agent:visibility',\n SWARM_OVERVIEW: 'swarm:overview',\n TASK_EVENTS: 'task:events',\n COORDINATION_SIGNALS: 'coordination:signals'\n} as const;\n\nexport const REDIS_KEYS = {\n AGENT_PROGRESS: 'agent:progress:',\n TASK_PROGRESS: 'task:progress:',\n SWARM_OVERVIEW: 'swarm:overview:',\n AGENT_VISIBILITY: 'agent:visibility:',\n PROGRESS_HISTORY: 'progress:history:'\n} as const;\n\n// ===== ENHANCED PROGRESS TRACKER CLASS =====\n\nexport class EnhancedProgressTracker extends EventEmitter {\n private redis: RedisClientType;\n private subscriber: RedisClientType;\n private logger: Logger;\n private taskProgress = new Map<string, TaskProgress>();\n private agentVisibility = new Map<string, AgentVisibility>();\n private swarmOverviews = new Map<string, SwarmProgressOverview>();\n private subscriptions = new Map<string, Set<(message: any) => void>>();\n private hmacSecret: string;\n\n constructor(\n redisUrl: string = process.env.REDIS_URL || 'redis://localhost:6379',\n loggerConfig?: LoggingConfig,\n hmacSecret: string = process.env.HMAC_SECRET || 'default-secret'\n ) {\n super();\n this.hmacSecret = hmacSecret;\n \n // Initialize logger\n const config: LoggingConfig = loggerConfig || {\n level: process.env.CLAUDE_FLOW_ENV === 'test' ? 'error' : 'info',\n format: 'json',\n destination: 'console'\n };\n this.logger = new Logger(config, { component: 'EnhancedProgressTracker' });\n\n // Initialize Redis clients\n this.redis = createClient({ url: redisUrl });\n this.subscriber = createClient({ url: redisUrl });\n\n this.setupRedisClients();\n }\n\n /**\n * Initialize Redis connections and subscriptions\n */\n async initialize(): Promise<void> {\n try {\n await Promise.all([\n this.redis.connect(),\n this.subscriber.connect()\n ]);\n\n // Set up default subscriptions\n await this.setupDefaultSubscriptions();\n\n this.logger.info('Enhanced Progress Tracker initialized', {\n redisConnected: true,\n subscriptionsEnabled: true\n });\n\n this.emit('initialized');\n } catch (error) {\n this.logger.error('Failed to initialize Enhanced Progress Tracker', {\n error: error instanceof Error ? error.message : String(error)\n });\n throw error;\n }\n }\n\n /**\n * Create a new task progress tracker\n */\n async createTaskProgress(\n taskId: string,\n agentId: string,\n swarmId: string,\n taskType: string,\n taskDescription: string,\n steps: Omit<ProgressStep, 'status' | 'id'>[]\n ): Promise<void> {\n const progressSteps: ProgressStep[] = steps.map((step, index) => ({\n ...step,\n id: `step-${index + 1}`,\n status: 'pending'\n }));\n\n const taskProgress: TaskProgress = {\n taskId,\n agentId,\n swarmId,\n taskType,\n taskDescription,\n overallStatus: 'pending',\n progressPercentage: 0,\n steps: progressSteps,\n startTime: Date.now(),\n confidence: 0.5,\n metadata: {\n filesProcessed: [],\n deliverables: [],\n dependencies: [],\n blockers: [],\n resources: {}\n }\n };\n\n // Store in memory\n this.taskProgress.set(taskId, taskProgress);\n\n // Store in Redis with TTL\n await this.redis.setEx(\n `${REDIS_KEYS.TASK_PROGRESS}${taskId}`,\n 86400, // 24 hours TTL\n JSON.stringify(taskProgress)\n );\n\n // Publish creation event\n await this.publishProgressUpdate({\n type: 'progress_update',\n agentId,\n swarmId,\n taskId,\n timestamp: Date.now(),\n data: taskProgress\n });\n\n this.logger.info('Task progress created', {\n taskId,\n agentId,\n swarmId,\n taskType,\n stepCount: steps.length\n });\n }\n\n /**\n * Update task progress with granular step information\n */\n async updateTaskProgress(\n taskId: string,\n updates: {\n stepId?: string;\n progressPercentage?: number;\n confidence?: number;\n status?: TaskProgress['overallStatus'];\n currentStep?: string;\n metadata?: Partial<TaskProgress['metadata']>;\n reasoning?: Partial<TaskProgress['reasoning']>;\n error?: string;\n }\n ): Promise<void> {\n const existing = this.taskProgress.get(taskId);\n if (!existing) {\n throw new Error(`Task progress not found: ${taskId}`);\n }\n\n // Update task progress\n const updated: TaskProgress = {\n ...existing,\n ...updates,\n metadata: {\n ...existing.metadata,\n ...updates.metadata\n },\n reasoning: {\n ...existing.reasoning,\n ...updates.reasoning\n }\n };\n\n // Update specific step if provided\n if (updates.stepId) {\n const step = updated.steps.find(s => s.id === updates.stepId);\n if (step) {\n if (updates.status && this.isStepStatus(updates.status)) {\n step.status = updates.status;\n }\n \n if (updates.status === 'in_progress' && !step.startTime) {\n step.startTime = Date.now();\n }\n \n if (updates.status === 'completed' || updates.status === 'failed') {\n step.endTime = Date.now();\n step.duration = step.endTime - (step.startTime || step.endTime);\n }\n\n if (updates.confidence) {\n step.confidence = updates.confidence;\n }\n\n if (updates.error) {\n step.error = updates.error;\n }\n }\n }\n\n // Recalculate overall progress\n updated.progressPercentage = this.calculateOverallProgress(updated.steps);\n\n // Update in memory\n this.taskProgress.set(taskId, updated);\n\n // Update in Redis\n await this.redis.setEx(\n `${REDIS_KEYS.TASK_PROGRESS}${taskId}`,\n 86400,\n JSON.stringify(updated)\n );\n\n // Publish update\n await this.publishProgressUpdate({\n type: 'progress_update',\n agentId: updated.agentId,\n swarmId: updated.swarmId,\n taskId,\n timestamp: Date.now(),\n data: updated\n });\n\n // Check for task completion\n if (updated.progressPercentage >= 100 && updated.overallStatus !== 'completed') {\n await this.completeTask(taskId);\n }\n\n this.logger.debug('Task progress updated', {\n taskId,\n progressPercentage: updated.progressPercentage,\n stepId: updates.stepId,\n status: updated.overallStatus\n });\n }\n\n /**\n * Add sub-steps to an existing step\n */\n async addSubSteps(\n taskId: string,\n parentStepId: string,\n subSteps: Omit<ProgressStep, 'status' | 'id'>[]\n ): Promise<void> {\n const task = this.taskProgress.get(taskId);\n if (!task) {\n throw new Error(`Task progress not found: ${taskId}`);\n }\n\n const parentStep = task.steps.find(s => s.id === parentStepId);\n if (!parentStep) {\n throw new Error(`Parent step not found: ${parentStepId}`);\n }\n\n const newSubSteps: ProgressStep[] = subSteps.map((step, index) => ({\n ...step,\n id: `${parentStepId}-sub-${index + 1}`,\n status: 'pending'\n }));\n\n parentStep.subSteps = [...(parentStep.subSteps || []), ...newSubSteps];\n\n // Update in memory and Redis\n this.taskProgress.set(taskId, task);\n await this.redis.setEx(\n `${REDIS_KEYS.TASK_PROGRESS}${taskId}`,\n 86400,\n JSON.stringify(task)\n );\n\n this.logger.debug('Sub-steps added', {\n taskId,\n parentStepId,\n subStepCount: subSteps.length\n });\n }\n\n /**\n * Mark task as completed\n */\n async completeTask(taskId: string, deliverables?: string[]): Promise<void> {\n const task = this.taskProgress.get(taskId);\n if (!task) {\n throw new Error(`Task progress not found: ${taskId}`);\n }\n\n task.overallStatus = 'completed';\n task.endTime = Date.now();\n task.progressPercentage = 100;\n task.confidence = Math.max(task.confidence, 0.8);\n\n if (deliverables) {\n task.metadata.deliverables = [...(task.metadata.deliverables || []), ...deliverables];\n }\n\n // Update in memory and Redis\n this.taskProgress.set(taskId, task);\n await this.redis.setEx(\n `${REDIS_KEYS.TASK_PROGRESS}${taskId}`,\n 86400,\n JSON.stringify(task)\n );\n\n // Update agent visibility\n await this.updateAgentVisibility(task.agentId, {\n status: 'completed',\n performance: {\n tasksCompleted: (this.agentVisibility.get(task.agentId)?.performance.tasksCompleted || 0) + 1,\n averageTaskDuration: this.calculateAverageTaskDuration(task.agentId),\n successRate: this.calculateSuccessRate(task.agentId),\n currentStreak: (this.agentVisibility.get(task.agentId)?.performance.currentStreak || 0) + 1\n }\n });\n\n // Publish completion event\n await this.publishProgressUpdate({\n type: 'task_complete',\n agentId: task.agentId,\n swarmId: task.swarmId,\n taskId,\n timestamp: Date.now(),\n data: task\n });\n\n this.logger.info('Task completed', {\n taskId,\n agentId: task.agentId,\n duration: task.endTime - task.startTime,\n deliverables: task.metadata.deliverables?.length || 0\n });\n }\n\n /**\n * Mark task as failed\n */\n async failTask(taskId: string, error: string, details?: Record<string, any>): Promise<void> {\n const task = this.taskProgress.get(taskId);\n if (!task) {\n throw new Error(`Task progress not found: ${taskId}`);\n }\n\n task.overallStatus = 'failed';\n task.endTime = Date.now();\n task.confidence = Math.min(task.confidence, 0.2);\n\n // Add error to current step or task metadata\n if (task.currentStep) {\n const currentStep = task.steps.find(s => s.id === task.currentStep);\n if (currentStep) {\n currentStep.status = 'failed';\n currentStep.error = error;\n currentStep.endTime = Date.now();\n }\n }\n\n task.metadata.blockers = [...(task.metadata.blockers || []), error];\n\n // Update in memory and Redis\n this.taskProgress.set(taskId, task);\n await this.redis.setEx(\n `${REDIS_KEYS.TASK_PROGRESS}${taskId}`,\n 86400,\n JSON.stringify(task)\n );\n\n // Update agent visibility\n await this.updateAgentVisibility(task.agentId, {\n status: 'error',\n performance: {\n tasksCompleted: this.agentVisibility.get(task.agentId)?.performance.tasksCompleted || 0,\n averageTaskDuration: this.calculateAverageTaskDuration(task.agentId),\n successRate: this.calculateSuccessRate(task.agentId),\n currentStreak: 0\n }\n });\n\n // Publish failure event\n await this.publishProgressUpdate({\n type: 'task_failed',\n agentId: task.agentId,\n swarmId: task.swarmId,\n taskId,\n timestamp: Date.now(),\n data: { ...task, error, details: details as any ?? {} }\n });\n\n this.logger.error('Task failed', {\n taskId,\n agentId: task.agentId,\n error,\n duration: task.endTime - task.startTime\n });\n }\n\n /**\n * Update agent visibility information\n */\n async updateAgentVisibility(\n agentId: string,\n updates: Partial<AgentVisibility>\n ): Promise<void> {\n const existing = this.agentVisibility.get(agentId) || this.createDefaultAgentVisibility(agentId);\n\n const updated: AgentVisibility = {\n ...existing,\n ...updates,\n recentActivity: [\n {\n timestamp: Date.now(),\n action: 'status_update',\n details: updates.status ? `Status updated to ${updates.status}` : `Status unchanged: ${existing.status}`\n },\n ...existing.recentActivity?.slice(0, 49) || [] // Keep last 50 activities\n ]\n };\n\n this.agentVisibility.set(agentId, updated);\n\n // Store in Redis (null check)\n if (this.redis) {\n await this.redis.setEx(\n `${REDIS_KEYS.AGENT_VISIBILITY}${agentId}`,\n 3600, // 1 hour TTL\n JSON.stringify(updated)\n );\n\n // Publish visibility update (null check)\n await this.redis.publish(\n REDIS_CHANNELS.AGENT_VISIBILITY,\n JSON.stringify({\n type: 'visibility_update',\n agentId,\n timestamp: Date.now(),\n data: updated\n })\n );\n }\n\n this.emit('agent-visibility-updated', { agentId, visibility: updated });\n }\n\n /**\n * Get comprehensive task progress\n */\n async getTaskProgress(taskId: string): Promise<TaskProgress | null> {\n // Try memory first\n let progress = this.taskProgress.get(taskId);\n \n // Fallback to Redis\n if (!progress) {\n const stored = await this.redis.get(`${REDIS_KEYS.TASK_PROGRESS}${taskId}`);\n if (stored) {\n progress = JSON.parse(stored);\n this.taskProgress.set(taskId, progress);\n }\n }\n\n return progress || null;\n }\n\n /**\n * Get agent visibility information\n */\n async getAgentVisibility(agentId: string): Promise<AgentVisibility | null> {\n // Try memory first\n let visibility = this.agentVisibility.get(agentId);\n \n // Fallback to Redis\n if (!visibility) {\n const stored = await this.redis.get(`${REDIS_KEYS.AGENT_VISIBILITY}${agentId}`);\n if (stored) {\n visibility = JSON.parse(stored);\n this.agentVisibility.set(agentId, visibility);\n }\n }\n\n return visibility || null;\n }\n\n /**\n * Get swarm progress overview\n */\n async getSwarmOverview(swarmId: string): Promise<SwarmProgressOverview | null> {\n // Try memory first\n let overview = this.swarmOverviews.get(swarmId);\n \n // If not in memory or stale, recalculate\n if (!overview || (Date.now() - overview.lastUpdated) > 30000) { // 30 seconds stale\n overview = await this.calculateSwarmOverview(swarmId);\n this.swarmOverviews.set(swarmId, overview);\n }\n\n return overview;\n }\n\n /**\n * Get active tasks for an agent\n */\n async getActiveTasks(agentId: string): Promise<TaskProgress[]> {\n const tasks: TaskProgress[] = [];\n \n // Check memory\n for (const [taskId, task] of this.taskProgress) {\n if (task.agentId === agentId && task.overallStatus === 'in_progress') {\n tasks.push(task);\n }\n }\n\n // Check Redis for any additional tasks\n const pattern = `${REDIS_KEYS.TASK_PROGRESS}*`;\n const keys = await this.redis.keys(pattern);\n \n for (const key of keys) {\n if (!this.taskProgress.has(key.replace(REDIS_KEYS.TASK_PROGRESS, ''))) {\n const stored = await this.redis.get(key);\n if (stored) {\n const task = JSON.parse(stored);\n if (task.agentId === agentId && task.overallStatus === 'in_progress') {\n tasks.push(task);\n }\n }\n }\n }\n\n return tasks;\n }\n\n /**\n * Subscribe to progress updates for specific agents or swarms\n */\n async subscribeToProgress(\n filter: {\n agentIds?: string[];\n swarmIds?: string[];\n taskTypes?: string[];\n },\n callback: (message: ProgressUpdateMessage) => void\n ): Promise<void> {\n const subscriptionKey = JSON.stringify(filter);\n \n if (!this.subscriptions.has(subscriptionKey)) {\n this.subscriptions.set(subscriptionKey, new Set());\n }\n \n this.subscriptions.get(subscriptionKey)!.add(callback);\n\n // Subscribe to Redis channel if not already subscribed\n await this.subscriber.subscribe(REDIS_CHANNELS.PROGRESS_UPDATES, (message) => {\n try {\n const update: ProgressUpdateMessage = JSON.parse(message);\n \n // Apply filter\n if (filter.agentIds && !filter.agentIds.includes(update.agentId)) return;\n if (filter.swarmIds && !filter.swarmIds.includes(update.swarmId)) return;\n \n // Get task details for task type filtering\n if (filter.taskTypes) {\n const task = this.taskProgress.get(update.taskId);\n if (!task || !filter.taskTypes.includes(task.taskType)) return;\n }\n \n callback(update);\n } catch (error) {\n this.logger.error('Error processing progress update', {\n error: error instanceof Error ? error.message : String(error),\n message\n });\n }\n });\n\n this.logger.debug('Subscribed to progress updates', { filter });\n }\n\n /**\n * Unsubscribe from progress updates\n */\n async unsubscribeFromProgress(\n filter: Record<string, string[]>,\n callback?: (message: ProgressUpdateMessage) => void\n ): Promise<void> {\n const subscriptionKey = JSON.stringify(filter);\n const subscriptions = this.subscriptions.get(subscriptionKey);\n \n if (subscriptions) {\n if (callback) {\n subscriptions.delete(callback);\n } else {\n subscriptions.clear();\n }\n \n if (subscriptions.size === 0) {\n this.subscriptions.delete(subscriptionKey);\n }\n }\n }\n\n /**\n * Cleanup resources\n */\n async cleanup(): Promise<void> {\n try {\n await Promise.all([\n this.redis.quit(),\n this.subscriber.quit()\n ]);\n \n this.taskProgress.clear();\n this.agentVisibility.clear();\n this.swarmOverviews.clear();\n this.subscriptions.clear();\n \n this.logger.info('Enhanced Progress Tracker cleaned up');\n } catch (error) {\n this.logger.error('Error during cleanup', {\n error: error instanceof Error ? error.message : String(error)\n });\n }\n }\n\n // ===== PRIVATE METHODS =====\n\n private setupRedisClients(): void {\n this.redis.on('error', (err) => {\n this.logger.error('Redis client error', { error: err.message });\n });\n\n this.subscriber.on('error', (err) => {\n this.logger.error('Redis subscriber error', { error: err.message });\n });\n }\n\n private async setupDefaultSubscriptions(): Promise<void> {\n // Subscribe to agent visibility updates\n await this.subscriber.subscribe(REDIS_CHANNELS.AGENT_VISIBILITY, (message) => {\n try {\n const update = JSON.parse(message);\n this.emit('agent-visibility-update', update);\n } catch (error) {\n this.logger.error('Error processing visibility update', { error });\n }\n });\n }\n\n private async publishProgressUpdate(message: ProgressUpdateMessage): Promise<void> {\n // Add HMAC signature for authentication\n message.signature = this.generateHmacSignature(message);\n \n await this.redis.publish(\n REDIS_CHANNELS.PROGRESS_UPDATES,\n JSON.stringify(message)\n );\n }\n\n private generateHmacSignature(message: ProgressUpdateMessage): string {\n const crypto = require('crypto');\n const payload = JSON.stringify({\n type: message.type,\n agentId: message.agentId,\n swarmId: message.swarmId,\n taskId: message.taskId,\n timestamp: message.timestamp\n });\n \n return crypto.createHmac('sha256', this.hmacSecret)\n .update(payload)\n .digest('hex');\n }\n\n private calculateOverallProgress(steps: ProgressStep[]): number {\n if (steps.length === 0) return 0;\n \n let totalProgress = 0;\n let totalWeight = 0;\n \n for (const step of steps) {\n const stepProgress = this.calculateStepProgress(step);\n const weight = 1; // Can be modified to weight steps differently\n \n totalProgress += stepProgress * weight;\n totalWeight += weight;\n }\n \n return totalWeight > 0 ? Math.round(totalProgress / totalWeight) : 0;\n }\n\n private calculateStepProgress(step: ProgressStep): number {\n if (step.status === 'completed') return 100;\n if (step.status === 'failed') return 0;\n if (step.status === 'skipped') return 100;\n if (step.status !== 'in_progress') return 0;\n \n // If step has sub-steps, calculate based on sub-steps\n if (step.subSteps && step.subSteps.length > 0) {\n return this.calculateOverallProgress(step.subSteps);\n }\n \n // Default progress for in-progress steps without sub-steps\n return 50; // Can be enhanced with time-based estimation\n }\n\n private isStepStatus(status: any): status is ProgressStep['status'] {\n return ['pending', 'in_progress', 'completed', 'failed', 'skipped'].includes(status);\n }\n\n private createDefaultAgentVisibility(agentId: string): AgentVisibility {\n return {\n agentId,\n agentType: 'unknown',\n status: 'idle',\n recentActivity: [],\n performance: {\n tasksCompleted: 0,\n averageTaskDuration: 0,\n successRate: 1.0,\n currentStreak: 0\n },\n capabilities: [],\n availability: {\n currentLoad: 0,\n maxConcurrentTasks: 1\n }\n };\n }\n\n private async calculateSwarmOverview(swarmId: string): Promise<SwarmProgressOverview> {\n const tasks = Array.from(this.taskProgress.values()).filter(t => t.swarmId === swarmId);\n const agents = Array.from(this.agentVisibility.values()).filter(a => \n this.taskProgress.has(a.agentId) && \n this.taskProgress.get(a.agentId)?.swarmId === swarmId\n );\n\n const totalTasks = tasks.length;\n const completedTasks = tasks.filter(t => t.overallStatus === 'completed').length;\n const failedTasks = tasks.filter(t => t.overallStatus === 'failed').length;\n const activeAgents = agents.filter(a => ['active', 'working'].includes(a.status)).length;\n\n const overallProgress = totalTasks > 0 ? (completedTasks / totalTasks) * 100 : 0;\n const successRate = totalTasks > 0 ? (completedTasks / totalTasks) : 1.0;\n const healthScore = (successRate * 0.7 + (activeAgents / Math.max(1, agents.length)) * 0.3) * 100;\n\n // Identify bottlenecks\n const bottlenecks: string[] = [];\n const blockedTasks = tasks.filter(t => t.overallStatus === 'blocked');\n if (blockedTasks.length > 0) {\n bottlenecks.push(`${blockedTasks.length} blocked tasks`);\n }\n\n const errorAgents = agents.filter(a => a.status === 'error');\n if (errorAgents.length > 0) {\n bottlenecks.push(`${errorAgents.length} agents in error state`);\n }\n\n return {\n swarmId,\n totalAgents: agents.length,\n activeAgents,\n totalTasks,\n completedTasks,\n failedTasks,\n overallProgress: Math.round(overallProgress),\n estimatedCompletion: this.estimateSwarmCompletion(swarmId),\n bottlenecks,\n healthScore: Math.round(healthScore),\n lastUpdated: Date.now()\n };\n }\n\n private estimateSwarmCompletion(swarmId: string): number | undefined {\n const tasks = Array.from(this.taskProgress.values()).filter(t => \n t.swarmId === swarmId && t.overallStatus === 'in_progress'\n );\n\n if (tasks.length === 0) return undefined;\n\n const averageTaskTime = tasks.reduce((sum, task) => {\n const elapsed = Date.now() - task.startTime;\n const progress = task.progressPercentage / 100;\n return sum + (progress > 0 ? elapsed / progress : 0);\n }, 0) / tasks.length;\n\n return Date.now() + averageTaskTime;\n }\n\n private calculateAverageTaskDuration(agentId: string): number {\n const completedTasks = Array.from(this.taskProgress.values()).filter(t => \n t.agentId === agentId && \n t.overallStatus === 'completed' && \n t.endTime\n );\n\n if (completedTasks.length === 0) return 0;\n\n const totalDuration = completedTasks.reduce((sum, task) => \n sum + (task.endTime! - task.startTime), 0\n );\n\n return totalDuration / completedTasks.length;\n }\n\n private calculateSuccessRate(agentId: string): number {\n const agentTasks = Array.from(this.taskProgress.values()).filter(t => t.agentId === agentId);\n \n if (agentTasks.length === 0) return 1.0;\n\n const completedTasks = agentTasks.filter(t => t.overallStatus === 'completed').length;\n return completedTasks / agentTasks.length;\n }\n}\n\n// ===== FACTORY FUNCTION =====\n\nexport function createEnhancedProgressTracker(\n redisUrl?: string,\n loggerConfig?: LoggingConfig,\n hmacSecret?: string\n): EnhancedProgressTracker {\n return new EnhancedProgressTracker(redisUrl, loggerConfig, hmacSecret);\n}\n\n// ===== EXPORTS =====\n\nexport default EnhancedProgressTracker;"],"names":["EventEmitter","createClient","Logger","REDIS_CHANNELS","PROGRESS_UPDATES","AGENT_VISIBILITY","SWARM_OVERVIEW","TASK_EVENTS","COORDINATION_SIGNALS","REDIS_KEYS","AGENT_PROGRESS","TASK_PROGRESS","PROGRESS_HISTORY","EnhancedProgressTracker","redis","subscriber","logger","taskProgress","Map","agentVisibility","swarmOverviews","subscriptions","hmacSecret","redisUrl","process","env","REDIS_URL","loggerConfig","HMAC_SECRET","config","level","CLAUDE_FLOW_ENV","format","destination","component","url","setupRedisClients","initialize","Promise","all","connect","setupDefaultSubscriptions","info","redisConnected","subscriptionsEnabled","emit","error","Error","message","String","createTaskProgress","taskId","agentId","swarmId","taskType","taskDescription","steps","progressSteps","map","step","index","id","status","overallStatus","progressPercentage","startTime","Date","now","confidence","metadata","filesProcessed","deliverables","dependencies","blockers","resources","set","setEx","JSON","stringify","publishProgressUpdate","type","timestamp","data","stepCount","length","updateTaskProgress","updates","existing","get","updated","reasoning","stepId","find","s","isStepStatus","endTime","duration","calculateOverallProgress","completeTask","debug","addSubSteps","parentStepId","subSteps","task","parentStep","newSubSteps","subStepCount","Math","max","updateAgentVisibility","performance","tasksCompleted","averageTaskDuration","calculateAverageTaskDuration","successRate","calculateSuccessRate","currentStreak","failTask","details","min","currentStep","createDefaultAgentVisibility","recentActivity","action","slice","publish","visibility","getTaskProgress","progress","stored","parse","getAgentVisibility","getSwarmOverview","overview","lastUpdated","calculateSwarmOverview","getActiveTasks","tasks","push","pattern","keys","key","has","replace","subscribeToProgress","filter","callback","subscriptionKey","Set","add","subscribe","update","agentIds","includes","swarmIds","taskTypes","unsubscribeFromProgress","delete","clear","size","cleanup","quit","on","err","signature","generateHmacSignature","crypto","require","payload","createHmac","digest","totalProgress","totalWeight","stepProgress","calculateStepProgress","weight","round","agentType","capabilities","availability","currentLoad","maxConcurrentTasks","Array","from","values","t","agents","a","totalTasks","completedTasks","failedTasks","activeAgents","overallProgress","healthScore","bottlenecks","blockedTasks","errorAgents","totalAgents","estimatedCompletion","estimateSwarmCompletion","undefined","averageTaskTime","reduce","sum","elapsed","totalDuration","agentTasks","createEnhancedProgressTracker"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/coordination/enhanced-progress-tracker.ts"],"sourcesContent":["/**\n * Enhanced Progress Tracker with Granular Progress Updates and Redis Messaging\n * \n * Provides detailed progress tracking for agent tasks with real-time Redis pub/sub messaging.\n * Supports granular progress updates, confidence scoring, and comprehensive visibility\n * into agent execution states.\n */\n\nimport { EventEmitter } from 'events';\nimport { createClient, RedisClientType } from 'redis';\nimport { Logger } from '../core/logger.js';\nimport type { LoggingConfig } from '../utils/types.js';\n\n// ===== TYPE DEFINITIONS =====\n\n/**\n * Granular progress step within a task\n */\nexport interface ProgressStep {\n id: string;\n name: string;\n description: string;\n status: 'pending' | 'in_progress' | 'completed' | 'failed' | 'skipped';\n startTime?: number;\n endTime?: number;\n duration?: number;\n confidence?: number;\n metadata?: Record<string, any>;\n error?: string;\n subSteps?: ProgressStep[];\n}\n\n/**\n * Detailed task progress information\n */\nexport interface TaskProgress {\n taskId: string;\n agentId: string;\n swarmId: string;\n taskType: string;\n taskDescription: string;\n overallStatus: 'pending' | 'in_progress' | 'completed' | 'failed' | 'blocked';\n progressPercentage: number;\n currentStep?: string;\n steps: ProgressStep[];\n startTime: number;\n endTime?: number;\n estimatedCompletion?: number;\n confidence: number;\n metadata: {\n filesProcessed?: string[];\n deliverables?: string[];\n dependencies?: string[];\n blockers?: string[];\n resources?: {\n memoryUsage?: number;\n cpuUsage?: number;\n diskUsage?: number;\n };\n };\n reasoning?: {\n currentThought?: string;\n strategy?: string;\n alternatives?: string[];\n risks?: string[];\n };\n}\n\n/**\n * Progress update message for Redis pub/sub\n */\nexport interface ProgressUpdateMessage {\n type: 'progress_update' | 'step_update' | 'task_complete' | 'task_failed';\n agentId: string;\n swarmId: string;\n taskId: string;\n timestamp: number;\n data: Partial<TaskProgress> | Partial<ProgressStep>;\n signature?: string;\n}\n\n/**\n * Agent visibility information\n */\nexport interface AgentVisibility {\n agentId: string;\n agentType: string;\n status: 'idle' | 'active' | 'working' | 'blocked' | 'completed' | 'error';\n currentTask?: TaskProgress;\n recentActivity: Array<{\n timestamp: number;\n action: string;\n details: string;\n }>;\n performance: {\n tasksCompleted: number;\n averageTaskDuration: number;\n successRate: number;\n currentStreak: number;\n };\n capabilities: string[];\n availability: {\n nextAvailable?: number;\n currentLoad: number;\n maxConcurrentTasks: number;\n };\n}\n\n/**\n * Swarm-wide progress overview\n */\nexport interface SwarmProgressOverview {\n swarmId: string;\n totalAgents: number;\n activeAgents: number;\n totalTasks: number;\n completedTasks: number;\n failedTasks: number;\n overallProgress: number;\n estimatedCompletion?: number;\n bottlenecks: string[];\n healthScore: number;\n lastUpdated: number;\n}\n\n// ===== REDIS CHANNELS AND KEYS =====\n\nexport const REDIS_CHANNELS = {\n PROGRESS_UPDATES: 'progress:updates',\n AGENT_VISIBILITY: 'agent:visibility',\n SWARM_OVERVIEW: 'swarm:overview',\n TASK_EVENTS: 'task:events',\n COORDINATION_SIGNALS: 'coordination:signals'\n} as const;\n\nexport const REDIS_KEYS = {\n AGENT_PROGRESS: 'agent:progress:',\n TASK_PROGRESS: 'task:progress:',\n SWARM_OVERVIEW: 'swarm:overview:',\n AGENT_VISIBILITY: 'agent:visibility:',\n PROGRESS_HISTORY: 'progress:history:'\n} as const;\n\n// ===== ENHANCED PROGRESS TRACKER CLASS =====\n\nexport class EnhancedProgressTracker extends EventEmitter {\n private redis: RedisClientType;\n private subscriber: RedisClientType;\n private logger: Logger;\n private taskProgress = new Map<string, TaskProgress>();\n private agentVisibility = new Map<string, AgentVisibility>();\n private swarmOverviews = new Map<string, SwarmProgressOverview>();\n private subscriptions = new Map<string, Set<(message: any) => void>>();\n private hmacSecret: string;\n\n constructor(\n redisUrl: string = process.env.CFN_REDIS_URL || process.env.REDIS_URL || `redis://${process.env.CFN_REDIS_HOST || 'cfn-redis'}:${process.env.CFN_REDIS_PORT || 6379}`,\n loggerConfig?: LoggingConfig,\n hmacSecret: string = process.env.HMAC_SECRET || 'default-secret'\n ) {\n super();\n this.hmacSecret = hmacSecret;\n \n // Initialize logger\n const config: LoggingConfig = loggerConfig || {\n level: process.env.CLAUDE_FLOW_ENV === 'test' ? 'error' : 'info',\n format: 'json',\n destination: 'console'\n };\n this.logger = new Logger(config, { component: 'EnhancedProgressTracker' });\n\n // Initialize Redis clients\n this.redis = createClient({ url: redisUrl });\n this.subscriber = createClient({ url: redisUrl });\n\n this.setupRedisClients();\n }\n\n /**\n * Initialize Redis connections and subscriptions\n */\n async initialize(): Promise<void> {\n try {\n await Promise.all([\n this.redis.connect(),\n this.subscriber.connect()\n ]);\n\n // Set up default subscriptions\n await this.setupDefaultSubscriptions();\n\n this.logger.info('Enhanced Progress Tracker initialized', {\n redisConnected: true,\n subscriptionsEnabled: true\n });\n\n this.emit('initialized');\n } catch (error) {\n this.logger.error('Failed to initialize Enhanced Progress Tracker', {\n error: error instanceof Error ? error.message : String(error)\n });\n throw error;\n }\n }\n\n /**\n * Create a new task progress tracker\n */\n async createTaskProgress(\n taskId: string,\n agentId: string,\n swarmId: string,\n taskType: string,\n taskDescription: string,\n steps: Omit<ProgressStep, 'status' | 'id'>[]\n ): Promise<void> {\n const progressSteps: ProgressStep[] = steps.map((step, index) => ({\n ...step,\n id: `step-${index + 1}`,\n status: 'pending'\n }));\n\n const taskProgress: TaskProgress = {\n taskId,\n agentId,\n swarmId,\n taskType,\n taskDescription,\n overallStatus: 'pending',\n progressPercentage: 0,\n steps: progressSteps,\n startTime: Date.now(),\n confidence: 0.5,\n metadata: {\n filesProcessed: [],\n deliverables: [],\n dependencies: [],\n blockers: [],\n resources: {}\n }\n };\n\n // Store in memory\n this.taskProgress.set(taskId, taskProgress);\n\n // Store in Redis with TTL\n await this.redis.setEx(\n `${REDIS_KEYS.TASK_PROGRESS}${taskId}`,\n 86400, // 24 hours TTL\n JSON.stringify(taskProgress)\n );\n\n // Publish creation event\n await this.publishProgressUpdate({\n type: 'progress_update',\n agentId,\n swarmId,\n taskId,\n timestamp: Date.now(),\n data: taskProgress\n });\n\n this.logger.info('Task progress created', {\n taskId,\n agentId,\n swarmId,\n taskType,\n stepCount: steps.length\n });\n }\n\n /**\n * Update task progress with granular step information\n */\n async updateTaskProgress(\n taskId: string,\n updates: {\n stepId?: string;\n progressPercentage?: number;\n confidence?: number;\n status?: TaskProgress['overallStatus'];\n currentStep?: string;\n metadata?: Partial<TaskProgress['metadata']>;\n reasoning?: Partial<TaskProgress['reasoning']>;\n error?: string;\n }\n ): Promise<void> {\n const existing = this.taskProgress.get(taskId);\n if (!existing) {\n throw new Error(`Task progress not found: ${taskId}`);\n }\n\n // Update task progress\n const updated: TaskProgress = {\n ...existing,\n ...updates,\n metadata: {\n ...existing.metadata,\n ...updates.metadata\n },\n reasoning: {\n ...existing.reasoning,\n ...updates.reasoning\n }\n };\n\n // Update specific step if provided\n if (updates.stepId) {\n const step = updated.steps.find(s => s.id === updates.stepId);\n if (step) {\n if (updates.status && this.isStepStatus(updates.status)) {\n step.status = updates.status;\n }\n \n if (updates.status === 'in_progress' && !step.startTime) {\n step.startTime = Date.now();\n }\n \n if (updates.status === 'completed' || updates.status === 'failed') {\n step.endTime = Date.now();\n step.duration = step.endTime - (step.startTime || step.endTime);\n }\n\n if (updates.confidence) {\n step.confidence = updates.confidence;\n }\n\n if (updates.error) {\n step.error = updates.error;\n }\n }\n }\n\n // Recalculate overall progress\n updated.progressPercentage = this.calculateOverallProgress(updated.steps);\n\n // Update in memory\n this.taskProgress.set(taskId, updated);\n\n // Update in Redis\n await this.redis.setEx(\n `${REDIS_KEYS.TASK_PROGRESS}${taskId}`,\n 86400,\n JSON.stringify(updated)\n );\n\n // Publish update\n await this.publishProgressUpdate({\n type: 'progress_update',\n agentId: updated.agentId,\n swarmId: updated.swarmId,\n taskId,\n timestamp: Date.now(),\n data: updated\n });\n\n // Check for task completion\n if (updated.progressPercentage >= 100 && updated.overallStatus !== 'completed') {\n await this.completeTask(taskId);\n }\n\n this.logger.debug('Task progress updated', {\n taskId,\n progressPercentage: updated.progressPercentage,\n stepId: updates.stepId,\n status: updated.overallStatus\n });\n }\n\n /**\n * Add sub-steps to an existing step\n */\n async addSubSteps(\n taskId: string,\n parentStepId: string,\n subSteps: Omit<ProgressStep, 'status' | 'id'>[]\n ): Promise<void> {\n const task = this.taskProgress.get(taskId);\n if (!task) {\n throw new Error(`Task progress not found: ${taskId}`);\n }\n\n const parentStep = task.steps.find(s => s.id === parentStepId);\n if (!parentStep) {\n throw new Error(`Parent step not found: ${parentStepId}`);\n }\n\n const newSubSteps: ProgressStep[] = subSteps.map((step, index) => ({\n ...step,\n id: `${parentStepId}-sub-${index + 1}`,\n status: 'pending'\n }));\n\n parentStep.subSteps = [...(parentStep.subSteps || []), ...newSubSteps];\n\n // Update in memory and Redis\n this.taskProgress.set(taskId, task);\n await this.redis.setEx(\n `${REDIS_KEYS.TASK_PROGRESS}${taskId}`,\n 86400,\n JSON.stringify(task)\n );\n\n this.logger.debug('Sub-steps added', {\n taskId,\n parentStepId,\n subStepCount: subSteps.length\n });\n }\n\n /**\n * Mark task as completed\n */\n async completeTask(taskId: string, deliverables?: string[]): Promise<void> {\n const task = this.taskProgress.get(taskId);\n if (!task) {\n throw new Error(`Task progress not found: ${taskId}`);\n }\n\n task.overallStatus = 'completed';\n task.endTime = Date.now();\n task.progressPercentage = 100;\n task.confidence = Math.max(task.confidence, 0.8);\n\n if (deliverables) {\n task.metadata.deliverables = [...(task.metadata.deliverables || []), ...deliverables];\n }\n\n // Update in memory and Redis\n this.taskProgress.set(taskId, task);\n await this.redis.setEx(\n `${REDIS_KEYS.TASK_PROGRESS}${taskId}`,\n 86400,\n JSON.stringify(task)\n );\n\n // Update agent visibility\n await this.updateAgentVisibility(task.agentId, {\n status: 'completed',\n performance: {\n tasksCompleted: (this.agentVisibility.get(task.agentId)?.performance.tasksCompleted || 0) + 1,\n averageTaskDuration: this.calculateAverageTaskDuration(task.agentId),\n successRate: this.calculateSuccessRate(task.agentId),\n currentStreak: (this.agentVisibility.get(task.agentId)?.performance.currentStreak || 0) + 1\n }\n });\n\n // Publish completion event\n await this.publishProgressUpdate({\n type: 'task_complete',\n agentId: task.agentId,\n swarmId: task.swarmId,\n taskId,\n timestamp: Date.now(),\n data: task\n });\n\n this.logger.info('Task completed', {\n taskId,\n agentId: task.agentId,\n duration: task.endTime - task.startTime,\n deliverables: task.metadata.deliverables?.length || 0\n });\n }\n\n /**\n * Mark task as failed\n */\n async failTask(taskId: string, error: string, details?: Record<string, any>): Promise<void> {\n const task = this.taskProgress.get(taskId);\n if (!task) {\n throw new Error(`Task progress not found: ${taskId}`);\n }\n\n task.overallStatus = 'failed';\n task.endTime = Date.now();\n task.confidence = Math.min(task.confidence, 0.2);\n\n // Add error to current step or task metadata\n if (task.currentStep) {\n const currentStep = task.steps.find(s => s.id === task.currentStep);\n if (currentStep) {\n currentStep.status = 'failed';\n currentStep.error = error;\n currentStep.endTime = Date.now();\n }\n }\n\n task.metadata.blockers = [...(task.metadata.blockers || []), error];\n\n // Update in memory and Redis\n this.taskProgress.set(taskId, task);\n await this.redis.setEx(\n `${REDIS_KEYS.TASK_PROGRESS}${taskId}`,\n 86400,\n JSON.stringify(task)\n );\n\n // Update agent visibility\n await this.updateAgentVisibility(task.agentId, {\n status: 'error',\n performance: {\n tasksCompleted: this.agentVisibility.get(task.agentId)?.performance.tasksCompleted || 0,\n averageTaskDuration: this.calculateAverageTaskDuration(task.agentId),\n successRate: this.calculateSuccessRate(task.agentId),\n currentStreak: 0\n }\n });\n\n // Publish failure event\n await this.publishProgressUpdate({\n type: 'task_failed',\n agentId: task.agentId,\n swarmId: task.swarmId,\n taskId,\n timestamp: Date.now(),\n data: { ...task, error, details: details as any ?? {} }\n });\n\n this.logger.error('Task failed', {\n taskId,\n agentId: task.agentId,\n error,\n duration: task.endTime - task.startTime\n });\n }\n\n /**\n * Update agent visibility information\n */\n async updateAgentVisibility(\n agentId: string,\n updates: Partial<AgentVisibility>\n ): Promise<void> {\n const existing = this.agentVisibility.get(agentId) || this.createDefaultAgentVisibility(agentId);\n\n const updated: AgentVisibility = {\n ...existing,\n ...updates,\n recentActivity: [\n {\n timestamp: Date.now(),\n action: 'status_update',\n details: updates.status ? `Status updated to ${updates.status}` : `Status unchanged: ${existing.status}`\n },\n ...existing.recentActivity?.slice(0, 49) || [] // Keep last 50 activities\n ]\n };\n\n this.agentVisibility.set(agentId, updated);\n\n // Store in Redis (null check)\n if (this.redis) {\n await this.redis.setEx(\n `${REDIS_KEYS.AGENT_VISIBILITY}${agentId}`,\n 3600, // 1 hour TTL\n JSON.stringify(updated)\n );\n\n // Publish visibility update (null check)\n await this.redis.publish(\n REDIS_CHANNELS.AGENT_VISIBILITY,\n JSON.stringify({\n type: 'visibility_update',\n agentId,\n timestamp: Date.now(),\n data: updated\n })\n );\n }\n\n this.emit('agent-visibility-updated', { agentId, visibility: updated });\n }\n\n /**\n * Get comprehensive task progress\n */\n async getTaskProgress(taskId: string): Promise<TaskProgress | null> {\n // Try memory first\n let progress = this.taskProgress.get(taskId);\n \n // Fallback to Redis\n if (!progress) {\n const stored = await this.redis.get(`${REDIS_KEYS.TASK_PROGRESS}${taskId}`);\n if (stored) {\n progress = JSON.parse(stored);\n this.taskProgress.set(taskId, progress);\n }\n }\n\n return progress || null;\n }\n\n /**\n * Get agent visibility information\n */\n async getAgentVisibility(agentId: string): Promise<AgentVisibility | null> {\n // Try memory first\n let visibility = this.agentVisibility.get(agentId);\n \n // Fallback to Redis\n if (!visibility) {\n const stored = await this.redis.get(`${REDIS_KEYS.AGENT_VISIBILITY}${agentId}`);\n if (stored) {\n visibility = JSON.parse(stored);\n this.agentVisibility.set(agentId, visibility);\n }\n }\n\n return visibility || null;\n }\n\n /**\n * Get swarm progress overview\n */\n async getSwarmOverview(swarmId: string): Promise<SwarmProgressOverview | null> {\n // Try memory first\n let overview = this.swarmOverviews.get(swarmId);\n \n // If not in memory or stale, recalculate\n if (!overview || (Date.now() - overview.lastUpdated) > 30000) { // 30 seconds stale\n overview = await this.calculateSwarmOverview(swarmId);\n this.swarmOverviews.set(swarmId, overview);\n }\n\n return overview;\n }\n\n /**\n * Get active tasks for an agent\n */\n async getActiveTasks(agentId: string): Promise<TaskProgress[]> {\n const tasks: TaskProgress[] = [];\n \n // Check memory\n for (const [taskId, task] of this.taskProgress) {\n if (task.agentId === agentId && task.overallStatus === 'in_progress') {\n tasks.push(task);\n }\n }\n\n // Check Redis for any additional tasks\n const pattern = `${REDIS_KEYS.TASK_PROGRESS}*`;\n const keys = await this.redis.keys(pattern);\n \n for (const key of keys) {\n if (!this.taskProgress.has(key.replace(REDIS_KEYS.TASK_PROGRESS, ''))) {\n const stored = await this.redis.get(key);\n if (stored) {\n const task = JSON.parse(stored);\n if (task.agentId === agentId && task.overallStatus === 'in_progress') {\n tasks.push(task);\n }\n }\n }\n }\n\n return tasks;\n }\n\n /**\n * Subscribe to progress updates for specific agents or swarms\n */\n async subscribeToProgress(\n filter: {\n agentIds?: string[];\n swarmIds?: string[];\n taskTypes?: string[];\n },\n callback: (message: ProgressUpdateMessage) => void\n ): Promise<void> {\n const subscriptionKey = JSON.stringify(filter);\n \n if (!this.subscriptions.has(subscriptionKey)) {\n this.subscriptions.set(subscriptionKey, new Set());\n }\n \n this.subscriptions.get(subscriptionKey)!.add(callback);\n\n // Subscribe to Redis channel if not already subscribed\n await this.subscriber.subscribe(REDIS_CHANNELS.PROGRESS_UPDATES, (message) => {\n try {\n const update: ProgressUpdateMessage = JSON.parse(message);\n \n // Apply filter\n if (filter.agentIds && !filter.agentIds.includes(update.agentId)) return;\n if (filter.swarmIds && !filter.swarmIds.includes(update.swarmId)) return;\n \n // Get task details for task type filtering\n if (filter.taskTypes) {\n const task = this.taskProgress.get(update.taskId);\n if (!task || !filter.taskTypes.includes(task.taskType)) return;\n }\n \n callback(update);\n } catch (error) {\n this.logger.error('Error processing progress update', {\n error: error instanceof Error ? error.message : String(error),\n message\n });\n }\n });\n\n this.logger.debug('Subscribed to progress updates', { filter });\n }\n\n /**\n * Unsubscribe from progress updates\n */\n async unsubscribeFromProgress(\n filter: Record<string, string[]>,\n callback?: (message: ProgressUpdateMessage) => void\n ): Promise<void> {\n const subscriptionKey = JSON.stringify(filter);\n const subscriptions = this.subscriptions.get(subscriptionKey);\n \n if (subscriptions) {\n if (callback) {\n subscriptions.delete(callback);\n } else {\n subscriptions.clear();\n }\n \n if (subscriptions.size === 0) {\n this.subscriptions.delete(subscriptionKey);\n }\n }\n }\n\n /**\n * Cleanup resources\n */\n async cleanup(): Promise<void> {\n try {\n await Promise.all([\n this.redis.quit(),\n this.subscriber.quit()\n ]);\n \n this.taskProgress.clear();\n this.agentVisibility.clear();\n this.swarmOverviews.clear();\n this.subscriptions.clear();\n \n this.logger.info('Enhanced Progress Tracker cleaned up');\n } catch (error) {\n this.logger.error('Error during cleanup', {\n error: error instanceof Error ? error.message : String(error)\n });\n }\n }\n\n // ===== PRIVATE METHODS =====\n\n private setupRedisClients(): void {\n this.redis.on('error', (err) => {\n this.logger.error('Redis client error', { error: err.message });\n });\n\n this.subscriber.on('error', (err) => {\n this.logger.error('Redis subscriber error', { error: err.message });\n });\n }\n\n private async setupDefaultSubscriptions(): Promise<void> {\n // Subscribe to agent visibility updates\n await this.subscriber.subscribe(REDIS_CHANNELS.AGENT_VISIBILITY, (message) => {\n try {\n const update = JSON.parse(message);\n this.emit('agent-visibility-update', update);\n } catch (error) {\n this.logger.error('Error processing visibility update', { error });\n }\n });\n }\n\n private async publishProgressUpdate(message: ProgressUpdateMessage): Promise<void> {\n // Add HMAC signature for authentication\n message.signature = this.generateHmacSignature(message);\n \n await this.redis.publish(\n REDIS_CHANNELS.PROGRESS_UPDATES,\n JSON.stringify(message)\n );\n }\n\n private generateHmacSignature(message: ProgressUpdateMessage): string {\n const crypto = require('crypto');\n const payload = JSON.stringify({\n type: message.type,\n agentId: message.agentId,\n swarmId: message.swarmId,\n taskId: message.taskId,\n timestamp: message.timestamp\n });\n \n return crypto.createHmac('sha256', this.hmacSecret)\n .update(payload)\n .digest('hex');\n }\n\n private calculateOverallProgress(steps: ProgressStep[]): number {\n if (steps.length === 0) return 0;\n \n let totalProgress = 0;\n let totalWeight = 0;\n \n for (const step of steps) {\n const stepProgress = this.calculateStepProgress(step);\n const weight = 1; // Can be modified to weight steps differently\n \n totalProgress += stepProgress * weight;\n totalWeight += weight;\n }\n \n return totalWeight > 0 ? Math.round(totalProgress / totalWeight) : 0;\n }\n\n private calculateStepProgress(step: ProgressStep): number {\n if (step.status === 'completed') return 100;\n if (step.status === 'failed') return 0;\n if (step.status === 'skipped') return 100;\n if (step.status !== 'in_progress') return 0;\n \n // If step has sub-steps, calculate based on sub-steps\n if (step.subSteps && step.subSteps.length > 0) {\n return this.calculateOverallProgress(step.subSteps);\n }\n \n // Default progress for in-progress steps without sub-steps\n return 50; // Can be enhanced with time-based estimation\n }\n\n private isStepStatus(status: any): status is ProgressStep['status'] {\n return ['pending', 'in_progress', 'completed', 'failed', 'skipped'].includes(status);\n }\n\n private createDefaultAgentVisibility(agentId: string): AgentVisibility {\n return {\n agentId,\n agentType: 'unknown',\n status: 'idle',\n recentActivity: [],\n performance: {\n tasksCompleted: 0,\n averageTaskDuration: 0,\n successRate: 1.0,\n currentStreak: 0\n },\n capabilities: [],\n availability: {\n currentLoad: 0,\n maxConcurrentTasks: 1\n }\n };\n }\n\n private async calculateSwarmOverview(swarmId: string): Promise<SwarmProgressOverview> {\n const tasks = Array.from(this.taskProgress.values()).filter(t => t.swarmId === swarmId);\n const agents = Array.from(this.agentVisibility.values()).filter(a => \n this.taskProgress.has(a.agentId) && \n this.taskProgress.get(a.agentId)?.swarmId === swarmId\n );\n\n const totalTasks = tasks.length;\n const completedTasks = tasks.filter(t => t.overallStatus === 'completed').length;\n const failedTasks = tasks.filter(t => t.overallStatus === 'failed').length;\n const activeAgents = agents.filter(a => ['active', 'working'].includes(a.status)).length;\n\n const overallProgress = totalTasks > 0 ? (completedTasks / totalTasks) * 100 : 0;\n const successRate = totalTasks > 0 ? (completedTasks / totalTasks) : 1.0;\n const healthScore = (successRate * 0.7 + (activeAgents / Math.max(1, agents.length)) * 0.3) * 100;\n\n // Identify bottlenecks\n const bottlenecks: string[] = [];\n const blockedTasks = tasks.filter(t => t.overallStatus === 'blocked');\n if (blockedTasks.length > 0) {\n bottlenecks.push(`${blockedTasks.length} blocked tasks`);\n }\n\n const errorAgents = agents.filter(a => a.status === 'error');\n if (errorAgents.length > 0) {\n bottlenecks.push(`${errorAgents.length} agents in error state`);\n }\n\n return {\n swarmId,\n totalAgents: agents.length,\n activeAgents,\n totalTasks,\n completedTasks,\n failedTasks,\n overallProgress: Math.round(overallProgress),\n estimatedCompletion: this.estimateSwarmCompletion(swarmId),\n bottlenecks,\n healthScore: Math.round(healthScore),\n lastUpdated: Date.now()\n };\n }\n\n private estimateSwarmCompletion(swarmId: string): number | undefined {\n const tasks = Array.from(this.taskProgress.values()).filter(t => \n t.swarmId === swarmId && t.overallStatus === 'in_progress'\n );\n\n if (tasks.length === 0) return undefined;\n\n const averageTaskTime = tasks.reduce((sum, task) => {\n const elapsed = Date.now() - task.startTime;\n const progress = task.progressPercentage / 100;\n return sum + (progress > 0 ? elapsed / progress : 0);\n }, 0) / tasks.length;\n\n return Date.now() + averageTaskTime;\n }\n\n private calculateAverageTaskDuration(agentId: string): number {\n const completedTasks = Array.from(this.taskProgress.values()).filter(t => \n t.agentId === agentId && \n t.overallStatus === 'completed' && \n t.endTime\n );\n\n if (completedTasks.length === 0) return 0;\n\n const totalDuration = completedTasks.reduce((sum, task) => \n sum + (task.endTime! - task.startTime), 0\n );\n\n return totalDuration / completedTasks.length;\n }\n\n private calculateSuccessRate(agentId: string): number {\n const agentTasks = Array.from(this.taskProgress.values()).filter(t => t.agentId === agentId);\n \n if (agentTasks.length === 0) return 1.0;\n\n const completedTasks = agentTasks.filter(t => t.overallStatus === 'completed').length;\n return completedTasks / agentTasks.length;\n }\n}\n\n// ===== FACTORY FUNCTION =====\n\nexport function createEnhancedProgressTracker(\n redisUrl?: string,\n loggerConfig?: LoggingConfig,\n hmacSecret?: string\n): EnhancedProgressTracker {\n return new EnhancedProgressTracker(redisUrl, loggerConfig, hmacSecret);\n}\n\n// ===== EXPORTS =====\n\nexport default EnhancedProgressTracker;"],"names":["EventEmitter","createClient","Logger","REDIS_CHANNELS","PROGRESS_UPDATES","AGENT_VISIBILITY","SWARM_OVERVIEW","TASK_EVENTS","COORDINATION_SIGNALS","REDIS_KEYS","AGENT_PROGRESS","TASK_PROGRESS","PROGRESS_HISTORY","EnhancedProgressTracker","redis","subscriber","logger","taskProgress","Map","agentVisibility","swarmOverviews","subscriptions","hmacSecret","redisUrl","process","env","CFN_REDIS_URL","REDIS_URL","CFN_REDIS_HOST","CFN_REDIS_PORT","loggerConfig","HMAC_SECRET","config","level","CLAUDE_FLOW_ENV","format","destination","component","url","setupRedisClients","initialize","Promise","all","connect","setupDefaultSubscriptions","info","redisConnected","subscriptionsEnabled","emit","error","Error","message","String","createTaskProgress","taskId","agentId","swarmId","taskType","taskDescription","steps","progressSteps","map","step","index","id","status","overallStatus","progressPercentage","startTime","Date","now","confidence","metadata","filesProcessed","deliverables","dependencies","blockers","resources","set","setEx","JSON","stringify","publishProgressUpdate","type","timestamp","data","stepCount","length","updateTaskProgress","updates","existing","get","updated","reasoning","stepId","find","s","isStepStatus","endTime","duration","calculateOverallProgress","completeTask","debug","addSubSteps","parentStepId","subSteps","task","parentStep","newSubSteps","subStepCount","Math","max","updateAgentVisibility","performance","tasksCompleted","averageTaskDuration","calculateAverageTaskDuration","successRate","calculateSuccessRate","currentStreak","failTask","details","min","currentStep","createDefaultAgentVisibility","recentActivity","action","slice","publish","visibility","getTaskProgress","progress","stored","parse","getAgentVisibility","getSwarmOverview","overview","lastUpdated","calculateSwarmOverview","getActiveTasks","tasks","push","pattern","keys","key","has","replace","subscribeToProgress","filter","callback","subscriptionKey","Set","add","subscribe","update","agentIds","includes","swarmIds","taskTypes","unsubscribeFromProgress","delete","clear","size","cleanup","quit","on","err","signature","generateHmacSignature","crypto","require","payload","createHmac","digest","totalProgress","totalWeight","stepProgress","calculateStepProgress","weight","round","agentType","capabilities","availability","currentLoad","maxConcurrentTasks","Array","from","values","t","agents","a","totalTasks","completedTasks","failedTasks","activeAgents","overallProgress","healthScore","bottlenecks","blockedTasks","errorAgents","totalAgents","estimatedCompletion","estimateSwarmCompletion","undefined","averageTaskTime","reduce","sum","elapsed","totalDuration","agentTasks","createEnhancedProgressTracker"],"mappings":"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"}
@@ -11,7 +11,7 @@ export class QEEventBus {
11
11
  config;
12
12
  constructor(config = {}){
13
13
  this.config = {
14
- redisUrl: process.env.REDIS_URL || 'redis://localhost:6379',
14
+ redisUrl: process.env.CFN_REDIS_URL || process.env.REDIS_URL || `redis://${process.env.CFN_REDIS_HOST || 'cfn-redis'}:${process.env.CFN_REDIS_PORT || 6379}`,
15
15
  performanceThreshold: 100,
16
16
  ...config
17
17
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/coordination/event-bus.ts"],"sourcesContent":["import Redis from 'ioredis';\r\nimport { performance } from 'perf_hooks';\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\nimport {\r\n EventTopic,\r\n TraceId,\r\n EventMetadata,\r\n AgentLifecycleEvent,\r\n EventSubscription,\r\n QEEventBusConfig,\r\n IEventRouter,\r\n IEventDispatcher,\r\n generateTraceId\r\n} from './types/event-bus.types';\r\n\r\n// TODO: Import WASM JSON parser when available\r\n// import { parseJsonWithWasm } from '../wasm/json-parser';\r\n\r\nexport class QEEventBus implements IEventRouter, IEventDispatcher {\r\n private redis: Redis;\r\n private topics: Set<EventTopic> = new Set();\r\n private subscriptions: Map<string, EventSubscription> = new Map();\r\n private config: QEEventBusConfig;\r\n\r\n constructor(config: QEEventBusConfig = {}) {\r\n this.config = {\r\n redisUrl: process.env.REDIS_URL || 'redis://localhost:6379',\r\n performanceThreshold: 100, // ms\r\n ...config\r\n };\r\n\r\n this.redis = new Redis(this.config.redisUrl);\r\n\r\n // Set up Redis pub/sub listener\r\n this.initRedisSubscription();\r\n }\r\n\r\n private initRedisSubscription() {\r\n const redisSub = new Redis(this.config.redisUrl);\r\n redisSub.on('message', async (topic, message) => {\r\n const startTime = performance.now();\r\n\r\n try {\r\n const { payload, metadata } = JSON.parse(message);\r\n const matchingSubscriptions = Array.from(this.subscriptions.values())\r\n .filter(sub => sub.topic === topic);\r\n\r\n await Promise.all(matchingSubscriptions.map(sub =>\r\n sub.callback(payload, metadata)\r\n ));\r\n } catch (error) {\r\n console.error(`Event processing error for topic ${topic}:`, error);\r\n }\r\n\r\n const processingTime = performance.now() - startTime;\r\n if (processingTime > (this.config.performanceThreshold || 100)) {\r\n console.warn(`Event processing for ${topic} took ${processingTime}ms`);\r\n }\r\n });\r\n\r\n // Subscribe to all currently registered topics\r\n this.topics.forEach(topic => redisSub.subscribe(topic));\r\n }\r\n\r\n // Event Router Implementation\r\n registerTopic(topic: EventTopic): void {\r\n if (!this.topics.has(topic)) {\r\n this.topics.add(topic);\r\n this.redis.subscribe(topic);\r\n }\r\n }\r\n\r\n removeTopic(topic: EventTopic): void {\r\n if (this.topics.has(topic)) {\r\n this.topics.delete(topic);\r\n this.redis.unsubscribe(topic);\r\n }\r\n }\r\n\r\n listTopics(): EventTopic[] {\r\n return Array.from(this.topics);\r\n }\r\n\r\n // Event Dispatcher Implementation\r\n async publish(\r\n topic: EventTopic,\r\n payload: unknown,\r\n traceId?: TraceId\r\n ): Promise<void> {\r\n if (!this.topics.has(topic)) {\r\n this.registerTopic(topic);\r\n }\r\n\r\n const metadata: EventMetadata = {\r\n timestamp: Date.now(),\r\n traceId: traceId || generateTraceId()\r\n };\r\n\r\n // TODO: Integrate WASM JSON parsing when available\r\n // const parsedPayload = this.config.wasmParserPath\r\n // ? parseJsonWithWasm(payload)\r\n // : payload;\r\n\r\n const message = JSON.stringify({ payload, metadata });\r\n await this.redis.publish(topic, message);\r\n }\r\n\r\n subscribe(\r\n topic: EventTopic,\r\n callback: EventSubscription['callback']\r\n ): string {\r\n const subscriptionId = uuidv4();\r\n const subscription: EventSubscription = {\r\n id: subscriptionId,\r\n topic,\r\n callback\r\n };\r\n\r\n this.subscriptions.set(subscriptionId, subscription);\r\n\r\n // Ensure topic is registered\r\n this.registerTopic(topic);\r\n\r\n return subscriptionId;\r\n }\r\n\r\n unsubscribe(subscriptionId: string): void {\r\n this.subscriptions.delete(subscriptionId);\r\n }\r\n\r\n // Agent Lifecycle Event Tracking\r\n trackLifecycleEvent(\r\n event: AgentLifecycleEvent,\r\n traceId?: TraceId\r\n ): Promise<void> {\r\n return this.publish(\r\n 'agent-lifecycle',\r\n event,\r\n traceId\r\n );\r\n }\r\n\r\n // Graceful Shutdown\r\n async shutdown(): Promise<void> {\r\n await this.redis.quit();\r\n }\r\n}\r\n\r\n// Singleton export for global access\r\nexport const eventBus = new QEEventBus();"],"names":["Redis","performance","v4","uuidv4","generateTraceId","QEEventBus","redis","topics","Set","subscriptions","Map","config","redisUrl","process","env","REDIS_URL","performanceThreshold","initRedisSubscription","redisSub","on","topic","message","startTime","now","payload","metadata","JSON","parse","matchingSubscriptions","Array","from","values","filter","sub","Promise","all","map","callback","error","console","processingTime","warn","forEach","subscribe","registerTopic","has","add","removeTopic","delete","unsubscribe","listTopics","publish","traceId","timestamp","Date","stringify","subscriptionId","subscription","id","set","trackLifecycleEvent","event","shutdown","quit","eventBus"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/coordination/event-bus.ts"],"sourcesContent":["import Redis from 'ioredis';\r\nimport { performance } from 'perf_hooks';\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\nimport {\r\n EventTopic,\r\n TraceId,\r\n EventMetadata,\r\n AgentLifecycleEvent,\r\n EventSubscription,\r\n QEEventBusConfig,\r\n IEventRouter,\r\n IEventDispatcher,\r\n generateTraceId\r\n} from './types/event-bus.types';\r\n\r\n// TODO: Import WASM JSON parser when available\r\n// import { parseJsonWithWasm } from '../wasm/json-parser';\r\n\r\nexport class QEEventBus implements IEventRouter, IEventDispatcher {\r\n private redis: Redis;\r\n private topics: Set<EventTopic> = new Set();\r\n private subscriptions: Map<string, EventSubscription> = new Map();\r\n private config: QEEventBusConfig;\r\n\r\n constructor(config: QEEventBusConfig = {}) {\r\n this.config = {\r\n redisUrl: process.env.CFN_REDIS_URL || process.env.REDIS_URL || `redis://${process.env.CFN_REDIS_HOST || 'cfn-redis'}:${process.env.CFN_REDIS_PORT || 6379}`,\r\n performanceThreshold: 100, // ms\r\n ...config\r\n };\r\n\r\n this.redis = new Redis(this.config.redisUrl);\r\n\r\n // Set up Redis pub/sub listener\r\n this.initRedisSubscription();\r\n }\r\n\r\n private initRedisSubscription() {\r\n const redisSub = new Redis(this.config.redisUrl);\r\n redisSub.on('message', async (topic, message) => {\r\n const startTime = performance.now();\r\n\r\n try {\r\n const { payload, metadata } = JSON.parse(message);\r\n const matchingSubscriptions = Array.from(this.subscriptions.values())\r\n .filter(sub => sub.topic === topic);\r\n\r\n await Promise.all(matchingSubscriptions.map(sub =>\r\n sub.callback(payload, metadata)\r\n ));\r\n } catch (error) {\r\n console.error(`Event processing error for topic ${topic}:`, error);\r\n }\r\n\r\n const processingTime = performance.now() - startTime;\r\n if (processingTime > (this.config.performanceThreshold || 100)) {\r\n console.warn(`Event processing for ${topic} took ${processingTime}ms`);\r\n }\r\n });\r\n\r\n // Subscribe to all currently registered topics\r\n this.topics.forEach(topic => redisSub.subscribe(topic));\r\n }\r\n\r\n // Event Router Implementation\r\n registerTopic(topic: EventTopic): void {\r\n if (!this.topics.has(topic)) {\r\n this.topics.add(topic);\r\n this.redis.subscribe(topic);\r\n }\r\n }\r\n\r\n removeTopic(topic: EventTopic): void {\r\n if (this.topics.has(topic)) {\r\n this.topics.delete(topic);\r\n this.redis.unsubscribe(topic);\r\n }\r\n }\r\n\r\n listTopics(): EventTopic[] {\r\n return Array.from(this.topics);\r\n }\r\n\r\n // Event Dispatcher Implementation\r\n async publish(\r\n topic: EventTopic,\r\n payload: unknown,\r\n traceId?: TraceId\r\n ): Promise<void> {\r\n if (!this.topics.has(topic)) {\r\n this.registerTopic(topic);\r\n }\r\n\r\n const metadata: EventMetadata = {\r\n timestamp: Date.now(),\r\n traceId: traceId || generateTraceId()\r\n };\r\n\r\n // TODO: Integrate WASM JSON parsing when available\r\n // const parsedPayload = this.config.wasmParserPath\r\n // ? parseJsonWithWasm(payload)\r\n // : payload;\r\n\r\n const message = JSON.stringify({ payload, metadata });\r\n await this.redis.publish(topic, message);\r\n }\r\n\r\n subscribe(\r\n topic: EventTopic,\r\n callback: EventSubscription['callback']\r\n ): string {\r\n const subscriptionId = uuidv4();\r\n const subscription: EventSubscription = {\r\n id: subscriptionId,\r\n topic,\r\n callback\r\n };\r\n\r\n this.subscriptions.set(subscriptionId, subscription);\r\n\r\n // Ensure topic is registered\r\n this.registerTopic(topic);\r\n\r\n return subscriptionId;\r\n }\r\n\r\n unsubscribe(subscriptionId: string): void {\r\n this.subscriptions.delete(subscriptionId);\r\n }\r\n\r\n // Agent Lifecycle Event Tracking\r\n trackLifecycleEvent(\r\n event: AgentLifecycleEvent,\r\n traceId?: TraceId\r\n ): Promise<void> {\r\n return this.publish(\r\n 'agent-lifecycle',\r\n event,\r\n traceId\r\n );\r\n }\r\n\r\n // Graceful Shutdown\r\n async shutdown(): Promise<void> {\r\n await this.redis.quit();\r\n }\r\n}\r\n\r\n// Singleton export for global access\r\nexport const eventBus = new QEEventBus();"],"names":["Redis","performance","v4","uuidv4","generateTraceId","QEEventBus","redis","topics","Set","subscriptions","Map","config","redisUrl","process","env","CFN_REDIS_URL","REDIS_URL","CFN_REDIS_HOST","CFN_REDIS_PORT","performanceThreshold","initRedisSubscription","redisSub","on","topic","message","startTime","now","payload","metadata","JSON","parse","matchingSubscriptions","Array","from","values","filter","sub","Promise","all","map","callback","error","console","processingTime","warn","forEach","subscribe","registerTopic","has","add","removeTopic","delete","unsubscribe","listTopics","publish","traceId","timestamp","Date","stringify","subscriptionId","subscription","id","set","trackLifecycleEvent","event","shutdown","quit","eventBus"],"mappings":"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"}
@@ -34,7 +34,7 @@ export class RedisMessagingInfrastructure extends EventEmitter {
34
34
  this.swarmId = swarmId;
35
35
  // Default configuration
36
36
  this.config = {
37
- redisUrl: config.redisUrl || process.env.REDIS_URL || 'redis://localhost:6379',
37
+ redisUrl: config.redisUrl || process.env.CFN_REDIS_URL || process.env.REDIS_URL || `redis://${process.env.CFN_REDIS_HOST || 'cfn-redis'}:${process.env.CFN_REDIS_PORT || 6379}`,
38
38
  hmacSecret: config.hmacSecret || process.env.HMAC_SECRET || 'default-secret',
39
39
  messageRetention: config.messageRetention || 3600000,
40
40
  heartbeatInterval: config.heartbeatInterval || 30000,