claude-flow-novice 2.9.1 → 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/cli/agent-executor.js +1 -1
- package/dist/cli/agent-executor.js.map +1 -1
- package/package.json +43 -7
- package/readme/README.md +15 -4
- package/scripts/init-project.js +39 -2
- 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,274 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
#
|
|
3
|
+
# Test script to verify BZPOPMIN implementation fixes
|
|
4
|
+
#
|
|
5
|
+
# Tests:
|
|
6
|
+
# 1. Compact JSON storage (no newlines breaking Redis)
|
|
7
|
+
# 2. Priority ordering (high priority messages processed first)
|
|
8
|
+
# 3. JSON validation on retrieval
|
|
9
|
+
# 4. Timeout handling
|
|
10
|
+
#
|
|
11
|
+
|
|
12
|
+
set -euo pipefail
|
|
13
|
+
|
|
14
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
15
|
+
INVOKE_SCRIPT="${SCRIPT_DIR}/invoke-waiting-mode.sh"
|
|
16
|
+
|
|
17
|
+
# Test counter
|
|
18
|
+
TESTS_PASSED=0
|
|
19
|
+
TESTS_FAILED=0
|
|
20
|
+
|
|
21
|
+
# Cleanup function
|
|
22
|
+
cleanup() {
|
|
23
|
+
local task_id="$1"
|
|
24
|
+
echo ""
|
|
25
|
+
echo "Cleaning up Redis keys for task: $task_id"
|
|
26
|
+
redis-cli KEYS "swarm:${task_id}:*" | xargs -r redis-cli DEL >/dev/null 2>&1 || true
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
# Test function
|
|
30
|
+
run_test() {
|
|
31
|
+
local test_name="$1"
|
|
32
|
+
local test_func="$2"
|
|
33
|
+
|
|
34
|
+
echo ""
|
|
35
|
+
echo "=========================================="
|
|
36
|
+
echo "TEST: $test_name"
|
|
37
|
+
echo "=========================================="
|
|
38
|
+
|
|
39
|
+
if $test_func; then
|
|
40
|
+
echo "✅ PASSED: $test_name"
|
|
41
|
+
((TESTS_PASSED++))
|
|
42
|
+
else
|
|
43
|
+
echo "❌ FAILED: $test_name"
|
|
44
|
+
((TESTS_FAILED++))
|
|
45
|
+
fi
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
# Test 1: Compact JSON storage (verify no newlines)
|
|
49
|
+
test_compact_json() {
|
|
50
|
+
local task_id="test-compact-$(date +%s)"
|
|
51
|
+
local agent_id="agent-1"
|
|
52
|
+
|
|
53
|
+
# Send wake message
|
|
54
|
+
"$INVOKE_SCRIPT" wake \
|
|
55
|
+
--task-id "$task_id" \
|
|
56
|
+
--agent-id "$agent_id" \
|
|
57
|
+
--reason "test_reason" \
|
|
58
|
+
--priority 50 >/dev/null
|
|
59
|
+
|
|
60
|
+
# Retrieve message directly from Redis
|
|
61
|
+
local queue_key="swarm:${task_id}:${agent_id}:wake-queue"
|
|
62
|
+
local stored_msg=$(redis-cli ZRANGE "$queue_key" 0 0 2>/dev/null | head -1)
|
|
63
|
+
|
|
64
|
+
cleanup "$task_id"
|
|
65
|
+
|
|
66
|
+
# Check if message is valid JSON
|
|
67
|
+
if echo "$stored_msg" | jq empty 2>/dev/null; then
|
|
68
|
+
# Check if message is compact (no newlines)
|
|
69
|
+
if [[ "$stored_msg" != *$'\n'* ]]; then
|
|
70
|
+
echo " ✓ Message stored as compact JSON"
|
|
71
|
+
return 0
|
|
72
|
+
else
|
|
73
|
+
echo " ✗ Message contains newlines"
|
|
74
|
+
return 1
|
|
75
|
+
fi
|
|
76
|
+
else
|
|
77
|
+
echo " ✗ Message is not valid JSON"
|
|
78
|
+
return 1
|
|
79
|
+
fi
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
# Test 2: Priority ordering (high priority first)
|
|
83
|
+
test_priority_ordering() {
|
|
84
|
+
local task_id="test-priority-$(date +%s)"
|
|
85
|
+
local agent_id="agent-1"
|
|
86
|
+
|
|
87
|
+
# Send 3 messages with different priorities
|
|
88
|
+
"$INVOKE_SCRIPT" wake --task-id "$task_id" --agent-id "$agent_id" --reason "low" --priority 20 >/dev/null
|
|
89
|
+
sleep 0.1
|
|
90
|
+
"$INVOKE_SCRIPT" wake --task-id "$task_id" --agent-id "$agent_id" --reason "medium" --priority 50 >/dev/null
|
|
91
|
+
sleep 0.1
|
|
92
|
+
"$INVOKE_SCRIPT" wake --task-id "$task_id" --agent-id "$agent_id" --reason "high" --priority 90 >/dev/null
|
|
93
|
+
|
|
94
|
+
# Agent should receive in order: high (90), medium (50), low (20)
|
|
95
|
+
local queue_key="swarm:${task_id}:${agent_id}:wake-queue"
|
|
96
|
+
|
|
97
|
+
# Get all messages in priority order
|
|
98
|
+
local msg1=$(redis-cli ZPOPMIN "$queue_key" 2>/dev/null | sed -n '1p')
|
|
99
|
+
local msg2=$(redis-cli ZPOPMIN "$queue_key" 2>/dev/null | sed -n '1p')
|
|
100
|
+
local msg3=$(redis-cli ZPOPMIN "$queue_key" 2>/dev/null | sed -n '1p')
|
|
101
|
+
|
|
102
|
+
cleanup "$task_id"
|
|
103
|
+
|
|
104
|
+
# Verify order
|
|
105
|
+
local reason1=$(echo "$msg1" | jq -r '.reason' 2>/dev/null)
|
|
106
|
+
local reason2=$(echo "$msg2" | jq -r '.reason' 2>/dev/null)
|
|
107
|
+
local reason3=$(echo "$msg3" | jq -r '.reason' 2>/dev/null)
|
|
108
|
+
|
|
109
|
+
if [ "$reason1" = "high" ] && [ "$reason2" = "medium" ] && [ "$reason3" = "low" ]; then
|
|
110
|
+
echo " ✓ Messages retrieved in correct priority order: $reason1 → $reason2 → $reason3"
|
|
111
|
+
return 0
|
|
112
|
+
else
|
|
113
|
+
echo " ✗ Incorrect order: $reason1 → $reason2 → $reason3 (expected: high → medium → low)"
|
|
114
|
+
return 1
|
|
115
|
+
fi
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
# Test 3: JSON validation on retrieval
|
|
119
|
+
test_json_validation() {
|
|
120
|
+
local task_id="test-validation-$(date +%s)"
|
|
121
|
+
local agent_id="agent-1"
|
|
122
|
+
|
|
123
|
+
# Send valid message
|
|
124
|
+
"$INVOKE_SCRIPT" wake --task-id "$task_id" --agent-id "$agent_id" --reason "valid_test" --priority 50 >/dev/null
|
|
125
|
+
|
|
126
|
+
# Start agent in background
|
|
127
|
+
timeout 5 "$INVOKE_SCRIPT" enter --task-id "$task_id" --agent-id "$agent_id" --context "test" >test_output.txt 2>&1 &
|
|
128
|
+
local agent_pid=$!
|
|
129
|
+
|
|
130
|
+
# Wait for agent to process message
|
|
131
|
+
sleep 2
|
|
132
|
+
|
|
133
|
+
# Check if agent received valid JSON
|
|
134
|
+
if wait $agent_pid 2>/dev/null; then
|
|
135
|
+
if grep -q "✅ Woken up!" test_output.txt && grep -q "valid_test" test_output.txt; then
|
|
136
|
+
echo " ✓ Agent validated and processed JSON message"
|
|
137
|
+
rm -f test_output.txt
|
|
138
|
+
cleanup "$task_id"
|
|
139
|
+
return 0
|
|
140
|
+
fi
|
|
141
|
+
fi
|
|
142
|
+
|
|
143
|
+
echo " ✗ Agent failed to validate JSON message"
|
|
144
|
+
rm -f test_output.txt
|
|
145
|
+
cleanup "$task_id"
|
|
146
|
+
return 1
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
# Test 4: Timeout handling (no deadlock)
|
|
150
|
+
test_timeout_handling() {
|
|
151
|
+
local task_id="test-timeout-$(date +%s)"
|
|
152
|
+
local agent_id="agent-1"
|
|
153
|
+
|
|
154
|
+
# Start agent without sending wake message
|
|
155
|
+
# Should timeout after a few seconds
|
|
156
|
+
timeout 3 "$INVOKE_SCRIPT" enter --task-id "$task_id" --agent-id "$agent_id" --context "test" >/dev/null 2>&1 &
|
|
157
|
+
local agent_pid=$!
|
|
158
|
+
|
|
159
|
+
sleep 4
|
|
160
|
+
|
|
161
|
+
# Check if agent is still running (should have timed out)
|
|
162
|
+
if ! kill -0 $agent_pid 2>/dev/null; then
|
|
163
|
+
echo " ✓ Agent handled timeout correctly"
|
|
164
|
+
cleanup "$task_id"
|
|
165
|
+
return 0
|
|
166
|
+
else
|
|
167
|
+
echo " ✗ Agent did not timeout"
|
|
168
|
+
kill $agent_pid 2>/dev/null || true
|
|
169
|
+
cleanup "$task_id"
|
|
170
|
+
return 1
|
|
171
|
+
fi
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
# Test 5: End-to-end wake-up flow
|
|
175
|
+
test_e2e_wakeup() {
|
|
176
|
+
local task_id="test-e2e-$(date +%s)"
|
|
177
|
+
local agent_id="agent-1"
|
|
178
|
+
|
|
179
|
+
# Start agent in background
|
|
180
|
+
timeout 10 "$INVOKE_SCRIPT" enter --task-id "$task_id" --agent-id "$agent_id" --context "e2e-test" >test_e2e_output.txt 2>&1 &
|
|
181
|
+
local agent_pid=$!
|
|
182
|
+
|
|
183
|
+
# Give agent time to enter waiting mode
|
|
184
|
+
sleep 1
|
|
185
|
+
|
|
186
|
+
# Send wake message
|
|
187
|
+
"$INVOKE_SCRIPT" wake \
|
|
188
|
+
--task-id "$task_id" \
|
|
189
|
+
--agent-id "$agent_id" \
|
|
190
|
+
--reason "e2e_test" \
|
|
191
|
+
--priority 80 \
|
|
192
|
+
--iteration 1 >/dev/null
|
|
193
|
+
|
|
194
|
+
# Wait for agent to complete
|
|
195
|
+
sleep 2
|
|
196
|
+
|
|
197
|
+
# Check results
|
|
198
|
+
if grep -q "✅ Woken up!" test_e2e_output.txt && grep -q "e2e_test" test_e2e_output.txt; then
|
|
199
|
+
echo " ✓ End-to-end wake-up flow successful"
|
|
200
|
+
rm -f test_e2e_output.txt
|
|
201
|
+
cleanup "$task_id"
|
|
202
|
+
return 0
|
|
203
|
+
else
|
|
204
|
+
echo " ✗ End-to-end wake-up flow failed"
|
|
205
|
+
cat test_e2e_output.txt
|
|
206
|
+
rm -f test_e2e_output.txt
|
|
207
|
+
cleanup "$task_id"
|
|
208
|
+
return 1
|
|
209
|
+
fi
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
# Test 6: Debug mode functionality
|
|
213
|
+
test_debug_mode() {
|
|
214
|
+
local task_id="test-debug-$(date +%s)"
|
|
215
|
+
local agent_id="agent-1"
|
|
216
|
+
|
|
217
|
+
# Send wake message with debug mode enabled
|
|
218
|
+
DEBUG=true "$INVOKE_SCRIPT" wake \
|
|
219
|
+
--task-id "$task_id" \
|
|
220
|
+
--agent-id "$agent_id" \
|
|
221
|
+
--reason "debug_test" \
|
|
222
|
+
--priority 75 >test_debug_output.txt 2>&1
|
|
223
|
+
|
|
224
|
+
cleanup "$task_id"
|
|
225
|
+
|
|
226
|
+
# Check if debug output is present
|
|
227
|
+
if grep -q "\[DEBUG\]" test_debug_output.txt; then
|
|
228
|
+
echo " ✓ Debug mode produces verbose output"
|
|
229
|
+
rm -f test_debug_output.txt
|
|
230
|
+
return 0
|
|
231
|
+
else
|
|
232
|
+
echo " ✗ Debug mode did not produce expected output"
|
|
233
|
+
rm -f test_debug_output.txt
|
|
234
|
+
return 1
|
|
235
|
+
fi
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
# Main execution
|
|
239
|
+
echo "=========================================="
|
|
240
|
+
echo "BZPOPMIN Implementation Fix Test Suite"
|
|
241
|
+
echo "=========================================="
|
|
242
|
+
echo ""
|
|
243
|
+
echo "Testing fixes for:"
|
|
244
|
+
echo " 1. Compact JSON storage (no newlines)"
|
|
245
|
+
echo " 2. Priority ordering"
|
|
246
|
+
echo " 3. JSON validation on retrieval"
|
|
247
|
+
echo " 4. Timeout handling"
|
|
248
|
+
echo " 5. End-to-end wake-up flow"
|
|
249
|
+
echo " 6. Debug mode"
|
|
250
|
+
|
|
251
|
+
# Run all tests
|
|
252
|
+
run_test "Compact JSON Storage" test_compact_json
|
|
253
|
+
run_test "Priority Ordering" test_priority_ordering
|
|
254
|
+
run_test "JSON Validation" test_json_validation
|
|
255
|
+
run_test "Timeout Handling" test_timeout_handling
|
|
256
|
+
run_test "End-to-End Wake-Up Flow" test_e2e_wakeup
|
|
257
|
+
run_test "Debug Mode" test_debug_mode
|
|
258
|
+
|
|
259
|
+
# Summary
|
|
260
|
+
echo ""
|
|
261
|
+
echo "=========================================="
|
|
262
|
+
echo "TEST SUMMARY"
|
|
263
|
+
echo "=========================================="
|
|
264
|
+
echo "Tests passed: $TESTS_PASSED"
|
|
265
|
+
echo "Tests failed: $TESTS_FAILED"
|
|
266
|
+
echo ""
|
|
267
|
+
|
|
268
|
+
if [ $TESTS_FAILED -eq 0 ]; then
|
|
269
|
+
echo "✅ All tests passed!"
|
|
270
|
+
exit 0
|
|
271
|
+
else
|
|
272
|
+
echo "❌ Some tests failed"
|
|
273
|
+
exit 1
|
|
274
|
+
fi
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
##############################################################################
|
|
4
|
+
# Test Cancel Swarm - Validates graceful shutdown functionality
|
|
5
|
+
#
|
|
6
|
+
# Tests:
|
|
7
|
+
# 1. Cancel active swarm (success path)
|
|
8
|
+
# 2. Cancel with custom reason and initiator
|
|
9
|
+
# 3. Cancel non-existent swarm (error handling)
|
|
10
|
+
# 4. Verify shutdown signals delivered to all agents
|
|
11
|
+
# 5. Verify swarm metadata updated correctly
|
|
12
|
+
# 6. Test force flag (skip confirmation)
|
|
13
|
+
##############################################################################
|
|
14
|
+
|
|
15
|
+
# Disable strict error handling for tests
|
|
16
|
+
set -uo pipefail
|
|
17
|
+
|
|
18
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
19
|
+
TEST_TASK_ID="test-cancel-$(date +%s)"
|
|
20
|
+
FAILED_TESTS=0
|
|
21
|
+
PASSED_TESTS=0
|
|
22
|
+
|
|
23
|
+
# Colors for output
|
|
24
|
+
RED='\033[0;31m'
|
|
25
|
+
GREEN='\033[0;32m'
|
|
26
|
+
YELLOW='\033[1;33m'
|
|
27
|
+
NC='\033[0m' # No Color
|
|
28
|
+
|
|
29
|
+
log_test() {
|
|
30
|
+
echo ""
|
|
31
|
+
echo "========================================="
|
|
32
|
+
echo "TEST: $1"
|
|
33
|
+
echo "========================================="
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
log_pass() {
|
|
37
|
+
echo -e "${GREEN}✓ PASS:${NC} $1"
|
|
38
|
+
((PASSED_TESTS++))
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
log_fail() {
|
|
42
|
+
echo -e "${RED}✗ FAIL:${NC} $1"
|
|
43
|
+
((FAILED_TESTS++))
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
log_info() {
|
|
47
|
+
echo -e "${YELLOW}ℹ INFO:${NC} $1"
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
cleanup() {
|
|
51
|
+
log_info "Cleaning up test data..."
|
|
52
|
+
|
|
53
|
+
# Delete test keys matching patterns
|
|
54
|
+
KEYS=$(redis-cli --scan --pattern "swarm:${TEST_TASK_ID}*" 2>/dev/null || true)
|
|
55
|
+
if [ -n "$KEYS" ]; then
|
|
56
|
+
echo "$KEYS" | while read -r KEY; do
|
|
57
|
+
redis-cli del "$KEY" > /dev/null 2>&1 || true
|
|
58
|
+
done
|
|
59
|
+
fi
|
|
60
|
+
|
|
61
|
+
KEYS=$(redis-cli --scan --pattern "swarm:test-cancel-*" 2>/dev/null || true)
|
|
62
|
+
if [ -n "$KEYS" ]; then
|
|
63
|
+
echo "$KEYS" | while read -r KEY; do
|
|
64
|
+
redis-cli del "$KEY" > /dev/null 2>&1 || true
|
|
65
|
+
done
|
|
66
|
+
fi
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
# Cleanup on exit
|
|
70
|
+
trap cleanup EXIT
|
|
71
|
+
|
|
72
|
+
echo "========================================="
|
|
73
|
+
echo "Cancel Swarm Test Suite"
|
|
74
|
+
echo "========================================="
|
|
75
|
+
echo "Test Task ID: $TEST_TASK_ID"
|
|
76
|
+
echo ""
|
|
77
|
+
|
|
78
|
+
# =============================================================================
|
|
79
|
+
# Test 1: Cancel active swarm (success path)
|
|
80
|
+
# =============================================================================
|
|
81
|
+
log_test "Cancel Active Swarm"
|
|
82
|
+
|
|
83
|
+
# Initialize test swarm
|
|
84
|
+
SWARM_ID="${TEST_TASK_ID}-swarm1"
|
|
85
|
+
AGENTS="coder-1,reviewer-1,tester-1"
|
|
86
|
+
|
|
87
|
+
"$SCRIPT_DIR/init-swarm.sh" \
|
|
88
|
+
--swarm-id "$SWARM_ID" \
|
|
89
|
+
--task-id "$TEST_TASK_ID" \
|
|
90
|
+
--agents "$AGENTS" > /dev/null
|
|
91
|
+
|
|
92
|
+
log_info "Swarm initialized: $SWARM_ID"
|
|
93
|
+
|
|
94
|
+
# Cancel swarm with force flag (skip confirmation)
|
|
95
|
+
OUTPUT=$("$SCRIPT_DIR/cancel-swarm.sh" \
|
|
96
|
+
--task-id "$TEST_TASK_ID" \
|
|
97
|
+
--force 2>&1 || true)
|
|
98
|
+
|
|
99
|
+
# Verify status updated
|
|
100
|
+
STATUS=$(redis-cli hget "swarm:${SWARM_ID}:metadata" status)
|
|
101
|
+
if [ "$STATUS" = "cancelled" ]; then
|
|
102
|
+
log_pass "Swarm status updated to 'cancelled'"
|
|
103
|
+
else
|
|
104
|
+
log_fail "Expected status 'cancelled', got: $STATUS"
|
|
105
|
+
fi
|
|
106
|
+
|
|
107
|
+
# Verify agents_notified count
|
|
108
|
+
NOTIFIED=$(redis-cli hget "swarm:${SWARM_ID}:metadata" agents_notified)
|
|
109
|
+
if [ "$NOTIFIED" = "3" ]; then
|
|
110
|
+
log_pass "All 3 agents notified"
|
|
111
|
+
else
|
|
112
|
+
log_fail "Expected 3 agents notified, got: $NOTIFIED"
|
|
113
|
+
fi
|
|
114
|
+
|
|
115
|
+
# Verify shutdown signal broadcasted
|
|
116
|
+
SHUTDOWN_KEY="swarm:${TEST_TASK_ID}:shutdown"
|
|
117
|
+
SHUTDOWN_MSG=$(redis-cli --raw lindex "$SHUTDOWN_KEY" 0 2>/dev/null || echo "{}")
|
|
118
|
+
|
|
119
|
+
if [ -n "$SHUTDOWN_MSG" ] && [ "$SHUTDOWN_MSG" != "(nil)" ]; then
|
|
120
|
+
log_pass "Shutdown signal broadcasted to $SHUTDOWN_KEY"
|
|
121
|
+
|
|
122
|
+
# Verify message content
|
|
123
|
+
REASON=$(echo "$SHUTDOWN_MSG" | jq -r '.reason // empty')
|
|
124
|
+
INITIATOR=$(echo "$SHUTDOWN_MSG" | jq -r '.initiator // empty')
|
|
125
|
+
|
|
126
|
+
if [ "$REASON" = "user_requested_cancellation" ]; then
|
|
127
|
+
log_pass "Shutdown signal has correct reason"
|
|
128
|
+
else
|
|
129
|
+
log_fail "Expected reason 'user_requested_cancellation', got: $REASON"
|
|
130
|
+
fi
|
|
131
|
+
|
|
132
|
+
if [ "$INITIATOR" = "main-chat" ]; then
|
|
133
|
+
log_pass "Shutdown signal has correct initiator"
|
|
134
|
+
else
|
|
135
|
+
log_fail "Expected initiator 'main-chat', got: $INITIATOR"
|
|
136
|
+
fi
|
|
137
|
+
else
|
|
138
|
+
log_fail "No shutdown signal found"
|
|
139
|
+
fi
|
|
140
|
+
|
|
141
|
+
# =============================================================================
|
|
142
|
+
# Test 2: Cancel with custom reason and initiator
|
|
143
|
+
# =============================================================================
|
|
144
|
+
log_test "Cancel with Custom Reason and Initiator"
|
|
145
|
+
|
|
146
|
+
SWARM_ID2="${TEST_TASK_ID}-swarm2"
|
|
147
|
+
"$SCRIPT_DIR/init-swarm.sh" \
|
|
148
|
+
--swarm-id "$SWARM_ID2" \
|
|
149
|
+
--task-id "${TEST_TASK_ID}-custom" \
|
|
150
|
+
--agents "backend-dev-1" > /dev/null
|
|
151
|
+
|
|
152
|
+
OUTPUT=$("$SCRIPT_DIR/cancel-swarm.sh" \
|
|
153
|
+
--task-id "${TEST_TASK_ID}-custom" \
|
|
154
|
+
--reason "integration_test_timeout" \
|
|
155
|
+
--initiator "test-runner" \
|
|
156
|
+
--force 2>&1 || true)
|
|
157
|
+
|
|
158
|
+
CANCEL_REASON=$(redis-cli hget "swarm:${SWARM_ID2}:metadata" cancellation_reason)
|
|
159
|
+
CANCEL_INIT=$(redis-cli hget "swarm:${SWARM_ID2}:metadata" cancellation_initiator)
|
|
160
|
+
|
|
161
|
+
if [ "$CANCEL_REASON" = "integration_test_timeout" ]; then
|
|
162
|
+
log_pass "Custom cancellation reason recorded"
|
|
163
|
+
else
|
|
164
|
+
log_fail "Expected reason 'integration_test_timeout', got: $CANCEL_REASON"
|
|
165
|
+
fi
|
|
166
|
+
|
|
167
|
+
if [ "$CANCEL_INIT" = "test-runner" ]; then
|
|
168
|
+
log_pass "Custom initiator recorded"
|
|
169
|
+
else
|
|
170
|
+
log_fail "Expected initiator 'test-runner', got: $CANCEL_INIT"
|
|
171
|
+
fi
|
|
172
|
+
|
|
173
|
+
# =============================================================================
|
|
174
|
+
# Test 3: Cancel non-existent swarm (error handling)
|
|
175
|
+
# =============================================================================
|
|
176
|
+
log_test "Cancel Non-Existent Swarm (Error Handling)"
|
|
177
|
+
|
|
178
|
+
OUTPUT=$("$SCRIPT_DIR/cancel-swarm.sh" \
|
|
179
|
+
--task-id "non-existent-task-id-12345" \
|
|
180
|
+
--force 2>&1 || true)
|
|
181
|
+
|
|
182
|
+
if echo "$OUTPUT" | grep -q "No swarm found"; then
|
|
183
|
+
log_pass "Error message displayed for non-existent swarm"
|
|
184
|
+
else
|
|
185
|
+
log_fail "Expected error message, got: $OUTPUT"
|
|
186
|
+
fi
|
|
187
|
+
|
|
188
|
+
# =============================================================================
|
|
189
|
+
# Test 4: Verify shutdown message format
|
|
190
|
+
# =============================================================================
|
|
191
|
+
log_test "Verify Shutdown Message Format"
|
|
192
|
+
|
|
193
|
+
SWARM_ID3="${TEST_TASK_ID}-swarm3"
|
|
194
|
+
"$SCRIPT_DIR/init-swarm.sh" \
|
|
195
|
+
--swarm-id "$SWARM_ID3" \
|
|
196
|
+
--task-id "${TEST_TASK_ID}-format" \
|
|
197
|
+
--agents "security-1" > /dev/null
|
|
198
|
+
|
|
199
|
+
"$SCRIPT_DIR/cancel-swarm.sh" \
|
|
200
|
+
--task-id "${TEST_TASK_ID}-format" \
|
|
201
|
+
--reason "test_message_format" \
|
|
202
|
+
--initiator "validator" \
|
|
203
|
+
--force > /dev/null 2>&1
|
|
204
|
+
|
|
205
|
+
SHUTDOWN_KEY="swarm:${TEST_TASK_ID}-format:shutdown"
|
|
206
|
+
MSG=$(redis-cli --raw lindex "$SHUTDOWN_KEY" 0 2>/dev/null || echo "{}")
|
|
207
|
+
|
|
208
|
+
# Validate JSON structure
|
|
209
|
+
REASON=$(echo "$MSG" | jq -r '.reason // empty')
|
|
210
|
+
TIMESTAMP=$(echo "$MSG" | jq -r '.timestamp // empty')
|
|
211
|
+
INITIATOR=$(echo "$MSG" | jq -r '.initiator // empty')
|
|
212
|
+
|
|
213
|
+
if [ "$REASON" = "test_message_format" ] && \
|
|
214
|
+
[ -n "$TIMESTAMP" ] && \
|
|
215
|
+
[ "$INITIATOR" = "validator" ]; then
|
|
216
|
+
log_pass "Shutdown message has correct format"
|
|
217
|
+
else
|
|
218
|
+
log_fail "Shutdown message format incorrect: $MSG"
|
|
219
|
+
fi
|
|
220
|
+
|
|
221
|
+
# =============================================================================
|
|
222
|
+
# Test 5: Verify cancelled_at timestamp
|
|
223
|
+
# =============================================================================
|
|
224
|
+
log_test "Verify Cancelled Timestamp"
|
|
225
|
+
|
|
226
|
+
CANCELLED_AT=$(redis-cli hget "swarm:${SWARM_ID3}:metadata" cancelled_at)
|
|
227
|
+
|
|
228
|
+
if [[ "$CANCELLED_AT" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$ ]]; then
|
|
229
|
+
log_pass "Cancelled timestamp in ISO 8601 format: $CANCELLED_AT"
|
|
230
|
+
else
|
|
231
|
+
log_fail "Invalid timestamp format: $CANCELLED_AT"
|
|
232
|
+
fi
|
|
233
|
+
|
|
234
|
+
# =============================================================================
|
|
235
|
+
# Test 6: Empty agent list handling
|
|
236
|
+
# =============================================================================
|
|
237
|
+
log_test "Handle Swarm with Empty Agent List"
|
|
238
|
+
|
|
239
|
+
SWARM_ID4="${TEST_TASK_ID}-swarm4"
|
|
240
|
+
redis-cli hset "swarm:${SWARM_ID4}:metadata" \
|
|
241
|
+
swarm_id "$SWARM_ID4" \
|
|
242
|
+
task_id "${TEST_TASK_ID}-empty" \
|
|
243
|
+
agents "" \
|
|
244
|
+
status "in_progress" > /dev/null
|
|
245
|
+
|
|
246
|
+
OUTPUT=$("$SCRIPT_DIR/cancel-swarm.sh" \
|
|
247
|
+
--task-id "${TEST_TASK_ID}-empty" \
|
|
248
|
+
--force 2>&1 || true)
|
|
249
|
+
|
|
250
|
+
STATUS=$(redis-cli hget "swarm:${SWARM_ID4}:metadata" status)
|
|
251
|
+
NOTIFIED=$(redis-cli hget "swarm:${SWARM_ID4}:metadata" agents_notified)
|
|
252
|
+
|
|
253
|
+
if [ "$STATUS" = "cancelled" ] && [ "$NOTIFIED" = "0" ]; then
|
|
254
|
+
log_pass "Empty agent list handled correctly"
|
|
255
|
+
else
|
|
256
|
+
log_fail "Empty agent list handling failed (status: $STATUS, notified: $NOTIFIED)"
|
|
257
|
+
fi
|
|
258
|
+
|
|
259
|
+
# =============================================================================
|
|
260
|
+
# Summary
|
|
261
|
+
# =============================================================================
|
|
262
|
+
echo ""
|
|
263
|
+
echo "========================================="
|
|
264
|
+
echo "Test Summary"
|
|
265
|
+
echo "========================================="
|
|
266
|
+
echo -e "${GREEN}Passed:${NC} $PASSED_TESTS"
|
|
267
|
+
echo -e "${RED}Failed:${NC} $FAILED_TESTS"
|
|
268
|
+
echo "========================================="
|
|
269
|
+
|
|
270
|
+
if [ $FAILED_TESTS -eq 0 ]; then
|
|
271
|
+
echo -e "${GREEN}✓ All tests passed!${NC}"
|
|
272
|
+
exit 0
|
|
273
|
+
else
|
|
274
|
+
echo -e "${RED}✗ Some tests failed${NC}"
|
|
275
|
+
exit 1
|
|
276
|
+
fi
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
##############################################################################
|
|
4
|
+
# Test Dead Letter Queue (DLQ) Functionality
|
|
5
|
+
# Validates DLQ write and query operations with simulated failures
|
|
6
|
+
##############################################################################
|
|
7
|
+
|
|
8
|
+
set -euo pipefail
|
|
9
|
+
|
|
10
|
+
TASK_ID="test-dlq-$(date +%s)"
|
|
11
|
+
TEST_AGENT="test-agent-1"
|
|
12
|
+
|
|
13
|
+
echo "=== DLQ Functionality Test ==="
|
|
14
|
+
echo "Task ID: $TASK_ID"
|
|
15
|
+
echo "Test Agent: $TEST_AGENT"
|
|
16
|
+
echo ""
|
|
17
|
+
|
|
18
|
+
##############################################################################
|
|
19
|
+
# Test 1: Simulate DLQ Write
|
|
20
|
+
##############################################################################
|
|
21
|
+
echo "[Test 1] Simulating DLQ write for failed agent..."
|
|
22
|
+
|
|
23
|
+
DLQ_KEY="swarm:${TASK_ID}:dlq:${TEST_AGENT}"
|
|
24
|
+
DLQ_ENTRY=$(jq -n \
|
|
25
|
+
--arg reason "timeout_after_retries" \
|
|
26
|
+
--arg retries "3" \
|
|
27
|
+
--arg ts "$(date +%s)" \
|
|
28
|
+
'{reason: $reason, retry_count: ($retries | tonumber), timestamp: ($ts | tonumber)}')
|
|
29
|
+
|
|
30
|
+
echo "$DLQ_ENTRY" | redis-cli -x LPUSH "$DLQ_KEY" >/dev/null
|
|
31
|
+
redis-cli EXPIRE "$DLQ_KEY" 604800 >/dev/null # 7 days TTL
|
|
32
|
+
|
|
33
|
+
echo " ✓ DLQ entry written"
|
|
34
|
+
echo ""
|
|
35
|
+
|
|
36
|
+
##############################################################################
|
|
37
|
+
# Test 2: Query Specific Agent DLQ
|
|
38
|
+
##############################################################################
|
|
39
|
+
echo "[Test 2] Querying DLQ for specific agent..."
|
|
40
|
+
./.claude/skills/cfn-redis-coordination/query-dlq.sh \
|
|
41
|
+
--task-id "$TASK_ID" \
|
|
42
|
+
--agent-id "$TEST_AGENT"
|
|
43
|
+
echo ""
|
|
44
|
+
|
|
45
|
+
##############################################################################
|
|
46
|
+
# Test 3: Add Multiple Failures
|
|
47
|
+
##############################################################################
|
|
48
|
+
echo "[Test 3] Adding multiple failure entries..."
|
|
49
|
+
|
|
50
|
+
TEST_AGENT_2="test-agent-2"
|
|
51
|
+
DLQ_KEY_2="swarm:${TASK_ID}:dlq:${TEST_AGENT_2}"
|
|
52
|
+
|
|
53
|
+
for i in {1..3}; do
|
|
54
|
+
DLQ_ENTRY=$(jq -n \
|
|
55
|
+
--arg reason "timeout_after_retries" \
|
|
56
|
+
--arg retries "$i" \
|
|
57
|
+
--arg ts "$(date +%s)" \
|
|
58
|
+
'{reason: $reason, retry_count: ($retries | tonumber), timestamp: ($ts | tonumber)}')
|
|
59
|
+
|
|
60
|
+
echo "$DLQ_ENTRY" | redis-cli -x LPUSH "$DLQ_KEY_2" >/dev/null
|
|
61
|
+
sleep 1
|
|
62
|
+
done
|
|
63
|
+
|
|
64
|
+
redis-cli EXPIRE "$DLQ_KEY_2" 604800 >/dev/null
|
|
65
|
+
|
|
66
|
+
echo " ✓ Added 3 failure entries for $TEST_AGENT_2"
|
|
67
|
+
echo ""
|
|
68
|
+
|
|
69
|
+
##############################################################################
|
|
70
|
+
# Test 4: Query All DLQ Entries for Task
|
|
71
|
+
##############################################################################
|
|
72
|
+
echo "[Test 4] Querying all DLQ entries for task..."
|
|
73
|
+
./.claude/skills/cfn-redis-coordination/query-dlq.sh --task-id "$TASK_ID"
|
|
74
|
+
echo ""
|
|
75
|
+
|
|
76
|
+
##############################################################################
|
|
77
|
+
# Test 5: Verify TTL
|
|
78
|
+
##############################################################################
|
|
79
|
+
echo "[Test 5] Verifying TTL..."
|
|
80
|
+
TTL=$(redis-cli TTL "$DLQ_KEY")
|
|
81
|
+
EXPECTED_TTL=604800 # 7 days
|
|
82
|
+
|
|
83
|
+
if [ "$TTL" -gt 0 ] && [ "$TTL" -le "$EXPECTED_TTL" ]; then
|
|
84
|
+
echo " ✓ TTL correctly set: ${TTL}s (~7 days)"
|
|
85
|
+
else
|
|
86
|
+
echo " ✗ TTL verification failed: ${TTL}s"
|
|
87
|
+
exit 1
|
|
88
|
+
fi
|
|
89
|
+
echo ""
|
|
90
|
+
|
|
91
|
+
##############################################################################
|
|
92
|
+
# Test 6: Verify Entry Count
|
|
93
|
+
##############################################################################
|
|
94
|
+
echo "[Test 6] Verifying entry counts..."
|
|
95
|
+
|
|
96
|
+
COUNT_1=$(redis-cli LLEN "$DLQ_KEY")
|
|
97
|
+
COUNT_2=$(redis-cli LLEN "$DLQ_KEY_2")
|
|
98
|
+
|
|
99
|
+
echo " Agent 1 entries: $COUNT_1 (expected: 1)"
|
|
100
|
+
echo " Agent 2 entries: $COUNT_2 (expected: 3)"
|
|
101
|
+
|
|
102
|
+
if [ "$COUNT_1" = "1" ] && [ "$COUNT_2" = "3" ]; then
|
|
103
|
+
echo " ✓ Entry counts correct"
|
|
104
|
+
else
|
|
105
|
+
echo " ✗ Entry count mismatch"
|
|
106
|
+
exit 1
|
|
107
|
+
fi
|
|
108
|
+
echo ""
|
|
109
|
+
|
|
110
|
+
##############################################################################
|
|
111
|
+
# Cleanup
|
|
112
|
+
##############################################################################
|
|
113
|
+
echo "[Cleanup] Removing test DLQ entries..."
|
|
114
|
+
redis-cli DEL "$DLQ_KEY" "$DLQ_KEY_2" >/dev/null
|
|
115
|
+
echo " ✓ Cleanup complete"
|
|
116
|
+
echo ""
|
|
117
|
+
|
|
118
|
+
##############################################################################
|
|
119
|
+
# Summary
|
|
120
|
+
##############################################################################
|
|
121
|
+
echo "=== Test Summary ==="
|
|
122
|
+
echo "✅ All DLQ tests passed!"
|
|
123
|
+
echo ""
|
|
124
|
+
echo "Validated:"
|
|
125
|
+
echo " - DLQ write functionality"
|
|
126
|
+
echo " - Single agent query"
|
|
127
|
+
echo " - Multi-agent query"
|
|
128
|
+
echo " - TTL expiration (7 days)"
|
|
129
|
+
echo " - Entry counting"
|