claude-flow-novice 2.14.37 → 2.15.1

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 (608) 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/commands/cfn-docker/CFN_DOCKER_NATIVE.md +295 -0
  26. package/.claude/commands/cfn-docker-core-test-suite.md +326 -0
  27. package/.claude/commands/cfn-loop-cli.md +1 -1
  28. package/.claude/commands/switch-api.md +48 -13
  29. package/.claude/root-claude-distribute/CFN-CLAUDE.md +177 -426
  30. package/.claude/skills/cfn-agent-spawning/get-agent-provider-env.sh +107 -0
  31. package/.claude/skills/cfn-agent-spawning/parse-agent-provider.sh +59 -0
  32. package/.claude/skills/cfn-docker-agent-spawning/spawn-agent.sh +51 -24
  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/helpers/spawn-agents.sh +18 -9
  38. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +52 -23
  39. package/.claude/skills/cfn-redis-coordination/complete-swarm.sh +3 -3
  40. package/.claude/skills/cfn-redis-coordination/data/cfn-loop.db +0 -0
  41. package/.claude/skills/cfn-redis-coordination/redis-cli-wrapper.sh +9 -0
  42. package/.claude/skills/cfn-redis-coordination/report-completion.sh +7 -7
  43. package/claude-assets/agents/cfn-dev-team/architecture/api-designer-persona.md +2 -0
  44. package/claude-assets/agents/cfn-dev-team/architecture/goal-planner.md +2 -0
  45. package/claude-assets/agents/cfn-dev-team/architecture/planner.md +2 -0
  46. package/claude-assets/agents/cfn-dev-team/architecture/system-architect.md +2 -0
  47. package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +419 -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/backend-developer.md +5 -0
  50. package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +2 -0
  51. package/claude-assets/agents/cfn-dev-team/documentation/README-VALIDATION.md +2 -0
  52. package/claude-assets/agents/cfn-dev-team/documentation/agent-type-guidelines.md +2 -0
  53. package/claude-assets/agents/cfn-dev-team/reviewers/quality/code-quality-validator.md +1 -1
  54. package/claude-assets/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +1 -1
  55. package/claude-assets/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +2 -0
  56. package/claude-assets/agents/cfn-dev-team/reviewers/quality/quality-metrics.md +2 -0
  57. package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +2 -0
  58. package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +1 -1
  59. package/claude-assets/agents/cfn-dev-team/testers/e2e/playwright-tester.md +1 -1
  60. package/claude-assets/agents/cfn-dev-team/testers/interaction-tester.md +2 -0
  61. package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +2 -0
  62. package/claude-assets/agents/cfn-dev-team/testers/playwright-tester.md +2 -0
  63. package/claude-assets/agents/cfn-dev-team/testers/unit/tdd-london-unit-swarm.md +4 -0
  64. package/claude-assets/agents/cfn-dev-team/testers/validation/validation-production-validator.md +1 -1
  65. package/claude-assets/agents/docker-coordinators/cfn-docker-v3-coordinator.md +825 -17
  66. package/claude-assets/agents/docker-team/micro-sprint-planner.md +747 -0
  67. package/claude-assets/agents/docker-ts-fixer.md +56 -0
  68. package/claude-assets/agents/typescript-specialist.md +280 -0
  69. package/claude-assets/cfn-extras/agents/cfn-coordinator-enterprise.md +1303 -0
  70. package/claude-assets/cfn-extras/agents/cfn-coordinator-mvp.md +942 -0
  71. package/claude-assets/cfn-extras/agents/cfn-coordinator-standard.md +1062 -0
  72. package/claude-assets/cfn-extras/agents/cfn-loop-coordinator.md +157 -0
  73. package/claude-assets/cfn-extras/agents/coordinator.md +182 -0
  74. package/claude-assets/cfn-extras/agents/cost-savings-cfn-loop-coordinator.md +760 -0
  75. package/claude-assets/cfn-extras/agents/cost-savings-coordinator.md +173 -0
  76. package/claude-assets/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator-enhanced.md +147 -0
  77. package/claude-assets/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md +162 -0
  78. package/claude-assets/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +161 -0
  79. package/claude-assets/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md +729 -0
  80. package/claude-assets/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +728 -0
  81. package/claude-assets/cfn-extras/agents/deprecated-coordinators/byzantine-coordinator.md +100 -0
  82. package/claude-assets/cfn-extras/agents/deprecated-coordinators/cfn-coordinator-enterprise.md +323 -0
  83. package/claude-assets/cfn-extras/agents/deprecated-coordinators/cfn-coordinator-mvp.md +157 -0
  84. package/claude-assets/cfn-extras/agents/deprecated-coordinators/cfn-coordinator-standard.md +229 -0
  85. package/claude-assets/cfn-extras/agents/deprecated-coordinators/cfn-coordinator-unified.md +149 -0
  86. package/claude-assets/cfn-extras/agents/deprecated-coordinators/coordinator-hybrid.md +231 -0
  87. package/claude-assets/cfn-extras/agents/deprecated-coordinators/gossip-coordinator.md +165 -0
  88. package/claude-assets/cfn-extras/agents/deprecated-coordinators/hierarchical-coordinator.md +95 -0
  89. package/claude-assets/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md +132 -0
  90. package/claude-assets/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +131 -0
  91. package/claude-assets/cfn-extras/agents/deprecated-coordinators/task-coordinator.md +109 -0
  92. package/claude-assets/cfn-extras/agents/deprecated-coordinators/test-coordinator.md +142 -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-docker/CFN_DOCKER_NATIVE.md +295 -0
  198. package/claude-assets/commands/cfn-docker-core-test-suite.md +326 -0
  199. package/claude-assets/commands/cfn-loop-cli.md +1 -1
  200. package/claude-assets/commands/switch-api.md +48 -13
  201. package/claude-assets/root-claude-distribute/CFN-CLAUDE.md +177 -426
  202. package/claude-assets/skills/cfn-agent-spawning/get-agent-provider-env.sh +107 -0
  203. package/claude-assets/skills/cfn-agent-spawning/parse-agent-provider.sh +59 -0
  204. package/claude-assets/skills/cfn-docker-agent-spawning/spawn-agent.sh +51 -24
  205. package/claude-assets/skills/cfn-docker-loop-orchestration/orchestrate.sh +763 -38
  206. package/claude-assets/skills/cfn-docker-redis-coordination/coordinate.sh +25 -10
  207. package/claude-assets/skills/cfn-docker-redis-coordination/coordinate.sh.backup-1763145142 +641 -0
  208. package/claude-assets/skills/cfn-docker-skill-mcp-selection/skill-mcp-selector.js +471 -471
  209. package/claude-assets/skills/cfn-docker-wave-execution/SKILL.md +936 -0
  210. package/claude-assets/skills/cfn-docker-wave-execution/cleanup-wave.sh +445 -0
  211. package/claude-assets/skills/cfn-docker-wave-execution/lib/docker-helpers.sh +804 -0
  212. package/claude-assets/skills/cfn-docker-wave-execution/monitor-wave.sh +485 -0
  213. package/claude-assets/skills/cfn-docker-wave-execution/spawn-wave.sh +547 -0
  214. package/claude-assets/skills/cfn-error-batching-strategy/README.md +323 -0
  215. package/claude-assets/skills/cfn-error-batching-strategy/SKILL.md +1016 -0
  216. package/claude-assets/skills/cfn-error-batching-strategy/analyze-errors.sh +327 -0
  217. package/claude-assets/skills/cfn-error-batching-strategy/calculate-waves.sh +256 -0
  218. package/claude-assets/skills/cfn-error-batching-strategy/cli.sh +523 -0
  219. package/claude-assets/skills/cfn-error-batching-strategy/cluster-files.sh +196 -0
  220. package/claude-assets/skills/cfn-error-batching-strategy/create-batches.sh +261 -0
  221. package/claude-assets/skills/cfn-error-batching-strategy/lib/core-functions.sh +47 -0
  222. package/claude-assets/skills/cfn-error-batching-strategy/templates/default-tiers.json +22 -0
  223. package/claude-assets/skills/cfn-error-batching-strategy/tests/test-batching-strategy.sh +498 -0
  224. package/claude-assets/skills/cfn-loop-orchestration/helpers/spawn-agents.sh +18 -9
  225. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +52 -23
  226. package/claude-assets/skills/cfn-redis-coordination/complete-swarm.sh +3 -3
  227. package/claude-assets/skills/cfn-redis-coordination/data/cfn-loop.db +0 -0
  228. package/claude-assets/skills/cfn-redis-coordination/redis-cli-wrapper.sh +9 -0
  229. package/claude-assets/skills/cfn-redis-coordination/report-completion.sh +7 -7
  230. package/claude-assets/skills/cfn-wave-checkpoint/SKILL.md +333 -0
  231. package/claude-assets/skills/cfn-wave-checkpoint/cleanup-orphans.sh +374 -0
  232. package/claude-assets/skills/cfn-wave-checkpoint/resume-wave.sh +325 -0
  233. package/claude-assets/skills/cfn-wave-checkpoint/save-checkpoint.sh +284 -0
  234. package/claude-assets/skills/docker-build/SKILL.md +203 -0
  235. package/claude-assets/skills/docker-build/build.sh +73 -0
  236. package/dist/agent/skill-mcp-selector.js +1 -1
  237. package/dist/agent/skill-mcp-selector.js.map +1 -1
  238. package/dist/agents/agent-loader.js +146 -165
  239. package/dist/agents/agent-loader.js.map +1 -1
  240. package/dist/cli/agent-definition-parser.js +36 -16
  241. package/dist/cli/agent-definition-parser.js.map +1 -1
  242. package/dist/cli/agent-executor.js +48 -13
  243. package/dist/cli/agent-executor.js.map +1 -1
  244. package/dist/cli/agent-prompt-builder.js +28 -2
  245. package/dist/cli/agent-prompt-builder.js.map +1 -1
  246. package/dist/cli/agent-spawn.js +57 -18
  247. package/dist/cli/agent-spawn.js.map +1 -1
  248. package/dist/cli/agent-token-manager.js +5 -1
  249. package/dist/cli/agent-token-manager.js.map +1 -1
  250. package/dist/cli/anthropic-client.js +35 -4
  251. package/dist/cli/anthropic-client.js.map +1 -1
  252. package/dist/cli/cfn-context.js +9 -6
  253. package/dist/cli/cfn-context.js.map +1 -1
  254. package/dist/cli/cfn-metrics.js +8 -1
  255. package/dist/cli/cfn-metrics.js.map +1 -1
  256. package/dist/cli/cfn-redis.js +7 -0
  257. package/dist/cli/cfn-redis.js.map +1 -1
  258. package/dist/cli/conversation-fork.js +14 -11
  259. package/dist/cli/conversation-fork.js.map +1 -1
  260. package/dist/cli/index.js +6 -1
  261. package/dist/cli/index.js.map +1 -1
  262. package/dist/cli/iteration-history.js +8 -5
  263. package/dist/cli/iteration-history.js.map +1 -1
  264. package/dist/coordination/enhanced-progress-tracker.js +1 -1
  265. package/dist/coordination/enhanced-progress-tracker.js.map +1 -1
  266. package/dist/coordination/event-bus.js +1 -1
  267. package/dist/coordination/event-bus.js.map +1 -1
  268. package/dist/coordination/redis-messaging-infrastructure.js +1 -1
  269. package/dist/coordination/redis-messaging-infrastructure.js.map +1 -1
  270. package/dist/mcp/auth-middleware.js +1 -1
  271. package/dist/mcp/auth-middleware.js.map +1 -1
  272. package/dist/mcp/playwright-mcp-server-auth.js +1 -1
  273. package/dist/mcp/playwright-mcp-server-auth.js.map +1 -1
  274. package/dist/utils/secret-filter.js +145 -0
  275. package/dist/utils/secret-filter.js.map +1 -0
  276. package/package.json +5 -4
  277. package/scripts/docker-agent-init.sh +106 -0
  278. package/scripts/docker-rebuild-all-agents.sh +127 -0
  279. package/scripts/init-project.js +4 -4
  280. package/scripts/switch-api.sh +151 -16
  281. package/.claude/cfn-agents-ignore/cfn-seo-team/AGENT_CREATION_REPORT.md +0 -471
  282. package/.claude/cfn-agents-ignore/cfn-seo-team/AGENT_CREATION_REPORT.md.backup +0 -481
  283. package/.claude/cfn-agents-ignore/cfn-seo-team/DELEGATION_MATRIX.md.backup +0 -371
  284. package/.claude/cfn-agents-ignore/cfn-seo-team/INTEGRATION_REQUIREMENTS.md.backup +0 -637
  285. package/.claude/cfn-agents-ignore/cfn-seo-team/cfn-seo-coordinator.md.backup +0 -398
  286. package/.claude/cfn-agents-ignore/cfn-seo-team/competitive-seo-analyst.md.backup +0 -401
  287. package/.claude/cfn-agents-ignore/cfn-seo-team/content-atomization-specialist.md.backup +0 -552
  288. package/.claude/cfn-agents-ignore/cfn-seo-team/content-seo-strategist.md.backup +0 -223
  289. package/.claude/cfn-agents-ignore/cfn-seo-team/eeat-content-auditor.md.backup +0 -367
  290. package/.claude/cfn-agents-ignore/cfn-seo-team/geo-optimization-expert.md.backup +0 -247
  291. package/.claude/cfn-agents-ignore/cfn-seo-team/link-building-specialist.md.backup +0 -269
  292. package/.claude/cfn-agents-ignore/cfn-seo-team/local-seo-optimizer.md.backup +0 -311
  293. package/.claude/cfn-agents-ignore/cfn-seo-team/programmatic-seo-engineer.md.backup +0 -222
  294. package/.claude/cfn-agents-ignore/cfn-seo-team/schema-markup-engineer.md.backup +0 -408
  295. package/.claude/cfn-agents-ignore/cfn-seo-team/seo-analytics-specialist.md.backup +0 -354
  296. package/.claude/cfn-agents-ignore/cfn-seo-team/seo-validators/accessibility-validator.md.backup +0 -561
  297. package/.claude/cfn-agents-ignore/cfn-seo-team/seo-validators/audience-validator.md.backup +0 -480
  298. package/.claude/cfn-agents-ignore/cfn-seo-team/seo-validators/branding-validator.md.backup +0 -448
  299. package/.claude/cfn-agents-ignore/cfn-seo-team/seo-validators/humanizer-validator.md.backup +0 -329
  300. package/.claude/cfn-agents-ignore/cfn-seo-team/technical-seo-specialist.md.backup +0 -208
  301. package/claude-assets/agents/AGENT_LIFECYCLE.md.backup_before_replace +0 -530
  302. package/claude-assets/agents/README-AGENT_LIFECYCLE.md.backup_before_replace +0 -522
  303. package/claude-assets/agents/cfn-dev-team/test-agent.md +0 -141
  304. package/claude-assets/agents/marketing_hybrid/cost_tracker.md +0 -13
  305. package/claude-assets/agents/marketing_hybrid/docker_deployer.md +0 -13
  306. package/claude-assets/agents/marketing_hybrid/zai_worker_spawner.md +0 -13
  307. package/claude-assets/cfn-agents-ignore/cfn-seo-team/AGENT_CREATION_REPORT.md +0 -471
  308. package/claude-assets/cfn-agents-ignore/cfn-seo-team/AGENT_CREATION_REPORT.md.backup +0 -481
  309. package/claude-assets/cfn-agents-ignore/cfn-seo-team/DELEGATION_MATRIX.md.backup +0 -371
  310. package/claude-assets/cfn-agents-ignore/cfn-seo-team/INTEGRATION_REQUIREMENTS.md.backup +0 -637
  311. package/claude-assets/cfn-agents-ignore/cfn-seo-team/cfn-seo-coordinator.md.backup +0 -398
  312. package/claude-assets/cfn-agents-ignore/cfn-seo-team/competitive-seo-analyst.md.backup +0 -401
  313. package/claude-assets/cfn-agents-ignore/cfn-seo-team/content-atomization-specialist.md.backup +0 -552
  314. package/claude-assets/cfn-agents-ignore/cfn-seo-team/content-seo-strategist.md.backup +0 -223
  315. package/claude-assets/cfn-agents-ignore/cfn-seo-team/eeat-content-auditor.md.backup +0 -367
  316. package/claude-assets/cfn-agents-ignore/cfn-seo-team/geo-optimization-expert.md.backup +0 -247
  317. package/claude-assets/cfn-agents-ignore/cfn-seo-team/link-building-specialist.md.backup +0 -269
  318. package/claude-assets/cfn-agents-ignore/cfn-seo-team/local-seo-optimizer.md.backup +0 -311
  319. package/claude-assets/cfn-agents-ignore/cfn-seo-team/programmatic-seo-engineer.md.backup +0 -222
  320. package/claude-assets/cfn-agents-ignore/cfn-seo-team/schema-markup-engineer.md.backup +0 -408
  321. package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-analytics-specialist.md.backup +0 -354
  322. package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-validators/accessibility-validator.md.backup +0 -561
  323. package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-validators/audience-validator.md.backup +0 -480
  324. package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-validators/branding-validator.md.backup +0 -448
  325. package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-validators/humanizer-validator.md.backup +0 -329
  326. package/claude-assets/cfn-agents-ignore/cfn-seo-team/technical-seo-specialist.md.backup +0 -208
  327. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/DELEGATION_MATRIX.md +0 -0
  328. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/HUMANIZER_PROMPTS.md +0 -0
  329. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/INTEGRATION_REQUIREMENTS.md +0 -0
  330. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/cfn-seo-coordinator.md +0 -0
  331. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/competitive-seo-analyst.md +0 -0
  332. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/content-atomization-specialist.md +0 -0
  333. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/content-seo-strategist.md +0 -0
  334. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/eeat-content-auditor.md +0 -0
  335. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/geo-optimization-expert.md +0 -0
  336. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/link-building-specialist.md +0 -0
  337. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/local-seo-optimizer.md +0 -0
  338. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/programmatic-seo-engineer.md +0 -0
  339. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/schema-markup-engineer.md +0 -0
  340. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-analytics-specialist.md +0 -0
  341. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-validators/accessibility-validator.md +0 -0
  342. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-validators/audience-validator.md +0 -0
  343. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-validators/branding-validator.md +0 -0
  344. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-validators/humanizer-validator.md +0 -0
  345. /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/technical-seo-specialist.md +0 -0
  346. /package/{claude-assets/skills → .claude/cfn-extras/skills/advanced-features}/cfn-agent-swap/SKILL.md +0 -0
  347. /package/{claude-assets/skills → .claude/cfn-extras/skills/advanced-features}/cfn-agent-swap/recommend-swap.sh +0 -0
  348. /package/{claude-assets/skills → .claude/cfn-extras/skills/advanced-features}/cfn-api-validation/test-endpoints.sh +0 -0
  349. /package/{claude-assets/skills → .claude/cfn-extras/skills/advanced-features}/cfn-context-pruner/SKILL.md +0 -0
  350. /package/{claude-assets/skills → .claude/cfn-extras/skills/advanced-features}/cfn-context-pruner/prune-context.sh +0 -0
  351. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/README.md +0 -0
  352. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/SKILL.md +0 -0
  353. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/config.json +0 -0
  354. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/eventbus-wrapper.cjs +0 -0
  355. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/invoke-event-publish.sh +0 -0
  356. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/invoke-event-subscribe.sh +0 -0
  357. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/invoke-lifecycle-track.sh +0 -0
  358. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/test-event-bus.sh +0 -0
  359. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/README.md +0 -0
  360. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/SKILL.md +0 -0
  361. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/config.json +0 -0
  362. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/invoke-fleet-allocate.sh +0 -0
  363. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/invoke-fleet-balance.sh +0 -0
  364. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/invoke-fleet-metrics.sh +0 -0
  365. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/invoke-fleet-register.sh +0 -0
  366. /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/test-fleet-manager.sh +0 -0
  367. /package/{claude-assets/skills → .claude/cfn-extras/skills/advanced-features}/cfn-task-mode-safety/cli-coordination.sh +0 -0
  368. /package/{claude-assets/skills → .claude/cfn-extras/skills/advanced-features}/cfn-task-mode-safety/mode-detection.sh +0 -0
  369. /package/{claude-assets/skills → .claude/cfn-extras/skills/advanced-features}/cfn-task-mode-sanitize/task-mode-env-sanitizer.sh +0 -0
  370. /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/README.md +0 -0
  371. /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/description-refinement-guide.md +0 -0
  372. /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/log-skill-invocation.js +0 -0
  373. /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/run-production-criteria-tests.sh +0 -0
  374. /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/skill-analytics-dashboard.js +0 -0
  375. /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/skill-invocation-hook.sh +0 -0
  376. /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/skill-invocations.sql +0 -0
  377. /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/test-corpus.json +0 -0
  378. /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/test-data-generator.js +0 -0
  379. /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/test-manual-override-rate.js +0 -0
  380. /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/validate-skill-selection.js +0 -0
  381. /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-improvement-recommender/SKILL.md +0 -0
  382. /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-improvement-recommender/recommend-improvements.sh +0 -0
  383. /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-memory-monitoring/SKILL.md +0 -0
  384. /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-pattern-extraction/SKILL.md +0 -0
  385. /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-pattern-extraction/extract-patterns.sh +0 -0
  386. /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-retrospective-report/SKILL.md +0 -0
  387. /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-retrospective-report/generate-report.sh +0 -0
  388. /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-telemetry/collect-metrics.sh +0 -0
  389. /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-telemetry/start-telemetry.sh +0 -0
  390. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/SKILL.md +0 -0
  391. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/add-bullet.sh +0 -0
  392. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/analyze-anti-pattern-effectiveness.sh +0 -0
  393. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/classify-task.sh +0 -0
  394. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/export-ace-metrics.sh +0 -0
  395. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/extract-tags.sh +0 -0
  396. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/format-negative-context.sh +0 -0
  397. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/init-indexes.sql +0 -0
  398. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-curate.sh +0 -0
  399. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-inject.sh +0 -0
  400. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-query.sh +0 -0
  401. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-reflect.sh +0 -0
  402. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-stats.sh +0 -0
  403. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/log-merge.sh +0 -0
  404. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/monitor-injection-performance.sh +0 -0
  405. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/optimize-injection-pipeline.sh +0 -0
  406. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/query-anti-patterns.sh +0 -0
  407. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/query-contexts.sh +0 -0
  408. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/query-reflections.sh +0 -0
  409. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/001-create-context-reflections.sql +0 -0
  410. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/README.md +0 -0
  411. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/SCHEMA_DESIGN_SUMMARY.md +0 -0
  412. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/populate-test-data-simple.sh +0 -0
  413. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/populate-test-data.sh +0 -0
  414. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/run-migration.sh +0 -0
  415. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/validate-schema.sql +0 -0
  416. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/score-relevance-adapter.sh +0 -0
  417. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/score-relevance.sh +0 -0
  418. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/sprint-7-lessons.json +0 -0
  419. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/store-reflection.sh +0 -0
  420. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/test-ace-skill.sh +0 -0
  421. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/track-ab-test.sh +0 -0
  422. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/update-reflection.sh +0 -0
  423. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/SKILL.md +0 -0
  424. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/agents-registry-clean.json +0 -0
  425. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/agents-registry-fixed.json +0 -0
  426. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/agents-registry.json +0 -0
  427. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/discover-agents.py +0 -0
  428. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/discover-agents.sh +0 -0
  429. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/invoke-registry.sh +0 -0
  430. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/temp_script.py +0 -0
  431. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-selector/SKILL.md +0 -0
  432. /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-selector/select-agents.sh +0 -0
  433. /package/{claude-assets/skills → .claude/cfn-extras/skills/deprecated}/cfn-cli-setup/validate-cli-environment.sh +0 -0
  434. /package/{claude-assets/skills → .claude/cfn-extras/skills/deprecated}/cfn-simplified-agent-lifecycle/COST_ANALYSIS.md +0 -0
  435. /package/{claude-assets/skills → .claude/cfn-extras/skills/deprecated}/cfn-simplified-agent-lifecycle/DESIGN.md +0 -0
  436. /package/{claude-assets/skills → .claude/cfn-extras/skills/deprecated}/cfn-simplified-agent-lifecycle/MIGRATION_PLAN.md +0 -0
  437. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-ad-campaigns/SKILL.md +0 -0
  438. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-ad-campaigns/operations/create-campaign.sh +0 -0
  439. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +0 -0
  440. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +0 -0
  441. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-ad-campaigns/operations/set-budget.sh +0 -0
  442. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +0 -0
  443. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-analytics-data/SKILL.md +0 -0
  444. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-analytics-data/operations/get-ad-performance.sh +0 -0
  445. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-analytics-data/operations/get-conversion-funnel.sh +0 -0
  446. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-analytics-data/operations/get-email-performance.sh +0 -0
  447. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-analytics-data/operations/get-social-engagement.sh +0 -0
  448. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-analytics-data/operations/get-website-traffic.sh +0 -0
  449. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-chatbot-conversations/SKILL.md +0 -0
  450. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +0 -0
  451. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +0 -0
  452. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +0 -0
  453. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-chatbot-conversations/operations/send-message.sh +0 -0
  454. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +0 -0
  455. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-competitive-intel/SKILL.md +0 -0
  456. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-competitive-intel/operations/get-backlink-profile.sh +0 -0
  457. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-competitive-intel/operations/get-keyword-rankings.sh +0 -0
  458. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-competitive-intel/operations/get-trending-topics.sh +0 -0
  459. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-competitive-intel/operations/monitor-competitor.sh +0 -0
  460. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-competitive-intel/operations/search-brand-mentions.sh +0 -0
  461. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-crm-contacts/SKILL.md +0 -0
  462. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-crm-contacts/operations/add-to-segment.sh +0 -0
  463. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-crm-contacts/operations/create-contact.sh +0 -0
  464. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-crm-contacts/operations/get-contact.sh +0 -0
  465. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-crm-contacts/operations/remove-from-segment.sh +0 -0
  466. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-crm-contacts/operations/update-contact.sh +0 -0
  467. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-email-campaigns/SKILL.md +0 -0
  468. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-email-campaigns/operations/create-campaign.sh +0 -0
  469. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-email-campaigns/operations/get-campaign-stats.sh +0 -0
  470. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-email-campaigns/operations/list-templates.sh +0 -0
  471. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-email-campaigns/operations/schedule-campaign.sh +0 -0
  472. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-email-campaigns/operations/send-test-email.sh +0 -0
  473. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-landing-pages/SKILL.md +0 -0
  474. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-landing-pages/operations/create-ab-test.sh +0 -0
  475. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-landing-pages/operations/create-landing-page.sh +0 -0
  476. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-landing-pages/operations/get-page-performance.sh +0 -0
  477. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-landing-pages/operations/publish-page.sh +0 -0
  478. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-landing-pages/operations/unpublish-page.sh +0 -0
  479. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-monitoring/SKILL.md +0 -0
  480. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-monitoring/operations/create-crisis-alert.sh +0 -0
  481. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-monitoring/operations/export-report.sh +0 -0
  482. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-monitoring/operations/get-sentiment-analysis.sh +0 -0
  483. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-monitoring/operations/search-mentions.sh +0 -0
  484. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-outreach/SKILL.md +0 -0
  485. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-outreach/operations/search-journalists.sh +0 -0
  486. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-outreach/operations/send-pitch.sh +0 -0
  487. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-outreach/operations/submit-haro-response.sh +0 -0
  488. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-outreach/operations/track-pitch-engagement.sh +0 -0
  489. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-press-distribution/SKILL.md +0 -0
  490. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-press-distribution/operations/distribute-press-release.sh +0 -0
  491. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-press-distribution/operations/get-distribution-status.sh +0 -0
  492. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-press-distribution/operations/get-pickup-metrics.sh +0 -0
  493. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-press-distribution/operations/list-templates.sh +0 -0
  494. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-sms-campaigns/SKILL.md +0 -0
  495. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-sms-campaigns/operations/create-campaign.sh +0 -0
  496. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +0 -0
  497. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-sms-campaigns/operations/opt-out.sh +0 -0
  498. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +0 -0
  499. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-sms-campaigns/operations/send-sms.sh +0 -0
  500. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-social-publishing/SKILL.md +0 -0
  501. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-social-publishing/operations/create-post.sh +0 -0
  502. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-social-publishing/operations/delete-post.sh +0 -0
  503. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-social-publishing/operations/get-post-stats.sh +0 -0
  504. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-social-publishing/operations/schedule-post.sh +0 -0
  505. /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-social-publishing/operations/upload-media.sh +0 -0
  506. /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/DESIGN.md +0 -0
  507. /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/SKILL.md +0 -0
  508. /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/invoke-portal-agents.sh +0 -0
  509. /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/invoke-portal-dashboard.sh +0 -0
  510. /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/invoke-portal-events.sh +0 -0
  511. /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/invoke-portal-metrics.sh +0 -0
  512. /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/invoke-portal-start.sh +0 -0
  513. /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/invoke-portal-stop.sh +0 -0
  514. /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/test-web-portal-skill.sh +0 -0
  515. /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/validate-deployment.sh +0 -0
  516. /package/{claude-assets/skills → .claude/cfn-extras/skills/utility}/cfn-environment-sanitization/SKILL.md +0 -0
  517. /package/{claude-assets/skills → .claude/cfn-extras/skills/utility}/cfn-environment-sanitization/sanitize-environment.sh +0 -0
  518. /package/{claude-assets/skills → .claude/cfn-extras/skills/utility}/cfn-process-instrumentation/SKILL.md +0 -0
  519. /package/{claude-assets/skills → .claude/cfn-extras/skills/utility}/cfn-process-instrumentation/instrument-process.sh +0 -0
  520. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/DELEGATION_MATRIX.md +0 -0
  521. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/HUMANIZER_PROMPTS.md +0 -0
  522. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/INTEGRATION_REQUIREMENTS.md +0 -0
  523. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/cfn-seo-coordinator.md +0 -0
  524. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/competitive-seo-analyst.md +0 -0
  525. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/content-atomization-specialist.md +0 -0
  526. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/content-seo-strategist.md +0 -0
  527. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/eeat-content-auditor.md +0 -0
  528. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/geo-optimization-expert.md +0 -0
  529. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/link-building-specialist.md +0 -0
  530. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/local-seo-optimizer.md +0 -0
  531. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/programmatic-seo-engineer.md +0 -0
  532. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/schema-markup-engineer.md +0 -0
  533. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-analytics-specialist.md +0 -0
  534. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-validators/accessibility-validator.md +0 -0
  535. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-validators/audience-validator.md +0 -0
  536. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-validators/branding-validator.md +0 -0
  537. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-validators/humanizer-validator.md +0 -0
  538. /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/technical-seo-specialist.md +0 -0
  539. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/README.md +0 -0
  540. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/SKILL.md +0 -0
  541. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/config.json +0 -0
  542. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/eventbus-wrapper.cjs +0 -0
  543. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/invoke-event-publish.sh +0 -0
  544. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/invoke-event-subscribe.sh +0 -0
  545. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/invoke-lifecycle-track.sh +0 -0
  546. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/test-event-bus.sh +0 -0
  547. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/README.md +0 -0
  548. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/SKILL.md +0 -0
  549. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/config.json +0 -0
  550. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/invoke-fleet-allocate.sh +0 -0
  551. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/invoke-fleet-balance.sh +0 -0
  552. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/invoke-fleet-metrics.sh +0 -0
  553. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/invoke-fleet-register.sh +0 -0
  554. /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/test-fleet-manager.sh +0 -0
  555. /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/README.md +0 -0
  556. /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/description-refinement-guide.md +0 -0
  557. /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/log-skill-invocation.js +0 -0
  558. /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/run-production-criteria-tests.sh +0 -0
  559. /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/skill-analytics-dashboard.js +0 -0
  560. /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/skill-invocation-hook.sh +0 -0
  561. /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/skill-invocations.sql +0 -0
  562. /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/test-corpus.json +0 -0
  563. /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/test-data-generator.js +0 -0
  564. /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/test-manual-override-rate.js +0 -0
  565. /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/validate-skill-selection.js +0 -0
  566. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/SKILL.md +0 -0
  567. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/add-bullet.sh +0 -0
  568. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/analyze-anti-pattern-effectiveness.sh +0 -0
  569. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/classify-task.sh +0 -0
  570. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/export-ace-metrics.sh +0 -0
  571. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/extract-tags.sh +0 -0
  572. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/format-negative-context.sh +0 -0
  573. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/init-indexes.sql +0 -0
  574. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-curate.sh +0 -0
  575. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-inject.sh +0 -0
  576. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-query.sh +0 -0
  577. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-reflect.sh +0 -0
  578. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-stats.sh +0 -0
  579. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/log-merge.sh +0 -0
  580. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/monitor-injection-performance.sh +0 -0
  581. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/optimize-injection-pipeline.sh +0 -0
  582. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/query-anti-patterns.sh +0 -0
  583. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/query-contexts.sh +0 -0
  584. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/query-reflections.sh +0 -0
  585. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/001-create-context-reflections.sql +0 -0
  586. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/README.md +0 -0
  587. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/SCHEMA_DESIGN_SUMMARY.md +0 -0
  588. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/populate-test-data-simple.sh +0 -0
  589. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/populate-test-data.sh +0 -0
  590. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/run-migration.sh +0 -0
  591. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/validate-schema.sql +0 -0
  592. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/score-relevance-adapter.sh +0 -0
  593. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/score-relevance.sh +0 -0
  594. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/sprint-7-lessons.json +0 -0
  595. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/store-reflection.sh +0 -0
  596. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/test-ace-skill.sh +0 -0
  597. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/track-ab-test.sh +0 -0
  598. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/update-reflection.sh +0 -0
  599. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/SKILL.md +0 -0
  600. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/agents-registry-clean.json +0 -0
  601. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/agents-registry-fixed.json +0 -0
  602. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/agents-registry.json +0 -0
  603. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/discover-agents.py +0 -0
  604. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/discover-agents.sh +0 -0
  605. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/invoke-registry.sh +0 -0
  606. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/temp_script.py +0 -0
  607. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-selector/SKILL.md +0 -0
  608. /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-selector/select-agents.sh +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/agent-prompt-builder.ts"],"sourcesContent":["/**\r\n * Agent Prompt Builder\r\n *\r\n * Builds comprehensive prompts for CLI-spawned agents by combining:\r\n * - Agent definition (YAML + markdown)\r\n * - Task context (taskId, iteration, mode)\r\n * - CFN Loop protocol (if applicable)\r\n * - Iteration history (Sprint 3 - Phase 2)\r\n * - Environment variables\r\n */\r\n\r\nimport { AgentDefinition, hasCFNLoopProtocol } from './agent-definition-parser.js';\r\nimport { loadIterationHistory, formatIterationHistory } from './iteration-history.js';\r\n\r\nexport interface TaskContext {\r\n taskId?: string;\r\n iteration?: number;\r\n context?: string;\r\n mode?: string;\r\n priority?: number;\r\n parentTaskId?: string;\r\n agentId?: string;\r\n}\r\n\r\n/**\r\n * Build CFN Loop protocol instructions\r\n */\r\nfunction buildCFNLoopProtocol(taskId: string, agentId: string): string {\r\n return `\r\n## CFN Loop Redis Completion Protocol\r\n\r\nYou are participating in a CFN Loop workflow. Follow this protocol EXACTLY:\r\n\r\n### Step 1: Complete Your Work\r\nExecute your assigned task (implementation, review, testing, etc.)\r\n\r\n### Step 2: Calculate Confidence Score\r\nAssess your work quality and assign a confidence score (0.0-1.0):\r\n- 0.90-1.0: Excellent, production-ready\r\n- 0.75-0.89: Good, minor issues possible\r\n- 0.50-0.74: Acceptable, needs review\r\n- 0.0-0.49: Poor, significant issues\r\n\r\n### Step 3: Report Completion to Redis\r\n\\`\\`\\`bash\r\n./.claude/skills/cfn-redis-coordination/report-completion.sh \\\\\r\n --task-id \"${taskId}\" \\\\\r\n --agent-id \"${agentId}\" \\\\\r\n --confidence [YOUR_CONFIDENCE_SCORE] \\\\\r\n --iteration \\${ITERATION:-1}\r\n\\`\\`\\`\r\n\r\nThis script automatically:\r\n- Signals completion via \\`swarm:${taskId}:${agentId}:done\\`\r\n- Stores confidence in \\`swarm:${taskId}:${agentId}:confidence\\`\r\n- Creates result hash in \\`swarm:${taskId}:${agentId}:result\\`\r\n- Updates SQLite persistence layer\r\n\r\n### Step 4: Exit Cleanly\r\nAfter reporting, exit immediately. DO NOT enter waiting mode.\r\n\r\nThe orchestrator will:\r\n- Collect confidence scores from all agents\r\n- Run gate check (≥0.75 threshold)\r\n- Spawn validators if gate passes\r\n- Spawn fresh agents for iteration N+1 if needed\r\n\r\n**Environment Variables Available:**\r\n- TASK_ID: ${taskId}\r\n- AGENT_ID: ${agentId}\r\n- ITERATION: Current iteration number (default: 1)\r\n- CONFIDENCE_SCORE: Your final confidence assessment\r\n\r\n**Why This Matters:**\r\n- Enables zero-token coordination (orchestrator uses Redis BLPOP)\r\n- Supports adaptive agent specialization (spawn different specialist for iteration N+1)\r\n- Prevents memory leaks (agents exit after reporting)\r\n- Confidence scores drive gate checks and consensus validation\r\n\r\n**CRITICAL:** Report completion before exiting. Orchestrator is waiting for your signal.\r\n`;\r\n}\r\n\r\n/**\r\n * Parse and enrich JSON context into natural language instructions\r\n */\r\nfunction enrichJSONContext(jsonObj: any): string {\r\n const sections: string[] = [];\r\n\r\n // Extract task description\r\n if (jsonObj.task) {\r\n sections.push(`**Task:** ${jsonObj.task}`);\r\n }\r\n\r\n // Parse files - convert comma-separated string to bullet list\r\n if (jsonObj.files) {\r\n const fileList = typeof jsonObj.files === 'string'\r\n ? jsonObj.files.split(',').map(f => f.trim()).filter(f => f)\r\n : Array.isArray(jsonObj.files) ? jsonObj.files : [];\r\n\r\n if (fileList.length > 0) {\r\n sections.push('\\n**Files to process:**');\r\n fileList.forEach(file => sections.push(`- ${file}`));\r\n }\r\n }\r\n\r\n // Add requirements/deliverables\r\n if (jsonObj.requirements) {\r\n const reqs = Array.isArray(jsonObj.requirements) ? jsonObj.requirements : [jsonObj.requirements];\r\n sections.push('\\n**Requirements:**');\r\n reqs.forEach((req, i) => sections.push(`${i + 1}. ${req}`));\r\n }\r\n\r\n if (jsonObj.deliverables) {\r\n const delivs = Array.isArray(jsonObj.deliverables) ? jsonObj.deliverables : [jsonObj.deliverables];\r\n sections.push('\\n**Deliverables:**');\r\n delivs.forEach(deliv => sections.push(`- ${deliv}`));\r\n }\r\n\r\n // Add batch information\r\n if (jsonObj.batch) {\r\n sections.push(`\\n**Batch:** ${jsonObj.batch}`);\r\n }\r\n\r\n // Add directory context\r\n if (jsonObj.directory) {\r\n sections.push(`\\n**Working Directory:** ${jsonObj.directory}`);\r\n }\r\n\r\n // Add acceptance criteria\r\n if (jsonObj.acceptanceCriteria) {\r\n const criteria = Array.isArray(jsonObj.acceptanceCriteria)\r\n ? jsonObj.acceptanceCriteria\r\n : [jsonObj.acceptanceCriteria];\r\n sections.push('\\n**Acceptance Criteria:**');\r\n criteria.forEach(criterion => sections.push(`- ${criterion}`));\r\n }\r\n\r\n // Add explicit instructions if present\r\n if (jsonObj.instructions) {\r\n sections.push('\\n**Instructions:**');\r\n const instrs = Array.isArray(jsonObj.instructions) ? jsonObj.instructions : [jsonObj.instructions];\r\n instrs.forEach((instr, i) => sections.push(`${i + 1}. ${instr}`));\r\n }\r\n\r\n return sections.join('\\n');\r\n}\r\n\r\n/**\r\n * Build task description from context\r\n */\r\nfunction buildTaskDescription(agentType: string, context: TaskContext): string {\r\n let desc = '';\r\n\r\n if (context.context) {\r\n // Try to parse as JSON first\r\n let contextStr = context.context.trim();\r\n\r\n // Check if context looks like JSON\r\n if ((contextStr.startsWith('{') && contextStr.endsWith('}')) ||\r\n (contextStr.startsWith('[') && contextStr.endsWith(']'))) {\r\n try {\r\n const jsonObj = JSON.parse(contextStr);\r\n desc = enrichJSONContext(jsonObj);\r\n\r\n // Add instruction footer for structured tasks\r\n if (jsonObj.files || jsonObj.deliverables) {\r\n desc += '\\n\\n**Process each item systematically and report confidence when complete.**';\r\n }\r\n } catch (e) {\r\n // Not valid JSON, treat as plain text\r\n desc = context.context;\r\n }\r\n } else {\r\n // Plain text context\r\n desc = context.context;\r\n }\r\n } else {\r\n desc = `Execute task as ${agentType} agent`;\r\n }\r\n\r\n // Add metadata fields\r\n if (context.taskId) {\r\n desc += `\\n\\n**Task ID:** ${context.taskId}`;\r\n }\r\n\r\n if (context.iteration) {\r\n desc += `\\n**Iteration:** ${context.iteration}`;\r\n }\r\n\r\n if (context.mode) {\r\n desc += `\\n**Mode:** ${context.mode}`;\r\n }\r\n\r\n if (context.priority) {\r\n desc += `\\n**Priority:** ${context.priority}`;\r\n }\r\n\r\n if (context.parentTaskId) {\r\n desc += `\\n**Parent Task:** ${context.parentTaskId}`;\r\n }\r\n\r\n return desc;\r\n}\r\n\r\n/**\r\n * Build environment context section\r\n */\r\nfunction buildEnvironmentContext(context: TaskContext): string {\r\n const env: string[] = [];\r\n\r\n if (context.taskId) env.push(`TASK_ID=${context.taskId}`);\r\n if (context.iteration) env.push(`ITERATION=${context.iteration}`);\r\n if (context.mode) env.push(`MODE=${context.mode}`);\r\n if (context.priority) env.push(`PRIORITY=${context.priority}`);\r\n if (context.parentTaskId) env.push(`PARENT_TASK_ID=${context.parentTaskId}`);\r\n\r\n if (env.length === 0) return '';\r\n\r\n return `\r\n## Environment Variables\r\n\r\n\\`\\`\\`bash\r\n${env.join('\\n')}\r\n\\`\\`\\`\r\n`;\r\n}\r\n\r\n/**\r\n * Build complete prompt for agent execution (async for iteration history)\r\n */\r\nexport async function buildAgentPrompt(\r\n definition: AgentDefinition,\r\n context: TaskContext\r\n): Promise<string> {\r\n // Use explicit agent ID if provided, otherwise generate from name + iteration\r\n const agentId = context.agentId || `${definition.name}-${context.iteration || 1}`;\r\n\r\n const sections: string[] = [];\r\n\r\n // 1. Agent definition header\r\n sections.push(`# Agent: ${definition.name}`);\r\n sections.push('');\r\n sections.push(definition.description);\r\n sections.push('');\r\n\r\n // 2. Task description\r\n sections.push('## Task');\r\n sections.push('');\r\n sections.push(buildTaskDescription(definition.name, context));\r\n sections.push('');\r\n\r\n // 3. Iteration history (Sprint 3 - Phase 2)\r\n // Load and format previous iterations if iteration > 1\r\n if (context.taskId && context.iteration && context.iteration > 1) {\r\n try {\r\n const history = await loadIterationHistory(context.taskId, agentId, context.iteration);\r\n const historyText = formatIterationHistory(history, context.iteration);\r\n sections.push(historyText);\r\n sections.push('');\r\n } catch (err) {\r\n console.warn(`[agent-prompt-builder] Failed to load iteration history:`, err);\r\n // Continue without history\r\n }\r\n }\r\n\r\n // 4. Agent definition content (from markdown file)\r\n sections.push('## Agent Definition');\r\n sections.push('');\r\n sections.push(definition.content);\r\n sections.push('');\r\n\r\n // 5. CFN Loop protocol (ALWAYS inject when taskId present - enables Redis coordination)\r\n if (context.taskId && agentId) {\r\n sections.push(buildCFNLoopProtocol(context.taskId, agentId));\r\n sections.push('');\r\n }\r\n\r\n // 6. Environment context\r\n const envContext = buildEnvironmentContext(context);\r\n if (envContext) {\r\n sections.push(envContext);\r\n sections.push('');\r\n }\r\n\r\n // 7. Execution instructions\r\n sections.push('## Execution Instructions');\r\n sections.push('');\r\n sections.push('1. Read and understand the task requirements');\r\n if (context.iteration && context.iteration > 1) {\r\n sections.push('2. Review iteration history and feedback from validators');\r\n sections.push('3. Address specific feedback points from previous iteration');\r\n sections.push('4. Execute your core responsibilities as defined above');\r\n } else {\r\n sections.push('2. Execute your core responsibilities as defined above');\r\n sections.push('3. Follow any protocol steps (CFN Loop, validation hooks, etc.)');\r\n }\r\n sections.push('4. Provide clear, concise output');\r\n sections.push('5. Report confidence score if applicable');\r\n sections.push('');\r\n\r\n // 7a. Pre-edit backup requirement (MANDATORY)\r\n sections.push('## Pre-Edit Backup Protocol (MANDATORY)');\r\n sections.push('');\r\n sections.push('**BEFORE ANY Edit/Write/MultiEdit operation, you MUST create a backup:**');\r\n sections.push('');\r\n sections.push('```bash');\r\n sections.push(`BACKUP_PATH=$(./.claude/hooks/cfn-invoke-pre-edit.sh \"$FILE_TO_EDIT\" --agent-id \"${agentId}\")`);\r\n sections.push('```');\r\n sections.push('');\r\n sections.push('**Why:** Enables safe file revert without git operations during parallel sessions.');\r\n sections.push('**Location:** `.backups/[agent-id]/[timestamp]_[hash]/`');\r\n sections.push('**Retention:** 24h TTL (configurable)');\r\n sections.push('');\r\n sections.push('**Complete Edit Workflow:**');\r\n sections.push('```bash');\r\n sections.push('# 1. Pre-Edit: Create backup');\r\n sections.push(`BACKUP_PATH=$(./.claude/hooks/cfn-invoke-pre-edit.sh \"src/file.ts\" --agent-id \"${agentId}\")`);\r\n sections.push('');\r\n sections.push('# 2. Edit: Perform file modification');\r\n sections.push('Edit: file_path=\"src/file.ts\" old_string=\"...\" new_string=\"...\"');\r\n sections.push('');\r\n sections.push('# 3. Post-Edit: Validate changes');\r\n sections.push(`./.claude/hooks/cfn-invoke-post-edit.sh \"src/file.ts\" --agent-id \"${agentId}\"`);\r\n sections.push('```');\r\n sections.push('');\r\n\r\n // 8. Tool reminder\r\n if (definition.tools && definition.tools.length > 0) {\r\n sections.push('## Available Tools');\r\n sections.push('');\r\n sections.push(`You have access to: ${definition.tools.join(', ')}`);\r\n sections.push('');\r\n }\r\n\r\n return sections.join('\\n');\r\n}\r\n\r\n/**\r\n * Extract agent ID from context\r\n * If agentId is explicitly provided in context, use it; otherwise generate from name + iteration\r\n */\r\nexport function getAgentId(definition: AgentDefinition, context: TaskContext): string {\r\n if (context.agentId) {\r\n return context.agentId;\r\n }\r\n return `${definition.name}-${context.iteration || 1}`;\r\n}\r\n\r\n/**\r\n * Build system prompt for agent (optional, for structured agent behavior)\r\n */\r\nexport function buildSystemPrompt(definition: AgentDefinition): string {\r\n return `You are ${definition.name}, a specialized AI agent.\r\n\r\nType: ${definition.type || 'specialist'}\r\nModel: ${definition.model}\r\nTools: ${definition.tools.join(', ')}\r\n\r\nFollow your agent definition exactly and complete assigned tasks with high quality.`;\r\n}\r\n"],"names":["loadIterationHistory","formatIterationHistory","buildCFNLoopProtocol","taskId","agentId","enrichJSONContext","jsonObj","sections","task","push","files","fileList","split","map","f","trim","filter","Array","isArray","length","forEach","file","requirements","reqs","req","i","deliverables","delivs","deliv","batch","directory","acceptanceCriteria","criteria","criterion","instructions","instrs","instr","join","buildTaskDescription","agentType","context","desc","contextStr","startsWith","endsWith","JSON","parse","e","iteration","mode","priority","parentTaskId","buildEnvironmentContext","env","buildAgentPrompt","definition","name","description","history","historyText","err","console","warn","content","envContext","tools","getAgentId","buildSystemPrompt","type","model"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/cli/agent-prompt-builder.ts"],"sourcesContent":["/**\r\n * Agent Prompt Builder\r\n *\r\n * Builds comprehensive prompts for CLI-spawned agents by combining:\r\n * - Agent definition (YAML + markdown)\r\n * - Task context (taskId, iteration, mode)\r\n * - CFN Loop protocol (if applicable)\r\n * - Iteration history (Sprint 3 - Phase 2)\r\n * - Environment variables\r\n */\r\n\r\nimport { AgentDefinition, hasCFNLoopProtocol } from './agent-definition-parser.js';\r\nimport { loadIterationHistory, formatIterationHistory } from './iteration-history.js';\r\n\r\nexport interface TaskContext {\r\n taskId?: string;\r\n iteration?: number;\r\n context?: string;\r\n mode?: string;\r\n priority?: number;\r\n parentTaskId?: string;\r\n agentId?: string;\r\n}\r\n\r\n/**\r\n * Build CFN Loop protocol instructions\r\n */\r\nfunction buildCFNLoopProtocol(taskId: string, agentId: string): string {\r\n return `\r\n## CFN Loop Redis Completion Protocol\r\n\r\nYou are participating in a CFN Loop workflow. Follow this protocol EXACTLY:\r\n\r\n### Step 1: Complete Your Work\r\nExecute your assigned task (implementation, review, testing, etc.)\r\n\r\n### Step 2: Calculate Confidence Score\r\nAssess your work quality and assign a confidence score (0.0-1.0):\r\n- 0.90-1.0: Excellent, production-ready\r\n- 0.75-0.89: Good, minor issues possible\r\n- 0.50-0.74: Acceptable, needs review\r\n- 0.0-0.49: Poor, significant issues\r\n\r\n### Step 3: Report Completion to Redis\r\n\\`\\`\\`bash\r\n./.claude/skills/cfn-redis-coordination/report-completion.sh \\\\\r\n --task-id \"${taskId}\" \\\\\r\n --agent-id \"${agentId}\" \\\\\r\n --confidence [YOUR_CONFIDENCE_SCORE] \\\\\r\n --iteration \\${ITERATION:-1}\r\n\\`\\`\\`\r\n\r\nThis script automatically:\r\n- Signals completion via \\`swarm:${taskId}:${agentId}:done\\`\r\n- Stores confidence in \\`swarm:${taskId}:${agentId}:confidence\\`\r\n- Creates result hash in \\`swarm:${taskId}:${agentId}:result\\`\r\n- Updates SQLite persistence layer\r\n\r\n### Step 4: Exit Cleanly\r\nAfter reporting, exit immediately. DO NOT enter waiting mode.\r\n\r\nThe orchestrator will:\r\n- Collect confidence scores from all agents\r\n- Run gate check (≥0.75 threshold)\r\n- Spawn validators if gate passes\r\n- Spawn fresh agents for iteration N+1 if needed\r\n\r\n**Environment Variables Available:**\r\n- TASK_ID: ${taskId}\r\n- AGENT_ID: ${agentId}\r\n- ITERATION: Current iteration number (default: 1)\r\n- CONFIDENCE_SCORE: Your final confidence assessment\r\n\r\n**Why This Matters:**\r\n- Enables zero-token coordination (orchestrator uses Redis BLPOP)\r\n- Supports adaptive agent specialization (spawn different specialist for iteration N+1)\r\n- Prevents memory leaks (agents exit after reporting)\r\n- Confidence scores drive gate checks and consensus validation\r\n\r\n**CRITICAL:** Report completion before exiting. Orchestrator is waiting for your signal.\r\n`;\r\n}\r\n\r\n/**\r\n * Parse and enrich JSON context into natural language instructions\r\n */\r\nfunction enrichJSONContext(jsonObj: any): string {\r\n const sections: string[] = [];\r\n\r\n // Extract task description\r\n if (jsonObj.task) {\r\n sections.push(`**Task:** ${jsonObj.task}`);\r\n }\r\n\r\n // Parse files - convert comma-separated string to bullet list\r\n if (jsonObj.files) {\r\n const fileList = typeof jsonObj.files === 'string'\r\n ? jsonObj.files.split(',').map(f => f.trim()).filter(f => f)\r\n : Array.isArray(jsonObj.files) ? jsonObj.files : [];\r\n\r\n if (fileList.length > 0) {\r\n sections.push('\\n**Files to process:**');\r\n fileList.forEach(file => sections.push(`- ${file}`));\r\n }\r\n }\r\n\r\n // Add requirements/deliverables\r\n if (jsonObj.requirements) {\r\n const reqs = Array.isArray(jsonObj.requirements) ? jsonObj.requirements : [jsonObj.requirements];\r\n sections.push('\\n**Requirements:**');\r\n reqs.forEach((req, i) => sections.push(`${i + 1}. ${req}`));\r\n }\r\n\r\n if (jsonObj.deliverables) {\r\n const delivs = Array.isArray(jsonObj.deliverables) ? jsonObj.deliverables : [jsonObj.deliverables];\r\n sections.push('\\n**Deliverables:**');\r\n delivs.forEach(deliv => sections.push(`- ${deliv}`));\r\n }\r\n\r\n // Add batch information\r\n if (jsonObj.batch) {\r\n sections.push(`\\n**Batch:** ${jsonObj.batch}`);\r\n }\r\n\r\n // Add directory context\r\n if (jsonObj.directory) {\r\n sections.push(`\\n**Working Directory:** ${jsonObj.directory}`);\r\n }\r\n\r\n // Add acceptance criteria\r\n if (jsonObj.acceptanceCriteria) {\r\n const criteria = Array.isArray(jsonObj.acceptanceCriteria)\r\n ? jsonObj.acceptanceCriteria\r\n : [jsonObj.acceptanceCriteria];\r\n sections.push('\\n**Acceptance Criteria:**');\r\n criteria.forEach(criterion => sections.push(`- ${criterion}`));\r\n }\r\n\r\n // Add explicit instructions if present\r\n if (jsonObj.instructions) {\r\n sections.push('\\n**Instructions:**');\r\n const instrs = Array.isArray(jsonObj.instructions) ? jsonObj.instructions : [jsonObj.instructions];\r\n instrs.forEach((instr, i) => sections.push(`${i + 1}. ${instr}`));\r\n }\r\n\r\n return sections.join('\\n');\r\n}\r\n\r\n/**\r\n * Build task description from context\r\n */\r\nfunction buildTaskDescription(agentType: string, context: TaskContext): string {\r\n let desc = '';\r\n\r\n if (context.context) {\r\n // Try to parse as JSON first\r\n let contextStr = context.context.trim();\r\n\r\n // Check if context looks like JSON\r\n if ((contextStr.startsWith('{') && contextStr.endsWith('}')) ||\r\n (contextStr.startsWith('[') && contextStr.endsWith(']'))) {\r\n try {\r\n const jsonObj = JSON.parse(contextStr);\r\n desc = enrichJSONContext(jsonObj);\r\n\r\n // Add instruction footer for structured tasks\r\n if (jsonObj.files || jsonObj.deliverables) {\r\n desc += '\\n\\n**Process each item systematically and report confidence when complete.**';\r\n }\r\n } catch (e) {\r\n // Not valid JSON, treat as plain text\r\n desc = context.context;\r\n }\r\n } else {\r\n // Plain text context\r\n desc = context.context;\r\n }\r\n } else {\r\n desc = `Execute task as ${agentType} agent`;\r\n }\r\n\r\n // Add metadata fields\r\n if (context.taskId) {\r\n desc += `\\n\\n**Task ID:** ${context.taskId}`;\r\n }\r\n\r\n if (context.iteration) {\r\n desc += `\\n**Iteration:** ${context.iteration}`;\r\n }\r\n\r\n if (context.mode) {\r\n desc += `\\n**Mode:** ${context.mode}`;\r\n }\r\n\r\n if (context.priority) {\r\n desc += `\\n**Priority:** ${context.priority}`;\r\n }\r\n\r\n if (context.parentTaskId) {\r\n desc += `\\n**Parent Task:** ${context.parentTaskId}`;\r\n }\r\n\r\n return desc;\r\n}\r\n\r\n/**\r\n * Build environment context section\r\n */\r\nfunction buildEnvironmentContext(context: TaskContext): string {\r\n const env: string[] = [];\r\n\r\n if (context.taskId) env.push(`TASK_ID=${context.taskId}`);\r\n if (context.iteration) env.push(`ITERATION=${context.iteration}`);\r\n if (context.mode) env.push(`MODE=${context.mode}`);\r\n if (context.priority) env.push(`PRIORITY=${context.priority}`);\r\n if (context.parentTaskId) env.push(`PARENT_TASK_ID=${context.parentTaskId}`);\r\n\r\n // Docker workspace detection\r\n const isDockerEnv = process.env.DOCKER_AGENT === 'true' || process.env.WORKSPACE_ROOT;\r\n const workspaceRoot = process.env.WORKSPACE_ROOT || '/workspace';\r\n\r\n if (isDockerEnv) {\r\n env.push(`WORKSPACE_ROOT=${workspaceRoot}`);\r\n }\r\n\r\n // Always include Docker context if detected, even if env array is empty\r\n if (isDockerEnv && env.length === 0) {\r\n env.push(`WORKSPACE_ROOT=${workspaceRoot}`);\r\n }\r\n\r\n if (env.length === 0 && !isDockerEnv) return '';\r\n\r\n let contextText = `\r\n## Environment Variables\r\n\r\n\\`\\`\\`bash\r\n${env.join('\\n')}\r\n\\`\\`\\`\r\n`;\r\n\r\n // Add Docker workspace notice if detected\r\n if (isDockerEnv) {\r\n contextText += `\r\n\r\n## Docker Container Environment\r\n\r\n**CRITICAL:** You are running inside a Docker container.\r\n\r\n- **Working Directory:** \\`${workspaceRoot}\\`\r\n- **File Paths:** All file operations use \\`${workspaceRoot}/\\` prefix\r\n- **Example:** To read \\`src/file.ts\\`, use \\`${workspaceRoot}/src/file.ts\\`\r\n\r\n**DO NOT** use paths from your training data or Main Chat context. Use \\`${workspaceRoot}/\\` for all file operations.\r\n`;\r\n }\r\n\r\n return contextText;\r\n}\r\n\r\n/**\r\n * Build complete prompt for agent execution (async for iteration history)\r\n */\r\nexport async function buildAgentPrompt(\r\n definition: AgentDefinition,\r\n context: TaskContext\r\n): Promise<string> {\r\n // Use explicit agent ID if provided, otherwise generate from name + iteration\r\n const agentId = context.agentId || `${definition.name}-${context.iteration || 1}`;\r\n\r\n const sections: string[] = [];\r\n\r\n // 1. Agent definition header\r\n sections.push(`# Agent: ${definition.name}`);\r\n sections.push('');\r\n sections.push(definition.description);\r\n sections.push('');\r\n\r\n // 2. Task description\r\n sections.push('## Task');\r\n sections.push('');\r\n sections.push(buildTaskDescription(definition.name, context));\r\n sections.push('');\r\n\r\n // 3. Iteration history (Sprint 3 - Phase 2)\r\n // Load and format previous iterations if iteration > 1\r\n if (context.taskId && context.iteration && context.iteration > 1) {\r\n try {\r\n const history = await loadIterationHistory(context.taskId, agentId, context.iteration);\r\n const historyText = formatIterationHistory(history, context.iteration);\r\n sections.push(historyText);\r\n sections.push('');\r\n } catch (err) {\r\n console.warn(`[agent-prompt-builder] Failed to load iteration history:`, err);\r\n // Continue without history\r\n }\r\n }\r\n\r\n // 4. Agent definition content (from markdown file)\r\n sections.push('## Agent Definition');\r\n sections.push('');\r\n sections.push(definition.content);\r\n sections.push('');\r\n\r\n // 5. CFN Loop protocol (ALWAYS inject when taskId present - enables Redis coordination)\r\n if (context.taskId && agentId) {\r\n sections.push(buildCFNLoopProtocol(context.taskId, agentId));\r\n sections.push('');\r\n }\r\n\r\n // 6. Environment context\r\n const envContext = buildEnvironmentContext(context);\r\n if (envContext) {\r\n sections.push(envContext);\r\n sections.push('');\r\n }\r\n\r\n // 7. Execution instructions\r\n sections.push('## Execution Instructions');\r\n sections.push('');\r\n sections.push('1. Read and understand the task requirements');\r\n if (context.iteration && context.iteration > 1) {\r\n sections.push('2. Review iteration history and feedback from validators');\r\n sections.push('3. Address specific feedback points from previous iteration');\r\n sections.push('4. Execute your core responsibilities as defined above');\r\n } else {\r\n sections.push('2. Execute your core responsibilities as defined above');\r\n sections.push('3. Follow any protocol steps (CFN Loop, validation hooks, etc.)');\r\n }\r\n sections.push('4. Provide clear, concise output');\r\n sections.push('5. Report confidence score if applicable');\r\n sections.push('');\r\n\r\n // 7a. Pre-edit backup requirement (MANDATORY)\r\n sections.push('## Pre-Edit Backup Protocol (MANDATORY)');\r\n sections.push('');\r\n sections.push('**BEFORE ANY Edit/Write/MultiEdit operation, you MUST create a backup:**');\r\n sections.push('');\r\n sections.push('```bash');\r\n sections.push(`BACKUP_PATH=$(./.claude/hooks/cfn-invoke-pre-edit.sh \"$FILE_TO_EDIT\" --agent-id \"${agentId}\")`);\r\n sections.push('```');\r\n sections.push('');\r\n sections.push('**Why:** Enables safe file revert without git operations during parallel sessions.');\r\n sections.push('**Location:** `.backups/[agent-id]/[timestamp]_[hash]/`');\r\n sections.push('**Retention:** 24h TTL (configurable)');\r\n sections.push('');\r\n sections.push('**Complete Edit Workflow:**');\r\n sections.push('```bash');\r\n sections.push('# 1. Pre-Edit: Create backup');\r\n sections.push(`BACKUP_PATH=$(./.claude/hooks/cfn-invoke-pre-edit.sh \"src/file.ts\" --agent-id \"${agentId}\")`);\r\n sections.push('');\r\n sections.push('# 2. Edit: Perform file modification');\r\n sections.push('Edit: file_path=\"src/file.ts\" old_string=\"...\" new_string=\"...\"');\r\n sections.push('');\r\n sections.push('# 3. Post-Edit: Validate changes');\r\n sections.push(`./.claude/hooks/cfn-invoke-post-edit.sh \"src/file.ts\" --agent-id \"${agentId}\"`);\r\n sections.push('```');\r\n sections.push('');\r\n\r\n // 8. Tool reminder\r\n if (definition.tools && definition.tools.length > 0) {\r\n sections.push('## Available Tools');\r\n sections.push('');\r\n sections.push(`You have access to: ${definition.tools.join(', ')}`);\r\n sections.push('');\r\n }\r\n\r\n return sections.join('\\n');\r\n}\r\n\r\n/**\r\n * Extract agent ID from context\r\n * If agentId is explicitly provided in context, use it; otherwise generate from name + iteration\r\n */\r\nexport function getAgentId(definition: AgentDefinition, context: TaskContext): string {\r\n if (context.agentId) {\r\n return context.agentId;\r\n }\r\n return `${definition.name}-${context.iteration || 1}`;\r\n}\r\n\r\n/**\r\n * Build system prompt for agent (optional, for structured agent behavior)\r\n */\r\nexport function buildSystemPrompt(definition: AgentDefinition): string {\r\n return `You are ${definition.name}, a specialized AI agent.\r\n\r\nType: ${definition.type || 'specialist'}\r\nModel: ${definition.model}\r\nTools: ${definition.tools.join(', ')}\r\n\r\nFollow your agent definition exactly and complete assigned tasks with high quality.`;\r\n}\r\n"],"names":["loadIterationHistory","formatIterationHistory","buildCFNLoopProtocol","taskId","agentId","enrichJSONContext","jsonObj","sections","task","push","files","fileList","split","map","f","trim","filter","Array","isArray","length","forEach","file","requirements","reqs","req","i","deliverables","delivs","deliv","batch","directory","acceptanceCriteria","criteria","criterion","instructions","instrs","instr","join","buildTaskDescription","agentType","context","desc","contextStr","startsWith","endsWith","JSON","parse","e","iteration","mode","priority","parentTaskId","buildEnvironmentContext","env","isDockerEnv","process","DOCKER_AGENT","WORKSPACE_ROOT","workspaceRoot","contextText","buildAgentPrompt","definition","name","description","history","historyText","err","console","warn","content","envContext","tools","getAgentId","buildSystemPrompt","type","model"],"mappings":"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"}
