claude-flow-novice 2.15.3 → 2.15.4
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/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
- package/.claude/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
- package/.claude/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
- package/.claude/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
- package/.claude/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
- package/.claude/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
- package/.claude/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
- package/.claude/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
- package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
- package/.claude/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
- package/.claude/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
- package/.claude/commands/cfn-loop-cli.md +16 -2
- package/.claude/commands/switch-api.md +31 -10
- package/.claude/hooks/cfn-lint-sql-injection.sh +61 -0
- package/.claude/hooks/cfn-post-edit-cfn-retrospective.sh +33 -2
- package/.claude/hooks/cfn-pre-edit-security-warning.sh +40 -0
- package/.claude/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
- package/.claude/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
- package/.claude/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
- package/.claude/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
- package/.claude/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
- package/.claude/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
- package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +184 -23
- package/.claude/skills/cfn-loop-orchestration/security_utils.sh +24 -0
- package/.claude/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
- package/.claude/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
- package/.claude/skills/cfn-redis-coordination/agent-log.sh +4 -0
- package/.claude/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
- package/.claude/skills/cfn-redis-coordination/agent-recovery.sh +2 -2
- package/.claude/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
- package/.claude/skills/cfn-redis-coordination/get-context.sh +33 -0
- package/.claude/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
- package/.claude/skills/cfn-redis-coordination/invoke-waiting-mode.sh +3 -0
- package/.claude/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
- package/.claude/skills/cfn-redis-coordination/redis-functions.sh +33 -0
- package/.claude/skills/cfn-redis-coordination/report-completion.sh +24 -31
- package/.claude/skills/cfn-redis-coordination/store-context.sh +4 -0
- package/.claude/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
- package/.claude/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
- package/.claude/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
- package/.claude/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
- package/.claude/skills/cfn-transparency-middleware/tests/input-validation.sh +15 -0
- package/README.md +116 -475
- package/claude-assets/agents/cfn-dev-team/README.md +103 -0
- package/claude-assets/agents/cfn-dev-team/architecture/goal-planner.md +1 -1
- package/claude-assets/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +77 -15
- package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +355 -6
- package/claude-assets/agents/cfn-dev-team/coordinators/consensus-builder.md +82 -1
- package/claude-assets/agents/cfn-dev-team/coordinators/handoff-coordinator.md +82 -1
- package/claude-assets/agents/cfn-dev-team/coordinators/multi-sprint-coordinator.md +77 -15
- package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +99 -12
- package/claude-assets/agents/cfn-dev-team/dev-ops/github-commit-agent.md +1 -1
- package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +97 -0
- package/claude-assets/agents/cfn-dev-team/dev-ops/monitoring-specialist.md +20 -1
- package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +97 -0
- package/claude-assets/agents/cfn-dev-team/developers/backend-developer.md +110 -13
- package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +106 -15
- package/claude-assets/agents/cfn-dev-team/developers/database/database-architect.md +115 -11
- package/claude-assets/agents/cfn-dev-team/developers/frontend/mobile-dev.md +94 -7
- package/claude-assets/agents/cfn-dev-team/developers/frontend/react-frontend-engineer.md +87 -9
- package/claude-assets/agents/cfn-dev-team/developers/frontend/typescript-specialist.md +85 -7
- package/claude-assets/agents/cfn-dev-team/developers/frontend/ui-designer.md +160 -28
- package/claude-assets/agents/cfn-dev-team/developers/graphql-specialist.md +101 -19
- package/claude-assets/agents/cfn-dev-team/developers/rust-developer.md +108 -14
- package/claude-assets/agents/cfn-dev-team/reviewers/{reviewer.md → code-reviewer.md} +95 -8
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/code-quality-validator.md +107 -7
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +98 -7
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +95 -7
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/security-specialist.md +136 -9
- package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +108 -1
- package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +107 -13
- package/claude-assets/agents/cfn-dev-team/testers/contract-tester.md +737 -0
- package/claude-assets/agents/cfn-dev-team/testers/e2e/playwright-tester.md +1 -1
- package/claude-assets/agents/cfn-dev-team/testers/integration-tester.md +828 -0
- package/claude-assets/agents/cfn-dev-team/testers/interaction-tester.md +106 -7
- package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +77 -0
- package/claude-assets/agents/cfn-dev-team/testers/mutation-testing-specialist.md +684 -0
- package/claude-assets/agents/cfn-dev-team/testers/playwright-tester.md +110 -1
- package/claude-assets/agents/cfn-dev-team/testers/tester.md +94 -7
- package/claude-assets/agents/cfn-dev-team/utility/code-booster.md +1 -3
- package/claude-assets/agents/cfn-dev-team/utility/epic-creator.md +87 -13
- package/claude-assets/agents/cfn-dev-team/utility/memory-leak-specialist.md +103 -7
- package/claude-assets/agents/cfn-dev-team/utility/researcher.md +1 -3
- package/claude-assets/agents/cfn-dev-team/utility/z-ai-specialist.md +94 -7
- package/claude-assets/agents/docker-coordinators/cfn-docker-v3-coordinator.md +46 -0
- package/claude-assets/agents/project-only-agents/npm-package-specialist.md +1 -1
- package/claude-assets/cfn-extras/skills/advanced-features/cfn-agent-swap/recommend-swap.sh +59 -59
- package/claude-assets/cfn-extras/skills/analytics/cfn-improvement-recommender/recommend-improvements.sh +91 -91
- package/claude-assets/cfn-extras/skills/analytics/cfn-pattern-extraction/extract-patterns.sh +79 -79
- package/claude-assets/cfn-extras/skills/analytics/cfn-retrospective-report/generate-report.sh +100 -100
- package/claude-assets/cfn-extras/skills/analytics/cfn-telemetry/start-telemetry.sh +110 -110
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/add-bullet.sh +145 -145
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/log-merge.sh +67 -67
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/monitor-injection-performance.sh +137 -137
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/optimize-injection-pipeline.sh +168 -168
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/query-reflections.sh +35 -35
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/store-reflection.sh +45 -45
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/track-ab-test.sh +41 -41
- package/claude-assets/cfn-extras/skills/deprecated/cfn-ace-system/update-reflection.sh +41 -41
- package/claude-assets/cfn-extras/skills/deprecated/cfn-cli-setup/validate-cli-environment.sh +191 -191
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/create-campaign.sh +231 -231
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/get-campaign-performance.sh +190 -190
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/pause-campaign.sh +142 -142
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/set-budget.sh +181 -181
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-ad-campaigns/operations/update-bid-strategy.sh +133 -133
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/get-conversation-history.sh +121 -121
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/qualify-lead.sh +156 -156
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/schedule-demo.sh +181 -181
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/send-message.sh +137 -137
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-chatbot-conversations/operations/transfer-to-human.sh +179 -179
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/create-campaign.sh +183 -183
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/get-delivery-status.sh +139 -139
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/opt-out.sh +150 -150
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/schedule-campaign.sh +187 -187
- package/claude-assets/cfn-extras/skills/marketing/cfn-marketing-sms-campaigns/operations/send-sms.sh +181 -181
- package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/test-web-portal-skill.sh +50 -50
- package/claude-assets/cfn-extras/skills/ui-portal/cfn-web-portal/validate-deployment.sh +84 -84
- package/claude-assets/cfn-extras/skills/utility/cfn-environment-sanitization/sanitize-environment.sh +243 -243
- package/claude-assets/commands/cfn-loop-cli.md +16 -2
- package/claude-assets/commands/switch-api.md +31 -10
- package/claude-assets/hooks/cfn-lint-sql-injection.sh +61 -0
- package/claude-assets/hooks/cfn-post-edit-cfn-retrospective.sh +33 -2
- package/claude-assets/hooks/cfn-pre-edit-security-warning.sh +40 -0
- package/claude-assets/hooks/detect-hardcoded-credentials.sh +212 -0
- package/claude-assets/skills/SKILL_TEMPLATE.md +774 -0
- package/claude-assets/skills/agent-lifecycle/execute-lifecycle-hook.sh +84 -113
- package/claude-assets/skills/agent-lifecycle/simple-audit.sh +33 -6
- package/claude-assets/skills/agent-template-generator/SKILL.md +440 -0
- package/claude-assets/skills/agent-template-generator/generate-agent.sh +405 -0
- package/claude-assets/skills/agent-validation-linter/SKILL.md +589 -0
- package/claude-assets/skills/agent-validation-linter/lint-agents.sh +271 -0
- package/claude-assets/skills/bootstrap/bash-fundamentals.md +786 -0
- package/claude-assets/skills/bootstrap/database-connection.md +464 -0
- package/claude-assets/skills/bootstrap/error-handling.md +580 -0
- package/claude-assets/skills/bootstrap/file-operations.md +699 -0
- package/claude-assets/skills/bootstrap/skill-loader.md +616 -0
- package/claude-assets/skills/bootstrap/sqlite-params.sh +287 -0
- package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh +22 -24
- package/claude-assets/skills/cfn-automatic-memory-persistence/test-memory-persistence.sh +17 -16
- package/claude-assets/skills/cfn-deployment/SKILL.md +293 -0
- package/claude-assets/skills/cfn-deployment/execute.sh +21 -0
- package/claude-assets/skills/cfn-docker-agent-spawning/SKILL.md +28 -4
- package/claude-assets/skills/cfn-docker-agent-spawning/spawn-agent.sh +3 -1
- package/claude-assets/skills/cfn-docker-loop-orchestration/orchestrate.sh +224 -20
- package/claude-assets/skills/cfn-environment-sanitization/sanitize-environment.sh +38 -0
- package/claude-assets/skills/cfn-error-batching-strategy/lib/core-functions.sh +47 -47
- package/claude-assets/skills/cfn-file-operations/SKILL.md +290 -0
- package/claude-assets/skills/cfn-file-operations/execute.sh +129 -0
- package/claude-assets/skills/cfn-file-operations/lib/atomic-write.sh +294 -0
- package/claude-assets/skills/cfn-file-operations/lib/lock.sh +361 -0
- package/claude-assets/skills/cfn-file-operations/test.sh +369 -0
- package/claude-assets/skills/cfn-log-operations/SKILL.md +308 -0
- package/claude-assets/skills/cfn-log-operations/execute.sh +420 -0
- package/claude-assets/skills/cfn-log-operations/lib/rotate.sh +406 -0
- package/claude-assets/skills/cfn-log-operations/lib/search.sh +448 -0
- package/claude-assets/skills/cfn-log-operations/test.sh +394 -0
- package/claude-assets/skills/cfn-loop-orchestration/helpers/gate-check.sh +550 -46
- package/claude-assets/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +277 -0
- package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +184 -23
- package/claude-assets/skills/cfn-loop-orchestration/security_utils.sh +24 -0
- package/claude-assets/skills/cfn-loop-orchestration/test-iteration-context-injection.sh +366 -0
- package/claude-assets/skills/cfn-parameterized-queries/SKILL.md +339 -0
- package/claude-assets/skills/cfn-playbook/query-playbook.sh +19 -15
- package/claude-assets/skills/cfn-playbook/update-playbook.sh +25 -14
- package/claude-assets/skills/cfn-process-instrumentation/instrument-process.sh +44 -0
- package/claude-assets/skills/cfn-promotion/SKILL.md +305 -0
- package/claude-assets/skills/cfn-redis-coordination/CENTRALIZED_REDIS_WRAPPER.md +319 -0
- package/claude-assets/skills/cfn-redis-coordination/agent-log.sh +4 -0
- package/claude-assets/skills/cfn-redis-coordination/agent-log.sh.bak +124 -0
- package/claude-assets/skills/cfn-redis-coordination/agent-recovery.sh +2 -2
- package/claude-assets/skills/cfn-redis-coordination/collect-confidence-scores.sh +30 -0
- package/claude-assets/skills/cfn-redis-coordination/get-context.sh +33 -0
- package/claude-assets/skills/cfn-redis-coordination/get-success-criteria.sh +54 -0
- package/claude-assets/skills/cfn-redis-coordination/invoke-waiting-mode.sh +3 -0
- package/claude-assets/skills/cfn-redis-coordination/redis-cli-wrapper.sh +24 -3
- package/claude-assets/skills/cfn-redis-coordination/redis-functions.sh +33 -0
- package/claude-assets/skills/cfn-redis-coordination/report-completion.sh +24 -31
- package/claude-assets/skills/cfn-redis-coordination/store-context.sh +4 -0
- package/claude-assets/skills/cfn-redis-coordination/store-success-criteria.sh +85 -0
- package/claude-assets/skills/cfn-redis-coordination/update-all-scripts.sh +67 -0
- package/claude-assets/skills/cfn-skill-loader/SKILL.md +466 -0
- package/claude-assets/skills/cfn-skill-loader/execute.sh +344 -0
- package/claude-assets/skills/cfn-sqlite-memory/ttl-cleanup.sh +17 -25
- package/claude-assets/skills/cfn-task-audit/get-audit-data.sh +42 -21
- package/claude-assets/skills/cfn-task-audit/store-task-audit.sh +17 -10
- package/claude-assets/skills/cfn-test-runner/detect-regressions.sh +17 -14
- package/claude-assets/skills/cfn-test-runner/detect-regressions.sh.backup-1763392821 +55 -0
- package/claude-assets/skills/cfn-test-runner/store-benchmarks.sh +17 -19
- package/claude-assets/skills/cfn-transparency-middleware/test-e2e.sh +15 -0
- package/claude-assets/skills/cfn-transparency-middleware/tests/input-validation.sh +15 -0
- package/claude-assets/skills/cfn-utilities/SKILL.md +237 -0
- package/claude-assets/skills/cfn-utilities/execute.sh +32 -0
- package/claude-assets/skills/cfn-utilities/lib/errors.sh +56 -0
- package/claude-assets/skills/cfn-utilities/lib/file-ops.sh +164 -0
- package/claude-assets/skills/cfn-utilities/lib/logging.sh +77 -0
- package/claude-assets/skills/cfn-utilities/lib/retry.sh +127 -0
- package/claude-assets/skills/cfn-utilities/test.sh +317 -0
- package/claude-assets/skills/integration/agent-handoff.sh +62 -64
- package/claude-assets/skills/json-validation/SKILL.md +431 -0
- package/claude-assets/skills/json-validation/test-validate-success-criteria.sh +421 -0
- package/claude-assets/skills/json-validation/validate-success-criteria.sh +197 -0
- package/claude-assets/skills/redis-coordination/validate-parameters.sh +34 -0
- package/claude-assets/skills/workflow-codification/DEPLOY_QUICK_REFERENCE.md +106 -0
- package/claude-assets/skills/workflow-codification/PROPAGATE_UPDATE_QUICK_REFERENCE.md +366 -0
- package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh +481 -0
- package/claude-assets/skills/workflow-codification/deploy-approved-skill.sh.backup-1763392820 +512 -0
- package/claude-assets/skills/workflow-codification/lib/security-utils.sh +204 -0
- package/claude-assets/skills/workflow-codification/propagate-skill-update.sh +648 -0
- package/claude-assets/skills/workflow-codification/propagate-skill-update.sh.backup-1763392820 +664 -0
- package/claude-assets/skills/workflow-codification/test-integration.sh +15 -0
- package/claude-assets/skills/workflow-codification/test-metadata-update.sh +350 -0
- package/claude-assets/skills/workflow-codification/track-cost-savings.sh +55 -14
- package/claude-assets/skills/workflow-codification/track-cost-savings.sh.backup-1763392821 +445 -0
- package/claude-assets/skills/workflow-codification/track-edge-case.sh +27 -60
- package/claude-assets/skills/workflow-codification/workflow-codification.db +0 -0
- package/dist/ace/ace-curator.js +10 -2
- package/dist/ace/ace-curator.js.map +1 -1
- package/dist/ace/ace-generator.js +4 -0
- package/dist/ace/ace-generator.js.map +1 -1
- package/dist/ace/ace-reflector.js +1 -1
- package/dist/ace/ace-reflector.js.map +1 -1
- package/dist/ace/context-injection.js +24 -2
- package/dist/ace/context-injection.js.map +1 -1
- package/dist/agents/agent-loader.js +146 -165
- package/dist/agents/agent-loader.js.map +1 -1
- package/dist/agents/task-agent-integration.js +1 -1
- package/dist/agents/task-agent-integration.js.map +1 -1
- package/dist/api/health-endpoints.js +390 -0
- package/dist/api/health-endpoints.js.map +1 -0
- package/dist/cli/agent-executor.js +4 -1
- package/dist/cli/agent-executor.js.map +1 -1
- package/dist/cli/agent-prompt-builder.js +89 -1
- package/dist/cli/agent-prompt-builder.js.map +1 -1
- package/dist/cli/agent-spawn.js +130 -37
- package/dist/cli/agent-spawn.js.map +1 -1
- package/dist/cli/skill-cache-validator.js +412 -0
- package/dist/cli/skill-cache-validator.js.map +1 -0
- package/dist/cli/skill-cli.js +991 -0
- package/dist/cli/skill-cli.js.map +1 -0
- package/dist/cli/skill-execution-logger.js +284 -0
- package/dist/cli/skill-execution-logger.js.map +1 -0
- package/dist/cli/skill-loader.js +457 -0
- package/dist/cli/skill-loader.js.map +1 -0
- package/dist/coordination/event-bus.js +2 -2
- package/dist/coordination/event-bus.js.map +1 -1
- package/dist/coordination/fleet-manager.js +1 -1
- package/dist/coordination/fleet-manager.js.map +1 -1
- package/dist/coordination/index.js +23 -9
- package/dist/coordination/index.js.map +1 -1
- package/dist/coordination/types/fleet-manager.types.js.map +1 -1
- package/dist/db/migration-manager.js +483 -0
- package/dist/db/migration-manager.js.map +1 -0
- package/dist/db/skills-query.js +535 -0
- package/dist/db/skills-query.js.map +1 -0
- package/dist/integration/DatabaseHandoff.js +1 -1
- package/dist/integration/DatabaseHandoff.js.map +1 -1
- package/dist/jobs/edge-case-analyzer.js +367 -0
- package/dist/jobs/edge-case-analyzer.js.map +1 -0
- package/dist/jobs/promotion-sla-enforcer.js +288 -0
- package/dist/jobs/promotion-sla-enforcer.js.map +1 -0
- package/dist/lib/agent-output-parser.js.map +1 -1
- package/dist/lib/agent-output-validator.js.map +1 -1
- package/dist/lib/agent-workspace.js +281 -0
- package/dist/lib/agent-workspace.js.map +1 -0
- package/dist/lib/atomic-file-writer.js +377 -0
- package/dist/lib/atomic-file-writer.js.map +1 -0
- package/dist/lib/backup-manager.js +779 -0
- package/dist/lib/backup-manager.js.map +1 -0
- package/dist/lib/checkpoint-manager.js +837 -0
- package/dist/lib/checkpoint-manager.js.map +1 -0
- package/dist/lib/circuit-breaker.js +340 -0
- package/dist/lib/circuit-breaker.js.map +1 -0
- package/dist/lib/completion-signal-handler.js +243 -0
- package/dist/lib/completion-signal-handler.js.map +1 -0
- package/dist/lib/config-manager.js +312 -0
- package/dist/lib/config-manager.js.map +1 -0
- package/dist/lib/config-migrator.js +386 -0
- package/dist/lib/config-migrator.js.map +1 -0
- package/dist/lib/config-validator.js.map +1 -1
- package/dist/lib/correlation-cache.js +311 -0
- package/dist/lib/correlation-cache.js.map +1 -0
- package/dist/lib/correlation.js +263 -0
- package/dist/lib/correlation.js.map +1 -0
- package/dist/lib/database-service/connection-pool-manager.js +520 -0
- package/dist/lib/database-service/connection-pool-manager.js.map +1 -0
- package/dist/lib/database-service/correlation.js +329 -0
- package/dist/lib/database-service/correlation.js.map +1 -0
- package/dist/lib/database-service/errors.js +120 -0
- package/dist/lib/database-service/errors.js.map +1 -0
- package/dist/lib/database-service/index.js +168 -0
- package/dist/lib/database-service/index.js.map +1 -0
- package/dist/lib/database-service/postgres-adapter.js +526 -0
- package/dist/lib/database-service/postgres-adapter.js.map +1 -0
- package/dist/lib/database-service/redis-adapter.js +360 -0
- package/dist/lib/database-service/redis-adapter.js.map +1 -0
- package/dist/lib/database-service/sqlite-adapter.js +544 -0
- package/dist/lib/database-service/sqlite-adapter.js.map +1 -0
- package/dist/lib/database-service/transaction-manager.js +773 -0
- package/dist/lib/database-service/transaction-manager.js.map +1 -0
- package/dist/lib/database-service/types.js +23 -0
- package/dist/lib/database-service/types.js.map +1 -0
- package/dist/lib/deadlock-resolver.js +292 -0
- package/dist/lib/deadlock-resolver.js.map +1 -0
- package/dist/lib/distributed-lock.js +451 -0
- package/dist/lib/distributed-lock.js.map +1 -0
- package/dist/lib/edge-case-deduplicator.js +227 -0
- package/dist/lib/edge-case-deduplicator.js.map +1 -0
- package/dist/lib/encryption-manager.js +322 -0
- package/dist/lib/encryption-manager.js.map +1 -0
- package/dist/lib/error-aggregator.js +234 -0
- package/dist/lib/error-aggregator.js.map +1 -0
- package/dist/lib/errors.js +287 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/file-lock-manager.js +578 -0
- package/dist/lib/file-lock-manager.js.map +1 -0
- package/dist/lib/file-operations.js +367 -0
- package/dist/lib/file-operations.js.map +1 -0
- package/dist/lib/idempotent-write.js +237 -0
- package/dist/lib/idempotent-write.js.map +1 -0
- package/dist/lib/integration-schema-validator.js +522 -0
- package/dist/lib/integration-schema-validator.js.map +1 -0
- package/dist/lib/lock-health-monitor.js +298 -0
- package/dist/lib/lock-health-monitor.js.map +1 -0
- package/dist/lib/log-shipper.js +422 -0
- package/dist/lib/log-shipper.js.map +1 -0
- package/dist/lib/logging.js +146 -0
- package/dist/lib/logging.js.map +1 -0
- package/dist/lib/message-deduplicator.js +439 -0
- package/dist/lib/message-deduplicator.js.map +1 -0
- package/dist/lib/multi-system-query.js +604 -0
- package/dist/lib/multi-system-query.js.map +1 -0
- package/dist/lib/orphan-detector.js +332 -0
- package/dist/lib/orphan-detector.js.map +1 -0
- package/dist/lib/password-generator.js +166 -0
- package/dist/lib/password-generator.js.map +1 -0
- package/dist/lib/path-validator.js +429 -0
- package/dist/lib/path-validator.js.map +1 -0
- package/dist/lib/query-translator.js +905 -0
- package/dist/lib/query-translator.js.map +1 -0
- package/dist/lib/queue-recovery.js +469 -0
- package/dist/lib/queue-recovery.js.map +1 -0
- package/dist/lib/redis-queue-manager.js +512 -0
- package/dist/lib/redis-queue-manager.js.map +1 -0
- package/dist/lib/reflection-archiver.js +272 -0
- package/dist/lib/reflection-archiver.js.map +1 -0
- package/dist/lib/retry-manager.js +453 -0
- package/dist/lib/retry-manager.js.map +1 -0
- package/dist/lib/retry.js +262 -0
- package/dist/lib/retry.js.map +1 -0
- package/dist/lib/schema-transform.js +695 -0
- package/dist/lib/schema-transform.js.map +1 -0
- package/dist/lib/schema-validator.js +491 -0
- package/dist/lib/schema-validator.js.map +1 -0
- package/dist/lib/skill-cache.js +297 -0
- package/dist/lib/skill-cache.js.map +1 -0
- package/dist/lib/skill-content-manager.js +337 -0
- package/dist/lib/skill-content-manager.js.map +1 -0
- package/dist/lib/skill-frontmatter-parser.js +237 -0
- package/dist/lib/skill-frontmatter-parser.js.map +1 -0
- package/dist/lib/skill-git-integration.js +275 -0
- package/dist/lib/skill-git-integration.js.map +1 -0
- package/dist/lib/skill-markdown-validator.js +396 -0
- package/dist/lib/skill-markdown-validator.js.map +1 -0
- package/dist/lib/skill-output-parser.js +312 -0
- package/dist/lib/skill-output-parser.js.map +1 -0
- package/dist/lib/unified-query-api.js +467 -0
- package/dist/lib/unified-query-api.js.map +1 -0
- package/dist/middleware/auth-middleware.js +350 -0
- package/dist/middleware/auth-middleware.js.map +1 -0
- package/dist/middleware/schema-validation.js +347 -0
- package/dist/middleware/schema-validation.js.map +1 -0
- package/dist/providers/anthropic-provider.js +1 -1
- package/dist/providers/anthropic-provider.js.map +1 -1
- package/dist/providers/provider-factory.js +2 -2
- package/dist/providers/provider-factory.js.map +1 -1
- package/dist/services/edge-case-analyzer.js +321 -0
- package/dist/services/edge-case-analyzer.js.map +1 -0
- package/dist/services/edge-case-deduplicator.js +266 -0
- package/dist/services/edge-case-deduplicator.js.map +1 -0
- package/dist/services/edge-case-detector.js +337 -0
- package/dist/services/edge-case-detector.js.map +1 -0
- package/dist/services/edge-case-tracker.js +547 -0
- package/dist/services/edge-case-tracker.js.map +1 -0
- package/dist/services/health-check-system.js +586 -0
- package/dist/services/health-check-system.js.map +1 -0
- package/dist/services/metrics-logger.js +412 -0
- package/dist/services/metrics-logger.js.map +1 -0
- package/dist/services/patch-generator.js +378 -0
- package/dist/services/patch-generator.js.map +1 -0
- package/dist/services/patch-validator.js +337 -0
- package/dist/services/patch-validator.js.map +1 -0
- package/dist/services/performance-monitor.js +811 -0
- package/dist/services/performance-monitor.js.map +1 -0
- package/dist/services/promotion-pipeline.js +918 -0
- package/dist/services/promotion-pipeline.js.map +1 -0
- package/dist/services/promotion-validator.js +394 -0
- package/dist/services/promotion-validator.js.map +1 -0
- package/dist/services/reflection-logger.js +388 -0
- package/dist/services/reflection-logger.js.map +1 -0
- package/dist/services/skill-deployment.js +472 -0
- package/dist/services/skill-deployment.js.map +1 -0
- package/dist/services/skill-loader.js +427 -0
- package/dist/services/skill-loader.js.map +1 -0
- package/dist/services/skill-promotion.js +372 -0
- package/dist/services/skill-promotion.js.map +1 -0
- package/dist/services/skill-validator.js +454 -0
- package/dist/services/skill-validator.js.map +1 -0
- package/dist/services/skill-versioning.js +244 -0
- package/dist/services/skill-versioning.js.map +1 -0
- package/dist/services/workspace-supervisor.js +597 -0
- package/dist/services/workspace-supervisor.js.map +1 -0
- package/dist/types/edge-case.js +45 -0
- package/dist/types/edge-case.js.map +1 -0
- package/package.json +201 -177
- package/readme/README.md +19 -4
- package/scripts/backup-cleanup.sh +627 -0
- package/scripts/cleanup-workspaces.sh +412 -0
- package/scripts/cleanup-yaml-configs.sh +141 -0
- package/scripts/deploy-approved-skills.sh +263 -0
- package/scripts/health-check.sh +447 -0
- package/scripts/log-aggregator.sh +554 -0
- package/scripts/log-monitor.sh +629 -0
- package/scripts/manage-agent-workspaces.sh +434 -0
- package/scripts/migrate-schema.sh +533 -0
- package/scripts/promote-staged-skills.sh +423 -0
- package/scripts/verify-no-secrets.sh +88 -35
- package/.claude/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
- package/.claude/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
- package/.claude/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
- package/.claude/skills/agent-lifecycle/SKILL.md +0 -60
- package/.claude/skills/agent-lifecycle/execute-lifecycle-hook.sh +0 -573
- package/.claude/skills/agent-lifecycle/simple-audit.sh +0 -31
- package/.claude/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
- package/.claude/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
- package/README.md.backup_before_replace +0 -781
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/adaptive-coordinator.md.backup +0 -161
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/blocking-coordinator-example.md.backup +0 -728
- package/claude-assets/cfn-extras/agents/deprecated-coordinators/mesh-coordinator.md.backup +0 -131
- package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh.backup +0 -273
- package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh.backup +0 -949
|
@@ -1,949 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
|
|
3
|
-
##############################################################################
|
|
4
|
-
# CFN Loop Orchestration - Main Coordinator
|
|
5
|
-
# Version: 1.1.0 (Security Enhanced)
|
|
6
|
-
#
|
|
7
|
-
# Orchestrates the Complete Fail Never (CFN) Loop workflow using modular
|
|
8
|
-
# helper scripts, Redis Coordination primitives, and enhanced security.
|
|
9
|
-
#
|
|
10
|
-
# Usage:
|
|
11
|
-
# ./orchestrate.sh --task-id <id> \
|
|
12
|
-
# --mode <mvp|standard|enterprise> \
|
|
13
|
-
# --loop3-agents <agent1,agent2,...> \
|
|
14
|
-
# --loop2-agents <agent1,agent2,...> \
|
|
15
|
-
# --product-owner <agent-id> \
|
|
16
|
-
# [--max-iterations <n>] \
|
|
17
|
-
# [--epic-context <json>] \
|
|
18
|
-
# [--phase-context <json>] \
|
|
19
|
-
# [--success-criteria <json>]
|
|
20
|
-
##############################################################################
|
|
21
|
-
|
|
22
|
-
set -euo pipefail
|
|
23
|
-
|
|
24
|
-
# ⚠️ ANTI-023 MEMORY LEAK PROTECTION: Block Task Mode agents
|
|
25
|
-
# Task Mode agents spawn via Task() tool and should NOT use orchestration scripts
|
|
26
|
-
if [[ -z "${TASK_ID:-}" || -z "${LOOP3_AGENTS:-}" ]]; then
|
|
27
|
-
echo "❌ TASK MODE DETECTED - Orchestration forbidden" >&2
|
|
28
|
-
echo "🚨 ANTI-023: This script is for CLI-spawned coordinators only" >&2
|
|
29
|
-
echo "💡 Task Mode coordination should be handled directly by Main Chat" >&2
|
|
30
|
-
echo "🔧 Coordinator spawned via Task() tool - Main Chat should coordinate directly" >&2
|
|
31
|
-
exit 1
|
|
32
|
-
fi
|
|
33
|
-
|
|
34
|
-
# Load security utilities
|
|
35
|
-
# shellcheck source=./security_utils.sh
|
|
36
|
-
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/security_utils.sh"
|
|
37
|
-
|
|
38
|
-
# Determine script directory
|
|
39
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
40
|
-
HELPERS_DIR="$SCRIPT_DIR/helpers"
|
|
41
|
-
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)" && REDIS_COORD_SKILL="$PROJECT_ROOT/.claude/skills/cfn-redis-coordination"
|
|
42
|
-
|
|
43
|
-
# Configuration
|
|
44
|
-
TASK_ID=""
|
|
45
|
-
MODE="standard"
|
|
46
|
-
LOOP3_AGENTS=""
|
|
47
|
-
LOOP2_AGENTS=""
|
|
48
|
-
PRODUCT_OWNER=""
|
|
49
|
-
MAX_ITERATIONS=10
|
|
50
|
-
MIN_QUORUM_LOOP3="0.66"
|
|
51
|
-
MIN_QUORUM_LOOP2="0.66"
|
|
52
|
-
EPIC_CONTEXT=""
|
|
53
|
-
PHASE_CONTEXT=""
|
|
54
|
-
SUCCESS_CRITERIA=""
|
|
55
|
-
EXPECTED_FILES=""
|
|
56
|
-
PHASE_ID=""
|
|
57
|
-
|
|
58
|
-
# Mode-specific thresholds
|
|
59
|
-
declare -A GATE_THRESHOLD=(
|
|
60
|
-
[mvp]=0.70
|
|
61
|
-
[standard]=0.75
|
|
62
|
-
[enterprise]=0.75
|
|
63
|
-
)
|
|
64
|
-
|
|
65
|
-
declare -A CONSENSUS_THRESHOLD=(
|
|
66
|
-
[mvp]=0.80
|
|
67
|
-
[standard]=0.90
|
|
68
|
-
[enterprise]=0.95
|
|
69
|
-
)
|
|
70
|
-
|
|
71
|
-
# Execution tracking
|
|
72
|
-
START_TIME=$(date +%s)
|
|
73
|
-
ITERATIONS_COMPLETED=0
|
|
74
|
-
FINAL_DECISION=""
|
|
75
|
-
LOOP3_FINAL_CONFIDENCE=0.0
|
|
76
|
-
LOOP2_FINAL_CONSENSUS=0.0
|
|
77
|
-
DELIVERABLES_VERIFIED=false
|
|
78
|
-
|
|
79
|
-
##############################################################################
|
|
80
|
-
# Argument Parsing
|
|
81
|
-
##############################################################################
|
|
82
|
-
while [[ $# -gt 0 ]]; do
|
|
83
|
-
case $1 in
|
|
84
|
-
--task-id)
|
|
85
|
-
if [[ $# -lt 2 ]]; then
|
|
86
|
-
echo "Error: --task-id requires a value"
|
|
87
|
-
exit 1
|
|
88
|
-
fi
|
|
89
|
-
TASK_ID=$(sanitize_input "$2") || { echo "Invalid task ID"; exit 1; }
|
|
90
|
-
shift 2
|
|
91
|
-
;;
|
|
92
|
-
--mode)
|
|
93
|
-
if [[ $# -lt 2 ]]; then
|
|
94
|
-
echo "Error: --mode requires a value"
|
|
95
|
-
exit 1
|
|
96
|
-
fi
|
|
97
|
-
MODE="$2"
|
|
98
|
-
# Whitelist allowed modes
|
|
99
|
-
if [[ ! "$MODE" =~ ^(mvp|standard|enterprise)$ ]]; then
|
|
100
|
-
echo "Invalid mode. Must be mvp, standard, or enterprise."
|
|
101
|
-
exit 1
|
|
102
|
-
fi
|
|
103
|
-
shift 2
|
|
104
|
-
;;
|
|
105
|
-
--loop3-agents)
|
|
106
|
-
if [[ $# -lt 2 ]]; then
|
|
107
|
-
echo "Error: --loop3-agents requires a value"
|
|
108
|
-
exit 1
|
|
109
|
-
fi
|
|
110
|
-
validate_agent_list "$2" || { echo "Invalid Loop 3 agent list"; exit 1; }
|
|
111
|
-
LOOP3_AGENTS="$2"
|
|
112
|
-
shift 2
|
|
113
|
-
;;
|
|
114
|
-
--loop2-agents)
|
|
115
|
-
if [[ $# -lt 2 ]]; then
|
|
116
|
-
echo "Error: --loop2-agents requires a value"
|
|
117
|
-
exit 1
|
|
118
|
-
fi
|
|
119
|
-
validate_agent_list "$2" || { echo "Invalid Loop 2 agent list"; exit 1; }
|
|
120
|
-
LOOP2_AGENTS="$2"
|
|
121
|
-
shift 2
|
|
122
|
-
;;
|
|
123
|
-
--product-owner)
|
|
124
|
-
if [[ $# -lt 2 ]]; then
|
|
125
|
-
echo "Error: --product-owner requires a value"
|
|
126
|
-
exit 1
|
|
127
|
-
fi
|
|
128
|
-
PRODUCT_OWNER=$(sanitize_input "$2") || { echo "Invalid product owner"; exit 1; }
|
|
129
|
-
shift 2
|
|
130
|
-
;;
|
|
131
|
-
--max-iterations)
|
|
132
|
-
if [[ $# -lt 2 ]]; then
|
|
133
|
-
echo "Error: --max-iterations requires a value"
|
|
134
|
-
exit 1
|
|
135
|
-
fi
|
|
136
|
-
# Validate max iterations is a positive integer
|
|
137
|
-
if [[ ! "$2" =~ ^[1-9][0-9]*$ ]]; then
|
|
138
|
-
echo "Max iterations must be a positive integer"
|
|
139
|
-
exit 1
|
|
140
|
-
fi
|
|
141
|
-
MAX_ITERATIONS="$2"
|
|
142
|
-
shift 2
|
|
143
|
-
;;
|
|
144
|
-
--min-quorum-loop3)
|
|
145
|
-
if [[ $# -lt 2 ]]; then
|
|
146
|
-
echo "Error: --min-quorum-loop3 requires a value"
|
|
147
|
-
exit 1
|
|
148
|
-
fi
|
|
149
|
-
# Validate quorum is a valid decimal between 0 and 1
|
|
150
|
-
if [[ ! "$2" =~ ^0\.[0-9]+$ ]] || (( $(echo "$2 > 1" | bc -l) )); then
|
|
151
|
-
echo "Invalid Loop 3 quorum. Must be between 0 and 1."
|
|
152
|
-
exit 1
|
|
153
|
-
fi
|
|
154
|
-
MIN_QUORUM_LOOP3="$2"
|
|
155
|
-
shift 2
|
|
156
|
-
;;
|
|
157
|
-
--min-quorum-loop2)
|
|
158
|
-
if [[ $# -lt 2 ]]; then
|
|
159
|
-
echo "Error: --min-quorum-loop2 requires a value"
|
|
160
|
-
exit 1
|
|
161
|
-
fi
|
|
162
|
-
# Validate quorum is a valid decimal between 0 and 1
|
|
163
|
-
if [[ ! "$2" =~ ^0\.[0-9]+$ ]] || (( $(echo "$2 > 1" | bc -l) )); then
|
|
164
|
-
echo "Invalid Loop 2 quorum. Must be between 0 and 1."
|
|
165
|
-
exit 1
|
|
166
|
-
fi
|
|
167
|
-
MIN_QUORUM_LOOP2="$2"
|
|
168
|
-
shift 2
|
|
169
|
-
;;
|
|
170
|
-
--epic-context)
|
|
171
|
-
if [[ $# -lt 2 ]]; then
|
|
172
|
-
echo "Error: --epic-context requires a value"
|
|
173
|
-
exit 1
|
|
174
|
-
fi
|
|
175
|
-
validate_json_context "$2" || { echo "Invalid epic context JSON"; exit 1; }
|
|
176
|
-
EPIC_CONTEXT="$2"
|
|
177
|
-
shift 2
|
|
178
|
-
;;
|
|
179
|
-
--phase-context)
|
|
180
|
-
if [[ $# -lt 2 ]]; then
|
|
181
|
-
echo "Error: --phase-context requires a value"
|
|
182
|
-
exit 1
|
|
183
|
-
fi
|
|
184
|
-
validate_json_context "$2" || { echo "Invalid phase context JSON"; exit 1; }
|
|
185
|
-
PHASE_CONTEXT="$2"
|
|
186
|
-
shift 2
|
|
187
|
-
;;
|
|
188
|
-
--success-criteria)
|
|
189
|
-
if [[ $# -lt 2 ]]; then
|
|
190
|
-
echo "Error: --success-criteria requires a value"
|
|
191
|
-
exit 1
|
|
192
|
-
fi
|
|
193
|
-
validate_json_context "$2" || { echo "Invalid success criteria JSON"; exit 1; }
|
|
194
|
-
SUCCESS_CRITERIA="$2"
|
|
195
|
-
shift 2
|
|
196
|
-
;;
|
|
197
|
-
--expected-files)
|
|
198
|
-
if [[ $# -lt 2 ]]; then
|
|
199
|
-
echo "Error: --expected-files requires a value"
|
|
200
|
-
exit 1
|
|
201
|
-
fi
|
|
202
|
-
# Optional: validate each expected file name if not empty
|
|
203
|
-
if [ -n "$2" ]; then
|
|
204
|
-
IFS=',' read -ra FILES <<< "$2"
|
|
205
|
-
for file in "${FILES[@]}"; do
|
|
206
|
-
sanitize_input "$file" 256 || { echo "Invalid expected filename: $file"; exit 1; }
|
|
207
|
-
done
|
|
208
|
-
fi
|
|
209
|
-
EXPECTED_FILES="$2"
|
|
210
|
-
shift 2
|
|
211
|
-
;;
|
|
212
|
-
--phase-id)
|
|
213
|
-
if [[ $# -lt 2 ]]; then
|
|
214
|
-
echo "Error: --phase-id requires a value"
|
|
215
|
-
exit 1
|
|
216
|
-
fi
|
|
217
|
-
PHASE_ID=$(sanitize_input "$2") || { echo "Invalid phase ID"; exit 1; }
|
|
218
|
-
shift 2
|
|
219
|
-
;;
|
|
220
|
-
*)
|
|
221
|
-
echo "Error: Unknown option: '$1'"
|
|
222
|
-
echo ""
|
|
223
|
-
echo "Usage: $0 [OPTIONS]"
|
|
224
|
-
echo ""
|
|
225
|
-
echo "Required options:"
|
|
226
|
-
echo " --task-id <id> Unique task identifier"
|
|
227
|
-
echo " --loop3-agents <agents> Comma-separated list of Loop 3 agents"
|
|
228
|
-
echo " --loop2-agents <agents> Comma-separated list of Loop 2 agents"
|
|
229
|
-
echo " --product-owner <agent> Product owner agent ID"
|
|
230
|
-
echo ""
|
|
231
|
-
echo "Optional options:"
|
|
232
|
-
echo " --mode <mode> CFN mode: mvp, standard, enterprise (default: standard)"
|
|
233
|
-
echo " --max-iterations <n> Maximum iterations (default: 10)"
|
|
234
|
-
echo " --min-quorum-loop3 <n> Loop 3 quorum threshold (default: 0.66)"
|
|
235
|
-
echo " --min-quorum-loop2 <n> Loop 2 quorum threshold (default: 0.66)"
|
|
236
|
-
echo " --epic-context <json> Epic context JSON"
|
|
237
|
-
echo " --phase-context <json> Phase context JSON"
|
|
238
|
-
echo " --success-criteria <json> Success criteria JSON"
|
|
239
|
-
echo " --expected-files <files> Comma-separated expected deliverables"
|
|
240
|
-
echo " --phase-id <id> Phase identifier for timeout calculation"
|
|
241
|
-
exit 1
|
|
242
|
-
;;
|
|
243
|
-
esac
|
|
244
|
-
done
|
|
245
|
-
|
|
246
|
-
# Validation
|
|
247
|
-
if [ -z "$TASK_ID" ] || [ -z "$LOOP3_AGENTS" ] || [ -z "$LOOP2_AGENTS" ] || [ -z "$PRODUCT_OWNER" ]; then
|
|
248
|
-
echo "Error: Required parameters missing"
|
|
249
|
-
echo "Usage: $0 --task-id <id> --mode <mode> --loop3-agents <agents> --loop2-agents <agents> --product-owner <agent>"
|
|
250
|
-
exit 1
|
|
251
|
-
fi
|
|
252
|
-
|
|
253
|
-
# Get thresholds for mode
|
|
254
|
-
# Add additional mode validation with safe fallback
|
|
255
|
-
case "$MODE" in
|
|
256
|
-
mvp)
|
|
257
|
-
GATE=${GATE_THRESHOLD[mvp]:-0.70}
|
|
258
|
-
CONSENSUS=${CONSENSUS_THRESHOLD[mvp]:-0.80}
|
|
259
|
-
;;
|
|
260
|
-
standard)
|
|
261
|
-
GATE=${GATE_THRESHOLD[standard]:-0.75}
|
|
262
|
-
CONSENSUS=${CONSENSUS_THRESHOLD[standard]:-0.90}
|
|
263
|
-
;;
|
|
264
|
-
enterprise)
|
|
265
|
-
GATE=${GATE_THRESHOLD[enterprise]:-0.85}
|
|
266
|
-
CONSENSUS=${CONSENSUS_THRESHOLD[enterprise]:-0.95}
|
|
267
|
-
;;
|
|
268
|
-
*)
|
|
269
|
-
echo "Invalid mode: $MODE"
|
|
270
|
-
exit 1
|
|
271
|
-
;;
|
|
272
|
-
esac
|
|
273
|
-
|
|
274
|
-
# Calculate timeout
|
|
275
|
-
TIMEOUT=$("$HELPERS_DIR/timeout-calculator.sh" --phase-id "${PHASE_ID:-unknown}")
|
|
276
|
-
|
|
277
|
-
echo "=============================================="
|
|
278
|
-
echo "CFN Loop Orchestration v1.0.0"
|
|
279
|
-
echo "=============================================="
|
|
280
|
-
echo "Task ID: $TASK_ID"
|
|
281
|
-
echo "Mode: $MODE"
|
|
282
|
-
echo "Gate Threshold: $GATE"
|
|
283
|
-
echo "Consensus Threshold: $CONSENSUS"
|
|
284
|
-
echo "Max Iterations: $MAX_ITERATIONS"
|
|
285
|
-
echo "Timeout: ${TIMEOUT}s"
|
|
286
|
-
echo "=============================================="
|
|
287
|
-
echo ""
|
|
288
|
-
|
|
289
|
-
##############################################################################
|
|
290
|
-
# Helper Functions
|
|
291
|
-
##############################################################################
|
|
292
|
-
|
|
293
|
-
function store_context() {
|
|
294
|
-
local task_id="$1"
|
|
295
|
-
|
|
296
|
-
# Store epic context if provided using Redis coordination primitive
|
|
297
|
-
if [ -n "$EPIC_CONTEXT" ]; then
|
|
298
|
-
"$REDIS_COORD_SKILL/store-context.sh" \
|
|
299
|
-
--task-id "$task_id" \
|
|
300
|
-
--key "epic-context" \
|
|
301
|
-
--value "$EPIC_CONTEXT" \
|
|
302
|
-
--namespace "swarm" >/dev/null
|
|
303
|
-
echo "Stored epic context"
|
|
304
|
-
fi
|
|
305
|
-
|
|
306
|
-
# Store phase context if provided using Redis coordination primitive
|
|
307
|
-
if [ -n "$PHASE_CONTEXT" ]; then
|
|
308
|
-
"$REDIS_COORD_SKILL/store-context.sh" \
|
|
309
|
-
--task-id "$task_id" \
|
|
310
|
-
--key "phase-context" \
|
|
311
|
-
--value "$PHASE_CONTEXT" \
|
|
312
|
-
--namespace "swarm" >/dev/null
|
|
313
|
-
echo "Stored phase context"
|
|
314
|
-
fi
|
|
315
|
-
|
|
316
|
-
# Store success criteria if provided using Redis coordination primitive
|
|
317
|
-
if [ -n "$SUCCESS_CRITERIA" ]; then
|
|
318
|
-
"$REDIS_COORD_SKILL/store-context.sh" \
|
|
319
|
-
--task-id "$task_id" \
|
|
320
|
-
--key "success-criteria" \
|
|
321
|
-
--value "$SUCCESS_CRITERIA" \
|
|
322
|
-
--namespace "swarm" >/dev/null
|
|
323
|
-
echo "Stored success criteria"
|
|
324
|
-
fi
|
|
325
|
-
|
|
326
|
-
echo ""
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
build_agent_context() {
|
|
330
|
-
local task_id="$1"
|
|
331
|
-
local iteration="$2"
|
|
332
|
-
local agent_type="$3"
|
|
333
|
-
local feedback="$4"
|
|
334
|
-
local loop_type="${5:-}" # NEW: loop3, loop2, or loop4 (optional)
|
|
335
|
-
|
|
336
|
-
# Initialize context variables
|
|
337
|
-
local task_desc="CFN Loop implementation"
|
|
338
|
-
local deliverables=""
|
|
339
|
-
local acceptance=""
|
|
340
|
-
local epic_context=""
|
|
341
|
-
local phase_context=""
|
|
342
|
-
local target_files=""
|
|
343
|
-
|
|
344
|
-
# Try to retrieve complete context from Redis
|
|
345
|
-
if command -v "$REDIS_COORD_SKILL/get-context.sh" >/dev/null 2>&1; then
|
|
346
|
-
if redis_context=$("$REDIS_COORD_SKILL/get-context.sh" --task-id "$task_id" --namespace "swarm" 2>/dev/null); then
|
|
347
|
-
echo "📥 Retrieved Redis context for task: $task_id" >&2
|
|
348
|
-
|
|
349
|
-
# Extract fields from Redis context
|
|
350
|
-
task_desc=$(echo "$redis_context" | jq -r '.["epic-context"] // .epic_context // "CFN Loop implementation"' 2>/dev/null || echo "CFN Loop implementation")
|
|
351
|
-
deliverables=$(echo "$redis_context" | jq -r '.deliverables // [] | if type == "array" then join(", ") else . end' 2>/dev/null || echo "")
|
|
352
|
-
acceptance=$(echo "$redis_context" | jq -r '.acceptanceCriteria // .["acceptance-criteria"] // [] | if type == "array" then join(", ") else . end' 2>/dev/null || echo "")
|
|
353
|
-
epic_context=$(echo "$redis_context" | jq -r '.["epic-context"] // ""' 2>/dev/null || echo "")
|
|
354
|
-
phase_context=$(echo "$redis_context" | jq -r '.["phase-context"] // ""' 2>/dev/null || echo "")
|
|
355
|
-
target_files=$(echo "$redis_context" | jq -r '.["target-files"] // ""' 2>/dev/null || echo "")
|
|
356
|
-
|
|
357
|
-
echo "📋 Redis context extracted - Task: $task_desc" >&2
|
|
358
|
-
else
|
|
359
|
-
echo "⚠️ Failed to retrieve Redis context, using local SUCCESS_CRITERIA" >&2
|
|
360
|
-
fi
|
|
361
|
-
else
|
|
362
|
-
echo "⚠️ get-context.sh not found, using local SUCCESS_CRITERIA" >&2
|
|
363
|
-
fi
|
|
364
|
-
|
|
365
|
-
# Fallback to local SUCCESS_CRITERIA if Redis retrieval failed or incomplete
|
|
366
|
-
if [ -z "$deliverables" ] && [ -n "$SUCCESS_CRITERIA" ]; then
|
|
367
|
-
deliverables=$(echo "$SUCCESS_CRITERIA" | jq -r '.deliverables // [] | join(", ")' 2>/dev/null || echo "")
|
|
368
|
-
acceptance=$(echo "$SUCCESS_CRITERIA" | jq -r '.acceptanceCriteria // [] | join(", ")' 2>/dev/null || echo "")
|
|
369
|
-
echo "🔄 Using local SUCCESS_CRITERIA as fallback" >&2
|
|
370
|
-
fi
|
|
371
|
-
|
|
372
|
-
# Build comprehensive context string
|
|
373
|
-
local context="Task: $task_desc"
|
|
374
|
-
|
|
375
|
-
if [ -n "$deliverables" ]; then
|
|
376
|
-
context="$context | Deliverables: $deliverables"
|
|
377
|
-
fi
|
|
378
|
-
|
|
379
|
-
if [ -n "$acceptance" ]; then
|
|
380
|
-
context="$context | Acceptance Criteria: $acceptance"
|
|
381
|
-
fi
|
|
382
|
-
|
|
383
|
-
if [ -n "$target_files" ]; then
|
|
384
|
-
context="$context | Target Files: $target_files"
|
|
385
|
-
fi
|
|
386
|
-
|
|
387
|
-
context="$context | Iteration: $iteration"
|
|
388
|
-
|
|
389
|
-
if [[ -n "$feedback" ]]; then
|
|
390
|
-
context="$context | Feedback: $feedback"
|
|
391
|
-
fi
|
|
392
|
-
|
|
393
|
-
# Add epic/phase context if available
|
|
394
|
-
if [ -n "$epic_context" ]; then
|
|
395
|
-
context="$context | Epic: $epic_context"
|
|
396
|
-
fi
|
|
397
|
-
|
|
398
|
-
if [ -n "$phase_context" ]; then
|
|
399
|
-
context="$context | Phase: $phase_context"
|
|
400
|
-
fi
|
|
401
|
-
|
|
402
|
-
# Inject CFN Loop context if injection script exists and loop_type provided
|
|
403
|
-
if [[ -n "$loop_type" ]] && [[ -x "$SCRIPT_DIR/inject-loop-context.sh" ]]; then
|
|
404
|
-
context=$("$SCRIPT_DIR/inject-loop-context.sh" "$loop_type" "$context" 2>/dev/null || echo "$context")
|
|
405
|
-
fi
|
|
406
|
-
|
|
407
|
-
echo "$context"
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
function spawn_loop3_agents() {
|
|
411
|
-
local task_id="$1"
|
|
412
|
-
local iteration="$2"
|
|
413
|
-
local agents="$3"
|
|
414
|
-
|
|
415
|
-
echo "[Loop 3] Spawning implementer agents (iteration $iteration)..."
|
|
416
|
-
|
|
417
|
-
# Convert comma-separated agents to array
|
|
418
|
-
IFS=',' read -ra AGENT_ARRAY <<< "$agents"
|
|
419
|
-
|
|
420
|
-
# Track agent instance counts for unique ID generation
|
|
421
|
-
declare -A AGENT_INSTANCE_COUNTS
|
|
422
|
-
|
|
423
|
-
# Spawn each agent via CLI
|
|
424
|
-
for agent_type in "${AGENT_ARRAY[@]}"; do
|
|
425
|
-
# Generate unique agent ID (agent-type-iteration-instance)
|
|
426
|
-
AGENT_INSTANCE_COUNTS["$agent_type"]=$((${AGENT_INSTANCE_COUNTS["$agent_type"]:-0} + 1))
|
|
427
|
-
INSTANCE_NUM="${AGENT_INSTANCE_COUNTS["$agent_type"]}"
|
|
428
|
-
UNIQUE_AGENT_ID="${agent_type}-${iteration}-${INSTANCE_NUM}"
|
|
429
|
-
|
|
430
|
-
echo " Spawning: $agent_type (ID: $UNIQUE_AGENT_ID)"
|
|
431
|
-
|
|
432
|
-
# Validate agent input
|
|
433
|
-
local safe_agent_type safe_task_id safe_agent_id
|
|
434
|
-
safe_agent_type=$(sanitize_input "$agent_type") || continue
|
|
435
|
-
safe_task_id=$(sanitize_input "$task_id") || continue
|
|
436
|
-
safe_agent_id=$(sanitize_input "$UNIQUE_AGENT_ID") || continue
|
|
437
|
-
|
|
438
|
-
# Spawn agent in background with explicit agent ID
|
|
439
|
-
npx claude-flow-novice agent "$safe_agent_type" \
|
|
440
|
-
--task-id "$safe_task_id" \
|
|
441
|
-
--agent-id "$safe_agent_id" \
|
|
442
|
-
--iteration "$iteration" \
|
|
443
|
-
--context "$(build_agent_context "$safe_task_id" "$iteration" "$safe_agent_type" "" "loop3")" &
|
|
444
|
-
|
|
445
|
-
# Store PID for monitoring using unique agent ID
|
|
446
|
-
AGENT_PID=$!
|
|
447
|
-
"$REDIS_COORD_SKILL/store-context.sh" \
|
|
448
|
-
--task-id "$task_id" \
|
|
449
|
-
--key "${UNIQUE_AGENT_ID}:pid" \
|
|
450
|
-
--value "{\"pid\": $AGENT_PID}" \
|
|
451
|
-
--namespace "swarm" >/dev/null
|
|
452
|
-
|
|
453
|
-
# Store agent ID mapping for later retrieval using Redis SADD for set storage
|
|
454
|
-
redis-cli SADD "swarm:${task_id}:loop3:agent_ids:iteration${iteration}" "$UNIQUE_AGENT_ID" >/dev/null
|
|
455
|
-
done
|
|
456
|
-
|
|
457
|
-
echo "[Loop 3] All agents spawned"
|
|
458
|
-
echo ""
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
function wait_for_agents() {
|
|
462
|
-
local task_id="$1"
|
|
463
|
-
local agents="$2"
|
|
464
|
-
local timeout="$3"
|
|
465
|
-
local iteration="${4:-1}"
|
|
466
|
-
|
|
467
|
-
echo "Waiting for agents to complete (timeout: ${timeout}s)..."
|
|
468
|
-
|
|
469
|
-
# Retrieve actual agent IDs from Redis (stored during spawn using SADD)
|
|
470
|
-
local stored_ids
|
|
471
|
-
stored_ids=$(redis-cli SMEMBERS "swarm:${task_id}:loop3:agent_ids:iteration${iteration}" 2>/dev/null | tr '\n' ',' | sed 's/,$//')
|
|
472
|
-
|
|
473
|
-
# If stored IDs exist, use them; otherwise fallback to generating from agent types
|
|
474
|
-
local -a AGENT_IDS
|
|
475
|
-
if [ -n "$stored_ids" ]; then
|
|
476
|
-
IFS=',' read -ra AGENT_IDS <<< "$stored_ids"
|
|
477
|
-
echo " Retrieved ${#AGENT_IDS[@]} agent IDs from Redis"
|
|
478
|
-
else
|
|
479
|
-
# Fallback: Convert agent types to IDs (legacy compatibility)
|
|
480
|
-
echo " Warning: No stored agent IDs, using agent types as fallback"
|
|
481
|
-
IFS=',' read -ra AGENT_TYPES <<< "$agents"
|
|
482
|
-
|
|
483
|
-
# Track instance counts to match spawn behavior
|
|
484
|
-
declare -A AGENT_INSTANCE_COUNTS
|
|
485
|
-
for agent_type in "${AGENT_TYPES[@]}"; do
|
|
486
|
-
AGENT_INSTANCE_COUNTS["$agent_type"]=$((${AGENT_INSTANCE_COUNTS["$agent_type"]:-0} + 1))
|
|
487
|
-
INSTANCE_NUM="${AGENT_INSTANCE_COUNTS["$agent_type"]}"
|
|
488
|
-
AGENT_IDS+=("${agent_type}-${iteration}-${INSTANCE_NUM}")
|
|
489
|
-
done
|
|
490
|
-
fi
|
|
491
|
-
|
|
492
|
-
# Parallel BLPOP implementation with shared timeout
|
|
493
|
-
# Track start time for global timeout calculation
|
|
494
|
-
local start_time=$(date +%s)
|
|
495
|
-
|
|
496
|
-
# Spawn parallel BLPOP processes for each agent
|
|
497
|
-
local pids=()
|
|
498
|
-
local temp_files=()
|
|
499
|
-
|
|
500
|
-
for unique_agent_id in "${AGENT_IDS[@]}"; do
|
|
501
|
-
# Create temporary file for this agent's result
|
|
502
|
-
local temp_file="/tmp/cfn-wait-${task_id}-${unique_agent_id}-$$.tmp"
|
|
503
|
-
temp_files+=("$temp_file")
|
|
504
|
-
|
|
505
|
-
echo " Waiting for: $unique_agent_id"
|
|
506
|
-
|
|
507
|
-
# Spawn BLPOP in background, write result to temp file
|
|
508
|
-
(
|
|
509
|
-
local result
|
|
510
|
-
if redis-cli blpop "swarm:${task_id}:${unique_agent_id}:done" "$timeout" >/dev/null 2>&1; then
|
|
511
|
-
echo "success" > "$temp_file"
|
|
512
|
-
else
|
|
513
|
-
echo "timeout" > "$temp_file"
|
|
514
|
-
fi
|
|
515
|
-
exit 0
|
|
516
|
-
) &
|
|
517
|
-
|
|
518
|
-
pids+=($!)
|
|
519
|
-
done
|
|
520
|
-
|
|
521
|
-
# Wait for all parallel BLPOP processes to complete
|
|
522
|
-
# This ensures timeout is global (60s total), not per-agent (60s * N)
|
|
523
|
-
for pid in "${pids[@]}"; do
|
|
524
|
-
wait "$pid" 2>/dev/null || true
|
|
525
|
-
done
|
|
526
|
-
|
|
527
|
-
# Calculate actual elapsed time
|
|
528
|
-
local end_time=$(date +%s)
|
|
529
|
-
local elapsed=$((end_time - start_time))
|
|
530
|
-
|
|
531
|
-
# Check results and report status
|
|
532
|
-
local completed=0
|
|
533
|
-
local timed_out=0
|
|
534
|
-
|
|
535
|
-
for i in "${!AGENT_IDS[@]}"; do
|
|
536
|
-
local unique_agent_id="${AGENT_IDS[$i]}"
|
|
537
|
-
local temp_file="${temp_files[$i]}"
|
|
538
|
-
|
|
539
|
-
if [ -f "$temp_file" ]; then
|
|
540
|
-
local result=$(cat "$temp_file")
|
|
541
|
-
if [ "$result" = "success" ]; then
|
|
542
|
-
((completed++))
|
|
543
|
-
echo " ✅ $unique_agent_id completed"
|
|
544
|
-
else
|
|
545
|
-
((timed_out++))
|
|
546
|
-
echo " ⚠️ $unique_agent_id did not complete within timeout"
|
|
547
|
-
fi
|
|
548
|
-
rm -f "$temp_file"
|
|
549
|
-
else
|
|
550
|
-
((timed_out++))
|
|
551
|
-
echo " ❌ $unique_agent_id result file missing"
|
|
552
|
-
fi
|
|
553
|
-
done
|
|
554
|
-
|
|
555
|
-
echo "Agents completed: $completed/${#AGENT_IDS[@]} (elapsed: ${elapsed}s)"
|
|
556
|
-
echo ""
|
|
557
|
-
}
|
|
558
|
-
|
|
559
|
-
function wait_for_loop2_agents() {
|
|
560
|
-
local task_id="$1"
|
|
561
|
-
local agents="$2"
|
|
562
|
-
local timeout="$3"
|
|
563
|
-
local iteration="${4:-1}"
|
|
564
|
-
|
|
565
|
-
echo "Waiting for Loop 2 validators to complete (timeout: ${timeout}s)..."
|
|
566
|
-
|
|
567
|
-
# Retrieve actual agent IDs from Redis (stored during spawn using SADD)
|
|
568
|
-
local stored_ids
|
|
569
|
-
stored_ids=$(redis-cli SMEMBERS "swarm:${task_id}:loop2:agent_ids:iteration${iteration}" 2>/dev/null | tr '\n' ',' | sed 's/,$//')
|
|
570
|
-
|
|
571
|
-
# If stored IDs exist, use them; otherwise fallback to generating from agent types
|
|
572
|
-
local -a VALIDATOR_IDS
|
|
573
|
-
if [ -n "$stored_ids" ]; then
|
|
574
|
-
IFS=',' read -ra VALIDATOR_IDS <<< "$stored_ids"
|
|
575
|
-
echo " Retrieved ${#VALIDATOR_IDS[@]} validator IDs from Redis"
|
|
576
|
-
else
|
|
577
|
-
# Fallback: Convert agent types to IDs (legacy compatibility)
|
|
578
|
-
echo " Warning: No stored validator IDs, using agent types as fallback"
|
|
579
|
-
IFS=',' read -ra AGENT_TYPES <<< "$agents"
|
|
580
|
-
|
|
581
|
-
# Track instance counts to match spawn behavior
|
|
582
|
-
declare -A AGENT_INSTANCE_COUNTS
|
|
583
|
-
for agent_type in "${AGENT_TYPES[@]}"; do
|
|
584
|
-
AGENT_INSTANCE_COUNTS["$agent_type"]=$((${AGENT_INSTANCE_COUNTS["$agent_type"]:-0} + 1))
|
|
585
|
-
INSTANCE_NUM="${AGENT_INSTANCE_COUNTS["$agent_type"]}"
|
|
586
|
-
VALIDATOR_IDS+=("${agent_type}-${iteration}-${INSTANCE_NUM}")
|
|
587
|
-
done
|
|
588
|
-
fi
|
|
589
|
-
|
|
590
|
-
# Parallel BLPOP implementation
|
|
591
|
-
local start_time=$(date +%s)
|
|
592
|
-
local pids=()
|
|
593
|
-
local temp_files=()
|
|
594
|
-
|
|
595
|
-
for unique_validator_id in "${VALIDATOR_IDS[@]}"; do
|
|
596
|
-
local temp_file="/tmp/cfn-wait-${task_id}-${unique_validator_id}-$$.tmp"
|
|
597
|
-
temp_files+=("$temp_file")
|
|
598
|
-
|
|
599
|
-
echo " Waiting for: $unique_validator_id"
|
|
600
|
-
|
|
601
|
-
# Spawn BLPOP in background
|
|
602
|
-
(
|
|
603
|
-
if redis-cli blpop "swarm:${task_id}:${unique_validator_id}:done" "$timeout" >/dev/null 2>&1; then
|
|
604
|
-
echo "success" > "$temp_file"
|
|
605
|
-
else
|
|
606
|
-
echo "timeout" > "$temp_file"
|
|
607
|
-
fi
|
|
608
|
-
exit 0
|
|
609
|
-
) &
|
|
610
|
-
|
|
611
|
-
pids+=($!)
|
|
612
|
-
done
|
|
613
|
-
|
|
614
|
-
# Wait for all processes
|
|
615
|
-
for pid in "${pids[@]}"; do
|
|
616
|
-
wait "$pid" 2>/dev/null || true
|
|
617
|
-
done
|
|
618
|
-
|
|
619
|
-
# Check results
|
|
620
|
-
local end_time=$(date +%s)
|
|
621
|
-
local elapsed=$((end_time - start_time))
|
|
622
|
-
local completed=0
|
|
623
|
-
local timed_out=0
|
|
624
|
-
|
|
625
|
-
for i in "${!VALIDATOR_IDS[@]}"; do
|
|
626
|
-
local unique_validator_id="${VALIDATOR_IDS[$i]}"
|
|
627
|
-
local temp_file="${temp_files[$i]}"
|
|
628
|
-
|
|
629
|
-
if [ -f "$temp_file" ]; then
|
|
630
|
-
local result=$(cat "$temp_file")
|
|
631
|
-
if [ "$result" = "success" ]; then
|
|
632
|
-
((completed++))
|
|
633
|
-
echo " ✅ $unique_validator_id completed"
|
|
634
|
-
else
|
|
635
|
-
((timed_out++))
|
|
636
|
-
echo " ⚠️ $unique_validator_id did not complete within timeout"
|
|
637
|
-
fi
|
|
638
|
-
rm -f "$temp_file"
|
|
639
|
-
else
|
|
640
|
-
((timed_out++))
|
|
641
|
-
echo " ❌ $unique_validator_id result file missing"
|
|
642
|
-
fi
|
|
643
|
-
done
|
|
644
|
-
|
|
645
|
-
echo "Validators completed: $completed/${#VALIDATOR_IDS[@]} (elapsed: ${elapsed}s)"
|
|
646
|
-
echo ""
|
|
647
|
-
}
|
|
648
|
-
|
|
649
|
-
function spawn_loop2_agents() {
|
|
650
|
-
local task_id="$1"
|
|
651
|
-
local iteration="$2"
|
|
652
|
-
local agents="$3"
|
|
653
|
-
|
|
654
|
-
echo "[Loop 2] Spawning validator agents (iteration $iteration)..."
|
|
655
|
-
|
|
656
|
-
# Convert comma-separated agents to array
|
|
657
|
-
IFS=',' read -ra AGENT_ARRAY <<< "$agents"
|
|
658
|
-
|
|
659
|
-
# Track agent instance counts for unique ID generation
|
|
660
|
-
declare -A AGENT_INSTANCE_COUNTS
|
|
661
|
-
|
|
662
|
-
# Spawn each agent via CLI
|
|
663
|
-
for agent_type in "${AGENT_ARRAY[@]}"; do
|
|
664
|
-
# Generate unique agent ID (agent-type-iteration-instance)
|
|
665
|
-
AGENT_INSTANCE_COUNTS["$agent_type"]=$((${AGENT_INSTANCE_COUNTS["$agent_type"]:-0} + 1))
|
|
666
|
-
INSTANCE_NUM="${AGENT_INSTANCE_COUNTS["$agent_type"]}"
|
|
667
|
-
UNIQUE_VALIDATOR_ID="${agent_type}-${iteration}-${INSTANCE_NUM}"
|
|
668
|
-
|
|
669
|
-
echo " Spawning: $agent_type (ID: $UNIQUE_VALIDATOR_ID)"
|
|
670
|
-
|
|
671
|
-
# Spawn agent in background with explicit agent ID
|
|
672
|
-
npx claude-flow-novice agent "$agent_type" \
|
|
673
|
-
--task-id "$task_id" \
|
|
674
|
-
--agent-id "$UNIQUE_VALIDATOR_ID" \
|
|
675
|
-
--iteration "$iteration" \
|
|
676
|
-
--context "$(build_agent_context "$task_id" "$iteration" "$agent_type" "" "loop2")" &
|
|
677
|
-
|
|
678
|
-
# Store PID for monitoring using unique agent ID
|
|
679
|
-
AGENT_PID=$!
|
|
680
|
-
"$REDIS_COORD_SKILL/store-context.sh" \
|
|
681
|
-
--task-id "$task_id" \
|
|
682
|
-
--key "${UNIQUE_VALIDATOR_ID}:pid" \
|
|
683
|
-
--value "{\"pid\": $AGENT_PID}" \
|
|
684
|
-
--namespace "swarm" >/dev/null
|
|
685
|
-
|
|
686
|
-
# Store agent ID mapping for later retrieval using Redis SADD for set storage
|
|
687
|
-
redis-cli SADD "swarm:${task_id}:loop2:agent_ids:iteration${iteration}" "$UNIQUE_VALIDATOR_ID" >/dev/null
|
|
688
|
-
done
|
|
689
|
-
|
|
690
|
-
echo "[Loop 2] All agents spawned"
|
|
691
|
-
echo ""
|
|
692
|
-
}
|
|
693
|
-
|
|
694
|
-
function spawn_product_owner() {
|
|
695
|
-
local task_id="$1"
|
|
696
|
-
local iteration="$2"
|
|
697
|
-
|
|
698
|
-
echo "[Product Owner] Spawning decision agent..."
|
|
699
|
-
|
|
700
|
-
# BLOCKER #2 FIX: Match execute-decision.sh actual parameters
|
|
701
|
-
# Required: --task-id, --agent-id, --consensus, --threshold, --iteration, --max-iterations
|
|
702
|
-
local decision_output
|
|
703
|
-
decision_output=$("$SCRIPT_DIR/.claude/skills/cfn-product-owner-decision/execute-decision.sh" \
|
|
704
|
-
--task-id "$task_id" \
|
|
705
|
-
--agent-id "$PRODUCT_OWNER" \
|
|
706
|
-
--consensus "$LOOP2_FINAL_CONSENSUS" \
|
|
707
|
-
--threshold "$CONSENSUS" \
|
|
708
|
-
--iteration "$iteration" \
|
|
709
|
-
--max-iterations "$MAX_ITERATIONS")
|
|
710
|
-
|
|
711
|
-
# Parse decision from output
|
|
712
|
-
if echo "$decision_output" | grep -q "PROCEED"; then
|
|
713
|
-
FINAL_DECISION="PROCEED"
|
|
714
|
-
elif echo "$decision_output" | grep -q "ITERATE"; then
|
|
715
|
-
FINAL_DECISION="ITERATE"
|
|
716
|
-
elif echo "$decision_output" | grep -q "ABORT"; then
|
|
717
|
-
FINAL_DECISION="ABORT"
|
|
718
|
-
else
|
|
719
|
-
echo "Warning: Could not parse Product Owner decision, defaulting to ITERATE"
|
|
720
|
-
FINAL_DECISION="ITERATE"
|
|
721
|
-
fi
|
|
722
|
-
|
|
723
|
-
echo "[Product Owner] Decision: $FINAL_DECISION"
|
|
724
|
-
echo ""
|
|
725
|
-
}
|
|
726
|
-
|
|
727
|
-
function output_result() {
|
|
728
|
-
local status="$1"
|
|
729
|
-
local end_time=$(date +%s)
|
|
730
|
-
local execution_time=$((end_time - START_TIME))
|
|
731
|
-
|
|
732
|
-
echo "=============================================="
|
|
733
|
-
echo "CFN Loop Execution Complete"
|
|
734
|
-
echo "=============================================="
|
|
735
|
-
echo "Status: $status"
|
|
736
|
-
echo "Iterations: $ITERATIONS_COMPLETED"
|
|
737
|
-
echo "Final Decision: $FINAL_DECISION"
|
|
738
|
-
echo "Loop 3 Confidence: $LOOP3_FINAL_CONFIDENCE"
|
|
739
|
-
echo "Loop 2 Consensus: $LOOP2_FINAL_CONSENSUS"
|
|
740
|
-
echo "Deliverables Verified: $DELIVERABLES_VERIFIED"
|
|
741
|
-
echo "Execution Time: ${execution_time}s"
|
|
742
|
-
echo "=============================================="
|
|
743
|
-
|
|
744
|
-
# Output structured JSON result
|
|
745
|
-
cat <<EOF
|
|
746
|
-
{
|
|
747
|
-
"status": "$status",
|
|
748
|
-
"iterations_completed": $ITERATIONS_COMPLETED,
|
|
749
|
-
"final_decision": "$FINAL_DECISION",
|
|
750
|
-
"loop3_confidence": $LOOP3_FINAL_CONFIDENCE,
|
|
751
|
-
"loop2_consensus": $LOOP2_FINAL_CONSENSUS,
|
|
752
|
-
"deliverables_verified": $DELIVERABLES_VERIFIED,
|
|
753
|
-
"execution_time_seconds": $execution_time
|
|
754
|
-
}
|
|
755
|
-
EOF
|
|
756
|
-
}
|
|
757
|
-
|
|
758
|
-
##############################################################################
|
|
759
|
-
# Main CFN Loop
|
|
760
|
-
##############################################################################
|
|
761
|
-
|
|
762
|
-
# Store context in Redis
|
|
763
|
-
store_context "$TASK_ID"
|
|
764
|
-
|
|
765
|
-
# Iteration loop
|
|
766
|
-
for ((ITERATION=1; ITERATION<=MAX_ITERATIONS; ITERATION++)); do
|
|
767
|
-
echo ""
|
|
768
|
-
echo "=========================================="
|
|
769
|
-
echo "Iteration $ITERATION / $MAX_ITERATIONS"
|
|
770
|
-
echo "=========================================="
|
|
771
|
-
echo ""
|
|
772
|
-
|
|
773
|
-
ITERATIONS_COMPLETED=$ITERATION
|
|
774
|
-
|
|
775
|
-
# Step 1: Spawn Loop 3 agents (implementers)
|
|
776
|
-
spawn_loop3_agents "$TASK_ID" "$ITERATION" "$LOOP3_AGENTS"
|
|
777
|
-
|
|
778
|
-
# Step 2: Wait for Loop 3 completion
|
|
779
|
-
wait_for_agents "$TASK_ID" "$LOOP3_AGENTS" "$TIMEOUT" "$ITERATION"
|
|
780
|
-
|
|
781
|
-
# Step 3: Verify deliverables (prevent "consensus on vapor")
|
|
782
|
-
if [ -n "$EXPECTED_FILES" ] || [ -n "$EPIC_CONTEXT" ]; then
|
|
783
|
-
# Extract task type from epic context for keyword detection
|
|
784
|
-
TASK_TYPE=""
|
|
785
|
-
if [ -n "$EPIC_CONTEXT" ]; then
|
|
786
|
-
TASK_TYPE=$(echo "$EPIC_CONTEXT" | jq -r '.epicGoal // ""' 2>/dev/null || echo "")
|
|
787
|
-
fi
|
|
788
|
-
|
|
789
|
-
if "$HELPERS_DIR/deliverable-verifier.sh" \
|
|
790
|
-
--expected-files "${EXPECTED_FILES:-}" \
|
|
791
|
-
--task-type "${TASK_TYPE:-}"; then
|
|
792
|
-
DELIVERABLES_VERIFIED=true
|
|
793
|
-
else
|
|
794
|
-
echo "❌ Deliverable verification failed - forcing Loop 3 iteration"
|
|
795
|
-
# Use iteration manager to wake Loop 3 agents with explicit feedback
|
|
796
|
-
"$HELPERS_DIR/iteration-manager.sh" \
|
|
797
|
-
--task-id "$TASK_ID" \
|
|
798
|
-
--iteration "$((ITERATION + 1))" \
|
|
799
|
-
--agents "$LOOP3_AGENTS" \
|
|
800
|
-
--feedback-source "swarm:${TASK_ID}:feedback"
|
|
801
|
-
continue
|
|
802
|
-
fi
|
|
803
|
-
fi
|
|
804
|
-
|
|
805
|
-
# Step 4: Gate check (Loop 3 self-validation)
|
|
806
|
-
# Retrieve actual Loop 3 agent IDs for validation
|
|
807
|
-
LOOP3_IDS=$(redis-cli SMEMBERS "swarm:${TASK_ID}:loop3:agent_ids:iteration${ITERATION}" 2>/dev/null | tr '\n' ',' | sed 's/,$//')
|
|
808
|
-
|
|
809
|
-
if [ -z "$LOOP3_IDS" ]; then
|
|
810
|
-
echo "⚠️ WARNING: No Loop 3 agent IDs found in Redis, using agent types as fallback"
|
|
811
|
-
LOOP3_IDS="$LOOP3_AGENTS"
|
|
812
|
-
fi
|
|
813
|
-
|
|
814
|
-
if "$HELPERS_DIR/gate-check.sh" \
|
|
815
|
-
--task-id "$TASK_ID" \
|
|
816
|
-
--agents "$LOOP3_IDS" \
|
|
817
|
-
--threshold "$GATE" \
|
|
818
|
-
--min-quorum "$MIN_QUORUM_LOOP3"; then
|
|
819
|
-
# Gate passed - store confidence
|
|
820
|
-
LOOP3_FINAL_CONFIDENCE=$("$REDIS_COORD_SKILL/invoke-waiting-mode.sh" collect \
|
|
821
|
-
--task-id "$TASK_ID" \
|
|
822
|
-
--agent-ids "$LOOP3_IDS" \
|
|
823
|
-
--min-quorum "$MIN_QUORUM_LOOP3")
|
|
824
|
-
else
|
|
825
|
-
# Gate failed - iterate Loop 3
|
|
826
|
-
echo "❌ Gate check failed - iterating Loop 3"
|
|
827
|
-
"$HELPERS_DIR/iteration-manager.sh" \
|
|
828
|
-
--task-id "$TASK_ID" \
|
|
829
|
-
--iteration "$((ITERATION + 1))" \
|
|
830
|
-
--agents "$LOOP3_AGENTS" \
|
|
831
|
-
--feedback-source "swarm:${TASK_ID}:feedback"
|
|
832
|
-
continue
|
|
833
|
-
fi
|
|
834
|
-
|
|
835
|
-
# Step 5: Spawn Loop 2 agents (validators)
|
|
836
|
-
spawn_loop2_agents "$TASK_ID" "$ITERATION" "$LOOP2_AGENTS"
|
|
837
|
-
|
|
838
|
-
# Step 6: Wait for Loop 2 completion
|
|
839
|
-
wait_for_loop2_agents "$TASK_ID" "$LOOP2_AGENTS" "$TIMEOUT" "$ITERATION"
|
|
840
|
-
|
|
841
|
-
# Step 7: Consensus check (Loop 2 validation)
|
|
842
|
-
# Retrieve actual Loop 2 agent IDs for validation
|
|
843
|
-
LOOP2_IDS=$(redis-cli SMEMBERS "swarm:${TASK_ID}:loop2:agent_ids:iteration${ITERATION}" 2>/dev/null | tr '\n' ',' | sed 's/,$//')
|
|
844
|
-
|
|
845
|
-
if [ -z "$LOOP2_IDS" ]; then
|
|
846
|
-
echo "⚠️ WARNING: No Loop 2 agent IDs found in Redis, using agent types as fallback"
|
|
847
|
-
LOOP2_IDS="$LOOP2_AGENTS"
|
|
848
|
-
fi
|
|
849
|
-
|
|
850
|
-
if "$HELPERS_DIR/consensus.sh" \
|
|
851
|
-
--task-id "$TASK_ID" \
|
|
852
|
-
--agents "$LOOP2_IDS" \
|
|
853
|
-
--threshold "$CONSENSUS" \
|
|
854
|
-
--min-quorum "$MIN_QUORUM_LOOP2"; then
|
|
855
|
-
# Consensus reached - store score
|
|
856
|
-
LOOP2_FINAL_CONSENSUS=$("$REDIS_COORD_SKILL/invoke-waiting-mode.sh" collect \
|
|
857
|
-
--task-id "$TASK_ID" \
|
|
858
|
-
--agent-ids "$LOOP2_IDS" \
|
|
859
|
-
--min-quorum "$MIN_QUORUM_LOOP2")
|
|
860
|
-
else
|
|
861
|
-
# Consensus failed - iterate all agents
|
|
862
|
-
echo "❌ Consensus check failed - iterating all agents"
|
|
863
|
-
"$HELPERS_DIR/iteration-manager.sh" \
|
|
864
|
-
--task-id "$TASK_ID" \
|
|
865
|
-
--iteration "$((ITERATION + 1))" \
|
|
866
|
-
--agents "$LOOP3_AGENTS,$LOOP2_AGENTS" \
|
|
867
|
-
--feedback-source "swarm:${TASK_ID}:feedback"
|
|
868
|
-
continue
|
|
869
|
-
fi
|
|
870
|
-
|
|
871
|
-
# Step 8: Product Owner Decision
|
|
872
|
-
spawn_product_owner "$TASK_ID" "$ITERATION"
|
|
873
|
-
|
|
874
|
-
# Step 9: Execute decision
|
|
875
|
-
case "$FINAL_DECISION" in
|
|
876
|
-
PROCEED)
|
|
877
|
-
# Launch ACE reflection in background (Loop 5)
|
|
878
|
-
echo "[Loop 5] Launching reflection in background..."
|
|
879
|
-
|
|
880
|
-
# Ensure log directory exists
|
|
881
|
-
mkdir -p "$PROJECT_ROOT/.artifacts/logs"
|
|
882
|
-
|
|
883
|
-
# Build reflection context from CFN Loop execution
|
|
884
|
-
REFLECTION_CONTEXT=$(cat <<EOF
|
|
885
|
-
{
|
|
886
|
-
"task_id": "$TASK_ID",
|
|
887
|
-
"task_type": "cfn_loop",
|
|
888
|
-
"mode": "$MODE",
|
|
889
|
-
"iterations_completed": $ITERATIONS_COMPLETED,
|
|
890
|
-
"loop3_agents": "$LOOP3_AGENTS",
|
|
891
|
-
"loop2_agents": "$LOOP2_AGENTS",
|
|
892
|
-
"loop3_confidence": $LOOP3_FINAL_CONFIDENCE,
|
|
893
|
-
"loop2_consensus": $LOOP2_FINAL_CONSENSUS,
|
|
894
|
-
"gate_threshold": $GATE,
|
|
895
|
-
"consensus_threshold": $CONSENSUS,
|
|
896
|
-
"deliverables_verified": $DELIVERABLES_VERIFIED,
|
|
897
|
-
"epic_context": $EPIC_CONTEXT,
|
|
898
|
-
"phase_context": $PHASE_CONTEXT,
|
|
899
|
-
"success_criteria": $SUCCESS_CRITERIA
|
|
900
|
-
}
|
|
901
|
-
EOF
|
|
902
|
-
)
|
|
903
|
-
|
|
904
|
-
# Launch reflection in background (non-blocking)
|
|
905
|
-
(
|
|
906
|
-
"$PROJECT_ROOT/.claude/skills/cfn-ace-system/invoke-context-reflect.sh" \
|
|
907
|
-
--context "$REFLECTION_CONTEXT" \
|
|
908
|
-
--output "/tmp/reflection-${TASK_ID}.json" 2>&1 | \
|
|
909
|
-
tee -a "$PROJECT_ROOT/.artifacts/logs/ace-reflection-${TASK_ID}.log"
|
|
910
|
-
|
|
911
|
-
# Log completion
|
|
912
|
-
echo "[$(date -Iseconds)] Reflection complete for task $TASK_ID" >> \
|
|
913
|
-
"$PROJECT_ROOT/.artifacts/logs/ace-reflection-${TASK_ID}.log"
|
|
914
|
-
) &
|
|
915
|
-
|
|
916
|
-
REFLECTION_PID=$!
|
|
917
|
-
echo "[Loop 5] Reflection launched (PID: $REFLECTION_PID)"
|
|
918
|
-
echo ""
|
|
919
|
-
|
|
920
|
-
# Continue with output (don't wait for reflection)
|
|
921
|
-
output_result "success"
|
|
922
|
-
exit 0
|
|
923
|
-
;;
|
|
924
|
-
ABORT)
|
|
925
|
-
output_result "aborted"
|
|
926
|
-
exit 1
|
|
927
|
-
;;
|
|
928
|
-
ITERATE)
|
|
929
|
-
if [ $ITERATION -ge $MAX_ITERATIONS ]; then
|
|
930
|
-
echo "❌ Max iterations reached"
|
|
931
|
-
output_result "failed"
|
|
932
|
-
exit 1
|
|
933
|
-
fi
|
|
934
|
-
|
|
935
|
-
echo "🔄 Product Owner requested iteration"
|
|
936
|
-
"$HELPERS_DIR/iteration-manager.sh" \
|
|
937
|
-
--task-id "$TASK_ID" \
|
|
938
|
-
--iteration "$((ITERATION + 1))" \
|
|
939
|
-
--agents "$LOOP3_AGENTS,$LOOP2_AGENTS" \
|
|
940
|
-
--feedback-source "swarm:${TASK_ID}:feedback"
|
|
941
|
-
continue
|
|
942
|
-
;;
|
|
943
|
-
esac
|
|
944
|
-
done
|
|
945
|
-
|
|
946
|
-
# Max iterations reached without success
|
|
947
|
-
echo "❌ Max iterations ($MAX_ITERATIONS) reached without PROCEED decision"
|
|
948
|
-
output_result "failed"
|
|
949
|
-
exit 1
|