claude-flow-novice 2.15.0 → 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.
- package/.claude/cfn-extras/agents/cfn-coordinator-enterprise.md +1303 -0
- package/.claude/cfn-extras/agents/cfn-coordinator-mvp.md +942 -0
- package/.claude/cfn-extras/agents/cfn-coordinator-standard.md +1062 -0
- package/.claude/cfn-extras/agents/cfn-loop-coordinator.md +157 -0
- package/.claude/cfn-extras/agents/coordinator.md +182 -0
- package/.claude/cfn-extras/agents/cost-savings-cfn-loop-coordinator.md +760 -0
- package/.claude/cfn-extras/agents/cost-savings-coordinator.md +173 -0
- package/.claude/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator-enhanced.md +147 -0
- package/.claude/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md +162 -0
- package/.claude/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +161 -0
- package/.claude/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md +729 -0
- package/.claude/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +728 -0
- package/.claude/cfn-extras/agents/deprecated-coordinators/byzantine-coordinator.md +100 -0
- package/.claude/cfn-extras/agents/deprecated-coordinators/cfn-coordinator-enterprise.md +323 -0
- package/.claude/cfn-extras/agents/deprecated-coordinators/cfn-coordinator-mvp.md +157 -0
- package/.claude/cfn-extras/agents/deprecated-coordinators/cfn-coordinator-standard.md +229 -0
- package/.claude/cfn-extras/agents/deprecated-coordinators/cfn-coordinator-unified.md +149 -0
- package/.claude/cfn-extras/agents/deprecated-coordinators/coordinator-hybrid.md +231 -0
- package/.claude/cfn-extras/agents/deprecated-coordinators/gossip-coordinator.md +165 -0
- package/.claude/cfn-extras/agents/deprecated-coordinators/hierarchical-coordinator.md +95 -0
- package/.claude/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md +132 -0
- package/.claude/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +131 -0
- package/.claude/cfn-extras/agents/deprecated-coordinators/task-coordinator.md +109 -0
- package/.claude/cfn-extras/agents/deprecated-coordinators/test-coordinator.md +142 -0
- package/.claude/commands/cfn-docker/CFN_DOCKER_NATIVE.md +295 -0
- package/.claude/commands/cfn-docker-core-test-suite.md +326 -0
- package/.claude/commands/cfn-loop-cli.md +1 -1
- package/.claude/commands/switch-api.md +20 -6
- package/.claude/root-claude-distribute/CFN-CLAUDE.md +177 -426
- package/.claude/skills/cfn-docker-agent-spawning/spawn-agent.sh +27 -18
- package/.claude/skills/cfn-docker-loop-orchestration/orchestrate.sh +763 -38
- package/.claude/skills/cfn-docker-redis-coordination/coordinate.sh +25 -10
- package/.claude/skills/cfn-docker-redis-coordination/coordinate.sh.backup-1763145142 +641 -0
- package/.claude/skills/cfn-docker-skill-mcp-selection/skill-mcp-selector.js +471 -471
- package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +52 -23
- package/.claude/skills/cfn-redis-coordination/complete-swarm.sh +3 -3
- package/.claude/skills/cfn-redis-coordination/data/cfn-loop.db +0 -0
- package/.claude/skills/cfn-redis-coordination/redis-cli-wrapper.sh +9 -0
- package/.claude/skills/cfn-redis-coordination/report-completion.sh +7 -7
- package/claude-assets/agents/cfn-dev-team/architecture/api-designer-persona.md +2 -0
- package/claude-assets/agents/cfn-dev-team/architecture/goal-planner.md +2 -0
- package/claude-assets/agents/cfn-dev-team/architecture/planner.md +2 -0
- package/claude-assets/agents/cfn-dev-team/architecture/system-architect.md +2 -0
- package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +419 -563
- package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +2 -0
- package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +2 -0
- package/claude-assets/agents/cfn-dev-team/documentation/README-VALIDATION.md +2 -0
- package/claude-assets/agents/cfn-dev-team/documentation/agent-type-guidelines.md +2 -0
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/code-quality-validator.md +1 -1
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +1 -1
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +2 -0
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/quality-metrics.md +2 -0
- package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +2 -0
- package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +1 -1
- package/claude-assets/agents/cfn-dev-team/testers/e2e/playwright-tester.md +1 -1
- package/claude-assets/agents/cfn-dev-team/testers/interaction-tester.md +2 -0
- package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +2 -0
- package/claude-assets/agents/cfn-dev-team/testers/playwright-tester.md +2 -0
- package/claude-assets/agents/cfn-dev-team/testers/unit/tdd-london-unit-swarm.md +4 -0
- package/claude-assets/agents/cfn-dev-team/testers/validation/validation-production-validator.md +1 -1
- package/claude-assets/agents/docker-coordinators/cfn-docker-v3-coordinator.md +825 -17
- package/claude-assets/agents/docker-team/micro-sprint-planner.md +747 -0
- package/claude-assets/agents/docker-ts-fixer.md +56 -0
- package/claude-assets/agents/typescript-specialist.md +280 -0
- package/claude-assets/cfn-extras/agents/cfn-coordinator-enterprise.md +1303 -0
- package/claude-assets/cfn-extras/agents/cfn-coordinator-mvp.md +942 -0
- package/claude-assets/cfn-extras/agents/cfn-coordinator-standard.md +1062 -0
- package/claude-assets/cfn-extras/agents/cfn-loop-coordinator.md +157 -0
- package/claude-assets/cfn-extras/agents/coordinator.md +182 -0
- package/claude-assets/cfn-extras/agents/cost-savings-cfn-loop-coordinator.md +760 -0
- package/claude-assets/cfn-extras/agents/cost-savings-coordinator.md +173 -0
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator-enhanced.md +147 -0
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md +162 -0
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +161 -0
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md +729 -0
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +728 -0
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/byzantine-coordinator.md +100 -0
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/cfn-coordinator-enterprise.md +323 -0
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/cfn-coordinator-mvp.md +157 -0
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/cfn-coordinator-standard.md +229 -0
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/cfn-coordinator-unified.md +149 -0
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/coordinator-hybrid.md +231 -0
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/gossip-coordinator.md +165 -0
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/hierarchical-coordinator.md +95 -0
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md +132 -0
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +131 -0
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/task-coordinator.md +109 -0
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/test-coordinator.md +142 -0
- package/claude-assets/cfn-extras/skills/advanced-features/cfn-agent-swap/SKILL.md +36 -0
- package/claude-assets/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +60 -0
- package/claude-assets/cfn-extras/skills/advanced-features/cfn-api-validation/test-endpoints.sh +54 -0
- package/claude-assets/cfn-extras/skills/advanced-features/cfn-context-pruner/SKILL.md +75 -0
- package/claude-assets/cfn-extras/skills/advanced-features/cfn-context-pruner/prune-context.sh +73 -0
- package/claude-assets/cfn-extras/skills/advanced-features/cfn-task-mode-safety/cli-coordination.sh +519 -0
- package/claude-assets/cfn-extras/skills/advanced-features/cfn-task-mode-safety/mode-detection.sh +326 -0
- package/claude-assets/cfn-extras/skills/advanced-features/cfn-task-mode-sanitize/task-mode-env-sanitizer.sh +267 -0
- package/claude-assets/cfn-extras/skills/analytics/cfn-improvement-recommender/SKILL.md +33 -0
- package/claude-assets/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +92 -0
- package/claude-assets/cfn-extras/skills/analytics/cfn-memory-monitoring/SKILL.md +531 -0
- package/claude-assets/cfn-extras/skills/analytics/cfn-pattern-extraction/SKILL.md +30 -0
- package/claude-assets/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +80 -0
- package/claude-assets/cfn-extras/skills/analytics/cfn-retrospective-report/SKILL.md +31 -0
- package/claude-assets/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +101 -0
- package/claude-assets/cfn-extras/skills/analytics/cfn-telemetry/collect-metrics.sh +249 -0
- package/claude-assets/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +111 -0
- package/claude-assets/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +192 -0
- package/claude-assets/cfn-extras/skills/deprecated/cfn-simplified-agent-lifecycle/COST_ANALYSIS.md +49 -0
- package/claude-assets/cfn-extras/skills/deprecated/cfn-simplified-agent-lifecycle/DESIGN.md +98 -0
- package/claude-assets/cfn-extras/skills/deprecated/cfn-simplified-agent-lifecycle/MIGRATION_PLAN.md +74 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/SKILL.md +392 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-analytics-data/SKILL.md +124 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-analytics-data/operations/get-ad-performance.sh +105 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-analytics-data/operations/get-conversion-funnel.sh +102 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-analytics-data/operations/get-email-performance.sh +105 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-analytics-data/operations/get-social-engagement.sh +105 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-analytics-data/operations/get-website-traffic.sh +107 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/SKILL.md +340 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-competitive-intel/SKILL.md +350 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-competitive-intel/operations/get-backlink-profile.sh +154 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-competitive-intel/operations/get-keyword-rankings.sh +173 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-competitive-intel/operations/get-trending-topics.sh +147 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-competitive-intel/operations/monitor-competitor.sh +146 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-competitive-intel/operations/search-brand-mentions.sh +167 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-crm-contacts/SKILL.md +116 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-crm-contacts/operations/add-to-segment.sh +78 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-crm-contacts/operations/create-contact.sh +113 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-crm-contacts/operations/get-contact.sh +86 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-crm-contacts/operations/remove-from-segment.sh +78 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-crm-contacts/operations/update-contact.sh +120 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-email-campaigns/SKILL.md +106 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-email-campaigns/operations/create-campaign.sh +123 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-email-campaigns/operations/get-campaign-stats.sh +66 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-email-campaigns/operations/list-templates.sh +68 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-email-campaigns/operations/schedule-campaign.sh +85 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-email-campaigns/operations/send-test-email.sh +81 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-landing-pages/SKILL.md +366 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-landing-pages/operations/create-ab-test.sh +231 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-landing-pages/operations/create-landing-page.sh +190 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-landing-pages/operations/get-page-performance.sh +137 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-landing-pages/operations/publish-page.sh +120 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-landing-pages/operations/unpublish-page.sh +108 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-media-monitoring/SKILL.md +202 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-media-monitoring/operations/create-crisis-alert.sh +104 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-media-monitoring/operations/export-report.sh +92 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-media-monitoring/operations/get-sentiment-analysis.sh +85 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-media-monitoring/operations/search-mentions.sh +86 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-media-outreach/SKILL.md +168 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-media-outreach/operations/search-journalists.sh +74 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-media-outreach/operations/send-pitch.sh +80 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-media-outreach/operations/submit-haro-response.sh +88 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-media-outreach/operations/track-pitch-engagement.sh +66 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-press-distribution/SKILL.md +159 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-press-distribution/operations/distribute-press-release.sh +94 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-press-distribution/operations/get-distribution-status.sh +59 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-press-distribution/operations/get-pickup-metrics.sh +72 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-press-distribution/operations/list-templates.sh +53 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/SKILL.md +429 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-social-publishing/SKILL.md +108 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-social-publishing/operations/create-post.sh +104 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-social-publishing/operations/delete-post.sh +76 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-social-publishing/operations/get-post-stats.sh +66 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-social-publishing/operations/schedule-post.sh +85 -0
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-social-publishing/operations/upload-media.sh +88 -0
- package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/DESIGN.md +117 -0
- package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/SKILL.md +679 -0
- package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/invoke-portal-agents.sh +129 -0
- package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/invoke-portal-dashboard.sh +85 -0
- package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/invoke-portal-events.sh +125 -0
- package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/invoke-portal-metrics.sh +112 -0
- package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/invoke-portal-start.sh +135 -0
- package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/invoke-portal-stop.sh +121 -0
- package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +51 -0
- package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +85 -0
- package/claude-assets/cfn-extras/skills/utility/cfn-environment-sanitization/SKILL.md +200 -0
- package/claude-assets/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +244 -0
- package/claude-assets/cfn-extras/skills/utility/cfn-process-instrumentation/SKILL.md +279 -0
- package/claude-assets/cfn-extras/skills/utility/cfn-process-instrumentation/instrument-process.sh +327 -0
- package/claude-assets/commands/cfn-docker/CFN_DOCKER_NATIVE.md +295 -0
- package/claude-assets/commands/cfn-docker-core-test-suite.md +326 -0
- package/claude-assets/commands/cfn-loop-cli.md +1 -1
- package/claude-assets/commands/switch-api.md +20 -6
- package/claude-assets/root-claude-distribute/CFN-CLAUDE.md +177 -426
- package/claude-assets/skills/cfn-docker-agent-spawning/spawn-agent.sh +27 -18
- package/claude-assets/skills/cfn-docker-loop-orchestration/orchestrate.sh +763 -38
- package/claude-assets/skills/cfn-docker-redis-coordination/coordinate.sh +25 -10
- package/claude-assets/skills/cfn-docker-redis-coordination/coordinate.sh.backup-1763145142 +641 -0
- package/claude-assets/skills/cfn-docker-skill-mcp-selection/skill-mcp-selector.js +471 -471
- package/claude-assets/skills/cfn-docker-wave-execution/SKILL.md +936 -0
- package/claude-assets/skills/cfn-docker-wave-execution/cleanup-wave.sh +445 -0
- package/claude-assets/skills/cfn-docker-wave-execution/lib/docker-helpers.sh +804 -0
- package/claude-assets/skills/cfn-docker-wave-execution/monitor-wave.sh +485 -0
- package/claude-assets/skills/cfn-docker-wave-execution/spawn-wave.sh +547 -0
- package/claude-assets/skills/cfn-error-batching-strategy/README.md +323 -0
- package/claude-assets/skills/cfn-error-batching-strategy/SKILL.md +1016 -0
- package/claude-assets/skills/cfn-error-batching-strategy/analyze-errors.sh +327 -0
- package/claude-assets/skills/cfn-error-batching-strategy/calculate-waves.sh +256 -0
- package/claude-assets/skills/cfn-error-batching-strategy/cli.sh +523 -0
- package/claude-assets/skills/cfn-error-batching-strategy/cluster-files.sh +196 -0
- package/claude-assets/skills/cfn-error-batching-strategy/create-batches.sh +261 -0
- package/claude-assets/skills/cfn-error-batching-strategy/lib/core-functions.sh +47 -0
- package/claude-assets/skills/cfn-error-batching-strategy/templates/default-tiers.json +22 -0
- package/claude-assets/skills/cfn-error-batching-strategy/tests/test-batching-strategy.sh +498 -0
- package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +52 -23
- package/claude-assets/skills/cfn-redis-coordination/complete-swarm.sh +3 -3
- package/claude-assets/skills/cfn-redis-coordination/data/cfn-loop.db +0 -0
- package/claude-assets/skills/cfn-redis-coordination/redis-cli-wrapper.sh +9 -0
- package/claude-assets/skills/cfn-redis-coordination/report-completion.sh +7 -7
- package/claude-assets/skills/cfn-wave-checkpoint/SKILL.md +333 -0
- package/claude-assets/skills/cfn-wave-checkpoint/cleanup-orphans.sh +374 -0
- package/claude-assets/skills/cfn-wave-checkpoint/resume-wave.sh +325 -0
- package/claude-assets/skills/cfn-wave-checkpoint/save-checkpoint.sh +284 -0
- package/claude-assets/skills/docker-build/SKILL.md +203 -0
- package/claude-assets/skills/docker-build/build.sh +73 -0
- package/dist/agent/skill-mcp-selector.js +1 -1
- package/dist/agent/skill-mcp-selector.js.map +1 -1
- package/dist/agents/agent-loader.js +146 -165
- package/dist/agents/agent-loader.js.map +1 -1
- package/dist/cli/agent-definition-parser.js +36 -16
- package/dist/cli/agent-definition-parser.js.map +1 -1
- package/dist/cli/agent-executor.js +48 -13
- package/dist/cli/agent-executor.js.map +1 -1
- package/dist/cli/agent-prompt-builder.js +28 -2
- package/dist/cli/agent-prompt-builder.js.map +1 -1
- package/dist/cli/agent-spawn.js +57 -18
- package/dist/cli/agent-spawn.js.map +1 -1
- package/dist/cli/agent-token-manager.js +5 -1
- package/dist/cli/agent-token-manager.js.map +1 -1
- package/dist/cli/anthropic-client.js +35 -4
- package/dist/cli/anthropic-client.js.map +1 -1
- package/dist/cli/cfn-context.js +9 -6
- package/dist/cli/cfn-context.js.map +1 -1
- package/dist/cli/cfn-metrics.js +8 -1
- package/dist/cli/cfn-metrics.js.map +1 -1
- package/dist/cli/cfn-redis.js +7 -0
- package/dist/cli/cfn-redis.js.map +1 -1
- package/dist/cli/conversation-fork.js +14 -11
- package/dist/cli/conversation-fork.js.map +1 -1
- package/dist/cli/index.js +6 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/iteration-history.js +8 -5
- package/dist/cli/iteration-history.js.map +1 -1
- package/dist/coordination/enhanced-progress-tracker.js +1 -1
- package/dist/coordination/enhanced-progress-tracker.js.map +1 -1
- package/dist/coordination/event-bus.js +1 -1
- package/dist/coordination/event-bus.js.map +1 -1
- package/dist/coordination/redis-messaging-infrastructure.js +1 -1
- package/dist/coordination/redis-messaging-infrastructure.js.map +1 -1
- package/dist/mcp/auth-middleware.js +1 -1
- package/dist/mcp/auth-middleware.js.map +1 -1
- package/dist/mcp/playwright-mcp-server-auth.js +1 -1
- package/dist/mcp/playwright-mcp-server-auth.js.map +1 -1
- package/dist/utils/secret-filter.js +145 -0
- package/dist/utils/secret-filter.js.map +1 -0
- package/package.json +5 -4
- package/scripts/docker-agent-init.sh +106 -0
- package/scripts/docker-rebuild-all-agents.sh +127 -0
- package/scripts/init-project.js +4 -4
- package/scripts/switch-api.sh +11 -4
- package/.claude/cfn-agents-ignore/cfn-seo-team/AGENT_CREATION_REPORT.md +0 -471
- package/.claude/cfn-agents-ignore/cfn-seo-team/AGENT_CREATION_REPORT.md.backup +0 -481
- package/.claude/cfn-agents-ignore/cfn-seo-team/DELEGATION_MATRIX.md.backup +0 -371
- package/.claude/cfn-agents-ignore/cfn-seo-team/INTEGRATION_REQUIREMENTS.md.backup +0 -637
- package/.claude/cfn-agents-ignore/cfn-seo-team/cfn-seo-coordinator.md.backup +0 -398
- package/.claude/cfn-agents-ignore/cfn-seo-team/competitive-seo-analyst.md.backup +0 -401
- package/.claude/cfn-agents-ignore/cfn-seo-team/content-atomization-specialist.md.backup +0 -552
- package/.claude/cfn-agents-ignore/cfn-seo-team/content-seo-strategist.md.backup +0 -223
- package/.claude/cfn-agents-ignore/cfn-seo-team/eeat-content-auditor.md.backup +0 -367
- package/.claude/cfn-agents-ignore/cfn-seo-team/geo-optimization-expert.md.backup +0 -247
- package/.claude/cfn-agents-ignore/cfn-seo-team/link-building-specialist.md.backup +0 -269
- package/.claude/cfn-agents-ignore/cfn-seo-team/local-seo-optimizer.md.backup +0 -311
- package/.claude/cfn-agents-ignore/cfn-seo-team/programmatic-seo-engineer.md.backup +0 -222
- package/.claude/cfn-agents-ignore/cfn-seo-team/schema-markup-engineer.md.backup +0 -408
- package/.claude/cfn-agents-ignore/cfn-seo-team/seo-analytics-specialist.md.backup +0 -354
- package/.claude/cfn-agents-ignore/cfn-seo-team/seo-validators/accessibility-validator.md.backup +0 -561
- package/.claude/cfn-agents-ignore/cfn-seo-team/seo-validators/audience-validator.md.backup +0 -480
- package/.claude/cfn-agents-ignore/cfn-seo-team/seo-validators/branding-validator.md.backup +0 -448
- package/.claude/cfn-agents-ignore/cfn-seo-team/seo-validators/humanizer-validator.md.backup +0 -329
- package/.claude/cfn-agents-ignore/cfn-seo-team/technical-seo-specialist.md.backup +0 -208
- package/claude-assets/agents/AGENT_LIFECYCLE.md.backup_before_replace +0 -530
- package/claude-assets/agents/README-AGENT_LIFECYCLE.md.backup_before_replace +0 -522
- package/claude-assets/agents/cfn-dev-team/test-agent.md +0 -141
- package/claude-assets/agents/marketing_hybrid/cost_tracker.md +0 -13
- package/claude-assets/agents/marketing_hybrid/docker_deployer.md +0 -13
- package/claude-assets/agents/marketing_hybrid/zai_worker_spawner.md +0 -13
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/AGENT_CREATION_REPORT.md +0 -471
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/AGENT_CREATION_REPORT.md.backup +0 -481
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/DELEGATION_MATRIX.md.backup +0 -371
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/INTEGRATION_REQUIREMENTS.md.backup +0 -637
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/cfn-seo-coordinator.md.backup +0 -398
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/competitive-seo-analyst.md.backup +0 -401
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/content-atomization-specialist.md.backup +0 -552
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/content-seo-strategist.md.backup +0 -223
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/eeat-content-auditor.md.backup +0 -367
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/geo-optimization-expert.md.backup +0 -247
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/link-building-specialist.md.backup +0 -269
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/local-seo-optimizer.md.backup +0 -311
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/programmatic-seo-engineer.md.backup +0 -222
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/schema-markup-engineer.md.backup +0 -408
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-analytics-specialist.md.backup +0 -354
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-validators/accessibility-validator.md.backup +0 -561
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-validators/audience-validator.md.backup +0 -480
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-validators/branding-validator.md.backup +0 -448
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-validators/humanizer-validator.md.backup +0 -329
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/technical-seo-specialist.md.backup +0 -208
- /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/DELEGATION_MATRIX.md +0 -0
- /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/HUMANIZER_PROMPTS.md +0 -0
- /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/INTEGRATION_REQUIREMENTS.md +0 -0
- /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/cfn-seo-coordinator.md +0 -0
- /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/competitive-seo-analyst.md +0 -0
- /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/content-atomization-specialist.md +0 -0
- /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/content-seo-strategist.md +0 -0
- /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/eeat-content-auditor.md +0 -0
- /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/geo-optimization-expert.md +0 -0
- /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/link-building-specialist.md +0 -0
- /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/local-seo-optimizer.md +0 -0
- /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/programmatic-seo-engineer.md +0 -0
- /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/schema-markup-engineer.md +0 -0
- /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-analytics-specialist.md +0 -0
- /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-validators/accessibility-validator.md +0 -0
- /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-validators/audience-validator.md +0 -0
- /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-validators/branding-validator.md +0 -0
- /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-validators/humanizer-validator.md +0 -0
- /package/.claude/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/technical-seo-specialist.md +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/advanced-features}/cfn-agent-swap/SKILL.md +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/advanced-features}/cfn-agent-swap/recommend-swap.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/advanced-features}/cfn-api-validation/test-endpoints.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/advanced-features}/cfn-context-pruner/SKILL.md +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/advanced-features}/cfn-context-pruner/prune-context.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/README.md +0 -0
- /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/SKILL.md +0 -0
- /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/config.json +0 -0
- /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/eventbus-wrapper.cjs +0 -0
- /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/invoke-event-publish.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/invoke-event-subscribe.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/invoke-lifecycle-track.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/test-event-bus.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/README.md +0 -0
- /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/SKILL.md +0 -0
- /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/config.json +0 -0
- /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/invoke-fleet-allocate.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/invoke-fleet-balance.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/invoke-fleet-metrics.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/invoke-fleet-register.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/test-fleet-manager.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/advanced-features}/cfn-task-mode-safety/cli-coordination.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/advanced-features}/cfn-task-mode-safety/mode-detection.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/advanced-features}/cfn-task-mode-sanitize/task-mode-env-sanitizer.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/README.md +0 -0
- /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/description-refinement-guide.md +0 -0
- /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/log-skill-invocation.js +0 -0
- /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/run-production-criteria-tests.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/skill-analytics-dashboard.js +0 -0
- /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/skill-invocation-hook.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/skill-invocations.sql +0 -0
- /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/test-corpus.json +0 -0
- /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/test-data-generator.js +0 -0
- /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/test-manual-override-rate.js +0 -0
- /package/.claude/{skills → cfn-extras/skills/analytics}/cfn-analytics/validate-skill-selection.js +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-improvement-recommender/SKILL.md +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-improvement-recommender/recommend-improvements.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-memory-monitoring/SKILL.md +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-pattern-extraction/SKILL.md +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-pattern-extraction/extract-patterns.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-retrospective-report/SKILL.md +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-retrospective-report/generate-report.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-telemetry/collect-metrics.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/analytics}/cfn-telemetry/start-telemetry.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/SKILL.md +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/add-bullet.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/analyze-anti-pattern-effectiveness.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/classify-task.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/export-ace-metrics.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/extract-tags.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/format-negative-context.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/init-indexes.sql +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-curate.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-inject.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-query.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-reflect.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-stats.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/log-merge.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/monitor-injection-performance.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/optimize-injection-pipeline.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/query-anti-patterns.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/query-contexts.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/query-reflections.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/001-create-context-reflections.sql +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/README.md +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/SCHEMA_DESIGN_SUMMARY.md +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/populate-test-data-simple.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/populate-test-data.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/run-migration.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/validate-schema.sql +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/score-relevance-adapter.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/score-relevance.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/sprint-7-lessons.json +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/store-reflection.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/test-ace-skill.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/track-ab-test.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/update-reflection.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/SKILL.md +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/agents-registry-clean.json +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/agents-registry-fixed.json +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/agents-registry.json +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/discover-agents.py +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/discover-agents.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/invoke-registry.sh +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/temp_script.py +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-selector/SKILL.md +0 -0
- /package/.claude/{skills → cfn-extras/skills/deprecated}/cfn-agent-selector/select-agents.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/deprecated}/cfn-cli-setup/validate-cli-environment.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/deprecated}/cfn-simplified-agent-lifecycle/COST_ANALYSIS.md +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/deprecated}/cfn-simplified-agent-lifecycle/DESIGN.md +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/deprecated}/cfn-simplified-agent-lifecycle/MIGRATION_PLAN.md +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-ad-campaigns/SKILL.md +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-ad-campaigns/operations/create-campaign.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-ad-campaigns/operations/set-budget.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-analytics-data/SKILL.md +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-analytics-data/operations/get-ad-performance.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-analytics-data/operations/get-conversion-funnel.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-analytics-data/operations/get-email-performance.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-analytics-data/operations/get-social-engagement.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-analytics-data/operations/get-website-traffic.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-chatbot-conversations/SKILL.md +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-chatbot-conversations/operations/send-message.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-competitive-intel/SKILL.md +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-competitive-intel/operations/get-backlink-profile.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-competitive-intel/operations/get-keyword-rankings.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-competitive-intel/operations/get-trending-topics.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-competitive-intel/operations/monitor-competitor.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-competitive-intel/operations/search-brand-mentions.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-crm-contacts/SKILL.md +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-crm-contacts/operations/add-to-segment.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-crm-contacts/operations/create-contact.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-crm-contacts/operations/get-contact.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-crm-contacts/operations/remove-from-segment.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-crm-contacts/operations/update-contact.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-email-campaigns/SKILL.md +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-email-campaigns/operations/create-campaign.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-email-campaigns/operations/get-campaign-stats.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-email-campaigns/operations/list-templates.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-email-campaigns/operations/schedule-campaign.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-email-campaigns/operations/send-test-email.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-landing-pages/SKILL.md +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-landing-pages/operations/create-ab-test.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-landing-pages/operations/create-landing-page.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-landing-pages/operations/get-page-performance.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-landing-pages/operations/publish-page.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-landing-pages/operations/unpublish-page.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-monitoring/SKILL.md +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-monitoring/operations/create-crisis-alert.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-monitoring/operations/export-report.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-monitoring/operations/get-sentiment-analysis.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-monitoring/operations/search-mentions.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-outreach/SKILL.md +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-outreach/operations/search-journalists.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-outreach/operations/send-pitch.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-outreach/operations/submit-haro-response.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-media-outreach/operations/track-pitch-engagement.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-press-distribution/SKILL.md +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-press-distribution/operations/distribute-press-release.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-press-distribution/operations/get-distribution-status.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-press-distribution/operations/get-pickup-metrics.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-press-distribution/operations/list-templates.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-sms-campaigns/SKILL.md +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-sms-campaigns/operations/create-campaign.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-sms-campaigns/operations/opt-out.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-sms-campaigns/operations/send-sms.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-social-publishing/SKILL.md +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-social-publishing/operations/create-post.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-social-publishing/operations/delete-post.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-social-publishing/operations/get-post-stats.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-social-publishing/operations/schedule-post.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/marketing}/cfn-marketing-social-publishing/operations/upload-media.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/DESIGN.md +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/SKILL.md +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/invoke-portal-agents.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/invoke-portal-dashboard.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/invoke-portal-events.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/invoke-portal-metrics.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/invoke-portal-start.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/invoke-portal-stop.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/test-web-portal-skill.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/ui-portal}/cfn-web-portal/validate-deployment.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/utility}/cfn-environment-sanitization/SKILL.md +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/utility}/cfn-environment-sanitization/sanitize-environment.sh +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/utility}/cfn-process-instrumentation/SKILL.md +0 -0
- /package/{claude-assets/skills → .claude/cfn-extras/skills/utility}/cfn-process-instrumentation/instrument-process.sh +0 -0
- /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/DELEGATION_MATRIX.md +0 -0
- /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/HUMANIZER_PROMPTS.md +0 -0
- /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/INTEGRATION_REQUIREMENTS.md +0 -0
- /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/cfn-seo-coordinator.md +0 -0
- /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/competitive-seo-analyst.md +0 -0
- /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/content-atomization-specialist.md +0 -0
- /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/content-seo-strategist.md +0 -0
- /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/eeat-content-auditor.md +0 -0
- /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/geo-optimization-expert.md +0 -0
- /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/link-building-specialist.md +0 -0
- /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/local-seo-optimizer.md +0 -0
- /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/programmatic-seo-engineer.md +0 -0
- /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/schema-markup-engineer.md +0 -0
- /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-analytics-specialist.md +0 -0
- /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-validators/accessibility-validator.md +0 -0
- /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-validators/audience-validator.md +0 -0
- /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-validators/branding-validator.md +0 -0
- /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/seo-validators/humanizer-validator.md +0 -0
- /package/claude-assets/{cfn-agents-ignore → cfn-extras/agents}/cfn-seo-team/technical-seo-specialist.md +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/README.md +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/SKILL.md +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/config.json +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/eventbus-wrapper.cjs +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/invoke-event-publish.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/invoke-event-subscribe.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/invoke-lifecycle-track.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-event-bus/test-event-bus.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/README.md +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/SKILL.md +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/config.json +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/invoke-fleet-allocate.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/invoke-fleet-balance.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/invoke-fleet-metrics.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/invoke-fleet-register.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/advanced-features}/cfn-fleet-manager/test-fleet-manager.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/README.md +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/description-refinement-guide.md +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/log-skill-invocation.js +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/run-production-criteria-tests.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/skill-analytics-dashboard.js +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/skill-invocation-hook.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/skill-invocations.sql +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/test-corpus.json +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/test-data-generator.js +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/test-manual-override-rate.js +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/analytics}/cfn-analytics/validate-skill-selection.js +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/SKILL.md +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/add-bullet.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/analyze-anti-pattern-effectiveness.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/classify-task.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/export-ace-metrics.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/extract-tags.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/format-negative-context.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/init-indexes.sql +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-curate.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-inject.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-query.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-reflect.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/invoke-context-stats.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/log-merge.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/monitor-injection-performance.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/optimize-injection-pipeline.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/query-anti-patterns.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/query-contexts.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/query-reflections.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/001-create-context-reflections.sql +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/README.md +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/SCHEMA_DESIGN_SUMMARY.md +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/populate-test-data-simple.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/populate-test-data.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/run-migration.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/schema/validate-schema.sql +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/score-relevance-adapter.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/score-relevance.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/sprint-7-lessons.json +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/store-reflection.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/test-ace-skill.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/track-ab-test.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-ace-system/update-reflection.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/SKILL.md +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/agents-registry-clean.json +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/agents-registry-fixed.json +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/agents-registry.json +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/discover-agents.py +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/discover-agents.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/invoke-registry.sh +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-discovery/temp_script.py +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-selector/SKILL.md +0 -0
- /package/claude-assets/{skills → cfn-extras/skills/deprecated}/cfn-agent-selector/select-agents.sh +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/anthropic-client.ts"],"sourcesContent":["/**\r\n * Anthropic API Client\r\n *\r\n * Handles communication with Claude API (Anthropic or z.ai provider).\r\n * Supports streaming responses and tool execution.\r\n */\r\n\r\nimport Anthropic from '@anthropic-ai/sdk';\r\nimport fs from 'fs/promises';\r\nimport path from 'path';\r\nimport { exec } from 'child_process';\r\nimport { promisify } from 'util';\r\nimport { executeTool, type ToolUse, type ToolResult } from './tool-executor.js';\r\n\r\nconst execAsync = promisify(exec);\r\n\r\nexport interface APIConfig {\r\n provider: 'anthropic' | 'zai';\r\n apiKey?: string;\r\n baseURL?: string;\r\n}\r\n\r\nexport interface MessageOptions {\r\n model: string;\r\n prompt: string;\r\n systemPrompt?: string;\r\n maxTokens?: number;\r\n temperature?: number;\r\n stream?: boolean;\r\n tools?: any[];\r\n messages?: Array<{ role: string; content: string }>; // Sprint 4: Conversation forking\r\n}\r\n\r\nexport interface MessageResponse {\r\n content: string;\r\n usage: {\r\n inputTokens: number;\r\n outputTokens: number;\r\n };\r\n stopReason: string;\r\n}\r\n\r\n/**\r\n * Get API configuration from environment and config files\r\n */\r\nexport async function getAPIConfig(): Promise<APIConfig> {\r\n // Check environment variable\r\n const envProvider = process.env.CLAUDE_API_PROVIDER;\r\n if (envProvider === 'zai') {\r\n return {\r\n provider: 'zai',\r\n apiKey: process.env.ZAI_API_KEY || process.env.ANTHROPIC_API_KEY,\r\n baseURL: process.env.ZAI_BASE_URL || 'https://api.z.ai/api/anthropic',\r\n };\r\n }\r\n\r\n // Check config file\r\n try {\r\n const configPath = path.join('.claude', 'config', 'api-provider.json');\r\n const config = JSON.parse(await fs.readFile(configPath, 'utf-8'));\r\n\r\n if (config.provider === 'zai' || config.provider === 'z.ai') {\r\n return {\r\n provider: 'zai',\r\n apiKey: config.apiKey || process.env.ZAI_API_KEY || process.env.ANTHROPIC_API_KEY,\r\n baseURL: config.baseURL || process.env.ZAI_BASE_URL || 'https://api.z.ai/api/anthropic',\r\n };\r\n }\r\n } catch {\r\n // Config file doesn't exist, use defaults\r\n }\r\n\r\n // Default to Anthropic\r\n return {\r\n provider: 'anthropic',\r\n apiKey: process.env.ANTHROPIC_API_KEY,\r\n };\r\n}\r\n\r\n/**\r\n * Create Anthropic client with appropriate configuration\r\n */\r\nexport async function createClient(): Promise<Anthropic> {\r\n const config = await getAPIConfig();\r\n\r\n if (!config.apiKey) {\r\n throw new Error(\r\n `API key not found. Set ${config.provider === 'zai' ? 'ZAI_API_KEY' : 'ANTHROPIC_API_KEY'} environment variable.`\r\n );\r\n }\r\n\r\n const clientOptions: any = {\r\n apiKey: config.apiKey,\r\n timeout: 120000, // 2 minutes (120 seconds)\r\n maxRetries: 2,\r\n };\r\n\r\n if (config.provider === 'zai' && config.baseURL) {\r\n clientOptions.baseURL = config.baseURL;\r\n }\r\n\r\n return new Anthropic(clientOptions);\r\n}\r\n\r\n/**\r\n * Map agent model name to API model ID (provider-specific)\r\n */\r\nexport function mapModelName(agentModel: string, provider: 'anthropic' | 'zai' = 'anthropic'): string {\r\n // Z.ai uses GLM models - try glm-4.6 first for all models\r\n if (provider === 'zai') {\r\n const zaiModelMap: Record<string, string> = {\r\n haiku: 'glm-4.6',\r\n sonnet: 'glm-4.6',\r\n opus: 'glm-4.6',\r\n };\r\n return zaiModelMap[agentModel] || 'glm-4.6';\r\n }\r\n\r\n // Anthropic uses Claude models\r\n const modelMap: Record<string, string> = {\r\n haiku: 'claude-3-5-haiku-20241022',\r\n sonnet: 'claude-3-5-sonnet-20241022',\r\n opus: 'claude-3-opus-20240229',\r\n };\r\n\r\n return modelMap[agentModel] || modelMap.haiku;\r\n}\r\n\r\n/**\r\n * Get fallback model for Z.ai (glm-4.6 -> glm-4.5-air)\r\n */\r\nfunction getFallbackModel(model: string): string | null {\r\n if (model === 'glm-4.6') {\r\n return 'glm-4.5-air';\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Send message to Claude API with streaming support and automatic fallback\r\n */\r\nexport async function sendMessage(\r\n options: MessageOptions,\r\n onChunk?: (text: string) => void\r\n): Promise<MessageResponse> {\r\n const client = await createClient();\r\n const config = await getAPIConfig();\r\n\r\n // Primary model (glm-4.6 for Z.ai, Claude for Anthropic)\r\n let model = mapModelName(options.model, config.provider);\r\n const maxTokens = options.maxTokens || 16000; // Sprint 6: 16K hard limit for GLM-4.6 (agents target 10K for buffer)\r\n const temperature = options.temperature ?? 1.0;\r\n\r\n // Disable streaming for Z.ai (compatibility issue)\r\n const enableStreaming = options.stream && config.provider !== 'zai';\r\n\r\n console.log(`[anthropic-client] Provider: ${config.provider}`);\r\n console.log(`[anthropic-client] Model: ${model}`);\r\n console.log(`[anthropic-client] Max tokens: ${maxTokens}`);\r\n console.log(`[anthropic-client] Stream: ${enableStreaming ? 'enabled' : 'disabled'}`);\r\n console.log('');\r\n\r\n // Sprint 4: Use messages array if provided (conversation forking)\r\n const messages: Anthropic.MessageParam[] = options.messages\r\n ? options.messages.map(m => ({\r\n role: m.role as 'user' | 'assistant',\r\n content: m.content,\r\n }))\r\n : [\r\n {\r\n role: 'user',\r\n content: options.prompt,\r\n },\r\n ];\r\n\r\n // Retry logic: Try primary model (glm-4.6), fall back to glm-4.5 on error\r\n let lastError: Error | null = null;\r\n let attempts = 0;\r\n const maxAttempts = 2; // Primary + fallback\r\n\r\n while (attempts < maxAttempts) {\r\n const currentModel = attempts === 0 ? model : getFallbackModel(model);\r\n\r\n if (!currentModel) {\r\n // No fallback available, throw last error\r\n throw lastError || new Error('No model available');\r\n }\r\n\r\n attempts++;\r\n\r\n if (attempts > 1) {\r\n console.log(`[anthropic-client] Retrying with fallback model: ${currentModel}`);\r\n }\r\n\r\n const requestParams: Anthropic.MessageCreateParams = {\r\n model: currentModel,\r\n max_tokens: maxTokens,\r\n temperature,\r\n messages,\r\n };\r\n\r\n if (options.systemPrompt) {\r\n requestParams.system = options.systemPrompt;\r\n }\r\n\r\n if (options.tools && options.tools.length > 0) {\r\n requestParams.tools = options.tools;\r\n }\r\n\r\n try {\r\n // Streaming response\r\n if (enableStreaming) {\r\n let fullContent = '';\r\n let inputTokens = 0;\r\n let outputTokens = 0;\r\n let stopReason = 'end_turn';\r\n\r\n console.log('[anthropic-client] Creating streaming request...');\r\n const stream = await client.messages.create({\r\n ...requestParams,\r\n stream: true,\r\n });\r\n\r\n console.log('[anthropic-client] Stream created, processing events...');\r\n for await (const event of stream) {\r\n console.log('[anthropic-client] Event type:', event.type);\r\n if (event.type === 'message_start') {\r\n // @ts-ignore - usage exists on message_start\r\n inputTokens = event.message.usage?.input_tokens || 0;\r\n } else if (event.type === 'content_block_delta') {\r\n // @ts-ignore - text exists on delta\r\n const text = event.delta?.text || '';\r\n fullContent += text;\r\n if (onChunk) {\r\n onChunk(text);\r\n }\r\n } else if (event.type === 'message_delta') {\r\n // @ts-ignore - usage exists on message_delta\r\n outputTokens = event.usage?.output_tokens || 0;\r\n // @ts-ignore - stop_reason exists on delta\r\n stopReason = event.delta?.stop_reason || 'end_turn';\r\n }\r\n }\r\n\r\n return {\r\n content: fullContent,\r\n usage: {\r\n inputTokens,\r\n outputTokens,\r\n },\r\n stopReason,\r\n };\r\n }\r\n\r\n // Non-streaming response\r\n const response = await client.messages.create(requestParams);\r\n\r\n const content =\r\n response.content\r\n .filter((block) => block.type === 'text')\r\n .map((block) => (block as any).text)\r\n .join('\\n') || '';\r\n\r\n return {\r\n content,\r\n usage: {\r\n inputTokens: response.usage.input_tokens,\r\n outputTokens: response.usage.output_tokens,\r\n },\r\n stopReason: response.stop_reason || 'end_turn',\r\n };\r\n } catch (error) {\r\n lastError = error instanceof Error ? error : new Error(String(error));\r\n console.error(`[anthropic-client] Error with model ${currentModel}:`, lastError.message);\r\n\r\n // If this was the last attempt, throw the error\r\n if (attempts >= maxAttempts) {\r\n throw lastError;\r\n }\r\n\r\n // Continue to next attempt with fallback model\r\n console.log('[anthropic-client] Will retry with fallback model...');\r\n }\r\n }\r\n\r\n // Should never reach here\r\n throw lastError || new Error('All retry attempts failed');\r\n}\r\n\r\n/**\r\n * Execute agent with tool support (agentic loop)\r\n *\r\n * Handles:\r\n * 1. Send message with tools\r\n * 2. Get response\r\n * 3. If tool_use blocks, execute tools and send results back\r\n * 4. Repeat until final text response\r\n */\r\nasync function executeWithTools(\r\n options: MessageOptions,\r\n onChunk?: (text: string) => void\r\n): Promise<MessageResponse> {\r\n const client = await createClient();\r\n const config = await getAPIConfig();\r\n\r\n const model = mapModelName(options.model, config.provider);\r\n const maxTokens = options.maxTokens || 16000;\r\n const temperature = options.temperature ?? 1.0;\r\n\r\n // Build initial messages array\r\n const messages: Anthropic.MessageParam[] = options.messages\r\n ? options.messages.map(m => ({\r\n role: m.role as 'user' | 'assistant',\r\n content: m.content,\r\n }))\r\n : [\r\n {\r\n role: 'user',\r\n content: options.prompt,\r\n },\r\n ];\r\n\r\n let totalInputTokens = 0;\r\n let totalOutputTokens = 0;\r\n let fullTextContent = '';\r\n const MAX_ITERATIONS = 10; // Prevent infinite loops\r\n let iteration = 0;\r\n\r\n while (iteration < MAX_ITERATIONS) {\r\n iteration++;\r\n console.log(`[executeWithTools] Iteration ${iteration}`);\r\n\r\n const requestParams: Anthropic.MessageCreateParams = {\r\n model,\r\n max_tokens: maxTokens,\r\n temperature,\r\n messages,\r\n };\r\n\r\n if (options.systemPrompt) {\r\n requestParams.system = options.systemPrompt;\r\n }\r\n\r\n if (options.tools && options.tools.length > 0) {\r\n requestParams.tools = options.tools;\r\n }\r\n\r\n // Make API request (non-streaming for now to handle tool_use)\r\n const response = await client.messages.create(requestParams);\r\n\r\n totalInputTokens += response.usage.input_tokens;\r\n totalOutputTokens += response.usage.output_tokens;\r\n\r\n // Extract content blocks\r\n const textBlocks = response.content.filter(block => block.type === 'text');\r\n const toolUseBlocks = response.content.filter(block => block.type === 'tool_use');\r\n\r\n // Stream text output\r\n for (const block of textBlocks) {\r\n if (block.type === 'text') {\r\n const text = (block as any).text;\r\n fullTextContent += text;\r\n if (onChunk) {\r\n onChunk(text);\r\n }\r\n }\r\n }\r\n\r\n // If no tool uses, we're done\r\n if (toolUseBlocks.length === 0) {\r\n console.log(`[executeWithTools] No tool uses, completing`);\r\n return {\r\n content: fullTextContent,\r\n usage: {\r\n inputTokens: totalInputTokens,\r\n outputTokens: totalOutputTokens,\r\n },\r\n stopReason: response.stop_reason || 'end_turn',\r\n };\r\n }\r\n\r\n // Execute tools\r\n console.log(`[executeWithTools] Executing ${toolUseBlocks.length} tool(s)`);\r\n const toolResults: ToolResult[] = [];\r\n\r\n for (const toolUseBlock of toolUseBlocks) {\r\n if (toolUseBlock.type !== 'tool_use') continue;\r\n\r\n const toolUse: ToolUse = {\r\n type: 'tool_use',\r\n id: (toolUseBlock as any).id,\r\n name: (toolUseBlock as any).name,\r\n input: (toolUseBlock as any).input,\r\n };\r\n\r\n console.log(`[executeWithTools] Tool: ${toolUse.name}`);\r\n const result = await executeTool(toolUse);\r\n toolResults.push(result);\r\n\r\n // Stream tool result\r\n if (onChunk) {\r\n onChunk(`\\n[Tool: ${toolUse.name}] ${result.content.substring(0, 100)}${result.content.length > 100 ? '...' : ''}\\n`);\r\n }\r\n }\r\n\r\n // Add assistant message with tool_use\r\n messages.push({\r\n role: 'assistant',\r\n content: response.content as any,\r\n });\r\n\r\n // Add tool results as user message\r\n messages.push({\r\n role: 'user',\r\n content: toolResults as any,\r\n });\r\n\r\n // Continue to next iteration\r\n }\r\n\r\n // Reached max iterations\r\n console.warn(`[executeWithTools] Reached max iterations (${MAX_ITERATIONS})`);\r\n return {\r\n content: fullTextContent,\r\n usage: {\r\n inputTokens: totalInputTokens,\r\n outputTokens: totalOutputTokens,\r\n },\r\n stopReason: 'max_tokens',\r\n };\r\n}\r\n\r\n/**\r\n * Execute agent via API with full lifecycle\r\n */\r\nexport async function executeAgentAPI(\r\n agentType: string,\r\n agentId: string,\r\n model: string,\r\n prompt: string,\r\n systemPrompt?: string,\r\n messages?: Array<{ role: string; content: string }>, // Sprint 4: Conversation forking\r\n maxTokens?: number, // Sprint 6: Configurable token limit\r\n tools?: any[] // Tool definitions for agent capabilities\r\n): Promise<{ success: boolean; output: string; usage: any; error?: string }> {\r\n // Start heartbeat monitoring (declare at function scope for error handling)\r\n let heartbeatInterval: NodeJS.Timeout | null = null;\r\n const taskId = process.env.TASK_ID;\r\n\r\n try {\r\n console.log(`[anthropic-client] Executing agent: ${agentType}`);\r\n console.log(`[anthropic-client] Agent ID: ${agentId}`);\r\n if (messages && messages.length > 1) {\r\n console.log(`[anthropic-client] Continuing conversation (${messages.length} messages)`);\r\n }\r\n console.log('');\r\n\r\n if (taskId) {\r\n heartbeatInterval = setInterval(async () => {\r\n try {\r\n await execAsync(`redis-cli hset \"swarm:${taskId}:agent:${agentId}\" heartbeat \"${Date.now()}\" status \"working\"`);\r\n } catch (err) {\r\n console.error('[heartbeat] Error sending heartbeat:', err);\r\n }\r\n }, 30000); // Every 30 seconds\r\n\r\n console.log(`[heartbeat] Monitoring started for agent ${agentId} (30s interval)`);\r\n }\r\n\r\n let fullOutput = '';\r\n\r\n // If tools provided, use agentic loop with tool execution\r\n // Otherwise use simple streaming\r\n let response: MessageResponse;\r\n\r\n if (tools && tools.length > 0) {\r\n console.log(`[anthropic-client] Tools enabled: ${tools.map(t => t.name).join(', ')}`);\r\n response = await executeWithTools(\r\n {\r\n model,\r\n prompt,\r\n systemPrompt,\r\n messages,\r\n maxTokens,\r\n tools\r\n },\r\n (chunk) => {\r\n process.stdout.write(chunk);\r\n fullOutput += chunk;\r\n }\r\n );\r\n } else {\r\n response = await sendMessage(\r\n {\r\n model,\r\n prompt,\r\n systemPrompt,\r\n stream: true,\r\n messages,\r\n maxTokens,\r\n },\r\n (chunk) => {\r\n process.stdout.write(chunk);\r\n fullOutput += chunk;\r\n }\r\n );\r\n }\r\n\r\n console.log('\\n');\r\n console.log('=== Agent Execution Complete ===');\r\n console.log(`Input tokens: ${response.usage.inputTokens}`);\r\n console.log(`Output tokens: ${response.usage.outputTokens}`);\r\n console.log(`Stop reason: ${response.stopReason}`);\r\n\r\n // Stop heartbeat and send final status\r\n if (heartbeatInterval) {\r\n clearInterval(heartbeatInterval);\r\n\r\n if (taskId) {\r\n await execAsync(`redis-cli hset \"swarm:${taskId}:agent:${agentId}\" heartbeat \"${Date.now()}\" status \"complete\"`);\r\n console.log(`[heartbeat] Monitoring stopped - agent ${agentId} complete`);\r\n }\r\n }\r\n\r\n return {\r\n success: true,\r\n output: response.content,\r\n usage: response.usage,\r\n };\r\n } catch (error) {\r\n console.error('[anthropic-client] Error:', error);\r\n\r\n // Stop heartbeat and send error status\r\n if (heartbeatInterval) {\r\n clearInterval(heartbeatInterval);\r\n\r\n if (taskId) {\r\n try {\r\n await execAsync(`redis-cli hset \"swarm:${taskId}:agent:${agentId}\" heartbeat \"${Date.now()}\" status \"error\"`);\r\n console.log(`[heartbeat] Monitoring stopped - agent ${agentId} error`);\r\n } catch (err) {\r\n // Ignore heartbeat errors during error handling\r\n }\r\n }\r\n }\r\n\r\n return {\r\n success: false,\r\n output: '',\r\n usage: { inputTokens: 0, outputTokens: 0 },\r\n error: error instanceof Error ? error.message : String(error),\r\n };\r\n }\r\n}\r\n"],"names":["Anthropic","fs","path","exec","promisify","executeTool","execAsync","getAPIConfig","envProvider","process","env","CLAUDE_API_PROVIDER","provider","apiKey","ZAI_API_KEY","ANTHROPIC_API_KEY","baseURL","ZAI_BASE_URL","configPath","join","config","JSON","parse","readFile","createClient","Error","clientOptions","timeout","maxRetries","mapModelName","agentModel","zaiModelMap","haiku","sonnet","opus","modelMap","getFallbackModel","model","sendMessage","options","onChunk","client","maxTokens","temperature","enableStreaming","stream","console","log","messages","map","m","role","content","prompt","lastError","attempts","maxAttempts","currentModel","requestParams","max_tokens","systemPrompt","system","tools","length","fullContent","inputTokens","outputTokens","stopReason","create","event","type","message","usage","input_tokens","text","delta","output_tokens","stop_reason","response","filter","block","error","String","executeWithTools","totalInputTokens","totalOutputTokens","fullTextContent","MAX_ITERATIONS","iteration","textBlocks","toolUseBlocks","toolResults","toolUseBlock","toolUse","id","name","input","result","push","substring","warn","executeAgentAPI","agentType","agentId","heartbeatInterval","taskId","TASK_ID","setInterval","Date","now","err","fullOutput","t","chunk","stdout","write","clearInterval","success","output"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/anthropic-client.ts"],"sourcesContent":["/**\r\n * Anthropic API Client\r\n *\r\n * Handles communication with Claude API (Anthropic or z.ai provider).\r\n * Supports streaming responses and tool execution.\r\n */\r\n\r\nimport Anthropic from '@anthropic-ai/sdk';\r\nimport fs from 'fs/promises';\r\nimport path from 'path';\r\nimport { exec } from 'child_process';\r\nimport { promisify } from 'util';\r\nimport { executeTool, type ToolUse, type ToolResult } from './tool-executor.js';\r\n\r\nconst execAsync = promisify(exec);\r\n\r\nexport interface APIConfig {\r\n provider: 'anthropic' | 'zai' | 'kimi' | 'openrouter';\r\n apiKey?: string;\r\n baseURL?: string;\r\n}\r\n\r\nexport interface MessageOptions {\r\n model: string;\r\n prompt: string;\r\n systemPrompt?: string;\r\n maxTokens?: number;\r\n temperature?: number;\r\n stream?: boolean;\r\n tools?: any[];\r\n messages?: Array<{ role: string; content: string }>; // Sprint 4: Conversation forking\r\n}\r\n\r\nexport interface MessageResponse {\r\n content: string;\r\n usage: {\r\n inputTokens: number;\r\n outputTokens: number;\r\n };\r\n stopReason: string;\r\n}\r\n\r\n/**\r\n * Get API configuration from environment and config files\r\n */\r\nexport async function getAPIConfig(): Promise<APIConfig> {\r\n // Check environment variable\r\n const envProvider = process.env.CLAUDE_API_PROVIDER;\r\n\r\n if (envProvider === 'zai') {\r\n return {\r\n provider: 'zai',\r\n apiKey: process.env.ZAI_API_KEY || process.env.ANTHROPIC_API_KEY,\r\n baseURL: process.env.ZAI_BASE_URL || 'https://api.z.ai/api/anthropic',\r\n };\r\n }\r\n\r\n if (envProvider === 'kimi') {\r\n return {\r\n provider: 'kimi',\r\n apiKey: process.env.KIMI_API_KEY,\r\n baseURL: process.env.KIMI_BASE_URL || 'https://api.moonshot.cn/v1',\r\n };\r\n }\r\n\r\n if (envProvider === 'openrouter') {\r\n return {\r\n provider: 'openrouter',\r\n apiKey: process.env.OPENROUTER_API_KEY,\r\n baseURL: process.env.OPENROUTER_BASE_URL || 'https://openrouter.ai/api/v1',\r\n };\r\n }\r\n\r\n // Check config file\r\n try {\r\n const configPath = path.join('.claude', 'config', 'api-provider.json');\r\n const config = JSON.parse(await fs.readFile(configPath, 'utf-8'));\r\n\r\n if (config.provider === 'zai' || config.provider === 'z.ai') {\r\n return {\r\n provider: 'zai',\r\n apiKey: config.apiKey || process.env.ZAI_API_KEY || process.env.ANTHROPIC_API_KEY,\r\n baseURL: config.baseURL || process.env.ZAI_BASE_URL || 'https://api.z.ai/api/anthropic',\r\n };\r\n }\r\n\r\n if (config.provider === 'kimi') {\r\n return {\r\n provider: 'kimi',\r\n apiKey: config.apiKey || process.env.KIMI_API_KEY,\r\n baseURL: config.baseURL || process.env.KIMI_BASE_URL || 'https://api.moonshot.cn/v1',\r\n };\r\n }\r\n\r\n if (config.provider === 'openrouter') {\r\n return {\r\n provider: 'openrouter',\r\n apiKey: config.apiKey || process.env.OPENROUTER_API_KEY,\r\n baseURL: config.baseURL || process.env.OPENROUTER_BASE_URL || 'https://openrouter.ai/api/v1',\r\n };\r\n }\r\n } catch {\r\n // Config file doesn't exist, use defaults\r\n }\r\n\r\n // Default to Anthropic\r\n return {\r\n provider: 'anthropic',\r\n apiKey: process.env.ANTHROPIC_API_KEY,\r\n };\r\n}\r\n\r\n/**\r\n * Create Anthropic client with appropriate configuration\r\n */\r\nexport async function createClient(): Promise<Anthropic> {\r\n const config = await getAPIConfig();\r\n\r\n if (!config.apiKey) {\r\n throw new Error(\r\n `API key not found. Set ${config.provider === 'zai' ? 'ZAI_API_KEY' : 'ANTHROPIC_API_KEY'} environment variable.`\r\n );\r\n }\r\n\r\n const clientOptions: any = {\r\n apiKey: config.apiKey,\r\n timeout: 120000, // 2 minutes (120 seconds)\r\n maxRetries: 2,\r\n };\r\n\r\n if (config.provider === 'zai' && config.baseURL) {\r\n clientOptions.baseURL = config.baseURL;\r\n }\r\n\r\n return new Anthropic(clientOptions);\r\n}\r\n\r\n/**\r\n * Map agent model name to API model ID (provider-specific)\r\n */\r\nexport function mapModelName(agentModel: string, provider: 'anthropic' | 'zai' = 'anthropic'): string {\r\n // Z.ai uses GLM models - try glm-4.6 first for all models\r\n if (provider === 'zai') {\r\n const zaiModelMap: Record<string, string> = {\r\n haiku: 'glm-4.6',\r\n sonnet: 'glm-4.6',\r\n opus: 'glm-4.6',\r\n };\r\n return zaiModelMap[agentModel] || 'glm-4.6';\r\n }\r\n\r\n // Anthropic uses Claude models\r\n const modelMap: Record<string, string> = {\r\n haiku: 'claude-3-5-haiku-20241022',\r\n sonnet: 'claude-3-5-sonnet-20241022',\r\n opus: 'claude-3-opus-20240229',\r\n };\r\n\r\n return modelMap[agentModel] || modelMap.haiku;\r\n}\r\n\r\n/**\r\n * Get fallback model for Z.ai (glm-4.6 -> glm-4.5-air)\r\n */\r\nfunction getFallbackModel(model: string): string | null {\r\n if (model === 'glm-4.6') {\r\n return 'glm-4.5-air';\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Send message to Claude API with streaming support and automatic fallback\r\n */\r\nexport async function sendMessage(\r\n options: MessageOptions,\r\n onChunk?: (text: string) => void\r\n): Promise<MessageResponse> {\r\n const client = await createClient();\r\n const config = await getAPIConfig();\r\n\r\n // Primary model (glm-4.6 for Z.ai, Claude for Anthropic)\r\n let model = mapModelName(options.model, config.provider);\r\n const maxTokens = options.maxTokens || 16000; // Sprint 6: 16K hard limit for GLM-4.6 (agents target 10K for buffer)\r\n const temperature = options.temperature ?? 1.0;\r\n\r\n // Disable streaming for Z.ai (compatibility issue)\r\n const enableStreaming = options.stream && config.provider !== 'zai';\r\n\r\n console.log(`[anthropic-client] Provider: ${config.provider}`);\r\n console.log(`[anthropic-client] Model: ${model}`);\r\n console.log(`[anthropic-client] Max tokens: ${maxTokens}`);\r\n console.log(`[anthropic-client] Stream: ${enableStreaming ? 'enabled' : 'disabled'}`);\r\n console.log('');\r\n\r\n // Sprint 4: Use messages array if provided (conversation forking)\r\n const messages: Anthropic.MessageParam[] = options.messages\r\n ? options.messages.map(m => ({\r\n role: m.role as 'user' | 'assistant',\r\n content: m.content,\r\n }))\r\n : [\r\n {\r\n role: 'user',\r\n content: options.prompt,\r\n },\r\n ];\r\n\r\n // Retry logic: Try primary model (glm-4.6), fall back to glm-4.5 on error\r\n let lastError: Error | null = null;\r\n let attempts = 0;\r\n const maxAttempts = 2; // Primary + fallback\r\n\r\n while (attempts < maxAttempts) {\r\n const currentModel = attempts === 0 ? model : getFallbackModel(model);\r\n\r\n if (!currentModel) {\r\n // No fallback available, throw last error\r\n throw lastError || new Error('No model available');\r\n }\r\n\r\n attempts++;\r\n\r\n if (attempts > 1) {\r\n console.log(`[anthropic-client] Retrying with fallback model: ${currentModel}`);\r\n }\r\n\r\n const requestParams: Anthropic.MessageCreateParams = {\r\n model: currentModel,\r\n max_tokens: maxTokens,\r\n temperature,\r\n messages,\r\n };\r\n\r\n if (options.systemPrompt) {\r\n requestParams.system = options.systemPrompt;\r\n }\r\n\r\n if (options.tools && options.tools.length > 0) {\r\n requestParams.tools = options.tools;\r\n }\r\n\r\n try {\r\n // Streaming response\r\n if (enableStreaming) {\r\n let fullContent = '';\r\n let inputTokens = 0;\r\n let outputTokens = 0;\r\n let stopReason = 'end_turn';\r\n\r\n console.log('[anthropic-client] Creating streaming request...');\r\n const stream = await client.messages.create({\r\n ...requestParams,\r\n stream: true,\r\n });\r\n\r\n console.log('[anthropic-client] Stream created, processing events...');\r\n for await (const event of stream) {\r\n console.log('[anthropic-client] Event type:', event.type);\r\n if (event.type === 'message_start') {\r\n // @ts-ignore - usage exists on message_start\r\n inputTokens = event.message.usage?.input_tokens || 0;\r\n } else if (event.type === 'content_block_delta') {\r\n // @ts-ignore - text exists on delta\r\n const text = event.delta?.text || '';\r\n fullContent += text;\r\n if (onChunk) {\r\n onChunk(text);\r\n }\r\n } else if (event.type === 'message_delta') {\r\n // @ts-ignore - usage exists on message_delta\r\n outputTokens = event.usage?.output_tokens || 0;\r\n // @ts-ignore - stop_reason exists on delta\r\n stopReason = event.delta?.stop_reason || 'end_turn';\r\n }\r\n }\r\n\r\n return {\r\n content: fullContent,\r\n usage: {\r\n inputTokens,\r\n outputTokens,\r\n },\r\n stopReason,\r\n };\r\n }\r\n\r\n // Non-streaming response\r\n const response = await client.messages.create(requestParams);\r\n\r\n const content =\r\n response.content\r\n .filter((block) => block.type === 'text')\r\n .map((block) => (block as any).text)\r\n .join('\\n') || '';\r\n\r\n return {\r\n content,\r\n usage: {\r\n inputTokens: response.usage.input_tokens,\r\n outputTokens: response.usage.output_tokens,\r\n },\r\n stopReason: response.stop_reason || 'end_turn',\r\n };\r\n } catch (error) {\r\n lastError = error instanceof Error ? error : new Error(String(error));\r\n console.error(`[anthropic-client] Error with model ${currentModel}:`, lastError.message);\r\n\r\n // If this was the last attempt, throw the error\r\n if (attempts >= maxAttempts) {\r\n throw lastError;\r\n }\r\n\r\n // Continue to next attempt with fallback model\r\n console.log('[anthropic-client] Will retry with fallback model...');\r\n }\r\n }\r\n\r\n // Should never reach here\r\n throw lastError || new Error('All retry attempts failed');\r\n}\r\n\r\n/**\r\n * Execute agent with tool support (agentic loop)\r\n *\r\n * Handles:\r\n * 1. Send message with tools\r\n * 2. Get response\r\n * 3. If tool_use blocks, execute tools and send results back\r\n * 4. Repeat until final text response\r\n */\r\nasync function executeWithTools(\r\n options: MessageOptions,\r\n onChunk?: (text: string) => void\r\n): Promise<MessageResponse> {\r\n const client = await createClient();\r\n const config = await getAPIConfig();\r\n\r\n const model = mapModelName(options.model, config.provider);\r\n const maxTokens = options.maxTokens || 16000;\r\n const temperature = options.temperature ?? 1.0;\r\n\r\n // Build initial messages array\r\n const messages: Anthropic.MessageParam[] = options.messages\r\n ? options.messages.map(m => ({\r\n role: m.role as 'user' | 'assistant',\r\n content: m.content,\r\n }))\r\n : [\r\n {\r\n role: 'user',\r\n content: options.prompt,\r\n },\r\n ];\r\n\r\n let totalInputTokens = 0;\r\n let totalOutputTokens = 0;\r\n let fullTextContent = '';\r\n const MAX_ITERATIONS = 20; // Prevent infinite loops (increased for exploration phase)\r\n let iteration = 0;\r\n\r\n while (iteration < MAX_ITERATIONS) {\r\n iteration++;\r\n console.log(`[executeWithTools] Iteration ${iteration}`);\r\n\r\n const requestParams: Anthropic.MessageCreateParams = {\r\n model,\r\n max_tokens: maxTokens,\r\n temperature,\r\n messages,\r\n };\r\n\r\n if (options.systemPrompt) {\r\n requestParams.system = options.systemPrompt;\r\n }\r\n\r\n if (options.tools && options.tools.length > 0) {\r\n requestParams.tools = options.tools;\r\n }\r\n\r\n // Make API request (non-streaming for now to handle tool_use)\r\n const response = await client.messages.create(requestParams);\r\n\r\n totalInputTokens += response.usage.input_tokens;\r\n totalOutputTokens += response.usage.output_tokens;\r\n\r\n // Extract content blocks\r\n const textBlocks = response.content.filter(block => block.type === 'text');\r\n const toolUseBlocks = response.content.filter(block => block.type === 'tool_use');\r\n\r\n // Stream text output\r\n for (const block of textBlocks) {\r\n if (block.type === 'text') {\r\n const text = (block as any).text;\r\n fullTextContent += text;\r\n if (onChunk) {\r\n onChunk(text);\r\n }\r\n }\r\n }\r\n\r\n // If no tool uses, we're done\r\n if (toolUseBlocks.length === 0) {\r\n console.log(`[executeWithTools] No tool uses, completing`);\r\n return {\r\n content: fullTextContent,\r\n usage: {\r\n inputTokens: totalInputTokens,\r\n outputTokens: totalOutputTokens,\r\n },\r\n stopReason: response.stop_reason || 'end_turn',\r\n };\r\n }\r\n\r\n // Execute tools\r\n console.log(`[executeWithTools] Executing ${toolUseBlocks.length} tool(s)`);\r\n const toolResults: ToolResult[] = [];\r\n\r\n for (const toolUseBlock of toolUseBlocks) {\r\n if (toolUseBlock.type !== 'tool_use') continue;\r\n\r\n const toolUse: ToolUse = {\r\n type: 'tool_use',\r\n id: (toolUseBlock as any).id,\r\n name: (toolUseBlock as any).name,\r\n input: (toolUseBlock as any).input,\r\n };\r\n\r\n console.log(`[executeWithTools] Tool: ${toolUse.name}`);\r\n const result = await executeTool(toolUse);\r\n toolResults.push(result);\r\n\r\n // Stream tool result\r\n if (onChunk) {\r\n onChunk(`\\n[Tool: ${toolUse.name}] ${result.content.substring(0, 100)}${result.content.length > 100 ? '...' : ''}\\n`);\r\n }\r\n }\r\n\r\n // Add assistant message with tool_use\r\n messages.push({\r\n role: 'assistant',\r\n content: response.content as any,\r\n });\r\n\r\n // Add tool results as user message\r\n messages.push({\r\n role: 'user',\r\n content: toolResults as any,\r\n });\r\n\r\n // Continue to next iteration\r\n }\r\n\r\n // Reached max iterations\r\n console.warn(`[executeWithTools] Reached max iterations (${MAX_ITERATIONS})`);\r\n return {\r\n content: fullTextContent,\r\n usage: {\r\n inputTokens: totalInputTokens,\r\n outputTokens: totalOutputTokens,\r\n },\r\n stopReason: 'max_tokens',\r\n };\r\n}\r\n\r\n/**\r\n * Execute agent via API with full lifecycle\r\n */\r\nexport async function executeAgentAPI(\r\n agentType: string,\r\n agentId: string,\r\n model: string,\r\n prompt: string,\r\n systemPrompt?: string,\r\n messages?: Array<{ role: string; content: string }>, // Sprint 4: Conversation forking\r\n maxTokens?: number, // Sprint 6: Configurable token limit\r\n tools?: any[] // Tool definitions for agent capabilities\r\n): Promise<{ success: boolean; output: string; usage: any; error?: string }> {\r\n // Start heartbeat monitoring (declare at function scope for error handling)\r\n let heartbeatInterval: NodeJS.Timeout | null = null;\r\n const taskId = process.env.TASK_ID;\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 {\r\n console.log(`[anthropic-client] Executing agent: ${agentType}`);\r\n console.log(`[anthropic-client] Agent ID: ${agentId}`);\r\n if (messages && messages.length > 1) {\r\n console.log(`[anthropic-client] Continuing conversation (${messages.length} messages)`);\r\n }\r\n console.log('');\r\n\r\n if (taskId) {\r\n heartbeatInterval = setInterval(async () => {\r\n try {\r\n await execAsync(`redis-cli -h ${redisHost} -p ${redisPort} hset \"swarm:${taskId}:agent:${agentId}\" heartbeat \"${Date.now()}\" status \"working\"`);\r\n } catch (err) {\r\n console.error('[heartbeat] Error sending heartbeat:', err);\r\n }\r\n }, 30000); // Every 30 seconds\r\n\r\n console.log(`[heartbeat] Monitoring started for agent ${agentId} (30s interval)`);\r\n }\r\n\r\n let fullOutput = '';\r\n\r\n // If tools provided, use agentic loop with tool execution\r\n // Otherwise use simple streaming\r\n let response: MessageResponse;\r\n\r\n if (tools && tools.length > 0) {\r\n console.log(`[anthropic-client] Tools enabled: ${tools.map(t => t.name).join(', ')}`);\r\n response = await executeWithTools(\r\n {\r\n model,\r\n prompt,\r\n systemPrompt,\r\n messages,\r\n maxTokens,\r\n tools\r\n },\r\n (chunk) => {\r\n process.stdout.write(chunk);\r\n fullOutput += chunk;\r\n }\r\n );\r\n } else {\r\n response = await sendMessage(\r\n {\r\n model,\r\n prompt,\r\n systemPrompt,\r\n stream: true,\r\n messages,\r\n maxTokens,\r\n },\r\n (chunk) => {\r\n process.stdout.write(chunk);\r\n fullOutput += chunk;\r\n }\r\n );\r\n }\r\n\r\n console.log('\\n');\r\n console.log('=== Agent Execution Complete ===');\r\n console.log(`Input tokens: ${response.usage.inputTokens}`);\r\n console.log(`Output tokens: ${response.usage.outputTokens}`);\r\n console.log(`Stop reason: ${response.stopReason}`);\r\n\r\n // Stop heartbeat and send final status\r\n if (heartbeatInterval) {\r\n clearInterval(heartbeatInterval);\r\n\r\n if (taskId) {\r\n await execAsync(`redis-cli -h ${redisHost} -p ${redisPort} hset \"swarm:${taskId}:agent:${agentId}\" heartbeat \"${Date.now()}\" status \"complete\"`);\r\n console.log(`[heartbeat] Monitoring stopped - agent ${agentId} complete`);\r\n }\r\n }\r\n\r\n return {\r\n success: true,\r\n output: response.content,\r\n usage: response.usage,\r\n };\r\n } catch (error) {\r\n console.error('[anthropic-client] Error:', error);\r\n\r\n // Stop heartbeat and send error status\r\n if (heartbeatInterval) {\r\n clearInterval(heartbeatInterval);\r\n\r\n if (taskId) {\r\n try {\r\n await execAsync(`redis-cli -h ${redisHost} -p ${redisPort} hset \"swarm:${taskId}:agent:${agentId}\" heartbeat \"${Date.now()}\" status \"error\"`);\r\n console.log(`[heartbeat] Monitoring stopped - agent ${agentId} error`);\r\n } catch (err) {\r\n // Ignore heartbeat errors during error handling\r\n }\r\n }\r\n }\r\n\r\n return {\r\n success: false,\r\n output: '',\r\n usage: { inputTokens: 0, outputTokens: 0 },\r\n error: error instanceof Error ? error.message : String(error),\r\n };\r\n }\r\n}\r\n"],"names":["Anthropic","fs","path","exec","promisify","executeTool","execAsync","getAPIConfig","envProvider","process","env","CLAUDE_API_PROVIDER","provider","apiKey","ZAI_API_KEY","ANTHROPIC_API_KEY","baseURL","ZAI_BASE_URL","KIMI_API_KEY","KIMI_BASE_URL","OPENROUTER_API_KEY","OPENROUTER_BASE_URL","configPath","join","config","JSON","parse","readFile","createClient","Error","clientOptions","timeout","maxRetries","mapModelName","agentModel","zaiModelMap","haiku","sonnet","opus","modelMap","getFallbackModel","model","sendMessage","options","onChunk","client","maxTokens","temperature","enableStreaming","stream","console","log","messages","map","m","role","content","prompt","lastError","attempts","maxAttempts","currentModel","requestParams","max_tokens","systemPrompt","system","tools","length","fullContent","inputTokens","outputTokens","stopReason","create","event","type","message","usage","input_tokens","text","delta","output_tokens","stop_reason","response","filter","block","error","String","executeWithTools","totalInputTokens","totalOutputTokens","fullTextContent","MAX_ITERATIONS","iteration","textBlocks","toolUseBlocks","toolResults","toolUseBlock","toolUse","id","name","input","result","push","substring","warn","executeAgentAPI","agentType","agentId","heartbeatInterval","taskId","TASK_ID","redisHost","CFN_REDIS_HOST","redisPort","CFN_REDIS_PORT","setInterval","Date","now","err","fullOutput","t","chunk","stdout","write","clearInterval","success","output"],"mappings":"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"}
|
package/dist/cli/cfn-context.js
CHANGED
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
import { exec } from 'child_process';
|
|
3
3
|
import { promisify } from 'util';
|
|
4
4
|
const execAsync = promisify(exec);
|
|
5
|
+
// Bug #6 Fix: Read Redis connection parameters from process.env
|
|
6
|
+
const redisHost = process.env.CFN_REDIS_HOST || 'cfn-redis';
|
|
7
|
+
const redisPort = process.env.CFN_REDIS_PORT || '6379';
|
|
5
8
|
// ============================================================================
|
|
6
9
|
// Redis Epic Context Functions
|
|
7
10
|
// ============================================================================
|
|
@@ -11,7 +14,7 @@ const execAsync = promisify(exec);
|
|
|
11
14
|
* Redis key: swarm:{taskId}:epic-context
|
|
12
15
|
*/ export async function loadEpicContext(taskId) {
|
|
13
16
|
try {
|
|
14
|
-
const { stdout } = await execAsync(`redis-cli get "swarm:${taskId}:epic-context"`);
|
|
17
|
+
const { stdout } = await execAsync(`redis-cli -h ${redisHost} -p ${redisPort} get "swarm:${taskId}:epic-context"`);
|
|
15
18
|
const result = stdout.trim();
|
|
16
19
|
if (result === '(nil)' || !result) {
|
|
17
20
|
return null;
|
|
@@ -28,7 +31,7 @@ const execAsync = promisify(exec);
|
|
|
28
31
|
* Redis key: swarm:{taskId}:phase-context
|
|
29
32
|
*/ export async function loadPhaseContext(taskId) {
|
|
30
33
|
try {
|
|
31
|
-
const { stdout } = await execAsync(`redis-cli get "swarm:${taskId}:phase-context"`);
|
|
34
|
+
const { stdout } = await execAsync(`redis-cli -h ${redisHost} -p ${redisPort} get "swarm:${taskId}:phase-context"`);
|
|
32
35
|
const result = stdout.trim();
|
|
33
36
|
if (result === '(nil)' || !result) {
|
|
34
37
|
return null;
|
|
@@ -45,7 +48,7 @@ const execAsync = promisify(exec);
|
|
|
45
48
|
* Redis key: swarm:{taskId}:success-criteria
|
|
46
49
|
*/ export async function loadSuccessCriteria(taskId) {
|
|
47
50
|
try {
|
|
48
|
-
const { stdout } = await execAsync(`redis-cli get "swarm:${taskId}:success-criteria"`);
|
|
51
|
+
const { stdout } = await execAsync(`redis-cli -h ${redisHost} -p ${redisPort} get "swarm:${taskId}:success-criteria"`);
|
|
49
52
|
const result = stdout.trim();
|
|
50
53
|
if (result === '(nil)' || !result) {
|
|
51
54
|
return null;
|
|
@@ -64,7 +67,7 @@ const execAsync = promisify(exec);
|
|
|
64
67
|
*/ export async function storeEpicContext(taskId, context) {
|
|
65
68
|
try {
|
|
66
69
|
const contextJson = JSON.stringify(context);
|
|
67
|
-
await execAsync(`redis-cli setex "swarm:${taskId}:epic-context" 604800 '${contextJson.replace(/'/g, "\\'")}'`);
|
|
70
|
+
await execAsync(`redis-cli -h ${redisHost} -p ${redisPort} setex "swarm:${taskId}:epic-context" 604800 '${contextJson.replace(/'/g, "\\'")}'`);
|
|
68
71
|
console.log(`[cfn-context] Stored epic context for task ${taskId}`);
|
|
69
72
|
return true;
|
|
70
73
|
} catch (error) {
|
|
@@ -80,7 +83,7 @@ const execAsync = promisify(exec);
|
|
|
80
83
|
*/ export async function storePhaseContext(taskId, context) {
|
|
81
84
|
try {
|
|
82
85
|
const contextJson = JSON.stringify(context);
|
|
83
|
-
await execAsync(`redis-cli setex "swarm:${taskId}:phase-context" 604800 '${contextJson.replace(/'/g, "\\'")}'`);
|
|
86
|
+
await execAsync(`redis-cli -h ${redisHost} -p ${redisPort} setex "swarm:${taskId}:phase-context" 604800 '${contextJson.replace(/'/g, "\\'")}'`);
|
|
84
87
|
console.log(`[cfn-context] Stored phase context for task ${taskId}`);
|
|
85
88
|
return true;
|
|
86
89
|
} catch (error) {
|
|
@@ -96,7 +99,7 @@ const execAsync = promisify(exec);
|
|
|
96
99
|
*/ export async function storeSuccessCriteria(taskId, criteria) {
|
|
97
100
|
try {
|
|
98
101
|
const criteriaJson = JSON.stringify(criteria);
|
|
99
|
-
await execAsync(`redis-cli setex "swarm:${taskId}:success-criteria" 604800 '${criteriaJson.replace(/'/g, "\\'")}'`);
|
|
102
|
+
await execAsync(`redis-cli -h ${redisHost} -p ${redisPort} setex "swarm:${taskId}:success-criteria" 604800 '${criteriaJson.replace(/'/g, "\\'")}'`);
|
|
100
103
|
console.log(`[cfn-context] Stored success criteria for task ${taskId}`);
|
|
101
104
|
return true;
|
|
102
105
|
} catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/cfn-context.ts"],"sourcesContent":["#!/usr/bin/env node\r\n/**\r\n * cfn-context - Epic context operations for CLI agents\r\n *\r\n * Provides functions to:\r\n * 1. Load epic/phase context from Redis\r\n * 2. Store epic/phase context to Redis\r\n * 3. Format context for agent system prompts\r\n *\r\n * Also provides ACE context operations CLI:\r\n * cfn-context reflect Run ACE reflection\r\n * cfn-context curate Merge contexts\r\n * cfn-context inject Inject into tasks\r\n * cfn-context query Search contexts\r\n * cfn-context stats Show analytics\r\n */\r\n\r\nimport { spawn } from 'child_process';\r\nimport { exec } from 'child_process';\r\nimport { promisify } from 'util';\r\n\r\nconst execAsync = promisify(exec);\r\n\r\n// ============================================================================\r\n// Epic Context Interfaces (for CLI Agent System Prompts)\r\n// ============================================================================\r\n\r\nexport interface EpicContextData {\r\n epicGoal?: string;\r\n epicName?: string;\r\n inScope?: string[];\r\n outOfScope?: string[];\r\n phases?: string[];\r\n currentPhase?: string;\r\n riskProfile?: string;\r\n stakeholders?: string[];\r\n references?: string[];\r\n timeline?: {\r\n start?: string;\r\n end?: string;\r\n milestones?: Array<{ phase: string; date: string }>;\r\n };\r\n}\r\n\r\nexport interface PhaseContextData {\r\n phaseName?: string;\r\n phaseNumber?: number;\r\n dependencies?: string[];\r\n deliverables?: string[];\r\n blockers?: string[];\r\n resources?: {\r\n agentCount?: number;\r\n estimatedDuration?: number;\r\n costBudget?: number;\r\n };\r\n}\r\n\r\nexport interface SuccessCriteriaData {\r\n acceptanceCriteria?: string[];\r\n gateThreshold?: number;\r\n consensusThreshold?: number;\r\n qualityGates?: {\r\n testCoverage?: number;\r\n securityScore?: number;\r\n performanceBudget?: number;\r\n };\r\n definitionOfDone?: string[];\r\n nonFunctionalRequirements?: string[];\r\n}\r\n\r\n// ============================================================================\r\n// Redis Epic Context Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Load epic context from Redis\r\n *\r\n * Redis key: swarm:{taskId}:epic-context\r\n */\r\nexport async function loadEpicContext(taskId: string): Promise<EpicContextData | null> {\r\n try {\r\n const { stdout } = await execAsync(`redis-cli get \"swarm:${taskId}:epic-context\"`);\r\n const result = stdout.trim();\r\n\r\n if (result === '(nil)' || !result) {\r\n return null;\r\n }\r\n\r\n return JSON.parse(result) as EpicContextData;\r\n } catch (error) {\r\n console.warn(`[cfn-context] Failed to load epic context for task ${taskId}:`, error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Load phase context from Redis\r\n *\r\n * Redis key: swarm:{taskId}:phase-context\r\n */\r\nexport async function loadPhaseContext(taskId: string): Promise<PhaseContextData | null> {\r\n try {\r\n const { stdout } = await execAsync(`redis-cli get \"swarm:${taskId}:phase-context\"`);\r\n const result = stdout.trim();\r\n\r\n if (result === '(nil)' || !result) {\r\n return null;\r\n }\r\n\r\n return JSON.parse(result) as PhaseContextData;\r\n } catch (error) {\r\n console.warn(`[cfn-context] Failed to load phase context for task ${taskId}:`, error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Load success criteria from Redis\r\n *\r\n * Redis key: swarm:{taskId}:success-criteria\r\n */\r\nexport async function loadSuccessCriteria(taskId: string): Promise<SuccessCriteriaData | null> {\r\n try {\r\n const { stdout } = await execAsync(`redis-cli get \"swarm:${taskId}:success-criteria\"`);\r\n const result = stdout.trim();\r\n\r\n if (result === '(nil)' || !result) {\r\n return null;\r\n }\r\n\r\n return JSON.parse(result) as SuccessCriteriaData;\r\n } catch (error) {\r\n console.warn(`[cfn-context] Failed to load success criteria for task ${taskId}:`, error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Store epic context to Redis\r\n *\r\n * Redis key: swarm:{taskId}:epic-context\r\n * TTL: 7 days\r\n */\r\nexport async function storeEpicContext(taskId: string, context: EpicContextData): Promise<boolean> {\r\n try {\r\n const contextJson = JSON.stringify(context);\r\n await execAsync(`redis-cli setex \"swarm:${taskId}:epic-context\" 604800 '${contextJson.replace(/'/g, \"\\\\'\")}'`);\r\n console.log(`[cfn-context] Stored epic context for task ${taskId}`);\r\n return true;\r\n } catch (error) {\r\n console.error(`[cfn-context] Failed to store epic context for task ${taskId}:`, error);\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Store phase context to Redis\r\n *\r\n * Redis key: swarm:{taskId}:phase-context\r\n * TTL: 7 days\r\n */\r\nexport async function storePhaseContext(taskId: string, context: PhaseContextData): Promise<boolean> {\r\n try {\r\n const contextJson = JSON.stringify(context);\r\n await execAsync(`redis-cli setex \"swarm:${taskId}:phase-context\" 604800 '${contextJson.replace(/'/g, \"\\\\'\")}'`);\r\n console.log(`[cfn-context] Stored phase context for task ${taskId}`);\r\n return true;\r\n } catch (error) {\r\n console.error(`[cfn-context] Failed to store phase context for task ${taskId}:`, error);\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Store success criteria to Redis\r\n *\r\n * Redis key: swarm:{taskId}:success-criteria\r\n * TTL: 7 days\r\n */\r\nexport async function storeSuccessCriteria(taskId: string, criteria: SuccessCriteriaData): Promise<boolean> {\r\n try {\r\n const criteriaJson = JSON.stringify(criteria);\r\n await execAsync(`redis-cli setex \"swarm:${taskId}:success-criteria\" 604800 '${criteriaJson.replace(/'/g, \"\\\\'\")}'`);\r\n console.log(`[cfn-context] Stored success criteria for task ${taskId}`);\r\n return true;\r\n } catch (error) {\r\n console.error(`[cfn-context] Failed to store success criteria for task ${taskId}:`, error);\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Format epic context as markdown for system prompt\r\n */\r\nexport function formatEpicContextForPrompt(epic: EpicContextData): string {\r\n if (!epic.epicGoal && !epic.inScope && !epic.outOfScope) {\r\n return '';\r\n }\r\n\r\n const sections: string[] = [];\r\n\r\n sections.push('## Epic Context');\r\n sections.push('');\r\n\r\n if (epic.epicName) {\r\n sections.push(`**Epic:** ${epic.epicName}`);\r\n sections.push('');\r\n }\r\n\r\n if (epic.epicGoal) {\r\n sections.push('**Goal:**');\r\n sections.push(epic.epicGoal);\r\n sections.push('');\r\n }\r\n\r\n if (epic.currentPhase) {\r\n sections.push(`**Current Phase:** ${epic.currentPhase}`);\r\n sections.push('');\r\n }\r\n\r\n if (epic.inScope && epic.inScope.length > 0) {\r\n sections.push('**In Scope:**');\r\n for (const item of epic.inScope) {\r\n sections.push(`- ${item}`);\r\n }\r\n sections.push('');\r\n }\r\n\r\n if (epic.outOfScope && epic.outOfScope.length > 0) {\r\n sections.push('**Out of Scope:**');\r\n for (const item of epic.outOfScope) {\r\n sections.push(`- ${item}`);\r\n }\r\n sections.push('');\r\n }\r\n\r\n if (epic.references && epic.references.length > 0) {\r\n sections.push('**References:**');\r\n for (const ref of epic.references) {\r\n sections.push(`- ${ref}`);\r\n }\r\n sections.push('');\r\n }\r\n\r\n return sections.join('\\n');\r\n}\r\n\r\n// ============================================================================\r\n// ACE Context Operations CLI (Original Functionality)\r\n// ============================================================================\r\n\r\ninterface ContextOptions {\r\n category?: string;\r\n tags?: string;\r\n confidence?: number;\r\n limit?: number;\r\n taskId?: string;\r\n phase?: string;\r\n}\r\n\r\nfunction parseArgs(args: string[]): { subcommand: string; query?: string; options: ContextOptions } {\r\n const subcommand = args[0] || 'stats';\r\n let query: string | undefined;\r\n const options: ContextOptions = {};\r\n\r\n // For query subcommand, first arg after subcommand is the query\r\n if (subcommand === 'query' && args[1] && !args[1].startsWith('--')) {\r\n query = args[1];\r\n }\r\n\r\n for (let i = 1; i < args.length; i += 2) {\r\n const key = args[i];\r\n const value = args[i + 1];\r\n\r\n switch (key) {\r\n case '--category':\r\n options.category = value;\r\n break;\r\n case '--tags':\r\n options.tags = value;\r\n break;\r\n case '--confidence':\r\n options.confidence = parseFloat(value);\r\n break;\r\n case '--limit':\r\n options.limit = parseInt(value, 10);\r\n break;\r\n case '--task-id':\r\n options.taskId = value;\r\n break;\r\n case '--phase':\r\n options.phase = value;\r\n break;\r\n }\r\n }\r\n\r\n return { subcommand, query, options };\r\n}\r\n\r\nasync function executeContext(subcommand: string, query: string | undefined, options: ContextOptions): Promise<void> {\r\n let slashCommand: string;\r\n\r\n switch (subcommand) {\r\n case 'reflect':\r\n slashCommand = '/context-reflect';\r\n if (options.taskId) slashCommand += ` --task-id ${options.taskId}`;\r\n break;\r\n\r\n case 'curate':\r\n slashCommand = '/context-curate';\r\n break;\r\n\r\n case 'inject':\r\n slashCommand = '/context-inject';\r\n if (options.taskId) slashCommand += ` --task-id ${options.taskId}`;\r\n if (options.phase) slashCommand += ` --phase ${options.phase}`;\r\n break;\r\n\r\n case 'query':\r\n if (!query) {\r\n console.error('Error: Query string required for query subcommand');\r\n console.error('Usage: cfn-context query <search-term> [options]');\r\n process.exit(1);\r\n }\r\n slashCommand = `/context-query \"${query}\"`;\r\n if (options.category) slashCommand += ` --category ${options.category}`;\r\n if (options.tags) slashCommand += ` --tags ${options.tags}`;\r\n if (options.confidence) slashCommand += ` --confidence ${options.confidence}`;\r\n break;\r\n\r\n case 'stats':\r\n slashCommand = '/context-stats';\r\n break;\r\n\r\n default:\r\n console.error(`Unknown subcommand: ${subcommand}`);\r\n console.error('Valid subcommands: reflect, curate, inject, query, stats');\r\n process.exit(1);\r\n }\r\n\r\n console.log(`[cfn-context] Executing: ${slashCommand}`);\r\n console.log('[cfn-context] Note: This delegates to claude-flow-novice slash commands');\r\n console.log('[cfn-context] Use Claude Code CLI for actual execution\\n');\r\n\r\n console.log('To execute this context operation, run in Claude Code:');\r\n console.log(` ${slashCommand}`);\r\n}\r\n\r\nfunction showHelp(): void {\r\n console.log(`\r\ncfn-context - ACE Context Operations CLI\r\n\r\nUsage:\r\n cfn-context reflect [options] Run ACE reflection on recent tasks\r\n cfn-context curate Merge reflection deltas into context\r\n cfn-context inject [options] Inject context into tasks\r\n cfn-context query <term> [options] Search contexts\r\n cfn-context stats Show context analytics\r\n\r\nOptions (reflect):\r\n --task-id <id> Reflect on specific task\r\n\r\nOptions (inject):\r\n --task-id <id> Inject into specific task\r\n --phase <name> Inject based on phase\r\n\r\nOptions (query):\r\n --category <cat> Filter by category\r\n --tags <tags> Filter by tags (comma-separated)\r\n --confidence <n> Minimum confidence score (0-1)\r\n --limit <n> Max results\r\n\r\nExamples:\r\n cfn-context reflect --task-id task-123\r\n cfn-context curate\r\n cfn-context inject --phase implementation\r\n cfn-context query \"redis coordination\" --category technical\r\n cfn-context stats\r\n\r\nContext Categories:\r\n technical Technical patterns and solutions\r\n architectural Design decisions and patterns\r\n operational Deployment and operations\r\n quality Testing and quality practices\r\n\r\nFor more info: https://docs.claude.com/cfn-context\r\n `);\r\n}\r\n\r\nasync function main(args: string[] = process.argv.slice(2)): Promise<void> {\r\n if (args.includes('--help') || args.includes('-h')) {\r\n showHelp();\r\n return;\r\n }\r\n\r\n const { subcommand, query, options } = parseArgs(args);\r\n await executeContext(subcommand, query, options);\r\n}\r\n\r\n// Run if called directly\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-context] Fatal error:', err);\r\n process.exit(1);\r\n });\r\n}\r\n\r\nexport { main };\r\n"],"names":["exec","promisify","execAsync","loadEpicContext","taskId","stdout","result","trim","JSON","parse","error","console","warn","loadPhaseContext","loadSuccessCriteria","storeEpicContext","context","contextJson","stringify","replace","log","storePhaseContext","storeSuccessCriteria","criteria","criteriaJson","formatEpicContextForPrompt","epic","epicGoal","inScope","outOfScope","sections","push","epicName","currentPhase","length","item","references","ref","join","parseArgs","args","subcommand","query","options","startsWith","i","key","value","category","tags","confidence","parseFloat","limit","parseInt","phase","executeContext","slashCommand","process","exit","showHelp","main","argv","slice","includes","isMainModule","url","endsWith","catch","err"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/cfn-context.ts"],"sourcesContent":["#!/usr/bin/env node\r\n/**\r\n * cfn-context - Epic context operations for CLI agents\r\n *\r\n * Provides functions to:\r\n * 1. Load epic/phase context from Redis\r\n * 2. Store epic/phase context to Redis\r\n * 3. Format context for agent system prompts\r\n *\r\n * Also provides ACE context operations CLI:\r\n * cfn-context reflect Run ACE reflection\r\n * cfn-context curate Merge contexts\r\n * cfn-context inject Inject into tasks\r\n * cfn-context query Search contexts\r\n * cfn-context stats Show analytics\r\n */\r\n\r\nimport { spawn } from 'child_process';\r\nimport { exec } from 'child_process';\r\nimport { promisify } from 'util';\r\n\r\nconst execAsync = promisify(exec);\r\n\r\n// Bug #6 Fix: Read Redis connection parameters from process.env\r\nconst redisHost = process.env.CFN_REDIS_HOST || 'cfn-redis';\r\nconst redisPort = process.env.CFN_REDIS_PORT || '6379';\r\n\r\n// ============================================================================\r\n// Epic Context Interfaces (for CLI Agent System Prompts)\r\n// ============================================================================\r\n\r\nexport interface EpicContextData {\r\n epicGoal?: string;\r\n epicName?: string;\r\n inScope?: string[];\r\n outOfScope?: string[];\r\n phases?: string[];\r\n currentPhase?: string;\r\n riskProfile?: string;\r\n stakeholders?: string[];\r\n references?: string[];\r\n timeline?: {\r\n start?: string;\r\n end?: string;\r\n milestones?: Array<{ phase: string; date: string }>;\r\n };\r\n}\r\n\r\nexport interface PhaseContextData {\r\n phaseName?: string;\r\n phaseNumber?: number;\r\n dependencies?: string[];\r\n deliverables?: string[];\r\n blockers?: string[];\r\n resources?: {\r\n agentCount?: number;\r\n estimatedDuration?: number;\r\n costBudget?: number;\r\n };\r\n}\r\n\r\nexport interface SuccessCriteriaData {\r\n acceptanceCriteria?: string[];\r\n gateThreshold?: number;\r\n consensusThreshold?: number;\r\n qualityGates?: {\r\n testCoverage?: number;\r\n securityScore?: number;\r\n performanceBudget?: number;\r\n };\r\n definitionOfDone?: string[];\r\n nonFunctionalRequirements?: string[];\r\n}\r\n\r\n// ============================================================================\r\n// Redis Epic Context Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Load epic context from Redis\r\n *\r\n * Redis key: swarm:{taskId}:epic-context\r\n */\r\nexport async function loadEpicContext(taskId: string): Promise<EpicContextData | null> {\r\n try {\r\n const { stdout } = await execAsync(`redis-cli -h ${redisHost} -p ${redisPort} get \"swarm:${taskId}:epic-context\"`);\r\n const result = stdout.trim();\r\n\r\n if (result === '(nil)' || !result) {\r\n return null;\r\n }\r\n\r\n return JSON.parse(result) as EpicContextData;\r\n } catch (error) {\r\n console.warn(`[cfn-context] Failed to load epic context for task ${taskId}:`, error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Load phase context from Redis\r\n *\r\n * Redis key: swarm:{taskId}:phase-context\r\n */\r\nexport async function loadPhaseContext(taskId: string): Promise<PhaseContextData | null> {\r\n try {\r\n const { stdout } = await execAsync(`redis-cli -h ${redisHost} -p ${redisPort} get \"swarm:${taskId}:phase-context\"`);\r\n const result = stdout.trim();\r\n\r\n if (result === '(nil)' || !result) {\r\n return null;\r\n }\r\n\r\n return JSON.parse(result) as PhaseContextData;\r\n } catch (error) {\r\n console.warn(`[cfn-context] Failed to load phase context for task ${taskId}:`, error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Load success criteria from Redis\r\n *\r\n * Redis key: swarm:{taskId}:success-criteria\r\n */\r\nexport async function loadSuccessCriteria(taskId: string): Promise<SuccessCriteriaData | null> {\r\n try {\r\n const { stdout } = await execAsync(`redis-cli -h ${redisHost} -p ${redisPort} get \"swarm:${taskId}:success-criteria\"`);\r\n const result = stdout.trim();\r\n\r\n if (result === '(nil)' || !result) {\r\n return null;\r\n }\r\n\r\n return JSON.parse(result) as SuccessCriteriaData;\r\n } catch (error) {\r\n console.warn(`[cfn-context] Failed to load success criteria for task ${taskId}:`, error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Store epic context to Redis\r\n *\r\n * Redis key: swarm:{taskId}:epic-context\r\n * TTL: 7 days\r\n */\r\nexport async function storeEpicContext(taskId: string, context: EpicContextData): Promise<boolean> {\r\n try {\r\n const contextJson = JSON.stringify(context);\r\n await execAsync(`redis-cli -h ${redisHost} -p ${redisPort} setex \"swarm:${taskId}:epic-context\" 604800 '${contextJson.replace(/'/g, \"\\\\'\")}'`);\r\n console.log(`[cfn-context] Stored epic context for task ${taskId}`);\r\n return true;\r\n } catch (error) {\r\n console.error(`[cfn-context] Failed to store epic context for task ${taskId}:`, error);\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Store phase context to Redis\r\n *\r\n * Redis key: swarm:{taskId}:phase-context\r\n * TTL: 7 days\r\n */\r\nexport async function storePhaseContext(taskId: string, context: PhaseContextData): Promise<boolean> {\r\n try {\r\n const contextJson = JSON.stringify(context);\r\n await execAsync(`redis-cli -h ${redisHost} -p ${redisPort} setex \"swarm:${taskId}:phase-context\" 604800 '${contextJson.replace(/'/g, \"\\\\'\")}'`);\r\n console.log(`[cfn-context] Stored phase context for task ${taskId}`);\r\n return true;\r\n } catch (error) {\r\n console.error(`[cfn-context] Failed to store phase context for task ${taskId}:`, error);\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Store success criteria to Redis\r\n *\r\n * Redis key: swarm:{taskId}:success-criteria\r\n * TTL: 7 days\r\n */\r\nexport async function storeSuccessCriteria(taskId: string, criteria: SuccessCriteriaData): Promise<boolean> {\r\n try {\r\n const criteriaJson = JSON.stringify(criteria);\r\n await execAsync(`redis-cli -h ${redisHost} -p ${redisPort} setex \"swarm:${taskId}:success-criteria\" 604800 '${criteriaJson.replace(/'/g, \"\\\\'\")}'`);\r\n console.log(`[cfn-context] Stored success criteria for task ${taskId}`);\r\n return true;\r\n } catch (error) {\r\n console.error(`[cfn-context] Failed to store success criteria for task ${taskId}:`, error);\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Format epic context as markdown for system prompt\r\n */\r\nexport function formatEpicContextForPrompt(epic: EpicContextData): string {\r\n if (!epic.epicGoal && !epic.inScope && !epic.outOfScope) {\r\n return '';\r\n }\r\n\r\n const sections: string[] = [];\r\n\r\n sections.push('## Epic Context');\r\n sections.push('');\r\n\r\n if (epic.epicName) {\r\n sections.push(`**Epic:** ${epic.epicName}`);\r\n sections.push('');\r\n }\r\n\r\n if (epic.epicGoal) {\r\n sections.push('**Goal:**');\r\n sections.push(epic.epicGoal);\r\n sections.push('');\r\n }\r\n\r\n if (epic.currentPhase) {\r\n sections.push(`**Current Phase:** ${epic.currentPhase}`);\r\n sections.push('');\r\n }\r\n\r\n if (epic.inScope && epic.inScope.length > 0) {\r\n sections.push('**In Scope:**');\r\n for (const item of epic.inScope) {\r\n sections.push(`- ${item}`);\r\n }\r\n sections.push('');\r\n }\r\n\r\n if (epic.outOfScope && epic.outOfScope.length > 0) {\r\n sections.push('**Out of Scope:**');\r\n for (const item of epic.outOfScope) {\r\n sections.push(`- ${item}`);\r\n }\r\n sections.push('');\r\n }\r\n\r\n if (epic.references && epic.references.length > 0) {\r\n sections.push('**References:**');\r\n for (const ref of epic.references) {\r\n sections.push(`- ${ref}`);\r\n }\r\n sections.push('');\r\n }\r\n\r\n return sections.join('\\n');\r\n}\r\n\r\n// ============================================================================\r\n// ACE Context Operations CLI (Original Functionality)\r\n// ============================================================================\r\n\r\ninterface ContextOptions {\r\n category?: string;\r\n tags?: string;\r\n confidence?: number;\r\n limit?: number;\r\n taskId?: string;\r\n phase?: string;\r\n}\r\n\r\nfunction parseArgs(args: string[]): { subcommand: string; query?: string; options: ContextOptions } {\r\n const subcommand = args[0] || 'stats';\r\n let query: string | undefined;\r\n const options: ContextOptions = {};\r\n\r\n // For query subcommand, first arg after subcommand is the query\r\n if (subcommand === 'query' && args[1] && !args[1].startsWith('--')) {\r\n query = args[1];\r\n }\r\n\r\n for (let i = 1; i < args.length; i += 2) {\r\n const key = args[i];\r\n const value = args[i + 1];\r\n\r\n switch (key) {\r\n case '--category':\r\n options.category = value;\r\n break;\r\n case '--tags':\r\n options.tags = value;\r\n break;\r\n case '--confidence':\r\n options.confidence = parseFloat(value);\r\n break;\r\n case '--limit':\r\n options.limit = parseInt(value, 10);\r\n break;\r\n case '--task-id':\r\n options.taskId = value;\r\n break;\r\n case '--phase':\r\n options.phase = value;\r\n break;\r\n }\r\n }\r\n\r\n return { subcommand, query, options };\r\n}\r\n\r\nasync function executeContext(subcommand: string, query: string | undefined, options: ContextOptions): Promise<void> {\r\n let slashCommand: string;\r\n\r\n switch (subcommand) {\r\n case 'reflect':\r\n slashCommand = '/context-reflect';\r\n if (options.taskId) slashCommand += ` --task-id ${options.taskId}`;\r\n break;\r\n\r\n case 'curate':\r\n slashCommand = '/context-curate';\r\n break;\r\n\r\n case 'inject':\r\n slashCommand = '/context-inject';\r\n if (options.taskId) slashCommand += ` --task-id ${options.taskId}`;\r\n if (options.phase) slashCommand += ` --phase ${options.phase}`;\r\n break;\r\n\r\n case 'query':\r\n if (!query) {\r\n console.error('Error: Query string required for query subcommand');\r\n console.error('Usage: cfn-context query <search-term> [options]');\r\n process.exit(1);\r\n }\r\n slashCommand = `/context-query \"${query}\"`;\r\n if (options.category) slashCommand += ` --category ${options.category}`;\r\n if (options.tags) slashCommand += ` --tags ${options.tags}`;\r\n if (options.confidence) slashCommand += ` --confidence ${options.confidence}`;\r\n break;\r\n\r\n case 'stats':\r\n slashCommand = '/context-stats';\r\n break;\r\n\r\n default:\r\n console.error(`Unknown subcommand: ${subcommand}`);\r\n console.error('Valid subcommands: reflect, curate, inject, query, stats');\r\n process.exit(1);\r\n }\r\n\r\n console.log(`[cfn-context] Executing: ${slashCommand}`);\r\n console.log('[cfn-context] Note: This delegates to claude-flow-novice slash commands');\r\n console.log('[cfn-context] Use Claude Code CLI for actual execution\\n');\r\n\r\n console.log('To execute this context operation, run in Claude Code:');\r\n console.log(` ${slashCommand}`);\r\n}\r\n\r\nfunction showHelp(): void {\r\n console.log(`\r\ncfn-context - ACE Context Operations CLI\r\n\r\nUsage:\r\n cfn-context reflect [options] Run ACE reflection on recent tasks\r\n cfn-context curate Merge reflection deltas into context\r\n cfn-context inject [options] Inject context into tasks\r\n cfn-context query <term> [options] Search contexts\r\n cfn-context stats Show context analytics\r\n\r\nOptions (reflect):\r\n --task-id <id> Reflect on specific task\r\n\r\nOptions (inject):\r\n --task-id <id> Inject into specific task\r\n --phase <name> Inject based on phase\r\n\r\nOptions (query):\r\n --category <cat> Filter by category\r\n --tags <tags> Filter by tags (comma-separated)\r\n --confidence <n> Minimum confidence score (0-1)\r\n --limit <n> Max results\r\n\r\nExamples:\r\n cfn-context reflect --task-id task-123\r\n cfn-context curate\r\n cfn-context inject --phase implementation\r\n cfn-context query \"redis coordination\" --category technical\r\n cfn-context stats\r\n\r\nContext Categories:\r\n technical Technical patterns and solutions\r\n architectural Design decisions and patterns\r\n operational Deployment and operations\r\n quality Testing and quality practices\r\n\r\nFor more info: https://docs.claude.com/cfn-context\r\n `);\r\n}\r\n\r\nasync function main(args: string[] = process.argv.slice(2)): Promise<void> {\r\n if (args.includes('--help') || args.includes('-h')) {\r\n showHelp();\r\n return;\r\n }\r\n\r\n const { subcommand, query, options } = parseArgs(args);\r\n await executeContext(subcommand, query, options);\r\n}\r\n\r\n// Run if called directly\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-context] Fatal error:', err);\r\n process.exit(1);\r\n });\r\n}\r\n\r\nexport { main };\r\n"],"names":["exec","promisify","execAsync","redisHost","process","env","CFN_REDIS_HOST","redisPort","CFN_REDIS_PORT","loadEpicContext","taskId","stdout","result","trim","JSON","parse","error","console","warn","loadPhaseContext","loadSuccessCriteria","storeEpicContext","context","contextJson","stringify","replace","log","storePhaseContext","storeSuccessCriteria","criteria","criteriaJson","formatEpicContextForPrompt","epic","epicGoal","inScope","outOfScope","sections","push","epicName","currentPhase","length","item","references","ref","join","parseArgs","args","subcommand","query","options","startsWith","i","key","value","category","tags","confidence","parseFloat","limit","parseInt","phase","executeContext","slashCommand","exit","showHelp","main","argv","slice","includes","isMainModule","url","endsWith","catch","err"],"mappings":"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"}
|
package/dist/cli/cfn-metrics.js
CHANGED
|
@@ -8,6 +8,9 @@
|
|
|
8
8
|
* cfn-metrics fleet Show fleet status
|
|
9
9
|
*/ import { spawn } from 'child_process';
|
|
10
10
|
import { resolve } from 'path';
|
|
11
|
+
// Bug #6 Fix: Read Redis connection parameters from process.env
|
|
12
|
+
const redisHost = process.env.CFN_REDIS_HOST || 'cfn-redis';
|
|
13
|
+
const redisPort = process.env.CFN_REDIS_PORT || '6379';
|
|
11
14
|
function parseArgs(args) {
|
|
12
15
|
const subcommand = args[0] || 'fleet';
|
|
13
16
|
const options = {};
|
|
@@ -73,6 +76,10 @@ async function executeMetrics(subcommand, options) {
|
|
|
73
76
|
// Query Redis for consensus data
|
|
74
77
|
const redisKey = `swarm:${options.taskId}:consensus:*`;
|
|
75
78
|
const proc = spawn('redis-cli', [
|
|
79
|
+
'-h',
|
|
80
|
+
redisHost,
|
|
81
|
+
'-p',
|
|
82
|
+
redisPort,
|
|
76
83
|
'--scan',
|
|
77
84
|
'--pattern',
|
|
78
85
|
redisKey
|
|
@@ -82,7 +89,7 @@ async function executeMetrics(subcommand, options) {
|
|
|
82
89
|
proc.on('exit', (code)=>{
|
|
83
90
|
if (code === 0) {
|
|
84
91
|
console.log('\nTo see consensus values, run:');
|
|
85
|
-
console.log(` redis-cli get swarm:${options.taskId}:consensus:loop2`);
|
|
92
|
+
console.log(` redis-cli -h ${redisHost} -p ${redisPort} get swarm:${options.taskId}:consensus:loop2`);
|
|
86
93
|
}
|
|
87
94
|
process.exit(code || 0);
|
|
88
95
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/cfn-metrics.ts"],"sourcesContent":["#!/usr/bin/env node\r\n/**\r\n * cfn-metrics - Monitoring and analytics\r\n *\r\n * Usage:\r\n * cfn-metrics agent Show agent metrics\r\n * cfn-metrics consensus Show consensus scores\r\n * cfn-metrics fleet Show fleet status\r\n */\r\n\r\nimport { spawn } from 'child_process';\r\nimport { resolve } from 'path';\r\n\r\ninterface MetricsOptions {\r\n agentId?: string;\r\n taskId?: string;\r\n period?: string;\r\n format?: string;\r\n}\r\n\r\nfunction parseArgs(args: string[]): { subcommand: string; options: MetricsOptions } {\r\n const subcommand = args[0] || 'fleet';\r\n const options: MetricsOptions = {};\r\n\r\n for (let i = 1; i < args.length; i += 2) {\r\n const key = args[i];\r\n const value = args[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 '--period':\r\n options.period = value;\r\n break;\r\n case '--format':\r\n options.format = value;\r\n break;\r\n }\r\n }\r\n\r\n return { subcommand, options };\r\n}\r\n\r\nasync function executeMetrics(subcommand: string, options: MetricsOptions): Promise<void> {\r\n const portalPath = resolve(process.cwd(), '.claude/skills/web-portal');\r\n\r\n switch (subcommand) {\r\n case 'agent': {\r\n console.log('[cfn-metrics] Fetching agent metrics...');\r\n\r\n const script = resolve(portalPath, 'invoke-portal-metrics.sh');\r\n const args: string[] = [];\r\n\r\n if (options.agentId) {\r\n args.push('--agent-id', options.agentId);\r\n }\r\n if (options.period) {\r\n args.push('--period', options.period);\r\n }\r\n\r\n const proc = spawn('bash', [script, ...args], { stdio: 'inherit' });\r\n\r\n proc.on('exit', (code) => process.exit(code || 0));\r\n proc.on('error', (err) => {\r\n console.error('[cfn-metrics] Error:', err.message);\r\n console.log('\\nFallback: Use web portal for metrics:');\r\n console.log(' http://localhost:3000/metrics');\r\n process.exit(1);\r\n });\r\n break;\r\n }\r\n\r\n case 'consensus': {\r\n console.log('[cfn-metrics] Fetching consensus scores...');\r\n\r\n if (!options.taskId) {\r\n console.error('Error: --task-id required for consensus metrics');\r\n process.exit(1);\r\n }\r\n\r\n // Query Redis for consensus data\r\n const redisKey = `swarm:${options.taskId}:consensus:*`;\r\n const proc = spawn('redis-cli', ['--scan', '--pattern', redisKey], { stdio: 'inherit' });\r\n\r\n proc.on('exit', (code) => {\r\n if (code === 0) {\r\n console.log('\\nTo see consensus values, run:');\r\n console.log(` redis-cli get swarm:${options.taskId}:consensus:loop2`);\r\n }\r\n process.exit(code || 0);\r\n });\r\n\r\n proc.on('error', (err) => {\r\n console.error('[cfn-metrics] Redis error:', err.message);\r\n process.exit(1);\r\n });\r\n break;\r\n }\r\n\r\n case 'fleet': {\r\n console.log('[cfn-metrics] Fetching fleet status...');\r\n\r\n const script = resolve(portalPath, 'invoke-portal-agents.sh');\r\n const proc = spawn('bash', [script, '--status', 'all'], { stdio: 'inherit' });\r\n\r\n proc.on('exit', (code) => process.exit(code || 0));\r\n proc.on('error', (err) => {\r\n console.error('[cfn-metrics] Error:', err.message);\r\n process.exit(1);\r\n });\r\n break;\r\n }\r\n\r\n default:\r\n console.error(`Unknown subcommand: ${subcommand}`);\r\n console.error('Valid subcommands: agent, consensus, fleet');\r\n process.exit(1);\r\n }\r\n}\r\n\r\nfunction showHelp(): void {\r\n console.log(`\r\ncfn-metrics - Monitoring and Analytics CLI\r\n\r\nUsage:\r\n cfn-metrics agent [options] Show agent performance metrics\r\n cfn-metrics consensus [options] Show consensus scores\r\n cfn-metrics fleet Show fleet status\r\n\r\nOptions (agent):\r\n --agent-id <id> Specific agent metrics\r\n --period <time> Time period (1h, 24h, 7d)\r\n --format <type> Output format (json, table)\r\n\r\nOptions (consensus):\r\n --task-id <id> Task to show consensus for (required)\r\n\r\nExamples:\r\n cfn-metrics agent --agent-id coder-1 --period 1h\r\n cfn-metrics consensus --task-id task-123\r\n cfn-metrics fleet\r\n\r\nMetrics Available:\r\n - Agent execution time\r\n - Confidence scores over time\r\n - Tool usage statistics\r\n - Consensus validation results\r\n - Fleet health and availability\r\n\r\nIntegration: Metrics also available via web portal at http://localhost:3000/metrics\r\n\r\nFor more info: https://docs.claude.com/cfn-metrics\r\n `);\r\n}\r\n\r\nasync function main(args: string[] = process.argv.slice(2)): Promise<void> {\r\n if (args.includes('--help') || args.includes('-h')) {\r\n showHelp();\r\n return;\r\n }\r\n\r\n const { subcommand, options } = parseArgs(args);\r\n await executeMetrics(subcommand, options);\r\n}\r\n\r\n// Run if called directly\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-metrics] Fatal error:', err);\r\n process.exit(1);\r\n });\r\n}\r\n\r\nexport { main };\r\n"],"names":["spawn","resolve","parseArgs","args","subcommand","options","i","length","key","value","agentId","taskId","period","format","executeMetrics","portalPath","
|
|
1
|
+
{"version":3,"sources":["../../src/cli/cfn-metrics.ts"],"sourcesContent":["#!/usr/bin/env node\r\n/**\r\n * cfn-metrics - Monitoring and analytics\r\n *\r\n * Usage:\r\n * cfn-metrics agent Show agent metrics\r\n * cfn-metrics consensus Show consensus scores\r\n * cfn-metrics fleet Show fleet status\r\n */\r\n\r\nimport { spawn } from 'child_process';\r\nimport { resolve } from 'path';\r\n\r\n// Bug #6 Fix: Read Redis connection parameters from process.env\r\nconst redisHost = process.env.CFN_REDIS_HOST || 'cfn-redis';\r\nconst redisPort = process.env.CFN_REDIS_PORT || '6379';\r\n\r\ninterface MetricsOptions {\r\n agentId?: string;\r\n taskId?: string;\r\n period?: string;\r\n format?: string;\r\n}\r\n\r\nfunction parseArgs(args: string[]): { subcommand: string; options: MetricsOptions } {\r\n const subcommand = args[0] || 'fleet';\r\n const options: MetricsOptions = {};\r\n\r\n for (let i = 1; i < args.length; i += 2) {\r\n const key = args[i];\r\n const value = args[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 '--period':\r\n options.period = value;\r\n break;\r\n case '--format':\r\n options.format = value;\r\n break;\r\n }\r\n }\r\n\r\n return { subcommand, options };\r\n}\r\n\r\nasync function executeMetrics(subcommand: string, options: MetricsOptions): Promise<void> {\r\n const portalPath = resolve(process.cwd(), '.claude/skills/web-portal');\r\n\r\n switch (subcommand) {\r\n case 'agent': {\r\n console.log('[cfn-metrics] Fetching agent metrics...');\r\n\r\n const script = resolve(portalPath, 'invoke-portal-metrics.sh');\r\n const args: string[] = [];\r\n\r\n if (options.agentId) {\r\n args.push('--agent-id', options.agentId);\r\n }\r\n if (options.period) {\r\n args.push('--period', options.period);\r\n }\r\n\r\n const proc = spawn('bash', [script, ...args], { stdio: 'inherit' });\r\n\r\n proc.on('exit', (code) => process.exit(code || 0));\r\n proc.on('error', (err) => {\r\n console.error('[cfn-metrics] Error:', err.message);\r\n console.log('\\nFallback: Use web portal for metrics:');\r\n console.log(' http://localhost:3000/metrics');\r\n process.exit(1);\r\n });\r\n break;\r\n }\r\n\r\n case 'consensus': {\r\n console.log('[cfn-metrics] Fetching consensus scores...');\r\n\r\n if (!options.taskId) {\r\n console.error('Error: --task-id required for consensus metrics');\r\n process.exit(1);\r\n }\r\n\r\n // Query Redis for consensus data\r\n const redisKey = `swarm:${options.taskId}:consensus:*`;\r\n const proc = spawn('redis-cli', ['-h', redisHost, '-p', redisPort, '--scan', '--pattern', redisKey], { stdio: 'inherit' });\r\n\r\n proc.on('exit', (code) => {\r\n if (code === 0) {\r\n console.log('\\nTo see consensus values, run:');\r\n console.log(` redis-cli -h ${redisHost} -p ${redisPort} get swarm:${options.taskId}:consensus:loop2`);\r\n }\r\n process.exit(code || 0);\r\n });\r\n\r\n proc.on('error', (err) => {\r\n console.error('[cfn-metrics] Redis error:', err.message);\r\n process.exit(1);\r\n });\r\n break;\r\n }\r\n\r\n case 'fleet': {\r\n console.log('[cfn-metrics] Fetching fleet status...');\r\n\r\n const script = resolve(portalPath, 'invoke-portal-agents.sh');\r\n const proc = spawn('bash', [script, '--status', 'all'], { stdio: 'inherit' });\r\n\r\n proc.on('exit', (code) => process.exit(code || 0));\r\n proc.on('error', (err) => {\r\n console.error('[cfn-metrics] Error:', err.message);\r\n process.exit(1);\r\n });\r\n break;\r\n }\r\n\r\n default:\r\n console.error(`Unknown subcommand: ${subcommand}`);\r\n console.error('Valid subcommands: agent, consensus, fleet');\r\n process.exit(1);\r\n }\r\n}\r\n\r\nfunction showHelp(): void {\r\n console.log(`\r\ncfn-metrics - Monitoring and Analytics CLI\r\n\r\nUsage:\r\n cfn-metrics agent [options] Show agent performance metrics\r\n cfn-metrics consensus [options] Show consensus scores\r\n cfn-metrics fleet Show fleet status\r\n\r\nOptions (agent):\r\n --agent-id <id> Specific agent metrics\r\n --period <time> Time period (1h, 24h, 7d)\r\n --format <type> Output format (json, table)\r\n\r\nOptions (consensus):\r\n --task-id <id> Task to show consensus for (required)\r\n\r\nExamples:\r\n cfn-metrics agent --agent-id coder-1 --period 1h\r\n cfn-metrics consensus --task-id task-123\r\n cfn-metrics fleet\r\n\r\nMetrics Available:\r\n - Agent execution time\r\n - Confidence scores over time\r\n - Tool usage statistics\r\n - Consensus validation results\r\n - Fleet health and availability\r\n\r\nIntegration: Metrics also available via web portal at http://localhost:3000/metrics\r\n\r\nFor more info: https://docs.claude.com/cfn-metrics\r\n `);\r\n}\r\n\r\nasync function main(args: string[] = process.argv.slice(2)): Promise<void> {\r\n if (args.includes('--help') || args.includes('-h')) {\r\n showHelp();\r\n return;\r\n }\r\n\r\n const { subcommand, options } = parseArgs(args);\r\n await executeMetrics(subcommand, options);\r\n}\r\n\r\n// Run if called directly\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-metrics] Fatal error:', err);\r\n process.exit(1);\r\n });\r\n}\r\n\r\nexport { main };\r\n"],"names":["spawn","resolve","redisHost","process","env","CFN_REDIS_HOST","redisPort","CFN_REDIS_PORT","parseArgs","args","subcommand","options","i","length","key","value","agentId","taskId","period","format","executeMetrics","portalPath","cwd","console","log","script","push","proc","stdio","on","code","exit","err","error","message","redisKey","showHelp","main","argv","slice","includes","isMainModule","url","endsWith","replace","catch"],"mappings":"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"}
|
package/dist/cli/cfn-redis.js
CHANGED
|
@@ -8,6 +8,9 @@
|
|
|
8
8
|
* cfn-redis event Handle pub/sub events
|
|
9
9
|
*/ import { spawn } from 'child_process';
|
|
10
10
|
import { resolve } from 'path';
|
|
11
|
+
// Bug #6 Fix: Read Redis connection parameters from process.env
|
|
12
|
+
const redisHost = process.env.CFN_REDIS_HOST || 'cfn-redis';
|
|
13
|
+
const redisPort = process.env.CFN_REDIS_PORT || '6379';
|
|
11
14
|
function parseArgs(args) {
|
|
12
15
|
const subcommand = args[0] || 'pattern';
|
|
13
16
|
let pattern;
|
|
@@ -112,6 +115,10 @@ async function executeRedis(subcommand, pattern, options) {
|
|
|
112
115
|
console.log('[cfn-redis] Monitoring Redis events...');
|
|
113
116
|
// Subscribe to Redis pub/sub events
|
|
114
117
|
const proc = spawn('redis-cli', [
|
|
118
|
+
'-h',
|
|
119
|
+
redisHost,
|
|
120
|
+
'-p',
|
|
121
|
+
redisPort,
|
|
115
122
|
'SUBSCRIBE',
|
|
116
123
|
'swarm:events',
|
|
117
124
|
'swarm:coordination'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/cfn-redis.ts"],"sourcesContent":["#!/usr/bin/env node\r\n/**\r\n * cfn-redis - Redis coordination helpers\r\n *\r\n * Usage:\r\n * cfn-redis pattern <name> Apply coordination pattern\r\n * cfn-redis waiting-mode Manage agent waiting\r\n * cfn-redis event Handle pub/sub events\r\n */\r\n\r\nimport { spawn } from 'child_process';\r\nimport { resolve } from 'path';\r\n\r\ninterface RedisOptions {\r\n taskId?: string;\r\n agentId?: string;\r\n action?: string;\r\n reason?: string;\r\n iteration?: number;\r\n context?: string;\r\n}\r\n\r\nfunction parseArgs(args: string[]): { subcommand: string; pattern?: string; options: RedisOptions } {\r\n const subcommand = args[0] || 'pattern';\r\n let pattern: string | undefined;\r\n const options: RedisOptions = {};\r\n\r\n // For pattern subcommand, first arg after subcommand is pattern name\r\n if (subcommand === 'pattern' && args[1] && !args[1].startsWith('--')) {\r\n pattern = args[1];\r\n }\r\n\r\n for (let i = 1; i < args.length; i += 2) {\r\n const key = args[i];\r\n const value = args[i + 1];\r\n\r\n switch (key) {\r\n case '--task-id':\r\n options.taskId = value;\r\n break;\r\n case '--agent-id':\r\n options.agentId = value;\r\n break;\r\n case '--action':\r\n options.action = value;\r\n break;\r\n case '--reason':\r\n options.reason = 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 }\r\n }\r\n\r\n return { subcommand, pattern, options };\r\n}\r\n\r\nasync function executeRedis(subcommand: string, pattern: string | undefined, options: RedisOptions): Promise<void> {\r\n const skillPath = resolve(process.cwd(), '.claude/skills/redis-coordination');\r\n\r\n switch (subcommand) {\r\n case 'pattern': {\r\n if (!pattern) {\r\n console.error('Error: Pattern name required');\r\n console.error('Available patterns: simple-chain, hierarchical-broadcast, mesh-hybrid');\r\n process.exit(1);\r\n }\r\n\r\n console.log(`[cfn-redis] Applying coordination pattern: ${pattern}`);\r\n\r\n const script = resolve(skillPath, `invoke-${pattern}.sh`);\r\n const args: string[] = [];\r\n\r\n if (options.taskId) args.push('--task-id', options.taskId);\r\n\r\n const proc = spawn('bash', [script, ...args], { stdio: 'inherit' });\r\n\r\n proc.on('exit', (code) => process.exit(code || 0));\r\n proc.on('error', (err) => {\r\n console.error('[cfn-redis] Error:', err.message);\r\n console.log(`\\nScript not found. Available patterns:`);\r\n console.log(' simple-chain, hierarchical-broadcast, mesh-hybrid');\r\n process.exit(1);\r\n });\r\n break;\r\n }\r\n\r\n case 'waiting-mode': {\r\n const action = options.action || 'enter';\r\n\r\n if (!options.taskId || !options.agentId) {\r\n console.error('Error: --task-id and --agent-id required for waiting-mode');\r\n process.exit(1);\r\n }\r\n\r\n console.log(`[cfn-redis] Waiting mode: ${action} for ${options.agentId}`);\r\n\r\n const script = resolve(skillPath, 'invoke-waiting-mode.sh');\r\n const args = [action, '--task-id', options.taskId, '--agent-id', options.agentId];\r\n\r\n if (options.context) args.push('--context', options.context);\r\n if (options.reason) args.push('--reason', options.reason);\r\n if (options.iteration) args.push('--iteration', options.iteration.toString());\r\n\r\n const proc = spawn('bash', [script, ...args], { stdio: 'inherit' });\r\n\r\n proc.on('exit', (code) => process.exit(code || 0));\r\n proc.on('error', (err) => {\r\n console.error('[cfn-redis] Error:', err.message);\r\n process.exit(1);\r\n });\r\n break;\r\n }\r\n\r\n case 'event': {\r\n console.log('[cfn-redis] Monitoring Redis events...');\r\n\r\n // Subscribe to Redis pub/sub events\r\n const proc = spawn('redis-cli', ['SUBSCRIBE', 'swarm:events', 'swarm:coordination'], { stdio: 'inherit' });\r\n\r\n proc.on('exit', (code) => process.exit(code || 0));\r\n proc.on('error', (err) => {\r\n console.error('[cfn-redis] Redis error:', err.message);\r\n process.exit(1);\r\n });\r\n break;\r\n }\r\n\r\n default:\r\n console.error(`Unknown subcommand: ${subcommand}`);\r\n console.error('Valid subcommands: pattern, waiting-mode, event');\r\n process.exit(1);\r\n }\r\n}\r\n\r\nfunction showHelp(): void {\r\n console.log(`\r\ncfn-redis - Redis Coordination Helpers CLI\r\n\r\nUsage:\r\n cfn-redis pattern <name> [options] Apply coordination pattern\r\n cfn-redis waiting-mode [options] Manage agent waiting\r\n cfn-redis event Monitor pub/sub events\r\n\r\nOptions (pattern):\r\n --task-id <id> Task ID for coordination\r\n\r\nOptions (waiting-mode):\r\n --task-id <id> Task ID (required)\r\n --agent-id <id> Agent ID (required)\r\n --action <action> Action (enter, wake, report, collect)\r\n --context <text> Context description\r\n --reason <reason> Wake reason\r\n --iteration <n> Iteration number\r\n\r\nExamples:\r\n cfn-redis pattern mesh-hybrid --task-id task-123\r\n cfn-redis waiting-mode --task-id task-123 --agent-id coder-1 --action enter\r\n cfn-redis waiting-mode --task-id task-123 --agent-id coder-1 --action wake --reason iteration --iteration 2\r\n cfn-redis event\r\n\r\nAvailable Patterns:\r\n simple-chain Linear agent coordination\r\n hierarchical-broadcast Coordinator broadcasts to agents\r\n mesh-hybrid Peer-to-peer with coordinator\r\n\r\nWaiting Mode Actions:\r\n enter Agent enters waiting mode (BLPOP)\r\n wake Coordinator wakes agent\r\n report Agent reports completion\r\n collect Coordinator collects results\r\n\r\nFor more info: https://docs.claude.com/cfn-redis\r\n `);\r\n}\r\n\r\nasync function main(args: string[] = process.argv.slice(2)): Promise<void> {\r\n if (args.includes('--help') || args.includes('-h')) {\r\n showHelp();\r\n return;\r\n }\r\n\r\n const { subcommand, pattern, options } = parseArgs(args);\r\n await executeRedis(subcommand, pattern, options);\r\n}\r\n\r\n// Run if called directly\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-redis] Fatal error:', err);\r\n process.exit(1);\r\n });\r\n}\r\n\r\nexport { main };\r\n"],"names":["spawn","resolve","parseArgs","args","subcommand","pattern","options","startsWith","i","length","key","value","taskId","agentId","action","reason","iteration","parseInt","context","executeRedis","skillPath","process","cwd","console","error","exit","log","script","push","proc","stdio","on","code","err","message","toString","showHelp","main","argv","slice","includes","isMainModule","url","endsWith","replace","catch"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/cfn-redis.ts"],"sourcesContent":["#!/usr/bin/env node\r\n/**\r\n * cfn-redis - Redis coordination helpers\r\n *\r\n * Usage:\r\n * cfn-redis pattern <name> Apply coordination pattern\r\n * cfn-redis waiting-mode Manage agent waiting\r\n * cfn-redis event Handle pub/sub events\r\n */\r\n\r\nimport { spawn } from 'child_process';\r\nimport { resolve } from 'path';\r\n\r\n// Bug #6 Fix: Read Redis connection parameters from process.env\r\nconst redisHost = process.env.CFN_REDIS_HOST || 'cfn-redis';\r\nconst redisPort = process.env.CFN_REDIS_PORT || '6379';\r\n\r\ninterface RedisOptions {\r\n taskId?: string;\r\n agentId?: string;\r\n action?: string;\r\n reason?: string;\r\n iteration?: number;\r\n context?: string;\r\n}\r\n\r\nfunction parseArgs(args: string[]): { subcommand: string; pattern?: string; options: RedisOptions } {\r\n const subcommand = args[0] || 'pattern';\r\n let pattern: string | undefined;\r\n const options: RedisOptions = {};\r\n\r\n // For pattern subcommand, first arg after subcommand is pattern name\r\n if (subcommand === 'pattern' && args[1] && !args[1].startsWith('--')) {\r\n pattern = args[1];\r\n }\r\n\r\n for (let i = 1; i < args.length; i += 2) {\r\n const key = args[i];\r\n const value = args[i + 1];\r\n\r\n switch (key) {\r\n case '--task-id':\r\n options.taskId = value;\r\n break;\r\n case '--agent-id':\r\n options.agentId = value;\r\n break;\r\n case '--action':\r\n options.action = value;\r\n break;\r\n case '--reason':\r\n options.reason = 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 }\r\n }\r\n\r\n return { subcommand, pattern, options };\r\n}\r\n\r\nasync function executeRedis(subcommand: string, pattern: string | undefined, options: RedisOptions): Promise<void> {\r\n const skillPath = resolve(process.cwd(), '.claude/skills/redis-coordination');\r\n\r\n switch (subcommand) {\r\n case 'pattern': {\r\n if (!pattern) {\r\n console.error('Error: Pattern name required');\r\n console.error('Available patterns: simple-chain, hierarchical-broadcast, mesh-hybrid');\r\n process.exit(1);\r\n }\r\n\r\n console.log(`[cfn-redis] Applying coordination pattern: ${pattern}`);\r\n\r\n const script = resolve(skillPath, `invoke-${pattern}.sh`);\r\n const args: string[] = [];\r\n\r\n if (options.taskId) args.push('--task-id', options.taskId);\r\n\r\n const proc = spawn('bash', [script, ...args], { stdio: 'inherit' });\r\n\r\n proc.on('exit', (code) => process.exit(code || 0));\r\n proc.on('error', (err) => {\r\n console.error('[cfn-redis] Error:', err.message);\r\n console.log(`\\nScript not found. Available patterns:`);\r\n console.log(' simple-chain, hierarchical-broadcast, mesh-hybrid');\r\n process.exit(1);\r\n });\r\n break;\r\n }\r\n\r\n case 'waiting-mode': {\r\n const action = options.action || 'enter';\r\n\r\n if (!options.taskId || !options.agentId) {\r\n console.error('Error: --task-id and --agent-id required for waiting-mode');\r\n process.exit(1);\r\n }\r\n\r\n console.log(`[cfn-redis] Waiting mode: ${action} for ${options.agentId}`);\r\n\r\n const script = resolve(skillPath, 'invoke-waiting-mode.sh');\r\n const args = [action, '--task-id', options.taskId, '--agent-id', options.agentId];\r\n\r\n if (options.context) args.push('--context', options.context);\r\n if (options.reason) args.push('--reason', options.reason);\r\n if (options.iteration) args.push('--iteration', options.iteration.toString());\r\n\r\n const proc = spawn('bash', [script, ...args], { stdio: 'inherit' });\r\n\r\n proc.on('exit', (code) => process.exit(code || 0));\r\n proc.on('error', (err) => {\r\n console.error('[cfn-redis] Error:', err.message);\r\n process.exit(1);\r\n });\r\n break;\r\n }\r\n\r\n case 'event': {\r\n console.log('[cfn-redis] Monitoring Redis events...');\r\n\r\n // Subscribe to Redis pub/sub events\r\n const proc = spawn('redis-cli', ['-h', redisHost, '-p', redisPort, 'SUBSCRIBE', 'swarm:events', 'swarm:coordination'], { stdio: 'inherit' });\r\n\r\n proc.on('exit', (code) => process.exit(code || 0));\r\n proc.on('error', (err) => {\r\n console.error('[cfn-redis] Redis error:', err.message);\r\n process.exit(1);\r\n });\r\n break;\r\n }\r\n\r\n default:\r\n console.error(`Unknown subcommand: ${subcommand}`);\r\n console.error('Valid subcommands: pattern, waiting-mode, event');\r\n process.exit(1);\r\n }\r\n}\r\n\r\nfunction showHelp(): void {\r\n console.log(`\r\ncfn-redis - Redis Coordination Helpers CLI\r\n\r\nUsage:\r\n cfn-redis pattern <name> [options] Apply coordination pattern\r\n cfn-redis waiting-mode [options] Manage agent waiting\r\n cfn-redis event Monitor pub/sub events\r\n\r\nOptions (pattern):\r\n --task-id <id> Task ID for coordination\r\n\r\nOptions (waiting-mode):\r\n --task-id <id> Task ID (required)\r\n --agent-id <id> Agent ID (required)\r\n --action <action> Action (enter, wake, report, collect)\r\n --context <text> Context description\r\n --reason <reason> Wake reason\r\n --iteration <n> Iteration number\r\n\r\nExamples:\r\n cfn-redis pattern mesh-hybrid --task-id task-123\r\n cfn-redis waiting-mode --task-id task-123 --agent-id coder-1 --action enter\r\n cfn-redis waiting-mode --task-id task-123 --agent-id coder-1 --action wake --reason iteration --iteration 2\r\n cfn-redis event\r\n\r\nAvailable Patterns:\r\n simple-chain Linear agent coordination\r\n hierarchical-broadcast Coordinator broadcasts to agents\r\n mesh-hybrid Peer-to-peer with coordinator\r\n\r\nWaiting Mode Actions:\r\n enter Agent enters waiting mode (BLPOP)\r\n wake Coordinator wakes agent\r\n report Agent reports completion\r\n collect Coordinator collects results\r\n\r\nFor more info: https://docs.claude.com/cfn-redis\r\n `);\r\n}\r\n\r\nasync function main(args: string[] = process.argv.slice(2)): Promise<void> {\r\n if (args.includes('--help') || args.includes('-h')) {\r\n showHelp();\r\n return;\r\n }\r\n\r\n const { subcommand, pattern, options } = parseArgs(args);\r\n await executeRedis(subcommand, pattern, options);\r\n}\r\n\r\n// Run if called directly\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-redis] Fatal error:', err);\r\n process.exit(1);\r\n });\r\n}\r\n\r\nexport { main };\r\n"],"names":["spawn","resolve","redisHost","process","env","CFN_REDIS_HOST","redisPort","CFN_REDIS_PORT","parseArgs","args","subcommand","pattern","options","startsWith","i","length","key","value","taskId","agentId","action","reason","iteration","parseInt","context","executeRedis","skillPath","cwd","console","error","exit","log","script","push","proc","stdio","on","code","err","message","toString","showHelp","main","argv","slice","includes","isMainModule","url","endsWith","replace","catch"],"mappings":"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"}
|
|
@@ -7,13 +7,16 @@
|
|
|
7
7
|
* Sprint 4: Conversation Forking (v2.7.0)
|
|
8
8
|
*/ import { execSync } from 'child_process';
|
|
9
9
|
import { randomBytes } from 'crypto';
|
|
10
|
+
// Bug #6 Fix: Read Redis connection parameters from process.env
|
|
11
|
+
const redisHost = process.env.CFN_REDIS_HOST || 'cfn-redis';
|
|
12
|
+
const redisPort = process.env.CFN_REDIS_PORT || '6379';
|
|
10
13
|
/**
|
|
11
14
|
* Store a message in conversation history
|
|
12
15
|
*/ export async function storeMessage(taskId, agentId, message) {
|
|
13
16
|
const key = `swarm:${taskId}:${agentId}:messages`;
|
|
14
17
|
const messageJson = JSON.stringify(message);
|
|
15
18
|
try {
|
|
16
|
-
execSync(`redis-cli rpush "${key}" '${messageJson.replace(/'/g, "'\\''")}'`, {
|
|
19
|
+
execSync(`redis-cli -h ${redisHost} -p ${redisPort} rpush "${key}" '${messageJson.replace(/'/g, "'\\''")}'`, {
|
|
17
20
|
encoding: 'utf8'
|
|
18
21
|
});
|
|
19
22
|
} catch (error) {
|
|
@@ -26,7 +29,7 @@ import { randomBytes } from 'crypto';
|
|
|
26
29
|
*/ export async function loadMessages(taskId, agentId, forkId) {
|
|
27
30
|
const key = forkId ? `swarm:${taskId}:${agentId}:fork:${forkId}:messages` : `swarm:${taskId}:${agentId}:messages`;
|
|
28
31
|
try {
|
|
29
|
-
const output = execSync(`redis-cli lrange "${key}" 0 -1`, {
|
|
32
|
+
const output = execSync(`redis-cli -h ${redisHost} -p ${redisPort} lrange "${key}" 0 -1`, {
|
|
30
33
|
encoding: 'utf8'
|
|
31
34
|
}).trim();
|
|
32
35
|
if (!output || output === '(empty array)') {
|
|
@@ -56,7 +59,7 @@ import { randomBytes } from 'crypto';
|
|
|
56
59
|
const forkKey = `swarm:${taskId}:${agentId}:fork:${forkId}:messages`;
|
|
57
60
|
for (const message of forkMessages){
|
|
58
61
|
const messageJson = JSON.stringify(message);
|
|
59
|
-
execSync(`redis-cli rpush "${forkKey}" '${messageJson.replace(/'/g, "'\\''")}'`, {
|
|
62
|
+
execSync(`redis-cli -h ${redisHost} -p ${redisPort} rpush "${forkKey}" '${messageJson.replace(/'/g, "'\\''")}'`, {
|
|
60
63
|
encoding: 'utf8'
|
|
61
64
|
});
|
|
62
65
|
}
|
|
@@ -70,12 +73,12 @@ import { randomBytes } from 'crypto';
|
|
|
70
73
|
messageCount: forkMessages.length
|
|
71
74
|
};
|
|
72
75
|
const metaKey = `swarm:${taskId}:${agentId}:fork:${forkId}:meta`;
|
|
73
|
-
execSync(`redis-cli setex "${metaKey}" 86400 '${JSON.stringify(metadata)}'`, {
|
|
76
|
+
execSync(`redis-cli -h ${redisHost} -p ${redisPort} setex "${metaKey}" 86400 '${JSON.stringify(metadata)}'`, {
|
|
74
77
|
encoding: 'utf8'
|
|
75
78
|
});
|
|
76
79
|
// Set as current fork
|
|
77
80
|
const currentForkKey = `swarm:${taskId}:${agentId}:current-fork`;
|
|
78
|
-
execSync(`redis-cli setex "${currentForkKey}" 86400 "${forkId}"`, {
|
|
81
|
+
execSync(`redis-cli -h ${redisHost} -p ${redisPort} setex "${currentForkKey}" 86400 "${forkId}"`, {
|
|
79
82
|
encoding: 'utf8'
|
|
80
83
|
});
|
|
81
84
|
console.log(`[conversation-fork] Created fork ${forkId} with ${forkMessages.length} messages`);
|
|
@@ -86,7 +89,7 @@ import { randomBytes } from 'crypto';
|
|
|
86
89
|
*/ export async function getCurrentFork(taskId, agentId) {
|
|
87
90
|
const key = `swarm:${taskId}:${agentId}:current-fork`;
|
|
88
91
|
try {
|
|
89
|
-
const forkId = execSync(`redis-cli get "${key}"`, {
|
|
92
|
+
const forkId = execSync(`redis-cli -h ${redisHost} -p ${redisPort} get "${key}"`, {
|
|
90
93
|
encoding: 'utf8'
|
|
91
94
|
}).trim();
|
|
92
95
|
if (forkId === '(nil)' || !forkId) {
|
|
@@ -102,7 +105,7 @@ import { randomBytes } from 'crypto';
|
|
|
102
105
|
*/ export async function getForkMetadata(taskId, agentId, forkId) {
|
|
103
106
|
const key = `swarm:${taskId}:${agentId}:fork:${forkId}:meta`;
|
|
104
107
|
try {
|
|
105
|
-
const metaJson = execSync(`redis-cli get "${key}"`, {
|
|
108
|
+
const metaJson = execSync(`redis-cli -h ${redisHost} -p ${redisPort} get "${key}"`, {
|
|
106
109
|
encoding: 'utf8'
|
|
107
110
|
}).trim();
|
|
108
111
|
if (metaJson === '(nil)' || !metaJson) {
|
|
@@ -118,12 +121,12 @@ import { randomBytes } from 'crypto';
|
|
|
118
121
|
*/ export async function listForks(taskId, agentId) {
|
|
119
122
|
const pattern = `swarm:${taskId}:${agentId}:fork:*:meta`;
|
|
120
123
|
try {
|
|
121
|
-
const keys = execSync(`redis-cli keys "${pattern}"`, {
|
|
124
|
+
const keys = execSync(`redis-cli -h ${redisHost} -p ${redisPort} keys "${pattern}"`, {
|
|
122
125
|
encoding: 'utf8'
|
|
123
126
|
}).trim().split('\n').filter((k)=>k);
|
|
124
127
|
const forks = [];
|
|
125
128
|
for (const key of keys){
|
|
126
|
-
const metaJson = execSync(`redis-cli get "${key}"`, {
|
|
129
|
+
const metaJson = execSync(`redis-cli -h ${redisHost} -p ${redisPort} get "${key}"`, {
|
|
127
130
|
encoding: 'utf8'
|
|
128
131
|
}).trim();
|
|
129
132
|
if (metaJson && metaJson !== '(nil)') {
|
|
@@ -142,7 +145,7 @@ import { randomBytes } from 'crypto';
|
|
|
142
145
|
const messagesKey = `swarm:${taskId}:${agentId}:fork:${forkId}:messages`;
|
|
143
146
|
const metaKey = `swarm:${taskId}:${agentId}:fork:${forkId}:meta`;
|
|
144
147
|
try {
|
|
145
|
-
execSync(`redis-cli del "${messagesKey}" "${metaKey}"`, {
|
|
148
|
+
execSync(`redis-cli -h ${redisHost} -p ${redisPort} del "${messagesKey}" "${metaKey}"`, {
|
|
146
149
|
encoding: 'utf8'
|
|
147
150
|
});
|
|
148
151
|
console.log(`[conversation-fork] Deleted fork ${forkId}`);
|
|
@@ -156,7 +159,7 @@ import { randomBytes } from 'crypto';
|
|
|
156
159
|
*/ export async function clearCurrentFork(taskId, agentId) {
|
|
157
160
|
const key = `swarm:${taskId}:${agentId}:current-fork`;
|
|
158
161
|
try {
|
|
159
|
-
execSync(`redis-cli del "${key}"`, {
|
|
162
|
+
execSync(`redis-cli -h ${redisHost} -p ${redisPort} del "${key}"`, {
|
|
160
163
|
encoding: 'utf8'
|
|
161
164
|
});
|
|
162
165
|
} catch (error) {
|