@@ -112,9 +112,12 @@
112
112
  if (taskId) {
113
113
  try {
114
114
  const { execSync } = await import('child_process');
115
+ // Bug #6 Fix: Read Redis connection parameters from process.env and interpolate in TypeScript
116
+ const redisHost = process.env.CFN_REDIS_HOST || 'cfn-redis';
117
+ const redisPort = process.env.CFN_REDIS_PORT || '6379';
115
118
  // Try to read epic-level context from Redis
116
119
  try {
117
- epicContext = execSync(`redis-cli get "swarm:${taskId}:epic-context"`, {
120
+ epicContext = execSync(`redis-cli -h ${redisHost} -p ${redisPort} get "swarm:${taskId}:epic-context"`, {
118
121
  encoding: 'utf8'
119
122
  }).trim();
120
123
  if (epicContext === '(nil)') epicContext = '';
@@ -123,7 +126,7 @@
123
126
  }
124
127
  // Try to read phase-specific context
125
128
  try {
126
- phaseContext = execSync(`redis-cli get "swarm:${taskId}:phase-context"`, {
129
+ phaseContext = execSync(`redis-cli -h ${redisHost} -p ${redisPort} get "swarm:${taskId}:phase-context"`, {
127
130
  encoding: 'utf8'
128
131
  }).trim();
129
132
  if (phaseContext === '(nil)') phaseContext = '';
@@ -132,7 +135,7 @@
132
135
  }
133
136
  // Try to read success criteria
134
137
  try {
135
- successCriteria = execSync(`redis-cli get "swarm:${taskId}:success-criteria"`, {
138
+ successCriteria = execSync(`redis-cli -h ${redisHost} -p ${redisPort} get "swarm:${taskId}:success-criteria"`, {
136
139
  encoding: 'utf8'
137
140
  }).trim();
138
141
  if (successCriteria === '(nil)') successCriteria = '';
@@ -146,21 +149,57 @@
146
149
  console.warn(`[cfn-spawn] Could not load epic context from Redis:`, err);
147
150
  }
148
151
  }
149
- // Add environment variables for agent context
150
- const env = {
151
- ...process.env,
152
- AGENT_TYPE: agentType,
153
- TASK_ID: taskId || '',
154
- ITERATION: iteration?.toString() || '1',
155
- CONTEXT: context || '',
156
- MODE: mode || 'cli',
157
- PRIORITY: priority?.toString() || '5',
158
- PARENT_TASK_ID: parentTaskId || '',
159
- // Epic-level context from Redis
160
- EPIC_CONTEXT: epicContext,
161
- PHASE_CONTEXT: phaseContext,
162
- SUCCESS_CRITERIA: successCriteria
163
- };
152
+ // Add environment variables for agent context - WHITELIST ONLY APPROACH
153
+ // SECURITY FIX: Do not use ...process.env spread which exposes ALL variables including secrets
154
+ // Instead, explicitly whitelist safe variables to pass to spawned process
155
+ const safeEnvVars = [
156
+ 'CFN_REDIS_HOST',
157
+ 'CFN_REDIS_PORT',
158
+ 'CFN_REDIS_URL',
159
+ 'CFN_MEMORY_BUDGET',
160
+ 'CFN_API_HOST',
161
+ 'CFN_API_PORT',
162
+ 'CFN_LOG_LEVEL',
163
+ 'CFN_LOG_FORMAT',
164
+ 'CFN_CONTAINER_MODE',
165
+ 'CFN_DOCKER_SOCKET',
166
+ 'CFN_NETWORK_NAME',
167
+ 'CFN_CUSTOM_ROUTING',
168
+ 'CFN_DEFAULT_PROVIDER',
169
+ 'NODE_ENV',
170
+ 'PATH',
171
+ 'HOME'
172
+ ];
173
+ // Build whitelist-only env object
174
+ const env = {};
175
+ // Add whitelisted CFN variables
176
+ for (const key of safeEnvVars){
177
+ const value = process.env[key];
178
+ if (value !== undefined) {
179
+ env[key] = value;
180
+ }
181
+ }
182
+ // Add API key only when explicitly needed (with strict validation)
183
+ if (process.env.ANTHROPIC_API_KEY) {
184
+ // Validate format: should start with "sk-" or "sk-ant-"
185
+ if (process.env.ANTHROPIC_API_KEY.match(/^sk-[a-zA-Z0-9-]+$/)) {
186
+ env.ANTHROPIC_API_KEY = process.env.ANTHROPIC_API_KEY;
187
+ } else {
188
+ console.warn('[cfn-spawn] Warning: ANTHROPIC_API_KEY format invalid, not passing to agent');
189
+ }
190
+ }
191
+ // Add task and execution context variables
192
+ env.AGENT_TYPE = agentType;
193
+ env.TASK_ID = taskId || '';
194
+ env.ITERATION = iteration?.toString() || '1';
195
+ env.CONTEXT = context || '';
196
+ env.MODE = mode || 'cli';
197
+ env.PRIORITY = priority?.toString() || '5';
198
+ env.PARENT_TASK_ID = parentTaskId || '';
199
+ // Epic-level context from Redis (sanitized)
200
+ env.EPIC_CONTEXT = epicContext;
201
+ env.PHASE_CONTEXT = phaseContext;
202
+ env.SUCCESS_CRITERIA = successCriteria;
164
203
  console.log(`[cfn-spawn] Executing: npx ${claudeArgs.join(' ')}`);
165
204
  // Spawn the claude-flow-novice agent process
166
205
  const agentProcess = spawn('npx', claudeArgs, {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/agent-spawn.ts"],"sourcesContent":["#!/usr/bin/env node\r\n/**\r\n * Agent Spawning CLI - Direct agent process spawning\r\n *\r\n * Usage:\r\n * npx cfn-spawn agent <type> [options]\r\n * npx cfn-spawn <type> [options] (agent is implied)\r\n *\r\n * Examples:\r\n * npx cfn-spawn agent researcher --task-id task-123 --iteration 1\r\n * npx cfn-spawn researcher --task-id task-123 --iteration 1\r\n */\r\n\r\nimport { spawn } from 'child_process';\r\nimport { resolve } from 'path';\r\n\r\ninterface AgentSpawnOptions {\r\n agentType: string;\r\n agentId?: string;\r\n taskId?: string;\r\n iteration?: number;\r\n context?: string;\r\n mode?: string;\r\n priority?: number;\r\n parentTaskId?: string;\r\n}\r\n\r\n/**\r\n * Parse command line arguments for agent spawning\r\n */\r\nfunction parseAgentArgs(args: string[]): AgentSpawnOptions | null {\r\n // Handle both \"agent <type>\" and \"<type>\" patterns\r\n let agentType: string;\r\n let optionArgs: string[];\r\n\r\n if (args[0] === 'agent') {\r\n agentType = args[1];\r\n optionArgs = args.slice(2);\r\n } else {\r\n agentType = args[0];\r\n optionArgs = args.slice(1);\r\n }\r\n\r\n if (!agentType) {\r\n console.error('Error: Agent type is required');\r\n console.error('Usage: cfn-spawn agent <type> [options]');\r\n return null;\r\n }\r\n\r\n const options: AgentSpawnOptions = { agentType };\r\n\r\n // Parse optional parameters\r\n for (let i = 0; i < optionArgs.length; i += 2) {\r\n const key = optionArgs[i];\r\n const value = optionArgs[i + 1];\r\n\r\n switch (key) {\r\n case '--agent-id':\r\n options.agentId = value;\r\n break;\r\n case '--task-id':\r\n options.taskId = value;\r\n break;\r\n case '--iteration':\r\n options.iteration = parseInt(value, 10);\r\n break;\r\n case '--context':\r\n options.context = value;\r\n break;\r\n case '--mode':\r\n options.mode = value;\r\n break;\r\n case '--priority':\r\n options.priority = parseInt(value, 10);\r\n break;\r\n case '--parent-task':\r\n case '--parent-task-id':\r\n options.parentTaskId = value;\r\n break;\r\n default:\r\n console.warn(`Unknown option: ${key}`);\r\n }\r\n }\r\n\r\n return options;\r\n}\r\n\r\n/**\r\n * Spawn an agent process using npx claude-flow-novice agent\r\n *\r\n * This is a wrapper/alias for the existing claude-flow-novice agent spawning mechanism\r\n * Provides the cfn-spawn naming pattern while delegating to the working implementation\r\n */\r\nasync function spawnAgent(options: AgentSpawnOptions): Promise<void> {\r\n const { agentType, agentId, taskId, iteration, context, mode, priority, parentTaskId } = options;\r\n\r\n console.log(`[cfn-spawn] Spawning agent: ${agentType}`);\r\n if (agentId) console.log(`[cfn-spawn] Agent ID: ${agentId}`);\r\n if (taskId) console.log(`[cfn-spawn] Task ID: ${taskId}`);\r\n if (iteration) console.log(`[cfn-spawn] Iteration: ${iteration}`);\r\n if (context) console.log(`[cfn-spawn] Context: ${context}`);\r\n if (mode) console.log(`[cfn-spawn] Mode: ${mode}`);\r\n\r\n // Build command arguments for npx claude-flow-novice agent\r\n const claudeArgs = ['claude-flow-novice', 'agent', agentType];\r\n\r\n // Add optional parameters\r\n if (agentId) {\r\n claudeArgs.push('--agent-id', agentId);\r\n }\r\n if (taskId) {\r\n claudeArgs.push('--task-id', taskId);\r\n }\r\n if (iteration) {\r\n claudeArgs.push('--iteration', iteration.toString());\r\n }\r\n if (context) {\r\n claudeArgs.push('--context', context);\r\n }\r\n if (mode) {\r\n claudeArgs.push('--mode', mode);\r\n }\r\n if (priority) {\r\n claudeArgs.push('--priority', priority.toString());\r\n }\r\n if (parentTaskId) {\r\n claudeArgs.push('--parent-task-id', parentTaskId);\r\n }\r\n\r\n // Fetch epic context from Redis if available\r\n let epicContext = '';\r\n let phaseContext = '';\r\n let successCriteria = '';\r\n\r\n if (taskId) {\r\n try {\r\n const { execSync } = await import('child_process');\r\n\r\n // Try to read epic-level context from Redis\r\n try {\r\n epicContext = execSync(`redis-cli get \"swarm:${taskId}:epic-context\"`, { encoding: 'utf8' }).trim();\r\n if (epicContext === '(nil)') epicContext = '';\r\n } catch (e) {\r\n // Redis not available or key doesn't exist\r\n }\r\n\r\n // Try to read phase-specific context\r\n try {\r\n phaseContext = execSync(`redis-cli get \"swarm:${taskId}:phase-context\"`, { encoding: 'utf8' }).trim();\r\n if (phaseContext === '(nil)') phaseContext = '';\r\n } catch (e) {\r\n // Redis not available or key doesn't exist\r\n }\r\n\r\n // Try to read success criteria\r\n try {\r\n successCriteria = execSync(`redis-cli get \"swarm:${taskId}:success-criteria\"`, { encoding: 'utf8' }).trim();\r\n if (successCriteria === '(nil)') successCriteria = '';\r\n } catch (e) {\r\n // Redis not available or key doesn't exist\r\n }\r\n\r\n if (epicContext) {\r\n console.log(`[cfn-spawn] Epic context loaded from Redis`);\r\n }\r\n } catch (err) {\r\n console.warn(`[cfn-spawn] Could not load epic context from Redis:`, err);\r\n }\r\n }\r\n\r\n // Add environment variables for agent context\r\n const env = {\r\n ...process.env,\r\n AGENT_TYPE: agentType,\r\n TASK_ID: taskId || '',\r\n ITERATION: iteration?.toString() || '1',\r\n CONTEXT: context || '',\r\n MODE: mode || 'cli',\r\n PRIORITY: priority?.toString() || '5',\r\n PARENT_TASK_ID: parentTaskId || '',\r\n // Epic-level context from Redis\r\n EPIC_CONTEXT: epicContext,\r\n PHASE_CONTEXT: phaseContext,\r\n SUCCESS_CRITERIA: successCriteria\r\n };\r\n\r\n console.log(`[cfn-spawn] Executing: npx ${claudeArgs.join(' ')}`);\r\n\r\n // Spawn the claude-flow-novice agent process\r\n const agentProcess = spawn('npx', claudeArgs, {\r\n stdio: 'inherit',\r\n env,\r\n cwd: process.cwd()\r\n });\r\n\r\n // Handle process exit\r\n agentProcess.on('exit', (code, signal) => {\r\n if (code === 0) {\r\n console.log(`[cfn-spawn] Agent ${agentType} completed successfully`);\r\n } else {\r\n console.error(`[cfn-spawn] Agent ${agentType} exited with code ${code}, signal ${signal}`);\r\n }\r\n process.exit(code || 0);\r\n });\r\n\r\n // Handle process errors\r\n agentProcess.on('error', (err) => {\r\n console.error(`[cfn-spawn] Failed to spawn agent ${agentType}:`, err.message);\r\n process.exit(1);\r\n });\r\n\r\n // Cleanup on parent exit\r\n process.on('SIGINT', () => {\r\n console.log('\\n[cfn-spawn] Received SIGINT, terminating agent...');\r\n agentProcess.kill('SIGINT');\r\n });\r\n\r\n process.on('SIGTERM', () => {\r\n console.log('\\n[cfn-spawn] Received SIGTERM, terminating agent...');\r\n agentProcess.kill('SIGTERM');\r\n });\r\n}\r\n\r\n/**\r\n * Build task description for the agent\r\n */\r\nfunction buildTaskDescription(\r\n agentType: string,\r\n taskId?: string,\r\n iteration?: number,\r\n context?: string\r\n): string {\r\n let desc = `Execute task as ${agentType} agent`;\r\n\r\n if (taskId) desc += ` for task ${taskId}`;\r\n if (iteration) desc += ` (iteration ${iteration})`;\r\n if (context) desc += `: ${context}`;\r\n\r\n return desc;\r\n}\r\n\r\n/**\r\n * Main CLI entry point\r\n */\r\nexport async function main(args: string[] = process.argv.slice(2)): Promise<void> {\r\n // Show help if requested\r\n if (args.includes('--help') || args.includes('-h')) {\r\n console.log(`\r\ncfn-spawn - Claude Flow Novice Agent Spawner\r\n\r\nUsage:\r\n cfn-spawn agent <type> [options]\r\n cfn-spawn <type> [options] (agent is implied)\r\n\r\nOptions:\r\n --agent-id <id> Explicit agent identifier (overrides auto-generation)\r\n --task-id <id> Task identifier\r\n --iteration <n> Iteration number\r\n --context <text> Context description\r\n --mode <mode> Execution mode (cli, api, hybrid)\r\n --priority <1-10> Task priority\r\n --parent-task-id <id> Parent task identifier\r\n\r\nExamples:\r\n cfn-spawn agent researcher --task-id task-123 --iteration 1\r\n cfn-spawn coder --task-id auth-impl --context \"Implement JWT auth\"\r\n cfn-spawn reviewer --task-id auth-impl --iteration 2 --mode cli\r\n cfn-spawn tester --agent-id tester-1-1 --task-id test-phase --iteration 1\r\n `);\r\n return;\r\n }\r\n\r\n // Parse arguments\r\n const options = parseAgentArgs(args);\r\n if (!options) {\r\n process.exit(1);\r\n }\r\n\r\n // Spawn the agent\r\n await spawnAgent(options);\r\n}\r\n\r\n// Run if called directly\r\n// ES module check - compare import.meta.url with the executed file\r\nconst isMainModule = import.meta.url.endsWith(process.argv[1]?.replace(/\\\\/g, '/') || '');\r\nif (isMainModule) {\r\n main().catch((err) => {\r\n console.error('[cfn-spawn] Fatal error:', err);\r\n process.exit(1);\r\n });\r\n}\r\n"],"names":["spawn","parseAgentArgs","args","agentType","optionArgs","slice","console","error","options","i","length","key","value","agentId","taskId","iteration","parseInt","context","mode","priority","parentTaskId","warn","spawnAgent","log","claudeArgs","push","toString","epicContext","phaseContext","successCriteria","execSync","encoding","trim","e","err","env","process","AGENT_TYPE","TASK_ID","ITERATION","CONTEXT","MODE","PRIORITY","PARENT_TASK_ID","EPIC_CONTEXT","PHASE_CONTEXT","SUCCESS_CRITERIA","join","agentProcess","stdio","cwd","on","code","signal","exit","message","kill","buildTaskDescription","desc","main","argv","includes","isMainModule","url","endsWith","replace","catch"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/cli/agent-spawn.ts"],"sourcesContent":["#!/usr/bin/env node\r\n/**\r\n * Agent Spawning CLI - Direct agent process spawning\r\n *\r\n * Usage:\r\n * npx cfn-spawn agent <type> [options]\r\n * npx cfn-spawn <type> [options] (agent is implied)\r\n *\r\n * Examples:\r\n * npx cfn-spawn agent researcher --task-id task-123 --iteration 1\r\n * npx cfn-spawn researcher --task-id task-123 --iteration 1\r\n */\r\n\r\nimport { spawn } from 'child_process';\r\nimport { resolve } from 'path';\r\n\r\ninterface AgentSpawnOptions {\r\n agentType: string;\r\n agentId?: string;\r\n taskId?: string;\r\n iteration?: number;\r\n context?: string;\r\n mode?: string;\r\n priority?: number;\r\n parentTaskId?: string;\r\n}\r\n\r\n/**\r\n * Parse command line arguments for agent spawning\r\n */\r\nfunction parseAgentArgs(args: string[]): AgentSpawnOptions | null {\r\n // Handle both \"agent <type>\" and \"<type>\" patterns\r\n let agentType: string;\r\n let optionArgs: string[];\r\n\r\n if (args[0] === 'agent') {\r\n agentType = args[1];\r\n optionArgs = args.slice(2);\r\n } else {\r\n agentType = args[0];\r\n optionArgs = args.slice(1);\r\n }\r\n\r\n if (!agentType) {\r\n console.error('Error: Agent type is required');\r\n console.error('Usage: cfn-spawn agent <type> [options]');\r\n return null;\r\n }\r\n\r\n const options: AgentSpawnOptions = { agentType };\r\n\r\n // Parse optional parameters\r\n for (let i = 0; i < optionArgs.length; i += 2) {\r\n const key = optionArgs[i];\r\n const value = optionArgs[i + 1];\r\n\r\n switch (key) {\r\n case '--agent-id':\r\n options.agentId = value;\r\n break;\r\n case '--task-id':\r\n options.taskId = value;\r\n break;\r\n case '--iteration':\r\n options.iteration = parseInt(value, 10);\r\n break;\r\n case '--context':\r\n options.context = value;\r\n break;\r\n case '--mode':\r\n options.mode = value;\r\n break;\r\n case '--priority':\r\n options.priority = parseInt(value, 10);\r\n break;\r\n case '--parent-task':\r\n case '--parent-task-id':\r\n options.parentTaskId = value;\r\n break;\r\n default:\r\n console.warn(`Unknown option: ${key}`);\r\n }\r\n }\r\n\r\n return options;\r\n}\r\n\r\n/**\r\n * Spawn an agent process using npx claude-flow-novice agent\r\n *\r\n * This is a wrapper/alias for the existing claude-flow-novice agent spawning mechanism\r\n * Provides the cfn-spawn naming pattern while delegating to the working implementation\r\n */\r\nasync function spawnAgent(options: AgentSpawnOptions): Promise<void> {\r\n const { agentType, agentId, taskId, iteration, context, mode, priority, parentTaskId } = options;\r\n\r\n console.log(`[cfn-spawn] Spawning agent: ${agentType}`);\r\n if (agentId) console.log(`[cfn-spawn] Agent ID: ${agentId}`);\r\n if (taskId) console.log(`[cfn-spawn] Task ID: ${taskId}`);\r\n if (iteration) console.log(`[cfn-spawn] Iteration: ${iteration}`);\r\n if (context) console.log(`[cfn-spawn] Context: ${context}`);\r\n if (mode) console.log(`[cfn-spawn] Mode: ${mode}`);\r\n\r\n // Build command arguments for npx claude-flow-novice agent\r\n const claudeArgs = ['claude-flow-novice', 'agent', agentType];\r\n\r\n // Add optional parameters\r\n if (agentId) {\r\n claudeArgs.push('--agent-id', agentId);\r\n }\r\n if (taskId) {\r\n claudeArgs.push('--task-id', taskId);\r\n }\r\n if (iteration) {\r\n claudeArgs.push('--iteration', iteration.toString());\r\n }\r\n if (context) {\r\n claudeArgs.push('--context', context);\r\n }\r\n if (mode) {\r\n claudeArgs.push('--mode', mode);\r\n }\r\n if (priority) {\r\n claudeArgs.push('--priority', priority.toString());\r\n }\r\n if (parentTaskId) {\r\n claudeArgs.push('--parent-task-id', parentTaskId);\r\n }\r\n\r\n // Fetch epic context from Redis if available\r\n let epicContext = '';\r\n let phaseContext = '';\r\n let successCriteria = '';\r\n\r\n if (taskId) {\r\n try {\r\n const { execSync } = await import('child_process');\r\n\r\n // Bug #6 Fix: Read Redis connection parameters from process.env and interpolate in TypeScript\r\n const redisHost = process.env.CFN_REDIS_HOST || 'cfn-redis';\r\n const redisPort = process.env.CFN_REDIS_PORT || '6379';\r\n\r\n // Try to read epic-level context from Redis\r\n try {\r\n epicContext = execSync(`redis-cli -h ${redisHost} -p ${redisPort} get \"swarm:${taskId}:epic-context\"`, { encoding: 'utf8' }).trim();\r\n if (epicContext === '(nil)') epicContext = '';\r\n } catch (e) {\r\n // Redis not available or key doesn't exist\r\n }\r\n\r\n // Try to read phase-specific context\r\n try {\r\n phaseContext = execSync(`redis-cli -h ${redisHost} -p ${redisPort} get \"swarm:${taskId}:phase-context\"`, { encoding: 'utf8' }).trim();\r\n if (phaseContext === '(nil)') phaseContext = '';\r\n } catch (e) {\r\n // Redis not available or key doesn't exist\r\n }\r\n\r\n // Try to read success criteria\r\n try {\r\n successCriteria = execSync(`redis-cli -h ${redisHost} -p ${redisPort} get \"swarm:${taskId}:success-criteria\"`, { encoding: 'utf8' }).trim();\r\n if (successCriteria === '(nil)') successCriteria = '';\r\n } catch (e) {\r\n // Redis not available or key doesn't exist\r\n }\r\n\r\n if (epicContext) {\r\n console.log(`[cfn-spawn] Epic context loaded from Redis`);\r\n }\r\n } catch (err) {\r\n console.warn(`[cfn-spawn] Could not load epic context from Redis:`, err);\r\n }\r\n }\r\n\r\n // Add environment variables for agent context - WHITELIST ONLY APPROACH\r\n // SECURITY FIX: Do not use ...process.env spread which exposes ALL variables including secrets\r\n // Instead, explicitly whitelist safe variables to pass to spawned process\r\n const safeEnvVars = [\r\n 'CFN_REDIS_HOST',\r\n 'CFN_REDIS_PORT',\r\n 'CFN_REDIS_URL',\r\n 'CFN_MEMORY_BUDGET',\r\n 'CFN_API_HOST',\r\n 'CFN_API_PORT',\r\n 'CFN_LOG_LEVEL',\r\n 'CFN_LOG_FORMAT',\r\n 'CFN_CONTAINER_MODE',\r\n 'CFN_DOCKER_SOCKET',\r\n 'CFN_NETWORK_NAME',\r\n 'CFN_CUSTOM_ROUTING',\r\n 'CFN_DEFAULT_PROVIDER',\r\n 'NODE_ENV',\r\n 'PATH',\r\n 'HOME'\r\n ];\r\n\r\n // Build whitelist-only env object\r\n const env: Record<string, string> = {};\r\n\r\n // Add whitelisted CFN variables\r\n for (const key of safeEnvVars) {\r\n const value = process.env[key];\r\n if (value !== undefined) {\r\n env[key] = value;\r\n }\r\n }\r\n\r\n // Add API key only when explicitly needed (with strict validation)\r\n if (process.env.ANTHROPIC_API_KEY) {\r\n // Validate format: should start with \"sk-\" or \"sk-ant-\"\r\n if (process.env.ANTHROPIC_API_KEY.match(/^sk-[a-zA-Z0-9-]+$/)) {\r\n env.ANTHROPIC_API_KEY = process.env.ANTHROPIC_API_KEY;\r\n } else {\r\n console.warn('[cfn-spawn] Warning: ANTHROPIC_API_KEY format invalid, not passing to agent');\r\n }\r\n }\r\n\r\n // Add task and execution context variables\r\n env.AGENT_TYPE = agentType;\r\n env.TASK_ID = taskId || '';\r\n env.ITERATION = iteration?.toString() || '1';\r\n env.CONTEXT = context || '';\r\n env.MODE = mode || 'cli';\r\n env.PRIORITY = priority?.toString() || '5';\r\n env.PARENT_TASK_ID = parentTaskId || '';\r\n\r\n // Epic-level context from Redis (sanitized)\r\n env.EPIC_CONTEXT = epicContext;\r\n env.PHASE_CONTEXT = phaseContext;\r\n env.SUCCESS_CRITERIA = successCriteria;\r\n\r\n console.log(`[cfn-spawn] Executing: npx ${claudeArgs.join(' ')}`);\r\n\r\n // Spawn the claude-flow-novice agent process\r\n const agentProcess = spawn('npx', claudeArgs, {\r\n stdio: 'inherit',\r\n env,\r\n cwd: process.cwd()\r\n });\r\n\r\n // Handle process exit\r\n agentProcess.on('exit', (code, signal) => {\r\n if (code === 0) {\r\n console.log(`[cfn-spawn] Agent ${agentType} completed successfully`);\r\n } else {\r\n console.error(`[cfn-spawn] Agent ${agentType} exited with code ${code}, signal ${signal}`);\r\n }\r\n process.exit(code || 0);\r\n });\r\n\r\n // Handle process errors\r\n agentProcess.on('error', (err) => {\r\n console.error(`[cfn-spawn] Failed to spawn agent ${agentType}:`, err.message);\r\n process.exit(1);\r\n });\r\n\r\n // Cleanup on parent exit\r\n process.on('SIGINT', () => {\r\n console.log('\\n[cfn-spawn] Received SIGINT, terminating agent...');\r\n agentProcess.kill('SIGINT');\r\n });\r\n\r\n process.on('SIGTERM', () => {\r\n console.log('\\n[cfn-spawn] Received SIGTERM, terminating agent...');\r\n agentProcess.kill('SIGTERM');\r\n });\r\n}\r\n\r\n/**\r\n * Build task description for the agent\r\n */\r\nfunction buildTaskDescription(\r\n agentType: string,\r\n taskId?: string,\r\n iteration?: number,\r\n context?: string\r\n): string {\r\n let desc = `Execute task as ${agentType} agent`;\r\n\r\n if (taskId) desc += ` for task ${taskId}`;\r\n if (iteration) desc += ` (iteration ${iteration})`;\r\n if (context) desc += `: ${context}`;\r\n\r\n return desc;\r\n}\r\n\r\n/**\r\n * Main CLI entry point\r\n */\r\nexport async function main(args: string[] = process.argv.slice(2)): Promise<void> {\r\n // Show help if requested\r\n if (args.includes('--help') || args.includes('-h')) {\r\n console.log(`\r\ncfn-spawn - Claude Flow Novice Agent Spawner\r\n\r\nUsage:\r\n cfn-spawn agent <type> [options]\r\n cfn-spawn <type> [options] (agent is implied)\r\n\r\nOptions:\r\n --agent-id <id> Explicit agent identifier (overrides auto-generation)\r\n --task-id <id> Task identifier\r\n --iteration <n> Iteration number\r\n --context <text> Context description\r\n --mode <mode> Execution mode (cli, api, hybrid)\r\n --priority <1-10> Task priority\r\n --parent-task-id <id> Parent task identifier\r\n\r\nExamples:\r\n cfn-spawn agent researcher --task-id task-123 --iteration 1\r\n cfn-spawn coder --task-id auth-impl --context \"Implement JWT auth\"\r\n cfn-spawn reviewer --task-id auth-impl --iteration 2 --mode cli\r\n cfn-spawn tester --agent-id tester-1-1 --task-id test-phase --iteration 1\r\n `);\r\n return;\r\n }\r\n\r\n // Parse arguments\r\n const options = parseAgentArgs(args);\r\n if (!options) {\r\n process.exit(1);\r\n }\r\n\r\n // Spawn the agent\r\n await spawnAgent(options);\r\n}\r\n\r\n// Run if called directly\r\n// ES module check - compare import.meta.url with the executed file\r\nconst isMainModule = import.meta.url.endsWith(process.argv[1]?.replace(/\\\\/g, '/') || '');\r\nif (isMainModule) {\r\n main().catch((err) => {\r\n console.error('[cfn-spawn] Fatal error:', err);\r\n process.exit(1);\r\n });\r\n}\r\n"],"names":["spawn","parseAgentArgs","args","agentType","optionArgs","slice","console","error","options","i","length","key","value","agentId","taskId","iteration","parseInt","context","mode","priority","parentTaskId","warn","spawnAgent","log","claudeArgs","push","toString","epicContext","phaseContext","successCriteria","execSync","redisHost","process","env","CFN_REDIS_HOST","redisPort","CFN_REDIS_PORT","encoding","trim","e","err","safeEnvVars","undefined","ANTHROPIC_API_KEY","match","AGENT_TYPE","TASK_ID","ITERATION","CONTEXT","MODE","PRIORITY","PARENT_TASK_ID","EPIC_CONTEXT","PHASE_CONTEXT","SUCCESS_CRITERIA","join","agentProcess","stdio","cwd","on","code","signal","exit","message","kill","buildTaskDescription","desc","main","argv","includes","isMainModule","url","endsWith","replace","catch"],"mappings":"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"}
@@ -8,7 +8,11 @@ const fs = require('fs').promises;
8
8
  const path = require('path');
9
9
  let AgentTokenManager = class AgentTokenManager {
10
10
  constructor(options = {}){
11
- this.redisUrl = options.redisUrl || process.env.MCP_REDIS_URL || 'redis://localhost:6379';
11
+ // Support CFN standard variables with fallback to legacy MCP_REDIS_URL
12
+ const redisHost = process.env.CFN_REDIS_HOST || 'cfn-redis';
13
+ const redisPort = process.env.CFN_REDIS_PORT || '6379';
14
+ const defaultUrl = `redis://${redisHost}:${redisPort}`;
15
+ this.redisUrl = options.redisUrl || process.env.CFN_REDIS_URL || process.env.MCP_REDIS_URL || defaultUrl;
12
16
  this.redis = null;
13
17
  this.agentConfigPath = options.agentConfigPath || './config/agent-whitelist.json';
14
18
  this.defaultExpiry = options.defaultExpiry || '24h';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/agent-token-manager.js"],"sourcesContent":["#!/usr/bin/env node\r\n\r\n/**\r\n * Agent Token Management CLI\r\n * Generate, register, and manage agent tokens for MCP authentication\r\n */\r\n\r\nconst crypto = require('crypto');\r\nconst Redis = require('redis');\r\nconst fs = require('fs').promises;\r\nconst path = require('path');\r\n\r\nclass AgentTokenManager {\r\n constructor(options = {}) {\r\n this.redisUrl = options.redisUrl || process.env.MCP_REDIS_URL || 'redis://localhost:6379';\r\n this.redis = null;\r\n this.agentConfigPath = options.agentConfigPath || './config/agent-whitelist.json';\r\n this.defaultExpiry = options.defaultExpiry || '24h';\r\n }\r\n\r\n async initialize() {\r\n try {\r\n this.redis = Redis.createClient({ url: this.redisUrl });\r\n await this.redis.connect();\r\n console.log('Connected to Redis for token management');\r\n } catch (error) {\r\n console.error('Failed to connect to Redis:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n async loadAgentConfig() {\r\n try {\r\n const configPath = path.resolve(this.agentConfigPath);\r\n const config = await fs.readFile(configPath, 'utf8');\r\n return JSON.parse(config);\r\n } catch (error) {\r\n console.error('Failed to load agent config:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n generateToken() {\r\n return crypto.randomBytes(32).toString('hex');\r\n }\r\n\r\n parseExpiry(expiry) {\r\n if (typeof expiry === 'number') {\r\n return expiry;\r\n }\r\n\r\n const match = expiry.match(/^(\\d+)([smhd])$/);\r\n if (!match) {\r\n return 86400; // Default to 24 hours\r\n }\r\n\r\n const value = parseInt(match[1]);\r\n const unit = match[2];\r\n const multipliers = { s: 1, m: 60, h: 3600, d: 86400 };\r\n\r\n return value * (multipliers[unit] || 86400);\r\n }\r\n\r\n async registerAgentToken(agentType, options = {}) {\r\n try {\r\n const config = await this.loadAgentConfig();\r\n const agentConfig = config.agents.find(a => a.type === agentType);\r\n\r\n if (!agentConfig) {\r\n throw new Error(`Unknown agent type: ${agentType}. Available types: ${config.agents.map(a => a.type).join(', ')}`);\r\n }\r\n\r\n const token = this.generateToken();\r\n const expiresIn = options.expiresIn || this.defaultExpiry;\r\n const expiresAt = Date.now() + (this.parseExpiry(expiresIn) * 1000);\r\n\r\n const tokenData = {\r\n token,\r\n agentType,\r\n displayName: agentConfig.displayName,\r\n skills: agentConfig.skills,\r\n allowedMcpServers: agentConfig.allowedMcpServers,\r\n resourceLimits: agentConfig.resourceLimits,\r\n expiresAt,\r\n createdAt: Date.now(),\r\n createdBy: options.createdBy || 'cli',\r\n description: options.description || `Token for ${agentConfig.displayName}`\r\n };\r\n\r\n // Store in Redis\r\n const key = `mcp:agent:${agentType}:${token}`;\r\n const value = JSON.stringify(tokenData);\r\n const ttlSeconds = this.parseExpiry(expiresIn);\r\n\r\n await this.redis.setEx(key, ttlSeconds, value);\r\n\r\n console.log(`✅ Token registered successfully!`);\r\n console.log(` Agent Type: ${agentConfig.displayName} (${agentType})`);\r\n console.log(` Token: ${token}`);\r\n console.log(` Skills: ${agentConfig.skills.join(', ')}`);\r\n console.log(` Allowed MCP Servers: ${agentConfig.allowedMcpServers.join(', ')}`);\r\n console.log(` Expires: ${new Date(expiresAt).toISOString()}`);\r\n console.log(` Memory Limit: ${agentConfig.resourceLimits.maxMemoryMB}MB`);\r\n console.log(` Rate Limit: ${agentConfig.resourceLimits.maxRequestsPerMinute}/min`);\r\n\r\n return tokenData;\r\n\r\n } catch (error) {\r\n console.error('❌ Failed to register token:', error.message);\r\n throw error;\r\n }\r\n }\r\n\r\n async listActiveTokens(agentType = null) {\r\n try {\r\n const pattern = agentType ? `mcp:agent:${agentType}:*` : 'mcp:agent:*';\r\n const keys = await this.redis.keys(pattern);\r\n const tokens = [];\r\n\r\n for (const key of keys) {\r\n const value = await this.redis.get(key);\r\n if (value) {\r\n const tokenData = JSON.parse(value);\r\n tokens.push({\r\n ...tokenData,\r\n key,\r\n status: tokenData.expiresAt > Date.now() ? 'active' : 'expired'\r\n });\r\n }\r\n }\r\n\r\n if (tokens.length === 0) {\r\n console.log('No active tokens found');\r\n return [];\r\n }\r\n\r\n console.log(`\\nActive Tokens (${tokens.length}):\\n`);\r\n console.log('Agent Type | Token | Expires At | Status');\r\n console.log('-------------------|------------------------------------|------------------------------|--------');\r\n\r\n for (const token of tokens) {\r\n const expiresAt = new Date(token.expiresAt).toISOString();\r\n const tokenShort = token.token.substring(0, 32);\r\n console.log(`${token.agentType.padEnd(17)} | ${tokenShort} | ${expiresAt} | ${token.status}`);\r\n }\r\n\r\n return tokens;\r\n\r\n } catch (error) {\r\n console.error('❌ Failed to list tokens:', error.message);\r\n throw error;\r\n }\r\n }\r\n\r\n async revokeToken(agentType, token) {\r\n try {\r\n const key = `mcp:agent:${agentType}:${token}`;\r\n const exists = await this.redis.exists(key);\r\n\r\n if (!exists) {\r\n throw new Error(`Token not found for agent ${agentType}`);\r\n }\r\n\r\n await this.redis.del(key);\r\n console.log(`✅ Token revoked successfully for agent ${agentType}`);\r\n console.log(` Token: ${token}`);\r\n\r\n } catch (error) {\r\n console.error('❌ Failed to revoke token:', error.message);\r\n throw error;\r\n }\r\n }\r\n\r\n async revokeAllTokens(agentType = null) {\r\n try {\r\n const pattern = agentType ? `mcp:agent:${agentType}:*` : 'mcp:agent:*';\r\n const keys = await this.redis.keys(pattern);\r\n\r\n if (keys.length === 0) {\r\n console.log('No tokens found to revoke');\r\n return 0;\r\n }\r\n\r\n await this.redis.del(keys);\r\n console.log(`✅ Revoked ${keys.length} tokens${agentType ? ` for agent ${agentType}` : ''}`);\r\n return keys.length;\r\n\r\n } catch (error) {\r\n console.error('❌ Failed to revoke tokens:', error.message);\r\n throw error;\r\n }\r\n }\r\n\r\n async validateToken(agentType, token) {\r\n try {\r\n const key = `mcp:agent:${agentType}:${token}`;\r\n const value = await this.redis.get(key);\r\n\r\n if (!value) {\r\n return { valid: false, reason: 'Token not found' };\r\n }\r\n\r\n const tokenData = JSON.parse(value);\r\n\r\n if (Date.now() > tokenData.expiresAt) {\r\n await this.redis.del(key);\r\n return { valid: false, reason: 'Token expired' };\r\n }\r\n\r\n return {\r\n valid: true,\r\n tokenData\r\n };\r\n\r\n } catch (error) {\r\n return { valid: false, reason: error.message };\r\n }\r\n }\r\n\r\n async getAgentInfo(agentType) {\r\n try {\r\n const config = await this.loadAgentConfig();\r\n const agentConfig = config.agents.find(a => a.type === agentType);\r\n\r\n if (!agentConfig) {\r\n throw new Error(`Unknown agent type: ${agentType}`);\r\n }\r\n\r\n console.log(`\\nAgent Information: ${agentConfig.displayName}`);\r\n console.log('='.repeat(50));\r\n console.log(`Type: ${agentConfig.type}`);\r\n console.log(`Skills: ${agentConfig.skills.join(', ')}`);\r\n console.log(`Allowed MCP Servers: ${agentConfig.allowedMcpServers.join(', ')}`);\r\n console.log(`Memory Limit: ${agentConfig.resourceLimits.maxMemoryMB}MB`);\r\n console.log(`Rate Limit: ${agentConfig.resourceLimits.maxRequestsPerMinute}/min`);\r\n console.log(`Max Concurrent: ${agentConfig.resourceLimits.maxConcurrentRequests}`);\r\n console.log(`Description: ${agentConfig.description}`);\r\n\r\n return agentConfig;\r\n\r\n } catch (error) {\r\n console.error('❌ Failed to get agent info:', error.message);\r\n throw error;\r\n }\r\n }\r\n\r\n async listAgentTypes() {\r\n try {\r\n const config = await this.loadAgentConfig();\r\n\r\n console.log(`\\nAvailable Agent Types (${config.agents.length}):\\n`);\r\n console.log('Agent Type | Display Name | Skills Count');\r\n console.log('------------------------|--------------------------------|-------------');\r\n\r\n for (const agent of config.agents) {\r\n const type = agent.type.padEnd(22);\r\n const name = agent.displayName.padEnd(32);\r\n const skills = agent.skills.length;\r\n console.log(`${type} | ${name} | ${skills}`);\r\n }\r\n\r\n return config.agents.map(a => a.type);\r\n\r\n } catch (error) {\r\n console.error('❌ Failed to list agent types:', error.message);\r\n throw error;\r\n }\r\n }\r\n\r\n async shutdown() {\r\n if (this.redis) {\r\n await this.redis.quit();\r\n }\r\n }\r\n}\r\n\r\n// CLI interface\r\nasync function main() {\r\n const args = process.argv.slice(2);\r\n const command = args[0];\r\n\r\n if (!command) {\r\n console.log(`\r\nAgent Token Management CLI\r\n\r\nUsage: node agent-token-manager.js <command> [options]\r\n\r\nCommands:\r\n register <agent-type> [options] Register a new token for an agent\r\n list [agent-type] List active tokens\r\n revoke <agent-type> <token> Revoke a specific token\r\n revoke-all [agent-type] Revoke all tokens (optionally for specific agent)\r\n validate <agent-type> <token> Validate a token\r\n info <agent-type> Show agent information\r\n types List available agent types\r\n\r\nOptions for 'register' command:\r\n --expires-in <duration> Token expiry (e.g., 1h, 30m, 7d) [default: 24h]\r\n --description <text> Token description\r\n --created-by <identifier> Creator identifier\r\n\r\nExamples:\r\n # Register token for frontend engineer\r\n node agent-token-manager.js register react-frontend-engineer\r\n\r\n # Register token with custom expiry\r\n node agent-token-manager.js register backend-developer --expires-in 2h\r\n\r\n # List all active tokens\r\n node agent-token-manager.js list\r\n\r\n # List tokens for specific agent\r\n node agent-token-manager.js list react-frontend-engineer\r\n\r\n # Revoke a specific token\r\n node agent-token-manager.js revoke react-frontend-engineer abc123...\r\n\r\n # Get agent information\r\n node agent-token-manager.js info security-specialist\r\n`);\r\n process.exit(0);\r\n }\r\n\r\n const tokenManager = new AgentTokenManager();\r\n\r\n try {\r\n await tokenManager.initialize();\r\n\r\n switch (command) {\r\n case 'register': {\r\n const agentType = args[1];\r\n if (!agentType) {\r\n throw new Error('Agent type is required for register command');\r\n }\r\n\r\n const options = {};\r\n for (let i = 2; i < args.length; i++) {\r\n if (args[i] === '--expires-in') {\r\n options.expiresIn = args[++i];\r\n } else if (args[i] === '--description') {\r\n options.description = args[++i];\r\n } else if (args[i] === '--created-by') {\r\n options.createdBy = args[++i];\r\n }\r\n }\r\n\r\n await tokenManager.registerAgentToken(agentType, options);\r\n break;\r\n }\r\n\r\n case 'list': {\r\n const agentType = args[1];\r\n await tokenManager.listActiveTokens(agentType);\r\n break;\r\n }\r\n\r\n case 'revoke': {\r\n const agentType = args[1];\r\n const token = args[2];\r\n if (!agentType || !token) {\r\n throw new Error('Agent type and token are required for revoke command');\r\n }\r\n await tokenManager.revokeToken(agentType, token);\r\n break;\r\n }\r\n\r\n case 'revoke-all': {\r\n const agentType = args[1];\r\n const count = await tokenManager.revokeAllTokens(agentType);\r\n console.log(`Revoked ${count} tokens`);\r\n break;\r\n }\r\n\r\n case 'validate': {\r\n const agentType = args[1];\r\n const token = args[2];\r\n if (!agentType || !token) {\r\n throw new Error('Agent type and token are required for validate command');\r\n }\r\n\r\n const result = await tokenManager.validateToken(agentType, token);\r\n if (result.valid) {\r\n console.log('✅ Token is valid');\r\n console.log(` Agent Type: ${result.tokenData.agentType}`);\r\n console.log(` Skills: ${result.tokenData.skills.join(', ')}`);\r\n console.log(` Expires: ${new Date(result.tokenData.expiresAt).toISOString()}`);\r\n } else {\r\n console.log('❌ Token is invalid');\r\n console.log(` Reason: ${result.reason}`);\r\n }\r\n break;\r\n }\r\n\r\n case 'info': {\r\n const agentType = args[1];\r\n if (!agentType) {\r\n throw new Error('Agent type is required for info command');\r\n }\r\n await tokenManager.getAgentInfo(agentType);\r\n break;\r\n }\r\n\r\n case 'types': {\r\n await tokenManager.listAgentTypes();\r\n break;\r\n }\r\n\r\n default:\r\n throw new Error(`Unknown command: ${command}`);\r\n }\r\n\r\n } catch (error) {\r\n console.error('❌ Error:', error.message);\r\n process.exit(1);\r\n } finally {\r\n await tokenManager.shutdown();\r\n }\r\n}\r\n\r\nif (require.main === module) {\r\n main().catch(error => {\r\n console.error('Fatal error:', error);\r\n process.exit(1);\r\n });\r\n}\r\n\r\nmodule.exports = AgentTokenManager;"],"names":["crypto","require","Redis","fs","promises","path","AgentTokenManager","options","redisUrl","process","env","MCP_REDIS_URL","redis","agentConfigPath","defaultExpiry","initialize","createClient","url","connect","console","log","error","loadAgentConfig","configPath","resolve","config","readFile","JSON","parse","generateToken","randomBytes","toString","parseExpiry","expiry","match","value","parseInt","unit","multipliers","s","m","h","d","registerAgentToken","agentType","agentConfig","agents","find","a","type","Error","map","join","token","expiresIn","expiresAt","Date","now","tokenData","displayName","skills","allowedMcpServers","resourceLimits","createdAt","createdBy","description","key","stringify","ttlSeconds","setEx","toISOString","maxMemoryMB","maxRequestsPerMinute","message","listActiveTokens","pattern","keys","tokens","get","push","status","length","tokenShort","substring","padEnd","revokeToken","exists","del","revokeAllTokens","validateToken","valid","reason","getAgentInfo","repeat","maxConcurrentRequests","listAgentTypes","agent","name","shutdown","quit","main","args","argv","slice","command","exit","tokenManager","i","count","result","module","catch","exports"],"mappings":";AAEA;;;CAGC,GAED,MAAMA,SAASC,QAAQ;AACvB,MAAMC,QAAQD,QAAQ;AACtB,MAAME,KAAKF,QAAQ,MAAMG,QAAQ;AACjC,MAAMC,OAAOJ,QAAQ;AAErB,IAAA,AAAMK,oBAAN,MAAMA;IACJ,YAAYC,UAAU,CAAC,CAAC,CAAE;QACxB,IAAI,CAACC,QAAQ,GAAGD,QAAQC,QAAQ,IAAIC,QAAQC,GAAG,CAACC,aAAa,IAAI;QACjE,IAAI,CAACC,KAAK,GAAG;QACb,IAAI,CAACC,eAAe,GAAGN,QAAQM,eAAe,IAAI;QAClD,IAAI,CAACC,aAAa,GAAGP,QAAQO,aAAa,IAAI;IAChD;IAEA,MAAMC,aAAa;QACjB,IAAI;YACF,IAAI,CAACH,KAAK,GAAGV,MAAMc,YAAY,CAAC;gBAAEC,KAAK,IAAI,CAACT,QAAQ;YAAC;YACrD,MAAM,IAAI,CAACI,KAAK,CAACM,OAAO;YACxBC,QAAQC,GAAG,CAAC;QACd,EAAE,OAAOC,OAAO;YACdF,QAAQE,KAAK,CAAC,+BAA+BA;YAC7C,MAAMA;QACR;IACF;IAEA,MAAMC,kBAAkB;QACtB,IAAI;YACF,MAAMC,aAAalB,KAAKmB,OAAO,CAAC,IAAI,CAACX,eAAe;YACpD,MAAMY,SAAS,MAAMtB,GAAGuB,QAAQ,CAACH,YAAY;YAC7C,OAAOI,KAAKC,KAAK,CAACH;QACpB,EAAE,OAAOJ,OAAO;YACdF,QAAQE,KAAK,CAAC,gCAAgCA;YAC9C,MAAMA;QACR;IACF;IAEAQ,gBAAgB;QACd,OAAO7B,OAAO8B,WAAW,CAAC,IAAIC,QAAQ,CAAC;IACzC;IAEAC,YAAYC,MAAM,EAAE;QAClB,IAAI,OAAOA,WAAW,UAAU;YAC9B,OAAOA;QACT;QAEA,MAAMC,QAAQD,OAAOC,KAAK,CAAC;QAC3B,IAAI,CAACA,OAAO;YACV,OAAO,OAAO,sBAAsB;QACtC;QAEA,MAAMC,QAAQC,SAASF,KAAK,CAAC,EAAE;QAC/B,MAAMG,OAAOH,KAAK,CAAC,EAAE;QACrB,MAAMI,cAAc;YAAEC,GAAG;YAAGC,GAAG;YAAIC,GAAG;YAAMC,GAAG;QAAM;QAErD,OAAOP,QAASG,CAAAA,WAAW,CAACD,KAAK,IAAI,KAAI;IAC3C;IAEA,MAAMM,mBAAmBC,SAAS,EAAErC,UAAU,CAAC,CAAC,EAAE;QAChD,IAAI;YACF,MAAMkB,SAAS,MAAM,IAAI,CAACH,eAAe;YACzC,MAAMuB,cAAcpB,OAAOqB,MAAM,CAACC,IAAI,CAACC,CAAAA,IAAKA,EAAEC,IAAI,KAAKL;YAEvD,IAAI,CAACC,aAAa;gBAChB,MAAM,IAAIK,MAAM,CAAC,oBAAoB,EAAEN,UAAU,mBAAmB,EAAEnB,OAAOqB,MAAM,CAACK,GAAG,CAACH,CAAAA,IAAKA,EAAEC,IAAI,EAAEG,IAAI,CAAC,OAAO;YACnH;YAEA,MAAMC,QAAQ,IAAI,CAACxB,aAAa;YAChC,MAAMyB,YAAY/C,QAAQ+C,SAAS,IAAI,IAAI,CAACxC,aAAa;YACzD,MAAMyC,YAAYC,KAAKC,GAAG,KAAM,IAAI,CAACzB,WAAW,CAACsB,aAAa;YAE9D,MAAMI,YAAY;gBAChBL;gBACAT;gBACAe,aAAad,YAAYc,WAAW;gBACpCC,QAAQf,YAAYe,MAAM;gBAC1BC,mBAAmBhB,YAAYgB,iBAAiB;gBAChDC,gBAAgBjB,YAAYiB,cAAc;gBAC1CP;gBACAQ,WAAWP,KAAKC,GAAG;gBACnBO,WAAWzD,QAAQyD,SAAS,IAAI;gBAChCC,aAAa1D,QAAQ0D,WAAW,IAAI,CAAC,UAAU,EAAEpB,YAAYc,WAAW,EAAE;YAC5E;YAEA,iBAAiB;YACjB,MAAMO,MAAM,CAAC,UAAU,EAAEtB,UAAU,CAAC,EAAES,OAAO;YAC7C,MAAMlB,QAAQR,KAAKwC,SAAS,CAACT;YAC7B,MAAMU,aAAa,IAAI,CAACpC,WAAW,CAACsB;YAEpC,MAAM,IAAI,CAAC1C,KAAK,CAACyD,KAAK,CAACH,KAAKE,YAAYjC;YAExChB,QAAQC,GAAG,CAAC,CAAC,gCAAgC,CAAC;YAC9CD,QAAQC,GAAG,CAAC,CAAC,eAAe,EAAEyB,YAAYc,WAAW,CAAC,EAAE,EAAEf,UAAU,CAAC,CAAC;YACtEzB,QAAQC,GAAG,CAAC,CAAC,UAAU,EAAEiC,OAAO;YAChClC,QAAQC,GAAG,CAAC,CAAC,WAAW,EAAEyB,YAAYe,MAAM,CAACR,IAAI,CAAC,OAAO;YACzDjC,QAAQC,GAAG,CAAC,CAAC,wBAAwB,EAAEyB,YAAYgB,iBAAiB,CAACT,IAAI,CAAC,OAAO;YACjFjC,QAAQC,GAAG,CAAC,CAAC,YAAY,EAAE,IAAIoC,KAAKD,WAAWe,WAAW,IAAI;YAC9DnD,QAAQC,GAAG,CAAC,CAAC,iBAAiB,EAAEyB,YAAYiB,cAAc,CAACS,WAAW,CAAC,EAAE,CAAC;YAC1EpD,QAAQC,GAAG,CAAC,CAAC,eAAe,EAAEyB,YAAYiB,cAAc,CAACU,oBAAoB,CAAC,IAAI,CAAC;YAEnF,OAAOd;QAET,EAAE,OAAOrC,OAAO;YACdF,QAAQE,KAAK,CAAC,+BAA+BA,MAAMoD,OAAO;YAC1D,MAAMpD;QACR;IACF;IAEA,MAAMqD,iBAAiB9B,YAAY,IAAI,EAAE;QACvC,IAAI;YACF,MAAM+B,UAAU/B,YAAY,CAAC,UAAU,EAAEA,UAAU,EAAE,CAAC,GAAG;YACzD,MAAMgC,OAAO,MAAM,IAAI,CAAChE,KAAK,CAACgE,IAAI,CAACD;YACnC,MAAME,SAAS,EAAE;YAEjB,KAAK,MAAMX,OAAOU,KAAM;gBACtB,MAAMzC,QAAQ,MAAM,IAAI,CAACvB,KAAK,CAACkE,GAAG,CAACZ;gBACnC,IAAI/B,OAAO;oBACT,MAAMuB,YAAY/B,KAAKC,KAAK,CAACO;oBAC7B0C,OAAOE,IAAI,CAAC;wBACV,GAAGrB,SAAS;wBACZQ;wBACAc,QAAQtB,UAAUH,SAAS,GAAGC,KAAKC,GAAG,KAAK,WAAW;oBACxD;gBACF;YACF;YAEA,IAAIoB,OAAOI,MAAM,KAAK,GAAG;gBACvB9D,QAAQC,GAAG,CAAC;gBACZ,OAAO,EAAE;YACX;YAEAD,QAAQC,GAAG,CAAC,CAAC,iBAAiB,EAAEyD,OAAOI,MAAM,CAAC,IAAI,CAAC;YACnD9D,QAAQC,GAAG,CAAC;YACZD,QAAQC,GAAG,CAAC;YAEZ,KAAK,MAAMiC,SAASwB,OAAQ;gBAC1B,MAAMtB,YAAY,IAAIC,KAAKH,MAAME,SAAS,EAAEe,WAAW;gBACvD,MAAMY,aAAa7B,MAAMA,KAAK,CAAC8B,SAAS,CAAC,GAAG;gBAC5ChE,QAAQC,GAAG,CAAC,GAAGiC,MAAMT,SAAS,CAACwC,MAAM,CAAC,IAAI,GAAG,EAAEF,WAAW,GAAG,EAAE3B,UAAU,GAAG,EAAEF,MAAM2B,MAAM,EAAE;YAC9F;YAEA,OAAOH;QAET,EAAE,OAAOxD,OAAO;YACdF,QAAQE,KAAK,CAAC,4BAA4BA,MAAMoD,OAAO;YACvD,MAAMpD;QACR;IACF;IAEA,MAAMgE,YAAYzC,SAAS,EAAES,KAAK,EAAE;QAClC,IAAI;YACF,MAAMa,MAAM,CAAC,UAAU,EAAEtB,UAAU,CAAC,EAAES,OAAO;YAC7C,MAAMiC,SAAS,MAAM,IAAI,CAAC1E,KAAK,CAAC0E,MAAM,CAACpB;YAEvC,IAAI,CAACoB,QAAQ;gBACX,MAAM,IAAIpC,MAAM,CAAC,0BAA0B,EAAEN,WAAW;YAC1D;YAEA,MAAM,IAAI,CAAChC,KAAK,CAAC2E,GAAG,CAACrB;YACrB/C,QAAQC,GAAG,CAAC,CAAC,uCAAuC,EAAEwB,WAAW;YACjEzB,QAAQC,GAAG,CAAC,CAAC,UAAU,EAAEiC,OAAO;QAElC,EAAE,OAAOhC,OAAO;YACdF,QAAQE,KAAK,CAAC,6BAA6BA,MAAMoD,OAAO;YACxD,MAAMpD;QACR;IACF;IAEA,MAAMmE,gBAAgB5C,YAAY,IAAI,EAAE;QACtC,IAAI;YACF,MAAM+B,UAAU/B,YAAY,CAAC,UAAU,EAAEA,UAAU,EAAE,CAAC,GAAG;YACzD,MAAMgC,OAAO,MAAM,IAAI,CAAChE,KAAK,CAACgE,IAAI,CAACD;YAEnC,IAAIC,KAAKK,MAAM,KAAK,GAAG;gBACrB9D,QAAQC,GAAG,CAAC;gBACZ,OAAO;YACT;YAEA,MAAM,IAAI,CAACR,KAAK,CAAC2E,GAAG,CAACX;YACrBzD,QAAQC,GAAG,CAAC,CAAC,UAAU,EAAEwD,KAAKK,MAAM,CAAC,OAAO,EAAErC,YAAY,CAAC,WAAW,EAAEA,WAAW,GAAG,IAAI;YAC1F,OAAOgC,KAAKK,MAAM;QAEpB,EAAE,OAAO5D,OAAO;YACdF,QAAQE,KAAK,CAAC,8BAA8BA,MAAMoD,OAAO;YACzD,MAAMpD;QACR;IACF;IAEA,MAAMoE,cAAc7C,SAAS,EAAES,KAAK,EAAE;QACpC,IAAI;YACF,MAAMa,MAAM,CAAC,UAAU,EAAEtB,UAAU,CAAC,EAAES,OAAO;YAC7C,MAAMlB,QAAQ,MAAM,IAAI,CAACvB,KAAK,CAACkE,GAAG,CAACZ;YAEnC,IAAI,CAAC/B,OAAO;gBACV,OAAO;oBAAEuD,OAAO;oBAAOC,QAAQ;gBAAkB;YACnD;YAEA,MAAMjC,YAAY/B,KAAKC,KAAK,CAACO;YAE7B,IAAIqB,KAAKC,GAAG,KAAKC,UAAUH,SAAS,EAAE;gBACpC,MAAM,IAAI,CAAC3C,KAAK,CAAC2E,GAAG,CAACrB;gBACrB,OAAO;oBAAEwB,OAAO;oBAAOC,QAAQ;gBAAgB;YACjD;YAEA,OAAO;gBACLD,OAAO;gBACPhC;YACF;QAEF,EAAE,OAAOrC,OAAO;YACd,OAAO;gBAAEqE,OAAO;gBAAOC,QAAQtE,MAAMoD,OAAO;YAAC;QAC/C;IACF;IAEA,MAAMmB,aAAahD,SAAS,EAAE;QAC5B,IAAI;YACF,MAAMnB,SAAS,MAAM,IAAI,CAACH,eAAe;YACzC,MAAMuB,cAAcpB,OAAOqB,MAAM,CAACC,IAAI,CAACC,CAAAA,IAAKA,EAAEC,IAAI,KAAKL;YAEvD,IAAI,CAACC,aAAa;gBAChB,MAAM,IAAIK,MAAM,CAAC,oBAAoB,EAAEN,WAAW;YACpD;YAEAzB,QAAQC,GAAG,CAAC,CAAC,qBAAqB,EAAEyB,YAAYc,WAAW,EAAE;YAC7DxC,QAAQC,GAAG,CAAC,IAAIyE,MAAM,CAAC;YACvB1E,QAAQC,GAAG,CAAC,CAAC,MAAM,EAAEyB,YAAYI,IAAI,EAAE;YACvC9B,QAAQC,GAAG,CAAC,CAAC,QAAQ,EAAEyB,YAAYe,MAAM,CAACR,IAAI,CAAC,OAAO;YACtDjC,QAAQC,GAAG,CAAC,CAAC,qBAAqB,EAAEyB,YAAYgB,iBAAiB,CAACT,IAAI,CAAC,OAAO;YAC9EjC,QAAQC,GAAG,CAAC,CAAC,cAAc,EAAEyB,YAAYiB,cAAc,CAACS,WAAW,CAAC,EAAE,CAAC;YACvEpD,QAAQC,GAAG,CAAC,CAAC,YAAY,EAAEyB,YAAYiB,cAAc,CAACU,oBAAoB,CAAC,IAAI,CAAC;YAChFrD,QAAQC,GAAG,CAAC,CAAC,gBAAgB,EAAEyB,YAAYiB,cAAc,CAACgC,qBAAqB,EAAE;YACjF3E,QAAQC,GAAG,CAAC,CAAC,aAAa,EAAEyB,YAAYoB,WAAW,EAAE;YAErD,OAAOpB;QAET,EAAE,OAAOxB,OAAO;YACdF,QAAQE,KAAK,CAAC,+BAA+BA,MAAMoD,OAAO;YAC1D,MAAMpD;QACR;IACF;IAEA,MAAM0E,iBAAiB;QACrB,IAAI;YACF,MAAMtE,SAAS,MAAM,IAAI,CAACH,eAAe;YAEzCH,QAAQC,GAAG,CAAC,CAAC,yBAAyB,EAAEK,OAAOqB,MAAM,CAACmC,MAAM,CAAC,IAAI,CAAC;YAClE9D,QAAQC,GAAG,CAAC;YACZD,QAAQC,GAAG,CAAC;YAEZ,KAAK,MAAM4E,SAASvE,OAAOqB,MAAM,CAAE;gBACjC,MAAMG,OAAO+C,MAAM/C,IAAI,CAACmC,MAAM,CAAC;gBAC/B,MAAMa,OAAOD,MAAMrC,WAAW,CAACyB,MAAM,CAAC;gBACtC,MAAMxB,SAASoC,MAAMpC,MAAM,CAACqB,MAAM;gBAClC9D,QAAQC,GAAG,CAAC,GAAG6B,KAAK,GAAG,EAAEgD,KAAK,GAAG,EAAErC,QAAQ;YAC7C;YAEA,OAAOnC,OAAOqB,MAAM,CAACK,GAAG,CAACH,CAAAA,IAAKA,EAAEC,IAAI;QAEtC,EAAE,OAAO5B,OAAO;YACdF,QAAQE,KAAK,CAAC,iCAAiCA,MAAMoD,OAAO;YAC5D,MAAMpD;QACR;IACF;IAEA,MAAM6E,WAAW;QACf,IAAI,IAAI,CAACtF,KAAK,EAAE;YACd,MAAM,IAAI,CAACA,KAAK,CAACuF,IAAI;QACvB;IACF;AACF;AAEA,gBAAgB;AAChB,eAAeC;IACb,MAAMC,OAAO5F,QAAQ6F,IAAI,CAACC,KAAK,CAAC;IAChC,MAAMC,UAAUH,IAAI,CAAC,EAAE;IAEvB,IAAI,CAACG,SAAS;QACZrF,QAAQC,GAAG,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCjB,CAAC;QACGX,QAAQgG,IAAI,CAAC;IACf;IAEA,MAAMC,eAAe,IAAIpG;IAEzB,IAAI;QACF,MAAMoG,aAAa3F,UAAU;QAE7B,OAAQyF;YACN,KAAK;gBAAY;oBACf,MAAM5D,YAAYyD,IAAI,CAAC,EAAE;oBACzB,IAAI,CAACzD,WAAW;wBACd,MAAM,IAAIM,MAAM;oBAClB;oBAEA,MAAM3C,UAAU,CAAC;oBACjB,IAAK,IAAIoG,IAAI,GAAGA,IAAIN,KAAKpB,MAAM,EAAE0B,IAAK;wBACpC,IAAIN,IAAI,CAACM,EAAE,KAAK,gBAAgB;4BAC9BpG,QAAQ+C,SAAS,GAAG+C,IAAI,CAAC,EAAEM,EAAE;wBAC/B,OAAO,IAAIN,IAAI,CAACM,EAAE,KAAK,iBAAiB;4BACtCpG,QAAQ0D,WAAW,GAAGoC,IAAI,CAAC,EAAEM,EAAE;wBACjC,OAAO,IAAIN,IAAI,CAACM,EAAE,KAAK,gBAAgB;4BACrCpG,QAAQyD,SAAS,GAAGqC,IAAI,CAAC,EAAEM,EAAE;wBAC/B;oBACF;oBAEA,MAAMD,aAAa/D,kBAAkB,CAACC,WAAWrC;oBACjD;gBACF;YAEA,KAAK;gBAAQ;oBACX,MAAMqC,YAAYyD,IAAI,CAAC,EAAE;oBACzB,MAAMK,aAAahC,gBAAgB,CAAC9B;oBACpC;gBACF;YAEA,KAAK;gBAAU;oBACb,MAAMA,YAAYyD,IAAI,CAAC,EAAE;oBACzB,MAAMhD,QAAQgD,IAAI,CAAC,EAAE;oBACrB,IAAI,CAACzD,aAAa,CAACS,OAAO;wBACxB,MAAM,IAAIH,MAAM;oBAClB;oBACA,MAAMwD,aAAarB,WAAW,CAACzC,WAAWS;oBAC1C;gBACF;YAEA,KAAK;gBAAc;oBACjB,MAAMT,YAAYyD,IAAI,CAAC,EAAE;oBACzB,MAAMO,QAAQ,MAAMF,aAAalB,eAAe,CAAC5C;oBACjDzB,QAAQC,GAAG,CAAC,CAAC,QAAQ,EAAEwF,MAAM,OAAO,CAAC;oBACrC;gBACF;YAEA,KAAK;gBAAY;oBACf,MAAMhE,YAAYyD,IAAI,CAAC,EAAE;oBACzB,MAAMhD,QAAQgD,IAAI,CAAC,EAAE;oBACrB,IAAI,CAACzD,aAAa,CAACS,OAAO;wBACxB,MAAM,IAAIH,MAAM;oBAClB;oBAEA,MAAM2D,SAAS,MAAMH,aAAajB,aAAa,CAAC7C,WAAWS;oBAC3D,IAAIwD,OAAOnB,KAAK,EAAE;wBAChBvE,QAAQC,GAAG,CAAC;wBACZD,QAAQC,GAAG,CAAC,CAAC,eAAe,EAAEyF,OAAOnD,SAAS,CAACd,SAAS,EAAE;wBAC1DzB,QAAQC,GAAG,CAAC,CAAC,WAAW,EAAEyF,OAAOnD,SAAS,CAACE,MAAM,CAACR,IAAI,CAAC,OAAO;wBAC9DjC,QAAQC,GAAG,CAAC,CAAC,YAAY,EAAE,IAAIoC,KAAKqD,OAAOnD,SAAS,CAACH,SAAS,EAAEe,WAAW,IAAI;oBACjF,OAAO;wBACLnD,QAAQC,GAAG,CAAC;wBACZD,QAAQC,GAAG,CAAC,CAAC,WAAW,EAAEyF,OAAOlB,MAAM,EAAE;oBAC3C;oBACA;gBACF;YAEA,KAAK;gBAAQ;oBACX,MAAM/C,YAAYyD,IAAI,CAAC,EAAE;oBACzB,IAAI,CAACzD,WAAW;wBACd,MAAM,IAAIM,MAAM;oBAClB;oBACA,MAAMwD,aAAad,YAAY,CAAChD;oBAChC;gBACF;YAEA,KAAK;gBAAS;oBACZ,MAAM8D,aAAaX,cAAc;oBACjC;gBACF;YAEA;gBACE,MAAM,IAAI7C,MAAM,CAAC,iBAAiB,EAAEsD,SAAS;QACjD;IAEF,EAAE,OAAOnF,OAAO;QACdF,QAAQE,KAAK,CAAC,YAAYA,MAAMoD,OAAO;QACvChE,QAAQgG,IAAI,CAAC;IACf,SAAU;QACR,MAAMC,aAAaR,QAAQ;IAC7B;AACF;AAEA,IAAIjG,QAAQmG,IAAI,KAAKU,QAAQ;IAC3BV,OAAOW,KAAK,CAAC1F,CAAAA;QACXF,QAAQE,KAAK,CAAC,gBAAgBA;QAC9BZ,QAAQgG,IAAI,CAAC;IACf;AACF;AAEAK,OAAOE,OAAO,GAAG1G"}
1
+ {"version":3,"sources":["../../src/cli/agent-token-manager.js"],"sourcesContent":["#!/usr/bin/env node\r\n\r\n/**\r\n * Agent Token Management CLI\r\n * Generate, register, and manage agent tokens for MCP authentication\r\n */\r\n\r\nconst crypto = require('crypto');\r\nconst Redis = require('redis');\r\nconst fs = require('fs').promises;\r\nconst path = require('path');\r\n\r\nclass AgentTokenManager {\r\n constructor(options = {}) {\r\n // Support CFN standard variables with fallback to legacy MCP_REDIS_URL\r\n const redisHost = process.env.CFN_REDIS_HOST || 'cfn-redis';\r\n const redisPort = process.env.CFN_REDIS_PORT || '6379';\r\n const defaultUrl = `redis://${redisHost}:${redisPort}`;\r\n this.redisUrl = options.redisUrl || process.env.CFN_REDIS_URL || process.env.MCP_REDIS_URL || defaultUrl;\r\n this.redis = null;\r\n this.agentConfigPath = options.agentConfigPath || './config/agent-whitelist.json';\r\n this.defaultExpiry = options.defaultExpiry || '24h';\r\n }\r\n\r\n async initialize() {\r\n try {\r\n this.redis = Redis.createClient({ url: this.redisUrl });\r\n await this.redis.connect();\r\n console.log('Connected to Redis for token management');\r\n } catch (error) {\r\n console.error('Failed to connect to Redis:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n async loadAgentConfig() {\r\n try {\r\n const configPath = path.resolve(this.agentConfigPath);\r\n const config = await fs.readFile(configPath, 'utf8');\r\n return JSON.parse(config);\r\n } catch (error) {\r\n console.error('Failed to load agent config:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n generateToken() {\r\n return crypto.randomBytes(32).toString('hex');\r\n }\r\n\r\n parseExpiry(expiry) {\r\n if (typeof expiry === 'number') {\r\n return expiry;\r\n }\r\n\r\n const match = expiry.match(/^(\\d+)([smhd])$/);\r\n if (!match) {\r\n return 86400; // Default to 24 hours\r\n }\r\n\r\n const value = parseInt(match[1]);\r\n const unit = match[2];\r\n const multipliers = { s: 1, m: 60, h: 3600, d: 86400 };\r\n\r\n return value * (multipliers[unit] || 86400);\r\n }\r\n\r\n async registerAgentToken(agentType, options = {}) {\r\n try {\r\n const config = await this.loadAgentConfig();\r\n const agentConfig = config.agents.find(a => a.type === agentType);\r\n\r\n if (!agentConfig) {\r\n throw new Error(`Unknown agent type: ${agentType}. Available types: ${config.agents.map(a => a.type).join(', ')}`);\r\n }\r\n\r\n const token = this.generateToken();\r\n const expiresIn = options.expiresIn || this.defaultExpiry;\r\n const expiresAt = Date.now() + (this.parseExpiry(expiresIn) * 1000);\r\n\r\n const tokenData = {\r\n token,\r\n agentType,\r\n displayName: agentConfig.displayName,\r\n skills: agentConfig.skills,\r\n allowedMcpServers: agentConfig.allowedMcpServers,\r\n resourceLimits: agentConfig.resourceLimits,\r\n expiresAt,\r\n createdAt: Date.now(),\r\n createdBy: options.createdBy || 'cli',\r\n description: options.description || `Token for ${agentConfig.displayName}`\r\n };\r\n\r\n // Store in Redis\r\n const key = `mcp:agent:${agentType}:${token}`;\r\n const value = JSON.stringify(tokenData);\r\n const ttlSeconds = this.parseExpiry(expiresIn);\r\n\r\n await this.redis.setEx(key, ttlSeconds, value);\r\n\r\n console.log(`✅ Token registered successfully!`);\r\n console.log(` Agent Type: ${agentConfig.displayName} (${agentType})`);\r\n console.log(` Token: ${token}`);\r\n console.log(` Skills: ${agentConfig.skills.join(', ')}`);\r\n console.log(` Allowed MCP Servers: ${agentConfig.allowedMcpServers.join(', ')}`);\r\n console.log(` Expires: ${new Date(expiresAt).toISOString()}`);\r\n console.log(` Memory Limit: ${agentConfig.resourceLimits.maxMemoryMB}MB`);\r\n console.log(` Rate Limit: ${agentConfig.resourceLimits.maxRequestsPerMinute}/min`);\r\n\r\n return tokenData;\r\n\r\n } catch (error) {\r\n console.error('❌ Failed to register token:', error.message);\r\n throw error;\r\n }\r\n }\r\n\r\n async listActiveTokens(agentType = null) {\r\n try {\r\n const pattern = agentType ? `mcp:agent:${agentType}:*` : 'mcp:agent:*';\r\n const keys = await this.redis.keys(pattern);\r\n const tokens = [];\r\n\r\n for (const key of keys) {\r\n const value = await this.redis.get(key);\r\n if (value) {\r\n const tokenData = JSON.parse(value);\r\n tokens.push({\r\n ...tokenData,\r\n key,\r\n status: tokenData.expiresAt > Date.now() ? 'active' : 'expired'\r\n });\r\n }\r\n }\r\n\r\n if (tokens.length === 0) {\r\n console.log('No active tokens found');\r\n return [];\r\n }\r\n\r\n console.log(`\\nActive Tokens (${tokens.length}):\\n`);\r\n console.log('Agent Type | Token | Expires At | Status');\r\n console.log('-------------------|------------------------------------|------------------------------|--------');\r\n\r\n for (const token of tokens) {\r\n const expiresAt = new Date(token.expiresAt).toISOString();\r\n const tokenShort = token.token.substring(0, 32);\r\n console.log(`${token.agentType.padEnd(17)} | ${tokenShort} | ${expiresAt} | ${token.status}`);\r\n }\r\n\r\n return tokens;\r\n\r\n } catch (error) {\r\n console.error('❌ Failed to list tokens:', error.message);\r\n throw error;\r\n }\r\n }\r\n\r\n async revokeToken(agentType, token) {\r\n try {\r\n const key = `mcp:agent:${agentType}:${token}`;\r\n const exists = await this.redis.exists(key);\r\n\r\n if (!exists) {\r\n throw new Error(`Token not found for agent ${agentType}`);\r\n }\r\n\r\n await this.redis.del(key);\r\n console.log(`✅ Token revoked successfully for agent ${agentType}`);\r\n console.log(` Token: ${token}`);\r\n\r\n } catch (error) {\r\n console.error('❌ Failed to revoke token:', error.message);\r\n throw error;\r\n }\r\n }\r\n\r\n async revokeAllTokens(agentType = null) {\r\n try {\r\n const pattern = agentType ? `mcp:agent:${agentType}:*` : 'mcp:agent:*';\r\n const keys = await this.redis.keys(pattern);\r\n\r\n if (keys.length === 0) {\r\n console.log('No tokens found to revoke');\r\n return 0;\r\n }\r\n\r\n await this.redis.del(keys);\r\n console.log(`✅ Revoked ${keys.length} tokens${agentType ? ` for agent ${agentType}` : ''}`);\r\n return keys.length;\r\n\r\n } catch (error) {\r\n console.error('❌ Failed to revoke tokens:', error.message);\r\n throw error;\r\n }\r\n }\r\n\r\n async validateToken(agentType, token) {\r\n try {\r\n const key = `mcp:agent:${agentType}:${token}`;\r\n const value = await this.redis.get(key);\r\n\r\n if (!value) {\r\n return { valid: false, reason: 'Token not found' };\r\n }\r\n\r\n const tokenData = JSON.parse(value);\r\n\r\n if (Date.now() > tokenData.expiresAt) {\r\n await this.redis.del(key);\r\n return { valid: false, reason: 'Token expired' };\r\n }\r\n\r\n return {\r\n valid: true,\r\n tokenData\r\n };\r\n\r\n } catch (error) {\r\n return { valid: false, reason: error.message };\r\n }\r\n }\r\n\r\n async getAgentInfo(agentType) {\r\n try {\r\n const config = await this.loadAgentConfig();\r\n const agentConfig = config.agents.find(a => a.type === agentType);\r\n\r\n if (!agentConfig) {\r\n throw new Error(`Unknown agent type: ${agentType}`);\r\n }\r\n\r\n console.log(`\\nAgent Information: ${agentConfig.displayName}`);\r\n console.log('='.repeat(50));\r\n console.log(`Type: ${agentConfig.type}`);\r\n console.log(`Skills: ${agentConfig.skills.join(', ')}`);\r\n console.log(`Allowed MCP Servers: ${agentConfig.allowedMcpServers.join(', ')}`);\r\n console.log(`Memory Limit: ${agentConfig.resourceLimits.maxMemoryMB}MB`);\r\n console.log(`Rate Limit: ${agentConfig.resourceLimits.maxRequestsPerMinute}/min`);\r\n console.log(`Max Concurrent: ${agentConfig.resourceLimits.maxConcurrentRequests}`);\r\n console.log(`Description: ${agentConfig.description}`);\r\n\r\n return agentConfig;\r\n\r\n } catch (error) {\r\n console.error('❌ Failed to get agent info:', error.message);\r\n throw error;\r\n }\r\n }\r\n\r\n async listAgentTypes() {\r\n try {\r\n const config = await this.loadAgentConfig();\r\n\r\n console.log(`\\nAvailable Agent Types (${config.agents.length}):\\n`);\r\n console.log('Agent Type | Display Name | Skills Count');\r\n console.log('------------------------|--------------------------------|-------------');\r\n\r\n for (const agent of config.agents) {\r\n const type = agent.type.padEnd(22);\r\n const name = agent.displayName.padEnd(32);\r\n const skills = agent.skills.length;\r\n console.log(`${type} | ${name} | ${skills}`);\r\n }\r\n\r\n return config.agents.map(a => a.type);\r\n\r\n } catch (error) {\r\n console.error('❌ Failed to list agent types:', error.message);\r\n throw error;\r\n }\r\n }\r\n\r\n async shutdown() {\r\n if (this.redis) {\r\n await this.redis.quit();\r\n }\r\n }\r\n}\r\n\r\n// CLI interface\r\nasync function main() {\r\n const args = process.argv.slice(2);\r\n const command = args[0];\r\n\r\n if (!command) {\r\n console.log(`\r\nAgent Token Management CLI\r\n\r\nUsage: node agent-token-manager.js <command> [options]\r\n\r\nCommands:\r\n register <agent-type> [options] Register a new token for an agent\r\n list [agent-type] List active tokens\r\n revoke <agent-type> <token> Revoke a specific token\r\n revoke-all [agent-type] Revoke all tokens (optionally for specific agent)\r\n validate <agent-type> <token> Validate a token\r\n info <agent-type> Show agent information\r\n types List available agent types\r\n\r\nOptions for 'register' command:\r\n --expires-in <duration> Token expiry (e.g., 1h, 30m, 7d) [default: 24h]\r\n --description <text> Token description\r\n --created-by <identifier> Creator identifier\r\n\r\nExamples:\r\n # Register token for frontend engineer\r\n node agent-token-manager.js register react-frontend-engineer\r\n\r\n # Register token with custom expiry\r\n node agent-token-manager.js register backend-developer --expires-in 2h\r\n\r\n # List all active tokens\r\n node agent-token-manager.js list\r\n\r\n # List tokens for specific agent\r\n node agent-token-manager.js list react-frontend-engineer\r\n\r\n # Revoke a specific token\r\n node agent-token-manager.js revoke react-frontend-engineer abc123...\r\n\r\n # Get agent information\r\n node agent-token-manager.js info security-specialist\r\n`);\r\n process.exit(0);\r\n }\r\n\r\n const tokenManager = new AgentTokenManager();\r\n\r\n try {\r\n await tokenManager.initialize();\r\n\r\n switch (command) {\r\n case 'register': {\r\n const agentType = args[1];\r\n if (!agentType) {\r\n throw new Error('Agent type is required for register command');\r\n }\r\n\r\n const options = {};\r\n for (let i = 2; i < args.length; i++) {\r\n if (args[i] === '--expires-in') {\r\n options.expiresIn = args[++i];\r\n } else if (args[i] === '--description') {\r\n options.description = args[++i];\r\n } else if (args[i] === '--created-by') {\r\n options.createdBy = args[++i];\r\n }\r\n }\r\n\r\n await tokenManager.registerAgentToken(agentType, options);\r\n break;\r\n }\r\n\r\n case 'list': {\r\n const agentType = args[1];\r\n await tokenManager.listActiveTokens(agentType);\r\n break;\r\n }\r\n\r\n case 'revoke': {\r\n const agentType = args[1];\r\n const token = args[2];\r\n if (!agentType || !token) {\r\n throw new Error('Agent type and token are required for revoke command');\r\n }\r\n await tokenManager.revokeToken(agentType, token);\r\n break;\r\n }\r\n\r\n case 'revoke-all': {\r\n const agentType = args[1];\r\n const count = await tokenManager.revokeAllTokens(agentType);\r\n console.log(`Revoked ${count} tokens`);\r\n break;\r\n }\r\n\r\n case 'validate': {\r\n const agentType = args[1];\r\n const token = args[2];\r\n if (!agentType || !token) {\r\n throw new Error('Agent type and token are required for validate command');\r\n }\r\n\r\n const result = await tokenManager.validateToken(agentType, token);\r\n if (result.valid) {\r\n console.log('✅ Token is valid');\r\n console.log(` Agent Type: ${result.tokenData.agentType}`);\r\n console.log(` Skills: ${result.tokenData.skills.join(', ')}`);\r\n console.log(` Expires: ${new Date(result.tokenData.expiresAt).toISOString()}`);\r\n } else {\r\n console.log('❌ Token is invalid');\r\n console.log(` Reason: ${result.reason}`);\r\n }\r\n break;\r\n }\r\n\r\n case 'info': {\r\n const agentType = args[1];\r\n if (!agentType) {\r\n throw new Error('Agent type is required for info command');\r\n }\r\n await tokenManager.getAgentInfo(agentType);\r\n break;\r\n }\r\n\r\n case 'types': {\r\n await tokenManager.listAgentTypes();\r\n break;\r\n }\r\n\r\n default:\r\n throw new Error(`Unknown command: ${command}`);\r\n }\r\n\r\n } catch (error) {\r\n console.error('❌ Error:', error.message);\r\n process.exit(1);\r\n } finally {\r\n await tokenManager.shutdown();\r\n }\r\n}\r\n\r\nif (require.main === module) {\r\n main().catch(error => {\r\n console.error('Fatal error:', error);\r\n process.exit(1);\r\n });\r\n}\r\n\r\nmodule.exports = AgentTokenManager;"],"names":["crypto","require","Redis","fs","promises","path","AgentTokenManager","options","redisHost","process","env","CFN_REDIS_HOST","redisPort","CFN_REDIS_PORT","defaultUrl","redisUrl","CFN_REDIS_URL","MCP_REDIS_URL","redis","agentConfigPath","defaultExpiry","initialize","createClient","url","connect","console","log","error","loadAgentConfig","configPath","resolve","config","readFile","JSON","parse","generateToken","randomBytes","toString","parseExpiry","expiry","match","value","parseInt","unit","multipliers","s","m","h","d","registerAgentToken","agentType","agentConfig","agents","find","a","type","Error","map","join","token","expiresIn","expiresAt","Date","now","tokenData","displayName","skills","allowedMcpServers","resourceLimits","createdAt","createdBy","description","key","stringify","ttlSeconds","setEx","toISOString","maxMemoryMB","maxRequestsPerMinute","message","listActiveTokens","pattern","keys","tokens","get","push","status","length","tokenShort","substring","padEnd","revokeToken","exists","del","revokeAllTokens","validateToken","valid","reason","getAgentInfo","repeat","maxConcurrentRequests","listAgentTypes","agent","name","shutdown","quit","main","args","argv","slice","command","exit","tokenManager","i","count","result","module","catch","exports"],"mappings":"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"}
@@ -22,6 +22,20 @@ const execAsync = promisify(exec);
22
22
  baseURL: process.env.ZAI_BASE_URL || 'https://api.z.ai/api/anthropic'
23
23
  };
24
24
  }
25
+ if (envProvider === 'kimi') {
26
+ return {
27
+ provider: 'kimi',
28
+ apiKey: process.env.KIMI_API_KEY,
29
+ baseURL: process.env.KIMI_BASE_URL || 'https://api.moonshot.cn/v1'
30
+ };
31
+ }
32
+ if (envProvider === 'openrouter') {
33
+ return {
34
+ provider: 'openrouter',
35
+ apiKey: process.env.OPENROUTER_API_KEY,
36
+ baseURL: process.env.OPENROUTER_BASE_URL || 'https://openrouter.ai/api/v1'
37
+ };
38
+ }
25
39
  // Check config file
26
40
  try {
27
41
  const configPath = path.join('.claude', 'config', 'api-provider.json');
@@ -33,6 +47,20 @@ const execAsync = promisify(exec);
33
47
  baseURL: config.baseURL || process.env.ZAI_BASE_URL || 'https://api.z.ai/api/anthropic'
34
48
  };
35
49
  }
50
+ if (config.provider === 'kimi') {
51
+ return {
52
+ provider: 'kimi',
53
+ apiKey: config.apiKey || process.env.KIMI_API_KEY,
54
+ baseURL: config.baseURL || process.env.KIMI_BASE_URL || 'https://api.moonshot.cn/v1'
55
+ };
56
+ }
57
+ if (config.provider === 'openrouter') {
58
+ return {
59
+ provider: 'openrouter',
60
+ apiKey: config.apiKey || process.env.OPENROUTER_API_KEY,
61
+ baseURL: config.baseURL || process.env.OPENROUTER_BASE_URL || 'https://openrouter.ai/api/v1'
62
+ };
63
+ }
36
64
  } catch {
37
65
  // Config file doesn't exist, use defaults
38
66
  }
@@ -232,7 +260,7 @@ const execAsync = promisify(exec);
232
260
  let totalInputTokens = 0;
233
261
  let totalOutputTokens = 0;
234
262
  let fullTextContent = '';
235
- const MAX_ITERATIONS = 10; // Prevent infinite loops
263
+ const MAX_ITERATIONS = 20; // Prevent infinite loops (increased for exploration phase)
236
264
  let iteration = 0;
237
265
  while(iteration < MAX_ITERATIONS){
238
266
  iteration++;
@@ -327,6 +355,9 @@ const execAsync = promisify(exec);
327
355
  // Start heartbeat monitoring (declare at function scope for error handling)
328
356
  let heartbeatInterval = null;
329
357
  const taskId = process.env.TASK_ID;
358
+ // Bug #6 Fix: Read Redis connection parameters from process.env and interpolate in TypeScript
359
+ const redisHost = process.env.CFN_REDIS_HOST || 'cfn-redis';
360
+ const redisPort = process.env.CFN_REDIS_PORT || '6379';
330
361
  try {
331
362
  console.log(`[anthropic-client] Executing agent: ${agentType}`);
332
363
  console.log(`[anthropic-client] Agent ID: ${agentId}`);
@@ -337,7 +368,7 @@ const execAsync = promisify(exec);
337
368
  if (taskId) {
338
369
  heartbeatInterval = setInterval(async ()=>{
339
370
  try {
340
- await execAsync(`redis-cli hset "swarm:${taskId}:agent:${agentId}" heartbeat "${Date.now()}" status "working"`);
371
+ await execAsync(`redis-cli -h ${redisHost} -p ${redisPort} hset "swarm:${taskId}:agent:${agentId}" heartbeat "${Date.now()}" status "working"`);
341
372
  } catch (err) {
342
373
  console.error('[heartbeat] Error sending heartbeat:', err);
343
374
  }
@@ -383,7 +414,7 @@ const execAsync = promisify(exec);
383
414
  if (heartbeatInterval) {
384
415
  clearInterval(heartbeatInterval);
385
416
  if (taskId) {
386
- await execAsync(`redis-cli hset "swarm:${taskId}:agent:${agentId}" heartbeat "${Date.now()}" status "complete"`);
417
+ await execAsync(`redis-cli -h ${redisHost} -p ${redisPort} hset "swarm:${taskId}:agent:${agentId}" heartbeat "${Date.now()}" status "complete"`);
387
418
  console.log(`[heartbeat] Monitoring stopped - agent ${agentId} complete`);
388
419
  }
389
420
  }
@@ -399,7 +430,7 @@ const execAsync = promisify(exec);
399
430
  clearInterval(heartbeatInterval);
400
431
  if (taskId) {
401
432
  try {
402
- await execAsync(`redis-cli hset "swarm:${taskId}:agent:${agentId}" heartbeat "${Date.now()}" status "error"`);
433
+ await execAsync(`redis-cli -h ${redisHost} -p ${redisPort} hset "swarm:${taskId}:agent:${agentId}" heartbeat "${Date.now()}" status "error"`);
403
434
  console.log(`[heartbeat] Monitoring stopped - agent ${agentId} error`);
404
435
  } catch (err) {
405
436
  // Ignore heartbeat errors during error handling