claude-flow-novice 2.9.0 → 2.10.0
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/agents/cfn-dev-team/CLAUDE.md +1086 -0
- package/.claude/agents/cfn-dev-team/README.md +116 -0
- package/.claude/agents/cfn-dev-team/architecture/api-designer-persona.md +149 -0
- package/.claude/agents/cfn-dev-team/architecture/base-template-generator.md +196 -0
- package/.claude/agents/cfn-dev-team/architecture/goal-planner.md +183 -0
- package/.claude/agents/cfn-dev-team/architecture/planner.md +182 -0
- package/.claude/agents/cfn-dev-team/architecture/system-architect.md +162 -0
- package/.claude/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +540 -0
- package/.claude/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +20 -14
- package/.claude/agents/cfn-dev-team/coordinators/consensus-builder.md +167 -0
- package/.claude/agents/cfn-dev-team/dev-ops/devops-engineer.md +148 -0
- package/.claude/agents/cfn-dev-team/dev-ops/github-commit-agent.md +118 -0
- package/.claude/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +540 -0
- package/.claude/agents/cfn-dev-team/developers/backend-dev.md +20 -0
- package/.claude/agents/cfn-dev-team/developers/data/data-engineer.md +585 -0
- package/.claude/agents/cfn-dev-team/developers/database/database-architect.md +276 -0
- package/.claude/agents/cfn-dev-team/developers/dev-backend-api.md +147 -0
- package/.claude/agents/cfn-dev-team/developers/frontend/mobile-dev.md +218 -0
- package/.claude/agents/cfn-dev-team/developers/{react-frontend-engineer.md → frontend/react-frontend-engineer.md} +53 -5
- package/.claude/agents/cfn-dev-team/developers/frontend/spec-mobile-react-native.md +199 -0
- package/.claude/agents/cfn-dev-team/developers/graphql-specialist.md +615 -0
- package/.claude/agents/cfn-dev-team/developers/rust-developer.md +174 -0
- package/.claude/agents/cfn-dev-team/documentation/README-VALIDATION.md +243 -0
- package/.claude/agents/cfn-dev-team/documentation/agent-type-guidelines.md +465 -0
- package/.claude/agents/cfn-dev-team/documentation/api-docs.md +103 -0
- package/.claude/agents/cfn-dev-team/documentation/docs-api-openapi.md +98 -0
- package/.claude/agents/cfn-dev-team/documentation/pseudocode.md +159 -0
- package/.claude/agents/cfn-dev-team/documentation/specification.md +157 -0
- package/.claude/agents/cfn-dev-team/product-owners/accessibility-advocate-persona.md +109 -0
- package/.claude/agents/cfn-dev-team/{coordinators → product-owners}/cto-agent.md +8 -6
- package/.claude/agents/cfn-dev-team/product-owners/power-user-persona.md +190 -0
- package/.claude/agents/cfn-dev-team/{coordinators → product-owners}/product-owner.md +85 -59
- package/.claude/agents/cfn-dev-team/reviewers/quality/analyze-code-quality.md +141 -0
- package/.claude/agents/cfn-dev-team/reviewers/quality/code-analyzer.md +200 -0
- package/.claude/agents/cfn-dev-team/reviewers/quality/cyclomatic-complexity-reducer.md +321 -0
- package/.claude/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +238 -0
- package/.claude/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +101 -0
- package/.claude/agents/cfn-dev-team/reviewers/quality/quality-metrics.md +375 -0
- package/.claude/agents/cfn-dev-team/reviewers/quality/security-specialist.md +193 -0
- package/.claude/agents/cfn-dev-team/reviewers/reviewer.md +39 -0
- package/.claude/agents/cfn-dev-team/testers/interaction-tester.md +31 -0
- package/.claude/agents/cfn-dev-team/testers/load-testing-specialist.md +469 -0
- package/.claude/agents/cfn-dev-team/testers/playwright-tester.md +24 -0
- package/.claude/agents/cfn-dev-team/testers/tester.md +20 -0
- package/.claude/agents/cfn-dev-team/utility/agent-builder.md +151 -0
- package/.claude/agents/cfn-dev-team/utility/analyst.md +178 -0
- package/.claude/agents/cfn-dev-team/utility/claude-code-expert.md +1043 -0
- package/.claude/agents/cfn-dev-team/utility/code-booster.md +139 -0
- package/.claude/agents/cfn-dev-team/utility/context-curator.md +99 -0
- package/.claude/agents/cfn-dev-team/{developers → utility}/researcher.md +6 -4
- package/.claude/commands/cfn/CFN_LOOP_FRONTEND.md +741 -0
- package/.claude/commands/cfn/CFN_LOOP_TASK_MODE.md +353 -0
- package/.claude/commands/cfn/cfn-loop-frontend.md +555 -0
- package/.claude/commands/cfn/cfn-loop.md +168 -7
- package/{CFN-CLAUDE.md → .claude/root-claude-distribute/CFN-CLAUDE.md} +23 -3
- package/.claude/skills/cfn-ace-system/SKILL.md +364 -0
- package/.claude/skills/cfn-ace-system/add-bullet.sh +145 -0
- package/.claude/skills/cfn-ace-system/analyze-anti-pattern-effectiveness.sh +56 -0
- package/.claude/skills/cfn-ace-system/classify-task.sh +18 -0
- package/.claude/skills/cfn-ace-system/export-ace-metrics.sh +48 -0
- package/.claude/skills/cfn-ace-system/extract-tags.sh +385 -0
- package/.claude/skills/cfn-ace-system/format-negative-context.sh +180 -0
- package/.claude/skills/cfn-ace-system/init-indexes.sql +160 -0
- package/.claude/skills/cfn-ace-system/invoke-context-curate.sh +192 -0
- package/.claude/skills/cfn-ace-system/invoke-context-inject.sh +361 -0
- package/.claude/skills/cfn-ace-system/invoke-context-query.sh +139 -0
- package/.claude/skills/cfn-ace-system/invoke-context-reflect.sh +343 -0
- package/.claude/skills/cfn-ace-system/invoke-context-stats.sh +227 -0
- package/.claude/skills/cfn-ace-system/log-merge.sh +67 -0
- package/.claude/skills/cfn-ace-system/monitor-injection-performance.sh +138 -0
- package/.claude/skills/cfn-ace-system/optimize-injection-pipeline.sh +169 -0
- package/.claude/skills/cfn-ace-system/query-anti-patterns.sh +276 -0
- package/.claude/skills/cfn-ace-system/query-contexts.sh +150 -0
- package/.claude/skills/cfn-ace-system/query-reflections.sh +35 -0
- package/.claude/skills/cfn-ace-system/schema/001-create-context-reflections.sql +237 -0
- package/.claude/skills/cfn-ace-system/schema/README.md +723 -0
- package/.claude/skills/cfn-ace-system/schema/SCHEMA_DESIGN_SUMMARY.md +564 -0
- package/.claude/skills/cfn-ace-system/schema/populate-test-data-simple.sh +62 -0
- package/.claude/skills/cfn-ace-system/schema/populate-test-data.sh +247 -0
- package/.claude/skills/cfn-ace-system/schema/run-migration.sh +231 -0
- package/.claude/skills/cfn-ace-system/schema/validate-schema.sql +280 -0
- package/.claude/skills/cfn-ace-system/score-relevance-adapter.sh +138 -0
- package/.claude/skills/cfn-ace-system/score-relevance.sh +253 -0
- package/.claude/skills/cfn-ace-system/sprint-7-lessons.json +46 -0
- package/.claude/skills/cfn-ace-system/store-reflection.sh +46 -0
- package/.claude/skills/cfn-ace-system/test-ace-skill.sh +312 -0
- package/.claude/skills/cfn-ace-system/track-ab-test.sh +42 -0
- package/.claude/skills/cfn-ace-system/update-reflection.sh +41 -0
- package/.claude/skills/cfn-agent-discovery/SKILL.md +40 -0
- package/.claude/skills/cfn-agent-discovery/agents-registry-clean.json +0 -0
- package/.claude/skills/cfn-agent-discovery/agents-registry-fixed.json +19 -0
- package/.claude/skills/cfn-agent-discovery/agents-registry.json +718 -0
- package/.claude/skills/cfn-agent-discovery/discover-agents.py +184 -0
- package/.claude/skills/cfn-agent-discovery/discover-agents.sh +87 -0
- package/.claude/skills/cfn-agent-discovery/invoke-registry.sh +11 -0
- package/.claude/skills/cfn-agent-discovery/temp_script.py +0 -0
- package/.claude/skills/cfn-agent-execution/execute-agent.sh +126 -0
- package/.claude/skills/cfn-agent-output-processing/SKILL.md +359 -0
- package/.claude/skills/cfn-agent-selector/SKILL.md +90 -0
- package/.claude/skills/cfn-agent-selector/select-agents.sh +112 -0
- package/.claude/skills/cfn-agent-spawning/SKILL.md +135 -0
- package/.claude/skills/cfn-agent-spawning/agent-selection-guide.md +814 -0
- package/.claude/skills/cfn-agent-spawning/check-dependencies.sh +30 -0
- package/.claude/skills/cfn-agent-spawning/spawn-agent.sh +263 -0
- package/.claude/skills/cfn-agent-spawning/spawn-templates.sh +613 -0
- package/.claude/skills/cfn-analytics/description-refinement-guide.md +164 -0
- package/.claude/skills/cfn-analytics/log-skill-invocation.js +122 -0
- package/.claude/skills/cfn-analytics/run-production-criteria-tests.sh +126 -0
- package/.claude/skills/cfn-analytics/skill-analytics-dashboard.js +113 -0
- package/.claude/skills/cfn-analytics/skill-invocation-hook.sh +28 -0
- package/.claude/skills/cfn-analytics/skill-invocations.sql +58 -0
- package/.claude/skills/cfn-analytics/test-corpus.json +32 -0
- package/.claude/skills/cfn-analytics/test-data-generator.js +115 -0
- package/.claude/skills/cfn-analytics/test-manual-override-rate.js +285 -0
- package/.claude/skills/cfn-analytics/validate-skill-selection.js +188 -0
- package/.claude/skills/cfn-config-management/SKILL.md +34 -0
- package/.claude/skills/cfn-config-management/check-dependencies.sh +56 -0
- package/.claude/skills/cfn-config-management/config.json +32 -0
- package/.claude/skills/cfn-config-management/manage-config.sh +113 -0
- package/.claude/skills/cfn-event-bus/SKILL.md +412 -0
- package/.claude/skills/cfn-event-bus/config.json +111 -0
- package/.claude/skills/cfn-event-bus/eventbus-wrapper.cjs +69 -0
- package/.claude/skills/cfn-event-bus/invoke-event-publish.sh +147 -0
- package/.claude/skills/cfn-event-bus/invoke-event-subscribe.sh +171 -0
- package/.claude/skills/cfn-event-bus/invoke-lifecycle-track.sh +201 -0
- package/.claude/skills/cfn-event-bus/test-event-bus.sh +280 -0
- package/.claude/skills/cfn-fleet-manager/SKILL.md +412 -0
- package/.claude/skills/cfn-fleet-manager/config.json +60 -0
- package/.claude/skills/cfn-fleet-manager/invoke-fleet-allocate.sh +182 -0
- package/.claude/skills/cfn-fleet-manager/invoke-fleet-balance.sh +239 -0
- package/.claude/skills/cfn-fleet-manager/invoke-fleet-metrics.sh +193 -0
- package/.claude/skills/cfn-fleet-manager/invoke-fleet-register.sh +124 -0
- package/.claude/skills/cfn-fleet-manager/test-fleet-manager.sh +345 -0
- package/.claude/skills/cfn-hook-pipeline/SKILL.md +148 -0
- package/.claude/skills/cfn-hook-pipeline/auto-resolve.sh +66 -0
- package/.claude/skills/cfn-hook-pipeline/check-dependencies.sh +40 -0
- package/.claude/skills/cfn-hook-pipeline/feedback-resolver.sh +452 -0
- package/.claude/skills/cfn-hook-pipeline/post-edit-handler.sh +154 -0
- package/.claude/skills/cfn-hook-pipeline/security-scan.json +60 -0
- package/.claude/skills/cfn-hook-pipeline/security-scanner.sh +121 -0
- package/.claude/skills/cfn-hook-pipeline/test-root-warning-resolution.sh +148 -0
- package/.claude/skills/cfn-hybrid-routing/SKILL.md +46 -0
- package/.claude/skills/cfn-hybrid-routing/check-dependencies.sh +52 -0
- package/.claude/skills/cfn-hybrid-routing/config.json +26 -0
- package/.claude/skills/cfn-hybrid-routing/spawn-worker.sh +44 -0
- package/.claude/skills/cfn-loop-orchestration/SKILL.md +299 -0
- package/.claude/skills/cfn-loop-orchestration/helpers/auto-tune-timeouts.sh +228 -0
- package/.claude/skills/cfn-loop-orchestration/helpers/consensus.sh +84 -0
- package/.claude/skills/cfn-loop-orchestration/helpers/context-injection.sh +142 -0
- package/.claude/skills/cfn-loop-orchestration/helpers/context-lookup.sh +359 -0
- package/.claude/skills/cfn-loop-orchestration/helpers/deliverable-verifier.sh +71 -0
- package/.claude/skills/cfn-loop-orchestration/helpers/gate-check.sh +90 -0
- package/.claude/skills/cfn-loop-orchestration/helpers/iteration-manager.sh +87 -0
- package/.claude/skills/cfn-loop-orchestration/helpers/spawn-agents.sh +271 -0
- package/.claude/skills/cfn-loop-orchestration/helpers/timeout-calculator.sh +51 -0
- package/.claude/skills/cfn-loop-orchestration/inject-loop-context.sh +41 -0
- package/.claude/skills/cfn-loop-orchestration/monitor-execution.sh +156 -0
- package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +884 -0
- package/.claude/skills/cfn-loop-orchestration/orchestrate.sh.backup +840 -0
- package/.claude/skills/cfn-loop-orchestration/security_utils.sh +99 -0
- package/.claude/skills/cfn-loop-orchestration/test-cfn-orchestration.sh +281 -0
- package/.claude/skills/cfn-loop-orchestration/test-edge-cases.sh +188 -0
- package/.claude/skills/cfn-loop-validation/SKILL.md +353 -0
- package/.claude/skills/cfn-loop-validation/check-dependencies.sh +31 -0
- package/.claude/skills/cfn-loop-validation/config.json +161 -0
- package/.claude/skills/cfn-loop-validation/consensus-calculator.js +477 -0
- package/.claude/skills/cfn-loop-validation/evidence-chain.sql +163 -0
- package/.claude/skills/cfn-loop-validation/examples/README.md +453 -0
- package/.claude/skills/cfn-loop-validation/examples/coordinator-full-cfn-loop.sh +234 -0
- package/.claude/skills/cfn-loop-validation/examples/coordinator-loop2-consensus.sh +132 -0
- package/.claude/skills/cfn-loop-validation/examples/coordinator-loop3-gate.sh +115 -0
- package/.claude/skills/cfn-loop-validation/examples/coordinator-redis-integration.sh +186 -0
- package/.claude/skills/cfn-loop-validation/orchestrate-cfn-loop.sh +252 -0
- package/.claude/skills/cfn-loop-validation/validate-iteration.sh +134 -0
- package/.claude/skills/cfn-process-lifecycle/SKILL.md +39 -0
- package/.claude/skills/cfn-process-lifecycle/check-dependencies.sh +58 -0
- package/.claude/skills/cfn-process-lifecycle/config.json +39 -0
- package/.claude/skills/cfn-process-lifecycle/process-manager.sh +144 -0
- package/.claude/skills/cfn-product-owner-decision/SKILL.md +332 -0
- package/.claude/skills/cfn-product-owner-decision/execute-decision.sh +176 -0
- package/.claude/skills/cfn-product-owner-decision/parse-decision.sh +66 -0
- package/.claude/skills/cfn-product-owner-decision/validate-deliverables.sh +82 -0
- package/.claude/skills/cfn-redis-coordination/AGENT_LOGGING.md +280 -0
- package/.claude/skills/cfn-redis-coordination/BZPOPMIN_FIX_SUMMARY.md +209 -0
- package/.claude/skills/cfn-redis-coordination/HEARTBEAT.md +57 -0
- package/.claude/skills/cfn-redis-coordination/HEARTBEAT_MONITORING.md +267 -0
- package/.claude/skills/cfn-redis-coordination/LOGGING.md +260 -0
- package/.claude/skills/cfn-redis-coordination/SECURITY_REVIEW.md +25 -0
- package/.claude/skills/cfn-redis-coordination/SHUTDOWN_HANDLING.md +164 -0
- package/.claude/skills/cfn-redis-coordination/SKILL.md +720 -0
- package/.claude/skills/cfn-redis-coordination/agent-log.sh +124 -0
- package/.claude/skills/cfn-redis-coordination/agent-recovery.sh +75 -0
- package/.claude/skills/cfn-redis-coordination/analyze-task-complexity.sh +277 -0
- package/.claude/skills/cfn-redis-coordination/cancel-swarm.sh +221 -0
- package/.claude/skills/cfn-redis-coordination/cfn-loop-exec.sh +468 -0
- package/.claude/skills/cfn-redis-coordination/cfn-loop-relaunch.sh +29 -0
- package/.claude/skills/cfn-redis-coordination/check-dependencies.sh +32 -0
- package/.claude/skills/cfn-redis-coordination/collect-confidence-scores.sh +179 -0
- package/.claude/skills/cfn-redis-coordination/collect-results.sh +75 -0
- package/.claude/skills/cfn-redis-coordination/complete-swarm.sh +75 -0
- package/.claude/skills/cfn-redis-coordination/config.json +61 -0
- package/.claude/skills/cfn-redis-coordination/data/cfn-loop.db +0 -0
- package/.claude/skills/cfn-redis-coordination/demos/phase4-wake-queue-test-report.md +82 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-bzpopmin-fix.sh +274 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-cancel-swarm.sh +276 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-dlq.sh +129 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-iteration-feedback.sh +320 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-orchestrator.sh +249 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-priority-wake-phase4-unix.sh +148 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-priority-wake-phase4.sh +163 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-priority-wake.sh +138 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-quick-fix.sh +81 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-quorum-absolute.sh +45 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-quorum-fallback.sh +68 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-quorum-percentage.sh +56 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-quorum-with-retry.sh +81 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-quorum.sh +57 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-shutdown-handling.sh +187 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-shutdown.sh +160 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-utils-unix.sh +97 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-utils.sh +97 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-waiting-mode.sh +59 -0
- package/.claude/skills/cfn-redis-coordination/examples/README.md +73 -0
- package/.claude/skills/cfn-redis-coordination/examples/grafana-dashboard.json +352 -0
- package/.claude/skills/cfn-redis-coordination/examples/hierarchical-pattern.sh +127 -0
- package/.claude/skills/cfn-redis-coordination/examples/mesh-pattern.sh +171 -0
- package/.claude/skills/cfn-redis-coordination/examples/timeout-handling.sh +227 -0
- package/.claude/skills/cfn-redis-coordination/examples/waiting-mode-pattern.sh +239 -0
- package/.claude/skills/cfn-redis-coordination/execute-product-owner-decision.sh +258 -0
- package/.claude/skills/cfn-redis-coordination/get-agent-timeout.sh +177 -0
- package/.claude/skills/cfn-redis-coordination/heartbeat-functions.sh +137 -0
- package/.claude/skills/cfn-redis-coordination/heartbeat-protocol.md +106 -0
- package/.claude/skills/cfn-redis-coordination/heartbeat.sh +126 -0
- package/.claude/skills/cfn-redis-coordination/init-swarm.sh +148 -0
- package/.claude/skills/cfn-redis-coordination/invoke-redis-pattern.sh +220 -0
- package/.claude/skills/cfn-redis-coordination/invoke-waiting-mode.sh +283 -0
- package/.claude/skills/cfn-redis-coordination/invoke-waiting-mode.sh.backup-p7 +423 -0
- package/.claude/skills/cfn-redis-coordination/list-active-swarms.sh +147 -0
- package/.claude/skills/cfn-redis-coordination/log-event.sh +109 -0
- package/.claude/skills/cfn-redis-coordination/metrics-export.sh +674 -0
- package/.claude/skills/cfn-redis-coordination/metrics-schema.json +66 -0
- package/.claude/skills/cfn-redis-coordination/metrics-storage.md +31 -0
- package/.claude/skills/cfn-redis-coordination/monitor-cfn-violations.sh +391 -0
- package/.claude/skills/cfn-redis-coordination/monitor-heartbeats.sh +101 -0
- package/.claude/skills/cfn-redis-coordination/orchestrate-cfn-loop-v3.sh +141 -0
- package/.claude/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh +31 -0
- package/.claude/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.backup +38 -0
- package/.claude/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.backup-1761167675 +1672 -0
- package/.claude/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.backup-p5 +1604 -0
- package/.claude/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.backup-phase1 +1550 -0
- package/.claude/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.backup-phase2 +1621 -0
- package/.claude/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.backup-phase3 +1621 -0
- package/.claude/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.bak +0 -0
- package/.claude/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.broken +1627 -0
- package/.claude/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.corrupted +80 -0
- package/.claude/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.deprecated +1864 -0
- package/.claude/skills/cfn-redis-coordination/priority-wake-mechanism.md +75 -0
- package/.claude/skills/cfn-redis-coordination/priority_wake.py +134 -0
- package/.claude/skills/cfn-redis-coordination/query-dlq.sh +162 -0
- package/.claude/skills/cfn-redis-coordination/query-logs.sh +103 -0
- package/.claude/skills/cfn-redis-coordination/redis-pattern.sh +619 -0
- package/.claude/skills/cfn-redis-coordination/retrieve-context.sh +58 -0
- package/.claude/skills/cfn-redis-coordination/select-specialist-agent.sh +371 -0
- package/.claude/skills/cfn-redis-coordination/semantic-match-tfidf.py +252 -0
- package/.claude/skills/cfn-redis-coordination/send-heartbeat.sh +165 -0
- package/.claude/skills/cfn-redis-coordination/signal.sh +38 -0
- package/.claude/skills/cfn-redis-coordination/store-context.sh +86 -0
- package/.claude/skills/cfn-redis-coordination/store-epic-context.sh +123 -0
- package/.claude/skills/cfn-redis-coordination/test-context-injection.sh +354 -0
- package/.claude/skills/cfn-redis-coordination/test-timeout-enforcement.sh +513 -0
- package/.claude/skills/cfn-redis-coordination/tests/convert-line-endings.sh +15 -0
- package/.claude/skills/cfn-redis-coordination/tests/dlq-functionality-test.sh +102 -0
- package/.claude/skills/cfn-redis-coordination/tests/edge-cases-test.sh +99 -0
- package/.claude/skills/cfn-redis-coordination/tests/integration-test.sh +170 -0
- package/.claude/skills/cfn-redis-coordination/tests/retry-mechanism-test.sh +82 -0
- package/.claude/skills/cfn-redis-coordination/tests/run-test-suite.sh +92 -0
- package/.claude/skills/cfn-redis-coordination/tests/run-tests.sh +4 -0
- package/.claude/skills/cfn-redis-coordination/tests/test-heartbeat-monitoring.sh +418 -0
- package/.claude/skills/cfn-redis-coordination/tests/test-heartbeat-simple.sh +124 -0
- package/.claude/skills/cfn-redis-coordination/tests/test-primitives.sh +166 -0
- package/.claude/skills/cfn-redis-coordination/tests/test-utils.sh +54 -0
- package/.claude/skills/cfn-redis-coordination/tests/test_coordination_primitives.sh.deprecated +20 -0
- package/.claude/skills/cfn-redis-coordination/tests/test_utils.sh +49 -0
- package/.claude/skills/cfn-redis-coordination/v2_modularization/core_orchestration.sh +76 -0
- package/.claude/skills/cfn-redis-coordination/validate-parameters.sh +492 -0
- package/.claude/skills/cfn-sqlite-memory/IMPLEMENTATION_REPORT.md +393 -0
- package/.claude/skills/cfn-sqlite-memory/QUICK_REFERENCE.md +204 -0
- package/.claude/skills/cfn-sqlite-memory/SKILL.md +415 -0
- package/.claude/skills/cfn-sqlite-memory/acl-queries.sql +452 -0
- package/.claude/skills/cfn-sqlite-memory/check-dependencies.sh +36 -0
- package/.claude/skills/cfn-sqlite-memory/config.json +45 -0
- package/.claude/skills/cfn-sqlite-memory/memory-cli.sh +88 -0
- package/.claude/skills/cfn-sqlite-memory/test-state-persistence.js +187 -0
- package/.claude/skills/cfn-sqlite-memory/ttl-cleanup.sh +274 -0
- package/.claude/skills/cfn-test-execution/SKILL.md +128 -0
- package/.claude/skills/cfn-test-execution/check-dependencies.sh +36 -0
- package/.claude/skills/cfn-test-execution/test-cache-reader.sh +134 -0
- package/.claude/skills/cfn-test-execution/test-concurrent-conflicts.sh +115 -0
- package/.claude/skills/cfn-test-execution/test-coordinator-pattern.sh +109 -0
- package/.claude/skills/cfn-transparency-middleware/Cargo.toml +18 -0
- package/.claude/skills/cfn-transparency-middleware/SECURITY.md +41 -0
- package/.claude/skills/cfn-transparency-middleware/SKILL.md +91 -0
- package/.claude/skills/cfn-transparency-middleware/TEST_RESULTS.md +174 -0
- package/.claude/skills/cfn-transparency-middleware/config.json +31 -0
- package/.claude/skills/cfn-transparency-middleware/examples/basic-usage.ts +39 -0
- package/.claude/skills/cfn-transparency-middleware/examples/batch-processing.ts +52 -0
- package/.claude/skills/cfn-transparency-middleware/examples/custom-filtering.ts +61 -0
- package/.claude/skills/cfn-transparency-middleware/invoke-transparency-filter.sh +98 -0
- package/.claude/skills/cfn-transparency-middleware/invoke-transparency-init.sh +224 -0
- package/.claude/skills/cfn-transparency-middleware/invoke-transparency-level.sh +333 -0
- package/.claude/skills/cfn-transparency-middleware/invoke-transparency-metrics.sh +345 -0
- package/.claude/skills/cfn-transparency-middleware/invoke-transparency-observe.sh +140 -0
- package/.claude/skills/cfn-transparency-middleware/invoke-transparency-stop.sh +235 -0
- package/.claude/skills/cfn-transparency-middleware/memory_query.rs +85 -0
- package/.claude/skills/cfn-transparency-middleware/memory_repository.rs +140 -0
- package/.claude/skills/cfn-transparency-middleware/memory_schema.rs +64 -0
- package/.claude/skills/cfn-transparency-middleware/middleware-config.sh +29 -0
- package/.claude/skills/cfn-transparency-middleware/performance-benchmark.sh +79 -0
- package/.claude/skills/cfn-transparency-middleware/test-e2e.sh +406 -0
- package/.claude/skills/cfn-transparency-middleware/test-integration.sh +162 -0
- package/.claude/skills/cfn-transparency-middleware/test-transparency-skill.sh +368 -0
- package/.claude/skills/cfn-transparency-middleware/test-transparency-skill.sh.unix +126 -0
- package/.claude/skills/cfn-transparency-middleware/tests/input-validation.sh +93 -0
- package/.claude/skills/cfn-transparency-middleware/wrap-agent.sh +132 -0
- package/.claude/skills/cfn-webapp-testing/SCREENSHOT_NAMING_CONVENTION.md +547 -0
- package/.claude/skills/cfn-webapp-testing/SKILL.md +877 -0
- package/.claude/skills/cfn-webapp-testing/capture-screenshot.sh +238 -0
- package/.claude/skills/cfn-webapp-testing/cfn-loop-integration.sh +265 -0
- package/.claude/skills/cfn-webapp-testing/compare-screenshots.sh +199 -0
- package/.claude/skills/cfn-webapp-testing/init-storage.sh +150 -0
- package/.claude/skills/cfn-webapp-testing/set-baseline.sh +196 -0
- package/.claude/skills/cfn-webapp-testing/test-webapp-testing.sh +233 -0
- package/README.md +51 -2
- package/dist/ace/ace-reflector.js +109 -10
- package/dist/ace/ace-reflector.js.map +1 -1
- package/dist/agents/agent-loader.js +165 -146
- package/dist/agents/agent-loader.js.map +1 -1
- package/dist/cli/agent-executor.js +1 -1
- package/dist/cli/agent-executor.js.map +1 -1
- package/dist/cli/config-manager.js +109 -91
- package/dist/cli/config-manager.js.map +1 -1
- package/package.json +43 -7
- package/readme/README.md +15 -4
- package/scripts/init-project.js +84 -29
- package/scripts/run-marketing-tests.sh +43 -0
- package/scripts/update_paths.sh +47 -0
- package/tools/install-lizard.sh +37 -0
- package/tools/simple-complexity.sh +44 -0
- package/.claude/agents/cfn-dev-team/developers/coder.md +0 -270
- package/.claude/agents/cfn-dev-team/developers/state-architect.md +0 -127
- package/.claude/agents/cfn-dev-team/reviewers/code-quality-validator.md +0 -128
- /package/.claude/agents/cfn-dev-team/developers/{ui-designer.md → frontend/ui-designer.md} +0 -0
- /package/.claude/agents/cfn-dev-team/{coordinators → product-owners}/product-owner-agent.md +0 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Quorum Percentage Test Case
|
|
3
|
+
# Tests percentage-based quorum scenarios
|
|
4
|
+
|
|
5
|
+
source "$(dirname "$0")/test-utils.sh"
|
|
6
|
+
|
|
7
|
+
# Test Scenario 1: 80% of 10 agents = 8 required, 8/10 complete → SUCCESS
|
|
8
|
+
test_percentage_quorum_success() {
|
|
9
|
+
local total_agents=10
|
|
10
|
+
local quorum_percentage=0.8
|
|
11
|
+
local completed_agents=8
|
|
12
|
+
|
|
13
|
+
local result=$(check_percentage_quorum "$total_agents" "$quorum_percentage" "$completed_agents")
|
|
14
|
+
assert_equals "$result" "SUCCESS" "Quorum not reached when 8/10 agents complete (80% required)"
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
# Test Scenario 2: 80% of 10 agents = 8 required, 7/10 complete → FAILURE
|
|
18
|
+
test_percentage_quorum_failure() {
|
|
19
|
+
local total_agents=10
|
|
20
|
+
local quorum_percentage=0.8
|
|
21
|
+
local completed_agents=7
|
|
22
|
+
|
|
23
|
+
local result=$(check_percentage_quorum "$total_agents" "$quorum_percentage" "$completed_agents")
|
|
24
|
+
assert_equals "$result" "FAILURE" "Quorum incorrectly reached when only 7/10 agents complete (80% required)"
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
# Test Scenario 3: 90% of 5 agents = 4.5 → 5 required (round up)
|
|
28
|
+
test_percentage_quorum_round_up() {
|
|
29
|
+
local total_agents=5
|
|
30
|
+
local quorum_percentage=0.9
|
|
31
|
+
local completed_agents=5
|
|
32
|
+
|
|
33
|
+
local result=$(check_percentage_quorum "$total_agents" "$quorum_percentage" "$completed_agents")
|
|
34
|
+
assert_equals "$result" "SUCCESS" "Quorum not reached when all 5/5 agents complete (90% required)"
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
# Test Scenario 4: 90% of 5 agents = 4.5 → 5 required, 4/5 complete → FAILURE
|
|
38
|
+
test_percentage_quorum_insufficient() {
|
|
39
|
+
local total_agents=5
|
|
40
|
+
local quorum_percentage=0.9
|
|
41
|
+
local completed_agents=4
|
|
42
|
+
|
|
43
|
+
local result=$(check_percentage_quorum "$total_agents" "$quorum_percentage" "$completed_agents")
|
|
44
|
+
assert_equals "$result" "FAILURE" "Quorum incorrectly reached when 4/5 agents complete (90% required)"
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
# Run the tests
|
|
48
|
+
main() {
|
|
49
|
+
test_percentage_quorum_success
|
|
50
|
+
test_percentage_quorum_failure
|
|
51
|
+
test_percentage_quorum_round_up
|
|
52
|
+
test_percentage_quorum_insufficient
|
|
53
|
+
echo "Percentage Quorum Test Complete"
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
main
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Quorum Retry Mechanism Test Case
|
|
3
|
+
# Tests retry scenarios for agent completion
|
|
4
|
+
|
|
5
|
+
source "$(dirname "$0")/test-utils.sh"
|
|
6
|
+
|
|
7
|
+
# Simulated Redis-based retry mechanism
|
|
8
|
+
simulate_agent_retry() {
|
|
9
|
+
local task_id="$1"
|
|
10
|
+
local agent_id="$2"
|
|
11
|
+
local max_retries="${3:-3}"
|
|
12
|
+
local retry_delay="${4:-5}"
|
|
13
|
+
|
|
14
|
+
local attempt=1
|
|
15
|
+
local success=false
|
|
16
|
+
|
|
17
|
+
while [ $attempt -le "$max_retries" ]; do
|
|
18
|
+
# Simulate agent work
|
|
19
|
+
if agent_work "$task_id" "$agent_id"; then
|
|
20
|
+
success=true
|
|
21
|
+
break
|
|
22
|
+
fi
|
|
23
|
+
|
|
24
|
+
echo "Agent $agent_id - Attempt $attempt failed. Retrying in $retry_delay seconds..."
|
|
25
|
+
sleep "$retry_delay"
|
|
26
|
+
((attempt++))
|
|
27
|
+
done
|
|
28
|
+
|
|
29
|
+
if [ "$success" = true ]; then
|
|
30
|
+
echo "SUCCESS"
|
|
31
|
+
else
|
|
32
|
+
echo "FAILURE"
|
|
33
|
+
fi
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
# Mock agent work function with potential failure
|
|
37
|
+
agent_work() {
|
|
38
|
+
local task_id="$1"
|
|
39
|
+
local agent_id="$2"
|
|
40
|
+
|
|
41
|
+
# Simulated 50% chance of failure on first attempt
|
|
42
|
+
if [ "$agent_id" == "agent-1" ] && [ -z "$RETRY_COMPLETE" ]; then
|
|
43
|
+
RETRY_COMPLETE=1
|
|
44
|
+
return 1
|
|
45
|
+
fi
|
|
46
|
+
|
|
47
|
+
return 0
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
# Test Scenario: Agent times out on attempt 1, retry succeeds on attempt 2
|
|
51
|
+
test_quorum_retry_mechanism() {
|
|
52
|
+
local task_id="retry-test-task"
|
|
53
|
+
local agent_id="agent-1"
|
|
54
|
+
|
|
55
|
+
local result=$(simulate_agent_retry "$task_id" "$agent_id")
|
|
56
|
+
assert_equals "$result" "SUCCESS" "Retry mechanism failed to complete agent work"
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
# Additional retry tests
|
|
60
|
+
test_multiple_agent_retries() {
|
|
61
|
+
local total_agents=5
|
|
62
|
+
local successful_agents=0
|
|
63
|
+
|
|
64
|
+
for ((i=1; i<=total_agents; i++)); do
|
|
65
|
+
local result=$(simulate_agent_retry "multi-retry-task" "agent-$i")
|
|
66
|
+
if [ "$result" == "SUCCESS" ]; then
|
|
67
|
+
((successful_agents++))
|
|
68
|
+
fi
|
|
69
|
+
done
|
|
70
|
+
|
|
71
|
+
assert_greater_than "$successful_agents" 3 "Insufficient agents completed with retry"
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
# Run the tests
|
|
75
|
+
main() {
|
|
76
|
+
test_quorum_retry_mechanism
|
|
77
|
+
test_multiple_agent_retries
|
|
78
|
+
echo "Retry Mechanism Test Complete"
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
main
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Master Quorum Validation Test Suite
|
|
3
|
+
# Task ID: redis-phase2-1760875940
|
|
4
|
+
# Agent ID: tester-2
|
|
5
|
+
|
|
6
|
+
set -euo pipefail
|
|
7
|
+
|
|
8
|
+
# Source common testing utilities
|
|
9
|
+
source "$(dirname "$0")/test-utils.sh"
|
|
10
|
+
|
|
11
|
+
# Test Results Tracking
|
|
12
|
+
TOTAL_TESTS=4
|
|
13
|
+
PASSED_TESTS=0
|
|
14
|
+
FAILED_TESTS=0
|
|
15
|
+
|
|
16
|
+
# Run Quorum Test Cases
|
|
17
|
+
run_test "test-quorum-absolute.sh"
|
|
18
|
+
run_test "test-quorum-percentage.sh"
|
|
19
|
+
run_test "test-quorum-with-retry.sh"
|
|
20
|
+
run_test "test-quorum-fallback.sh"
|
|
21
|
+
|
|
22
|
+
# Generate Test Report
|
|
23
|
+
generate_test_report
|
|
24
|
+
|
|
25
|
+
# Signal Completion to Redis
|
|
26
|
+
signal_task_complete() {
|
|
27
|
+
local confidence=$(calculate_confidence)
|
|
28
|
+
redis-cli lpush "swarm:redis-phase2-1760875940:tester-2:done" "complete"
|
|
29
|
+
|
|
30
|
+
# Report to waiting mode
|
|
31
|
+
./.claude/skills/cfn-redis-coordination/invoke-waiting-mode.sh report \
|
|
32
|
+
--task-id redis-phase2-1760875940 \
|
|
33
|
+
--agent-id tester-2 \
|
|
34
|
+
--confidence "$confidence" \
|
|
35
|
+
--iteration 1
|
|
36
|
+
|
|
37
|
+
# Enter waiting mode
|
|
38
|
+
./.claude/skills/cfn-redis-coordination/invoke-waiting-mode.sh enter \
|
|
39
|
+
--task-id redis-phase2-1760875940 \
|
|
40
|
+
--agent-id tester-2 \
|
|
41
|
+
--context "task-2-3-complete"
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
# Run main test suite
|
|
45
|
+
main() {
|
|
46
|
+
# Setup any required test environments
|
|
47
|
+
setup_test_environment
|
|
48
|
+
|
|
49
|
+
# Execute test cases
|
|
50
|
+
run_all_tests
|
|
51
|
+
|
|
52
|
+
# Signal completion
|
|
53
|
+
signal_task_complete
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
# Execute main function
|
|
57
|
+
main
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
##############################################################################
|
|
4
|
+
# Test: Shutdown Handling in Orchestrator
|
|
5
|
+
# Verifies that orchestrator responds to shutdown signals and cleans up
|
|
6
|
+
##############################################################################
|
|
7
|
+
|
|
8
|
+
set -euo pipefail
|
|
9
|
+
|
|
10
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
11
|
+
TEST_TASK_ID="test-shutdown-$(date +%s)"
|
|
12
|
+
CLEANUP_NEEDED=1
|
|
13
|
+
|
|
14
|
+
# Cleanup function
|
|
15
|
+
cleanup() {
|
|
16
|
+
if [ $CLEANUP_NEEDED -eq 1 ]; then
|
|
17
|
+
echo ""
|
|
18
|
+
echo "=== Cleanup ==="
|
|
19
|
+
redis-cli DEL "swarm:${TEST_TASK_ID}:shutdown" >/dev/null 2>&1 || true
|
|
20
|
+
redis-cli DEL "swarm:${TEST_TASK_ID}:*" >/dev/null 2>&1 || true
|
|
21
|
+
echo "Cleanup complete"
|
|
22
|
+
fi
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
trap cleanup EXIT
|
|
26
|
+
|
|
27
|
+
echo "=== Test: Shutdown Handling in Orchestrator ==="
|
|
28
|
+
echo "Test Task ID: $TEST_TASK_ID"
|
|
29
|
+
echo ""
|
|
30
|
+
|
|
31
|
+
# Test 1: Start orchestrator in background
|
|
32
|
+
echo "Test 1: Starting orchestrator in background..."
|
|
33
|
+
|
|
34
|
+
# Create mock agents (we'll send shutdown before they complete)
|
|
35
|
+
MOCK_LOOP3="mock-agent-1,mock-agent-2"
|
|
36
|
+
MOCK_LOOP2="mock-validator-1"
|
|
37
|
+
MOCK_PO="mock-po"
|
|
38
|
+
|
|
39
|
+
# Start orchestrator in background with high timeout (so it doesn't fail quickly)
|
|
40
|
+
timeout 30 "$SCRIPT_DIR/orchestrate-cfn-loop.sh" \
|
|
41
|
+
--task-id "$TEST_TASK_ID" \
|
|
42
|
+
--mode standard \
|
|
43
|
+
--loop3-agents "$MOCK_LOOP3" \
|
|
44
|
+
--loop2-agents "$MOCK_LOOP2" \
|
|
45
|
+
--product-owner "$MOCK_PO" \
|
|
46
|
+
--timeout 3600 \
|
|
47
|
+
--max-iterations 5 > /tmp/orchestrator-output-${TEST_TASK_ID}.log 2>&1 &
|
|
48
|
+
|
|
49
|
+
ORCHESTRATOR_PID=$!
|
|
50
|
+
echo "Orchestrator started (PID: $ORCHESTRATOR_PID)"
|
|
51
|
+
|
|
52
|
+
# Wait for orchestrator to initialize and start shutdown monitor
|
|
53
|
+
sleep 2
|
|
54
|
+
|
|
55
|
+
# Verify orchestrator is running
|
|
56
|
+
if ! kill -0 $ORCHESTRATOR_PID 2>/dev/null; then
|
|
57
|
+
echo "❌ FAIL: Orchestrator process died prematurely"
|
|
58
|
+
cat /tmp/orchestrator-output-${TEST_TASK_ID}.log
|
|
59
|
+
exit 1
|
|
60
|
+
fi
|
|
61
|
+
|
|
62
|
+
echo "✅ PASS: Orchestrator is running"
|
|
63
|
+
echo ""
|
|
64
|
+
|
|
65
|
+
# Test 2: Send shutdown signal via Redis
|
|
66
|
+
echo "Test 2: Sending shutdown signal via Redis..."
|
|
67
|
+
|
|
68
|
+
SHUTDOWN_PAYLOAD=$(jq -n --arg reason "test_shutdown" '{reason: $reason}')
|
|
69
|
+
echo "$SHUTDOWN_PAYLOAD" | redis-cli -x LPUSH "swarm:${TEST_TASK_ID}:shutdown" >/dev/null
|
|
70
|
+
|
|
71
|
+
echo "Shutdown signal sent: $SHUTDOWN_PAYLOAD"
|
|
72
|
+
echo "Waiting for orchestrator to shutdown..."
|
|
73
|
+
|
|
74
|
+
# Wait up to 5 seconds for graceful shutdown
|
|
75
|
+
for i in {1..10}; do
|
|
76
|
+
if ! kill -0 $ORCHESTRATOR_PID 2>/dev/null; then
|
|
77
|
+
echo "✅ PASS: Orchestrator shutdown gracefully"
|
|
78
|
+
break
|
|
79
|
+
fi
|
|
80
|
+
sleep 0.5
|
|
81
|
+
done
|
|
82
|
+
|
|
83
|
+
# Verify orchestrator has stopped
|
|
84
|
+
if kill -0 $ORCHESTRATOR_PID 2>/dev/null; then
|
|
85
|
+
echo "❌ FAIL: Orchestrator did not shutdown within 5 seconds"
|
|
86
|
+
kill -9 $ORCHESTRATOR_PID 2>/dev/null || true
|
|
87
|
+
exit 1
|
|
88
|
+
fi
|
|
89
|
+
|
|
90
|
+
echo ""
|
|
91
|
+
|
|
92
|
+
# Test 3: Verify cleanup happened
|
|
93
|
+
echo "Test 3: Verifying cleanup..."
|
|
94
|
+
|
|
95
|
+
# Check orchestrator output for shutdown messages
|
|
96
|
+
if grep -q "Orchestrator shutting down gracefully" /tmp/orchestrator-output-${TEST_TASK_ID}.log; then
|
|
97
|
+
echo "✅ PASS: Found shutdown message in output"
|
|
98
|
+
else
|
|
99
|
+
echo "❌ FAIL: Shutdown message not found in output"
|
|
100
|
+
echo "Output:"
|
|
101
|
+
cat /tmp/orchestrator-output-${TEST_TASK_ID}.log
|
|
102
|
+
exit 1
|
|
103
|
+
fi
|
|
104
|
+
|
|
105
|
+
if grep -q "Shutdown complete" /tmp/orchestrator-output-${TEST_TASK_ID}.log; then
|
|
106
|
+
echo "✅ PASS: Found completion message in output"
|
|
107
|
+
else
|
|
108
|
+
echo "⚠️ WARNING: Completion message not found (non-critical)"
|
|
109
|
+
fi
|
|
110
|
+
|
|
111
|
+
# Check if swarm was marked as cancelled (may not be present if init-swarm never ran)
|
|
112
|
+
if grep -q "Marking swarm as cancelled" /tmp/orchestrator-output-${TEST_TASK_ID}.log || grep -q "Failed to mark swarm as cancelled" /tmp/orchestrator-output-${TEST_TASK_ID}.log; then
|
|
113
|
+
echo "✅ PASS: Attempted to mark swarm as cancelled"
|
|
114
|
+
else
|
|
115
|
+
echo "⚠️ INFO: Swarm cancellation not attempted (may not have initialized yet)"
|
|
116
|
+
fi
|
|
117
|
+
|
|
118
|
+
echo ""
|
|
119
|
+
|
|
120
|
+
# Test 4: Send SIGTERM signal
|
|
121
|
+
echo "Test 4: Testing SIGTERM signal handling..."
|
|
122
|
+
|
|
123
|
+
# Start another orchestrator instance
|
|
124
|
+
timeout 30 "$SCRIPT_DIR/orchestrate-cfn-loop.sh" \
|
|
125
|
+
--task-id "${TEST_TASK_ID}-sigterm" \
|
|
126
|
+
--mode standard \
|
|
127
|
+
--loop3-agents "$MOCK_LOOP3" \
|
|
128
|
+
--loop2-agents "$MOCK_LOOP2" \
|
|
129
|
+
--product-owner "$MOCK_PO" \
|
|
130
|
+
--timeout 3600 \
|
|
131
|
+
--max-iterations 5 > /tmp/orchestrator-output-${TEST_TASK_ID}-sigterm.log 2>&1 &
|
|
132
|
+
|
|
133
|
+
ORCHESTRATOR_PID_2=$!
|
|
134
|
+
echo "Second orchestrator started (PID: $ORCHESTRATOR_PID_2)"
|
|
135
|
+
|
|
136
|
+
# Wait for initialization
|
|
137
|
+
sleep 2
|
|
138
|
+
|
|
139
|
+
# Send SIGTERM
|
|
140
|
+
echo "Sending SIGTERM to orchestrator..."
|
|
141
|
+
kill -TERM $ORCHESTRATOR_PID_2 2>/dev/null || true
|
|
142
|
+
|
|
143
|
+
# Wait for shutdown
|
|
144
|
+
for i in {1..10}; do
|
|
145
|
+
if ! kill -0 $ORCHESTRATOR_PID_2 2>/dev/null; then
|
|
146
|
+
echo "✅ PASS: Orchestrator responded to SIGTERM"
|
|
147
|
+
break
|
|
148
|
+
fi
|
|
149
|
+
sleep 0.5
|
|
150
|
+
done
|
|
151
|
+
|
|
152
|
+
# Verify shutdown
|
|
153
|
+
if kill -0 $ORCHESTRATOR_PID_2 2>/dev/null; then
|
|
154
|
+
echo "❌ FAIL: Orchestrator did not respond to SIGTERM within 5 seconds"
|
|
155
|
+
kill -9 $ORCHESTRATOR_PID_2 2>/dev/null || true
|
|
156
|
+
exit 1
|
|
157
|
+
fi
|
|
158
|
+
|
|
159
|
+
# Check for SIGTERM handling in output
|
|
160
|
+
if grep -q "SIGTERM_received" /tmp/orchestrator-output-${TEST_TASK_ID}-sigterm.log; then
|
|
161
|
+
echo "✅ PASS: SIGTERM signal was properly caught and handled"
|
|
162
|
+
else
|
|
163
|
+
echo "⚠️ WARNING: SIGTERM handling message not clear in output"
|
|
164
|
+
fi
|
|
165
|
+
|
|
166
|
+
echo ""
|
|
167
|
+
echo "=== All Tests Passed ==="
|
|
168
|
+
echo ""
|
|
169
|
+
echo "Orchestrator output (Test 1 - Redis shutdown):"
|
|
170
|
+
echo "----------------------------------------------"
|
|
171
|
+
cat /tmp/orchestrator-output-${TEST_TASK_ID}.log
|
|
172
|
+
echo ""
|
|
173
|
+
echo "Orchestrator output (Test 2 - SIGTERM):"
|
|
174
|
+
echo "----------------------------------------"
|
|
175
|
+
cat /tmp/orchestrator-output-${TEST_TASK_ID}-sigterm.log
|
|
176
|
+
|
|
177
|
+
# Cleanup test files
|
|
178
|
+
rm -f /tmp/orchestrator-output-${TEST_TASK_ID}.log
|
|
179
|
+
rm -f /tmp/orchestrator-output-${TEST_TASK_ID}-sigterm.log
|
|
180
|
+
redis-cli DEL "swarm:${TEST_TASK_ID}-sigterm:shutdown" >/dev/null 2>&1 || true
|
|
181
|
+
redis-cli DEL "swarm:${TEST_TASK_ID}-sigterm:*" >/dev/null 2>&1 || true
|
|
182
|
+
|
|
183
|
+
CLEANUP_NEEDED=0 # Prevent duplicate cleanup
|
|
184
|
+
|
|
185
|
+
echo ""
|
|
186
|
+
echo "✅ All shutdown handling tests passed successfully"
|
|
187
|
+
exit 0
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
#
|
|
3
|
+
# Test shutdown handling for waiting agents
|
|
4
|
+
#
|
|
5
|
+
|
|
6
|
+
set -euo pipefail
|
|
7
|
+
|
|
8
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
9
|
+
WAITING_MODE_SCRIPT="$SCRIPT_DIR/invoke-waiting-mode.sh"
|
|
10
|
+
|
|
11
|
+
TASK_ID="test-shutdown-$(date +%s)"
|
|
12
|
+
AGENT_ID="test-agent-1"
|
|
13
|
+
|
|
14
|
+
echo "=========================================="
|
|
15
|
+
echo "Testing Shutdown Handling"
|
|
16
|
+
echo "=========================================="
|
|
17
|
+
echo ""
|
|
18
|
+
echo "Task ID: $TASK_ID"
|
|
19
|
+
echo "Agent ID: $AGENT_ID"
|
|
20
|
+
echo ""
|
|
21
|
+
|
|
22
|
+
# Clean up Redis keys before test
|
|
23
|
+
echo "Cleaning up Redis keys..."
|
|
24
|
+
redis-cli DEL "swarm:${TASK_ID}:${AGENT_ID}:ready" >/dev/null 2>&1 || true
|
|
25
|
+
redis-cli DEL "swarm:${TASK_ID}:${AGENT_ID}:wake-queue" >/dev/null 2>&1 || true
|
|
26
|
+
redis-cli DEL "swarm:${TASK_ID}:shutdown" >/dev/null 2>&1 || true
|
|
27
|
+
|
|
28
|
+
echo ""
|
|
29
|
+
echo "Test 1: Agent enters waiting mode in background"
|
|
30
|
+
echo "------------------------------------------------"
|
|
31
|
+
|
|
32
|
+
# Start agent in background
|
|
33
|
+
{
|
|
34
|
+
$WAITING_MODE_SCRIPT enter \
|
|
35
|
+
--task-id "$TASK_ID" \
|
|
36
|
+
--agent-id "$AGENT_ID" \
|
|
37
|
+
--context "test-shutdown"
|
|
38
|
+
|
|
39
|
+
EXIT_CODE=$?
|
|
40
|
+
echo "Agent exited with code: $EXIT_CODE"
|
|
41
|
+
|
|
42
|
+
if [ $EXIT_CODE -eq 130 ]; then
|
|
43
|
+
echo "✅ Agent gracefully shutdown with SIGINT code (130)"
|
|
44
|
+
else
|
|
45
|
+
echo "❌ Expected exit code 130, got $EXIT_CODE"
|
|
46
|
+
exit 1
|
|
47
|
+
fi
|
|
48
|
+
} &
|
|
49
|
+
|
|
50
|
+
AGENT_PID=$!
|
|
51
|
+
echo "Agent started (PID: $AGENT_PID)"
|
|
52
|
+
|
|
53
|
+
# Wait for agent to enter waiting mode
|
|
54
|
+
sleep 2
|
|
55
|
+
|
|
56
|
+
# Check if agent published ready status
|
|
57
|
+
READY_STATUS=$(redis-cli LPOP "swarm:${TASK_ID}:${AGENT_ID}:ready")
|
|
58
|
+
if [ -n "$READY_STATUS" ] && [ "$READY_STATUS" != "(nil)" ]; then
|
|
59
|
+
echo "✅ Agent published ready status:"
|
|
60
|
+
echo "$READY_STATUS" | jq '.'
|
|
61
|
+
else
|
|
62
|
+
echo "❌ Agent did not publish ready status"
|
|
63
|
+
kill $AGENT_PID 2>/dev/null || true
|
|
64
|
+
exit 1
|
|
65
|
+
fi
|
|
66
|
+
|
|
67
|
+
echo ""
|
|
68
|
+
echo "Test 2: Send shutdown signal"
|
|
69
|
+
echo "-----------------------------"
|
|
70
|
+
|
|
71
|
+
$WAITING_MODE_SCRIPT shutdown \
|
|
72
|
+
--task-id "$TASK_ID" \
|
|
73
|
+
--reason "test_shutdown"
|
|
74
|
+
|
|
75
|
+
echo ""
|
|
76
|
+
echo "Test 3: Verify agent receives shutdown and exits"
|
|
77
|
+
echo "------------------------------------------------"
|
|
78
|
+
|
|
79
|
+
# Wait for agent to process shutdown (max 2 seconds for poll cycle)
|
|
80
|
+
sleep 3
|
|
81
|
+
|
|
82
|
+
# Check if agent process is still running
|
|
83
|
+
if ps -p $AGENT_PID >/dev/null 2>&1; then
|
|
84
|
+
echo "❌ Agent still running after shutdown signal"
|
|
85
|
+
kill $AGENT_PID 2>/dev/null || true
|
|
86
|
+
exit 1
|
|
87
|
+
else
|
|
88
|
+
echo "✅ Agent terminated after shutdown signal"
|
|
89
|
+
fi
|
|
90
|
+
|
|
91
|
+
# Wait for background process to finish and capture exit code
|
|
92
|
+
wait $AGENT_PID 2>/dev/null || true
|
|
93
|
+
|
|
94
|
+
echo ""
|
|
95
|
+
echo "Test 4: Verify shutdown with wake signal priority"
|
|
96
|
+
echo "-------------------------------------------------"
|
|
97
|
+
|
|
98
|
+
# Clean up
|
|
99
|
+
redis-cli DEL "swarm:${TASK_ID}:${AGENT_ID}:ready" >/dev/null 2>&1 || true
|
|
100
|
+
redis-cli DEL "swarm:${TASK_ID}:${AGENT_ID}:wake-queue" >/dev/null 2>&1 || true
|
|
101
|
+
redis-cli DEL "swarm:${TASK_ID}:shutdown" >/dev/null 2>&1 || true
|
|
102
|
+
|
|
103
|
+
# Start agent in background
|
|
104
|
+
{
|
|
105
|
+
$WAITING_MODE_SCRIPT enter \
|
|
106
|
+
--task-id "$TASK_ID" \
|
|
107
|
+
--agent-id "$AGENT_ID" \
|
|
108
|
+
--context "test-priority"
|
|
109
|
+
|
|
110
|
+
EXIT_CODE=$?
|
|
111
|
+
if [ $EXIT_CODE -eq 130 ]; then
|
|
112
|
+
echo "✅ Agent prioritized shutdown over wake signal"
|
|
113
|
+
else
|
|
114
|
+
echo "⚠️ Agent exited with code $EXIT_CODE (may have received wake signal first)"
|
|
115
|
+
fi
|
|
116
|
+
} &
|
|
117
|
+
|
|
118
|
+
AGENT_PID=$!
|
|
119
|
+
|
|
120
|
+
# Wait for agent to enter waiting mode
|
|
121
|
+
sleep 2
|
|
122
|
+
|
|
123
|
+
# Send both wake and shutdown signals (shutdown should take priority)
|
|
124
|
+
$WAITING_MODE_SCRIPT wake \
|
|
125
|
+
--task-id "$TASK_ID" \
|
|
126
|
+
--agent-id "$AGENT_ID" \
|
|
127
|
+
--reason "test_wake" \
|
|
128
|
+
--priority 50 &
|
|
129
|
+
|
|
130
|
+
$WAITING_MODE_SCRIPT shutdown \
|
|
131
|
+
--task-id "$TASK_ID" \
|
|
132
|
+
--reason "test_shutdown_priority" &
|
|
133
|
+
|
|
134
|
+
# Wait for signals to be sent
|
|
135
|
+
sleep 1
|
|
136
|
+
|
|
137
|
+
# Wait for agent to process
|
|
138
|
+
sleep 3
|
|
139
|
+
|
|
140
|
+
# Check if agent terminated
|
|
141
|
+
if ps -p $AGENT_PID >/dev/null 2>&1; then
|
|
142
|
+
echo "⚠️ Agent still running (may have processed wake signal)"
|
|
143
|
+
kill $AGENT_PID 2>/dev/null || true
|
|
144
|
+
else
|
|
145
|
+
echo "✅ Agent terminated (shutdown had priority)"
|
|
146
|
+
fi
|
|
147
|
+
|
|
148
|
+
wait $AGENT_PID 2>/dev/null || true
|
|
149
|
+
|
|
150
|
+
echo ""
|
|
151
|
+
echo "=========================================="
|
|
152
|
+
echo "✅ All shutdown handling tests passed!"
|
|
153
|
+
echo "=========================================="
|
|
154
|
+
|
|
155
|
+
# Cleanup
|
|
156
|
+
redis-cli DEL "swarm:${TASK_ID}:${AGENT_ID}:ready" >/dev/null 2>&1 || true
|
|
157
|
+
redis-cli DEL "swarm:${TASK_ID}:${AGENT_ID}:wake-queue" >/dev/null 2>&1 || true
|
|
158
|
+
redis-cli DEL "swarm:${TASK_ID}:shutdown" >/dev/null 2>&1 || true
|
|
159
|
+
|
|
160
|
+
exit 0
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Utility functions for quorum testing
|
|
3
|
+
|
|
4
|
+
# Check absolute quorum
|
|
5
|
+
check_quorum() {
|
|
6
|
+
local total_agents="$1"
|
|
7
|
+
local quorum="$2"
|
|
8
|
+
local completed_agents="$3"
|
|
9
|
+
|
|
10
|
+
if [ "$completed_agents" -ge "$quorum" ]; then
|
|
11
|
+
echo "SUCCESS"
|
|
12
|
+
else
|
|
13
|
+
echo "FAILURE"
|
|
14
|
+
fi
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
# Check percentage-based quorum
|
|
18
|
+
check_percentage_quorum() {
|
|
19
|
+
local total_agents="$1"
|
|
20
|
+
local quorum_percentage="$2"
|
|
21
|
+
local completed_agents="$3"
|
|
22
|
+
|
|
23
|
+
# Calculate the minimum number of agents required (round up)
|
|
24
|
+
local required_agents=$(echo "scale=0; ceil($total_agents * $quorum_percentage)" | bc)
|
|
25
|
+
|
|
26
|
+
if [ "$completed_agents" -ge "$required_agents" ]; then
|
|
27
|
+
echo "SUCCESS"
|
|
28
|
+
else
|
|
29
|
+
echo "FAILURE"
|
|
30
|
+
fi
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
# Graceful degradation strategy
|
|
34
|
+
simulate_graceful_degradation() {
|
|
35
|
+
local total_agents="$1"
|
|
36
|
+
local initial_quorum="$2"
|
|
37
|
+
local max_failures="$3"
|
|
38
|
+
|
|
39
|
+
# Dynamically adjust quorum based on failures
|
|
40
|
+
local current_quorum="$initial_quorum"
|
|
41
|
+
local adjusted_agents=$((total_agents - max_failures))
|
|
42
|
+
local adjusted_quorum_threshold=$(echo "scale=2; $current_quorum * 0.8" | bc)
|
|
43
|
+
|
|
44
|
+
if (( $(echo "$adjusted_quorum_threshold <= 0.65" | bc -l) )); then
|
|
45
|
+
echo "HALT" # Prevent degradation below minimum viable quorum
|
|
46
|
+
else
|
|
47
|
+
echo "$(check_percentage_quorum "$adjusted_agents" "$adjusted_quorum_threshold" "$adjusted_agents")"
|
|
48
|
+
fi
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
# Assertion functions
|
|
52
|
+
assert_equals() {
|
|
53
|
+
local actual="$1"
|
|
54
|
+
local expected="$2"
|
|
55
|
+
local message="${3:-Assertion failed}"
|
|
56
|
+
|
|
57
|
+
if [ "$actual" != "$expected" ]; then
|
|
58
|
+
echo "FAIL: $message (Expected: $expected, Got: $actual)"
|
|
59
|
+
exit 1
|
|
60
|
+
fi
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
assert_greater_than() {
|
|
64
|
+
local actual="$1"
|
|
65
|
+
local expected="$2"
|
|
66
|
+
local message="${3:-Assertion failed}"
|
|
67
|
+
|
|
68
|
+
if [ "$actual" -le "$expected" ]; then
|
|
69
|
+
echo "FAIL: $message (Expected > $expected, Got: $actual)"
|
|
70
|
+
exit 1
|
|
71
|
+
fi
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
assert_not_empty() {
|
|
75
|
+
local value="$1"
|
|
76
|
+
local message="${2:-Value is empty}"
|
|
77
|
+
|
|
78
|
+
if [ -z "$value" ]; then
|
|
79
|
+
echo "FAIL: $message"
|
|
80
|
+
exit 1
|
|
81
|
+
fi
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
# Error handling and logging
|
|
85
|
+
log_error() {
|
|
86
|
+
local message="$1"
|
|
87
|
+
echo "[ERROR] $message" >&2
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
# Cleanup function
|
|
91
|
+
cleanup() {
|
|
92
|
+
# Remove any temporary files or reset test environments
|
|
93
|
+
echo "Cleaning up test environment..."
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
# Trap to ensure cleanup happens even if script fails
|
|
97
|
+
trap cleanup EXIT
|