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,423 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
#
|
|
3
|
+
# Redis Waiting Mode CLI Wrapper for Agents
|
|
4
|
+
#
|
|
5
|
+
# Usage:
|
|
6
|
+
# ./invoke-waiting-mode.sh enter --task-id <task> --agent-id <agent> --context <context>
|
|
7
|
+
# ./invoke-waiting-mode.sh wake --task-id <task> --agent-id <agent> --reason <reason> [--iteration <n>] [--priority <0-100>] [--fork-id <fork_id>]
|
|
8
|
+
# ./invoke-waiting-mode.sh report --task-id <task> --agent-id <agent> --confidence <score> [--iteration <n>]
|
|
9
|
+
# ./invoke-waiting-mode.sh collect --task-id <task> --agent-ids <id1,id2,id3>
|
|
10
|
+
# ./invoke-waiting-mode.sh shutdown --task-id <task> [--reason <reason>]
|
|
11
|
+
#
|
|
12
|
+
# New parameter: --fork-id
|
|
13
|
+
# Optional unique identifier for conversation continuation
|
|
14
|
+
# Allows tracking and resuming specific conversation forks
|
|
15
|
+
# Stored in Redis with 5-minute TTL during agent wake
|
|
16
|
+
#
|
|
17
|
+
# Priority Levels (0-100, higher = more urgent, default = 50):
|
|
18
|
+
# 90-100: Critical (security patches, system failures)
|
|
19
|
+
# 70-89: High (urgent features, blocking bugs)
|
|
20
|
+
# 40-60: Medium (normal tasks, default)
|
|
21
|
+
# 20-39: Low (optimizations, refactoring)
|
|
22
|
+
# 0-19: Minimal (documentation, cleanup)
|
|
23
|
+
#
|
|
24
|
+
# Examples:
|
|
25
|
+
# # Agent enters waiting mode
|
|
26
|
+
# ./invoke-waiting-mode.sh enter --task-id auth-system --agent-id coder-1 --context "iteration-1"
|
|
27
|
+
#
|
|
28
|
+
# # Coordinator wakes agent with fork ID
|
|
29
|
+
# ./invoke-waiting-mode.sh wake --task-id auth-system --agent-id coder-1 --reason cfn_loop_iteration --iteration 2 --fork-id "fork-1-a3b2c1d4"
|
|
30
|
+
#
|
|
31
|
+
# # Other existing use cases remain unchanged
|
|
32
|
+
|
|
33
|
+
set -euo pipefail
|
|
34
|
+
|
|
35
|
+
# Debug mode (set DEBUG=true for verbose output)
|
|
36
|
+
DEBUG="${DEBUG:-false}"
|
|
37
|
+
|
|
38
|
+
# Parse command
|
|
39
|
+
COMMAND="${1:-}"
|
|
40
|
+
shift || true
|
|
41
|
+
|
|
42
|
+
# Parse arguments
|
|
43
|
+
TASK_ID=""
|
|
44
|
+
AGENT_ID=""
|
|
45
|
+
AGENT_IDS=""
|
|
46
|
+
CONTEXT=""
|
|
47
|
+
REASON=""
|
|
48
|
+
ITERATION=""
|
|
49
|
+
CONFIDENCE=""
|
|
50
|
+
FEEDBACK=""
|
|
51
|
+
TASK_DESC=""
|
|
52
|
+
FORK_ID=""
|
|
53
|
+
PRIORITY=50 # Default medium priority (0-100, higher = more urgent)
|
|
54
|
+
|
|
55
|
+
while [[ $# -gt 0 ]]; do
|
|
56
|
+
case $1 in
|
|
57
|
+
--task-id)
|
|
58
|
+
TASK_ID="$2"
|
|
59
|
+
shift 2
|
|
60
|
+
;;
|
|
61
|
+
--agent-id)
|
|
62
|
+
AGENT_ID="$2"
|
|
63
|
+
shift 2
|
|
64
|
+
;;
|
|
65
|
+
--agent-ids)
|
|
66
|
+
AGENT_IDS="$2"
|
|
67
|
+
shift 2
|
|
68
|
+
;;
|
|
69
|
+
--context)
|
|
70
|
+
CONTEXT="$2"
|
|
71
|
+
shift 2
|
|
72
|
+
;;
|
|
73
|
+
--reason)
|
|
74
|
+
REASON="$2"
|
|
75
|
+
shift 2
|
|
76
|
+
;;
|
|
77
|
+
--iteration)
|
|
78
|
+
ITERATION="$2"
|
|
79
|
+
shift 2
|
|
80
|
+
;;
|
|
81
|
+
--confidence)
|
|
82
|
+
CONFIDENCE="$2"
|
|
83
|
+
shift 2
|
|
84
|
+
;;
|
|
85
|
+
--feedback)
|
|
86
|
+
FEEDBACK="$2"
|
|
87
|
+
shift 2
|
|
88
|
+
;;
|
|
89
|
+
--task)
|
|
90
|
+
TASK_DESC="$2"
|
|
91
|
+
shift 2
|
|
92
|
+
;;
|
|
93
|
+
--priority)
|
|
94
|
+
PRIORITY="$2"
|
|
95
|
+
shift 2
|
|
96
|
+
;;
|
|
97
|
+
--fork-id)
|
|
98
|
+
FORK_ID="$2"
|
|
99
|
+
shift 2
|
|
100
|
+
;;
|
|
101
|
+
*)
|
|
102
|
+
echo "Unknown argument: $1"
|
|
103
|
+
exit 1
|
|
104
|
+
;;
|
|
105
|
+
esac
|
|
106
|
+
done
|
|
107
|
+
|
|
108
|
+
# Validate required arguments
|
|
109
|
+
case "$COMMAND" in
|
|
110
|
+
enter)
|
|
111
|
+
if [ -z "$TASK_ID" ] || [ -z "$AGENT_ID" ] || [ -z "$CONTEXT" ]; then
|
|
112
|
+
echo "Error: enter requires --task-id, --agent-id, and --context"
|
|
113
|
+
exit 1
|
|
114
|
+
fi
|
|
115
|
+
|
|
116
|
+
# Enter waiting mode
|
|
117
|
+
READY_KEY="swarm:${TASK_ID}:${AGENT_ID}:ready"
|
|
118
|
+
WAKE_QUEUE="swarm:${TASK_ID}:${AGENT_ID}:wake-queue"
|
|
119
|
+
SHUTDOWN_KEY="swarm:${TASK_ID}:shutdown"
|
|
120
|
+
|
|
121
|
+
# Publish ready status
|
|
122
|
+
READY_MSG=$(jq -n \
|
|
123
|
+
--arg status "waiting" \
|
|
124
|
+
--arg context "$CONTEXT" \
|
|
125
|
+
--arg ts "$(date +%s)" \
|
|
126
|
+
'{status: $status, context: $context, timestamp: ($ts | tonumber)}')
|
|
127
|
+
|
|
128
|
+
echo "$READY_MSG" | redis-cli -x LPUSH "$READY_KEY" >/dev/null
|
|
129
|
+
|
|
130
|
+
echo "[$AGENT_ID] Entered waiting mode (context: $CONTEXT)"
|
|
131
|
+
echo "[$AGENT_ID] Blocking on priority queue $WAKE_QUEUE and $SHUTDOWN_KEY (infinite timeout)..."
|
|
132
|
+
echo "[$AGENT_ID] Zero token cost while waiting"
|
|
133
|
+
|
|
134
|
+
# Poll loop: check shutdown first, then block on wake queue with timeout
|
|
135
|
+
# This allows us to support both priority queues and shutdown signals
|
|
136
|
+
while true; do
|
|
137
|
+
# Check for shutdown signal first (highest priority)
|
|
138
|
+
SHUTDOWN_CHECK=$(redis-cli LPOP "$SHUTDOWN_KEY")
|
|
139
|
+
|
|
140
|
+
if [ -n "$SHUTDOWN_CHECK" ] && [ "$SHUTDOWN_CHECK" != "(nil)" ]; then
|
|
141
|
+
# Shutdown signal received
|
|
142
|
+
SHUTDOWN_REASON=$(echo "$SHUTDOWN_CHECK" | jq -r '.reason // "unknown"')
|
|
143
|
+
echo "[$AGENT_ID] 🛑 Shutdown signal received"
|
|
144
|
+
echo "[$AGENT_ID] Reason: $SHUTDOWN_REASON"
|
|
145
|
+
echo "$SHUTDOWN_CHECK" | jq '.'
|
|
146
|
+
|
|
147
|
+
# Exit with SIGINT code to indicate graceful shutdown
|
|
148
|
+
exit 130
|
|
149
|
+
fi
|
|
150
|
+
|
|
151
|
+
# Block on wake queue with 1-second timeout (allows periodic shutdown checks)
|
|
152
|
+
# BZPOPMIN returns: key, member, score (3 lines)
|
|
153
|
+
WAKE_RESULT=$(redis-cli BZPOPMIN "$WAKE_QUEUE" 1 2>/dev/null)
|
|
154
|
+
|
|
155
|
+
if [ -n "$WAKE_RESULT" ] && [ "$WAKE_RESULT" != "(nil)" ]; then
|
|
156
|
+
# Parse result (BZPOPMIN returns 3 lines: key, member, score)
|
|
157
|
+
WAKE_MSG=$(echo "$WAKE_RESULT" | sed -n '2p')
|
|
158
|
+
|
|
159
|
+
# Validate JSON before processing
|
|
160
|
+
if echo "$WAKE_MSG" | jq empty 2>/dev/null; then
|
|
161
|
+
echo "[$AGENT_ID] ✅ Woken up!"
|
|
162
|
+
echo "$WAKE_MSG" | jq '.'
|
|
163
|
+
|
|
164
|
+
# Return wake message to caller
|
|
165
|
+
echo "$WAKE_MSG"
|
|
166
|
+
break
|
|
167
|
+
else
|
|
168
|
+
echo "[$AGENT_ID] ⚠️ Invalid JSON in wake message, ignoring"
|
|
169
|
+
continue
|
|
170
|
+
fi
|
|
171
|
+
fi
|
|
172
|
+
|
|
173
|
+
# If no wake signal received, loop back to check shutdown again
|
|
174
|
+
done
|
|
175
|
+
;;
|
|
176
|
+
|
|
177
|
+
wake)
|
|
178
|
+
if [ -z "$TASK_ID" ] || [ -z "$AGENT_ID" ] || [ -z "$REASON" ]; then
|
|
179
|
+
echo "Error: wake requires --task-id, --agent-id, and --reason"
|
|
180
|
+
exit 1
|
|
181
|
+
fi
|
|
182
|
+
|
|
183
|
+
WAKE_QUEUE="swarm:${TASK_ID}:${AGENT_ID}:wake-queue"
|
|
184
|
+
|
|
185
|
+
# Build wake message (compact JSON for Redis storage)
|
|
186
|
+
WAKE_MSG=$(jq -nc \
|
|
187
|
+
--arg reason "$REASON" \
|
|
188
|
+
--arg iteration "${ITERATION:-0}" \
|
|
189
|
+
--arg task "${TASK_DESC:-}" \
|
|
190
|
+
--arg feedback "${FEEDBACK:-}" \
|
|
191
|
+
--arg priority "$PRIORITY" \
|
|
192
|
+
--arg fork_id "${FORK_ID:-}" \
|
|
193
|
+
--arg ts "$(date +%s)" \
|
|
194
|
+
'{
|
|
195
|
+
reason: $reason,
|
|
196
|
+
iteration: ($iteration | tonumber),
|
|
197
|
+
task: $task,
|
|
198
|
+
feedback: ($feedback | split(",") | map(select(length > 0))),
|
|
199
|
+
priority: ($priority | tonumber),
|
|
200
|
+
fork_id: $fork_id,
|
|
201
|
+
timestamp: ($ts | tonumber)
|
|
202
|
+
}')
|
|
203
|
+
|
|
204
|
+
# Store feedback in Redis for agent to read (if provided and iteration > 0)
|
|
205
|
+
# Debug: Echo values before conditional (only if feedback provided)
|
|
206
|
+
if [ -n "$FEEDBACK" ]; then
|
|
207
|
+
[ "$DEBUG" = "true" ] && echo "[DEBUG] Checking feedback storage: FEEDBACK='$FEEDBACK', ITERATION='${ITERATION:-0}'"
|
|
208
|
+
fi
|
|
209
|
+
|
|
210
|
+
# Only store feedback if: feedback is non-empty AND iteration > 0
|
|
211
|
+
# Check iteration value explicitly (not just default)
|
|
212
|
+
if [ -n "$FEEDBACK" ] && [ -n "$ITERATION" ] && [ "$ITERATION" -gt 0 ]; then
|
|
213
|
+
FEEDBACK_KEY="swarm:${TASK_ID}:${AGENT_ID}:feedback:iteration-${ITERATION}"
|
|
214
|
+
FEEDBACK_ARRAY=$(echo "$FEEDBACK" | jq -Rc 'split(",") | map(select(length > 0))')
|
|
215
|
+
|
|
216
|
+
# Only store if feedback array is not empty after filtering
|
|
217
|
+
ARRAY_LENGTH=$(echo "$FEEDBACK_ARRAY" | jq 'length')
|
|
218
|
+
if [ "$ARRAY_LENGTH" -gt 0 ]; then
|
|
219
|
+
# Store as JSON array with 24-hour TTL
|
|
220
|
+
REDIS_RESULT=$(printf '%s' "$FEEDBACK_ARRAY" | redis-cli -x SET "$FEEDBACK_KEY")
|
|
221
|
+
redis-cli EXPIRE "$FEEDBACK_KEY" 86400 >/dev/null
|
|
222
|
+
|
|
223
|
+
# Always log feedback storage (not just in DEBUG mode)
|
|
224
|
+
if [ "$REDIS_RESULT" = "OK" ]; then
|
|
225
|
+
echo " [Feedback] Stored $ARRAY_LENGTH items in Redis (TTL: 24h)"
|
|
226
|
+
fi
|
|
227
|
+
|
|
228
|
+
if [ "$DEBUG" = "true" ]; then
|
|
229
|
+
echo "[DEBUG] Stored feedback in $FEEDBACK_KEY (TTL: 24h)"
|
|
230
|
+
echo "[DEBUG] Feedback: $FEEDBACK_ARRAY"
|
|
231
|
+
echo "[DEBUG] Redis SET result: $REDIS_RESULT"
|
|
232
|
+
fi
|
|
233
|
+
fi
|
|
234
|
+
fi
|
|
235
|
+
|
|
236
|
+
# Calculate priority score (lower score = higher priority, popped first)
|
|
237
|
+
# Score = (100 - priority) * 1000000 + timestamp
|
|
238
|
+
# This ensures higher priority messages are processed first, with FIFO for same priority
|
|
239
|
+
TIMESTAMP=$(date +%s)
|
|
240
|
+
PRIORITY_SCORE=$(echo "(100 - $PRIORITY) * 1000000 + $TIMESTAMP" | bc)
|
|
241
|
+
|
|
242
|
+
# Debug output
|
|
243
|
+
if [ "$DEBUG" = "true" ]; then
|
|
244
|
+
echo "[DEBUG] WAKE_QUEUE: $WAKE_QUEUE"
|
|
245
|
+
echo "[DEBUG] PRIORITY: $PRIORITY"
|
|
246
|
+
echo "[DEBUG] Priority score: $PRIORITY_SCORE"
|
|
247
|
+
echo "[DEBUG] Message: $WAKE_MSG"
|
|
248
|
+
fi
|
|
249
|
+
|
|
250
|
+
# Add to sorted set (ZADD with calculated score)
|
|
251
|
+
redis-cli ZADD "$WAKE_QUEUE" "$PRIORITY_SCORE" "$WAKE_MSG" >/dev/null
|
|
252
|
+
|
|
253
|
+
# Store fork ID in Redis if provided
|
|
254
|
+
if [ -n "$FORK_ID" ]; then
|
|
255
|
+
FORK_KEY="swarm:${TASK_ID}:${AGENT_ID}:fork-id"
|
|
256
|
+
# Store fork ID with 5-minute expiration
|
|
257
|
+
redis-cli SETEX "$FORK_KEY" 300 "$FORK_ID" >/dev/null
|
|
258
|
+
echo "[Coordinator] Fork ID stored: $FORK_ID (5-minute TTL)"
|
|
259
|
+
fi
|
|
260
|
+
|
|
261
|
+
echo "[Coordinator] ✅ Wake signal sent to $AGENT_ID"
|
|
262
|
+
echo " Reason: $REASON"
|
|
263
|
+
echo " Priority: $PRIORITY (score: $PRIORITY_SCORE)"
|
|
264
|
+
[ -n "$ITERATION" ] && echo " Iteration: $ITERATION"
|
|
265
|
+
;;
|
|
266
|
+
|
|
267
|
+
report)
|
|
268
|
+
if [ -z "$TASK_ID" ] || [ -z "$AGENT_ID" ] || [ -z "$CONFIDENCE" ]; then
|
|
269
|
+
echo "Error: report requires --task-id, --agent-id, and --confidence"
|
|
270
|
+
exit 1
|
|
271
|
+
fi
|
|
272
|
+
|
|
273
|
+
RESULT_KEY="swarm:${TASK_ID}:${AGENT_ID}:result"
|
|
274
|
+
|
|
275
|
+
# Build result message with optional feedback
|
|
276
|
+
RESULT_MSG=$(jq -n \
|
|
277
|
+
--arg confidence "$CONFIDENCE" \
|
|
278
|
+
--arg iteration "${ITERATION:-0}" \
|
|
279
|
+
--arg feedback "${FEEDBACK:-}" \
|
|
280
|
+
--arg ts "$(date +%s)" \
|
|
281
|
+
'{
|
|
282
|
+
confidence: ($confidence | tonumber),
|
|
283
|
+
iteration: ($iteration | tonumber),
|
|
284
|
+
feedback: ($feedback | split(",") | map(select(length > 0))),
|
|
285
|
+
timestamp: ($ts | tonumber)
|
|
286
|
+
}')
|
|
287
|
+
|
|
288
|
+
echo "$RESULT_MSG" | redis-cli -x LPUSH "$RESULT_KEY" >/dev/null
|
|
289
|
+
|
|
290
|
+
echo "[$AGENT_ID] ✅ Result reported"
|
|
291
|
+
echo " Confidence: $CONFIDENCE"
|
|
292
|
+
[ -n "$ITERATION" ] && echo " Iteration: $ITERATION"
|
|
293
|
+
if [ -n "$FEEDBACK" ]; then
|
|
294
|
+
echo " Feedback items: $(echo "$FEEDBACK" | tr ',' '\n' | wc -l)"
|
|
295
|
+
fi
|
|
296
|
+
;;
|
|
297
|
+
|
|
298
|
+
collect)
|
|
299
|
+
if [ -z "$TASK_ID" ] || [ -z "$AGENT_IDS" ]; then
|
|
300
|
+
echo "Error: collect requires --task-id and --agent-ids"
|
|
301
|
+
exit 1
|
|
302
|
+
fi
|
|
303
|
+
|
|
304
|
+
echo "[Coordinator] Collecting results from agents..."
|
|
305
|
+
echo ""
|
|
306
|
+
|
|
307
|
+
# Split agent IDs
|
|
308
|
+
IFS=',' read -ra AGENTS <<< "$AGENT_IDS"
|
|
309
|
+
|
|
310
|
+
RESULTS=()
|
|
311
|
+
CONFIDENCES=()
|
|
312
|
+
ALL_FEEDBACK=()
|
|
313
|
+
|
|
314
|
+
for AGENT in "${AGENTS[@]}"; do
|
|
315
|
+
RESULT_KEY="swarm:${TASK_ID}:${AGENT}:result"
|
|
316
|
+
|
|
317
|
+
# Get latest result (non-blocking)
|
|
318
|
+
RESULT=$(redis-cli LPOP "$RESULT_KEY")
|
|
319
|
+
|
|
320
|
+
if [ -n "$RESULT" ] && [ "$RESULT" != "(nil)" ]; then
|
|
321
|
+
CONF=$(echo "$RESULT" | jq -r '.confidence')
|
|
322
|
+
echo " [$AGENT] Confidence: $CONF"
|
|
323
|
+
RESULTS+=("$RESULT")
|
|
324
|
+
CONFIDENCES+=("$CONF")
|
|
325
|
+
|
|
326
|
+
# Check if result includes feedback array
|
|
327
|
+
FEEDBACK=$(echo "$RESULT" | jq -r '.feedback // empty | .[]?' 2>/dev/null)
|
|
328
|
+
if [ -n "$FEEDBACK" ]; then
|
|
329
|
+
echo " [$AGENT] Feedback provided:"
|
|
330
|
+
echo "$RESULT" | jq -r '.feedback[]' | sed 's/^/ - /'
|
|
331
|
+
|
|
332
|
+
# Collect all feedback items
|
|
333
|
+
while IFS= read -r ITEM; do
|
|
334
|
+
ALL_FEEDBACK+=("$ITEM")
|
|
335
|
+
done < <(echo "$RESULT" | jq -r '.feedback[]')
|
|
336
|
+
fi
|
|
337
|
+
else
|
|
338
|
+
echo " [$AGENT] ⚠️ No result found"
|
|
339
|
+
fi
|
|
340
|
+
done
|
|
341
|
+
|
|
342
|
+
# Calculate consensus
|
|
343
|
+
if [ ${#CONFIDENCES[@]} -gt 0 ]; then
|
|
344
|
+
SUM=0
|
|
345
|
+
for CONF in "${CONFIDENCES[@]}"; do
|
|
346
|
+
SUM=$(echo "$SUM + $CONF" | bc)
|
|
347
|
+
done
|
|
348
|
+
COUNT=${#CONFIDENCES[@]}
|
|
349
|
+
CONSENSUS=$(echo "scale=2; $SUM / $COUNT" | bc)
|
|
350
|
+
|
|
351
|
+
echo ""
|
|
352
|
+
echo "[Coordinator] Consensus: $CONSENSUS"
|
|
353
|
+
|
|
354
|
+
# Print aggregated feedback if available
|
|
355
|
+
if [ ${#ALL_FEEDBACK[@]} -gt 0 ]; then
|
|
356
|
+
echo "[Coordinator] Aggregated Feedback (${#ALL_FEEDBACK[@]} items):"
|
|
357
|
+
printf '%s\n' "${ALL_FEEDBACK[@]}" | sort -u | sed 's/^/ - /'
|
|
358
|
+
fi
|
|
359
|
+
|
|
360
|
+
echo "$CONSENSUS"
|
|
361
|
+
else
|
|
362
|
+
echo ""
|
|
363
|
+
echo "[Coordinator] No results to calculate consensus"
|
|
364
|
+
echo "0.0"
|
|
365
|
+
fi
|
|
366
|
+
;;
|
|
367
|
+
|
|
368
|
+
shutdown)
|
|
369
|
+
if [ -z "$TASK_ID" ]; then
|
|
370
|
+
echo "Error: shutdown requires --task-id"
|
|
371
|
+
exit 1
|
|
372
|
+
fi
|
|
373
|
+
|
|
374
|
+
SHUTDOWN_KEY="swarm:${TASK_ID}:shutdown"
|
|
375
|
+
|
|
376
|
+
# Build shutdown message
|
|
377
|
+
SHUTDOWN_MSG=$(jq -n \
|
|
378
|
+
--arg reason "${REASON:-task_complete}" \
|
|
379
|
+
--arg ts "$(date +%s)" \
|
|
380
|
+
'{
|
|
381
|
+
reason: $reason,
|
|
382
|
+
timestamp: ($ts | tonumber)
|
|
383
|
+
}')
|
|
384
|
+
|
|
385
|
+
# Broadcast shutdown signal (use LPUSH to add to list)
|
|
386
|
+
# All waiting agents will check this key and exit gracefully
|
|
387
|
+
echo "$SHUTDOWN_MSG" | redis-cli -x LPUSH "$SHUTDOWN_KEY" >/dev/null
|
|
388
|
+
|
|
389
|
+
echo "[Coordinator] 🛑 Shutdown signal broadcasted"
|
|
390
|
+
echo " Task ID: $TASK_ID"
|
|
391
|
+
echo " Reason: ${REASON:-task_complete}"
|
|
392
|
+
echo ""
|
|
393
|
+
echo "Note: Signal added to $SHUTDOWN_KEY"
|
|
394
|
+
echo "All waiting agents will receive shutdown on next poll cycle (max 1 second)"
|
|
395
|
+
;;
|
|
396
|
+
|
|
397
|
+
*)
|
|
398
|
+
echo "Usage: $0 <command> [options]"
|
|
399
|
+
echo ""
|
|
400
|
+
echo "Commands:"
|
|
401
|
+
echo " enter - Agent enters waiting mode"
|
|
402
|
+
echo " wake - Coordinator wakes an agent (supports --priority 0-100, --fork-id)"
|
|
403
|
+
echo " report - Agent reports result"
|
|
404
|
+
echo " collect - Coordinator collects results"
|
|
405
|
+
echo " shutdown - Coordinator broadcasts shutdown signal to all waiting agents"
|
|
406
|
+
echo ""
|
|
407
|
+
echo "Priority Levels (0-100, higher = more urgent, default = 50):"
|
|
408
|
+
echo " 90-100: Critical (security patches, system failures)"
|
|
409
|
+
echo " 70-89: High (urgent features, blocking bugs)"
|
|
410
|
+
echo " 40-60: Medium (normal tasks, default)"
|
|
411
|
+
echo " 20-39: Low (optimizations, refactoring)"
|
|
412
|
+
echo " 0-19: Minimal (documentation, cleanup)"
|
|
413
|
+
echo ""
|
|
414
|
+
echo "Examples:"
|
|
415
|
+
echo " $0 enter --task-id auth --agent-id coder-1 --context iteration-1"
|
|
416
|
+
echo " $0 wake --task-id auth --agent-id coder-1 --reason cfn_loop_iteration --iteration 2 --fork-id fork-1"
|
|
417
|
+
echo " $0 wake --task-id auth --agent-id coder-1 --reason security_patch --priority 95"
|
|
418
|
+
echo " $0 report --task-id auth --agent-id coder-1 --confidence 0.85 --iteration 1"
|
|
419
|
+
echo " $0 collect --task-id auth --agent-ids coder-1,reviewer-1,tester-1"
|
|
420
|
+
echo " $0 shutdown --task-id auth --reason task_complete"
|
|
421
|
+
exit 1
|
|
422
|
+
;;
|
|
423
|
+
esac
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
##############################################################################
|
|
4
|
+
# List Active Swarms - Redis Coordination
|
|
5
|
+
#
|
|
6
|
+
# Queries Redis for all active swarm metadata to help track multiple
|
|
7
|
+
# concurrent CFN Loop sessions.
|
|
8
|
+
#
|
|
9
|
+
# Usage:
|
|
10
|
+
# ./list-active-swarms.sh [--task-id <id>] [--mode <mode>] [--json]
|
|
11
|
+
##############################################################################
|
|
12
|
+
|
|
13
|
+
set -euo pipefail
|
|
14
|
+
|
|
15
|
+
# Configuration
|
|
16
|
+
TASK_ID_FILTER=""
|
|
17
|
+
MODE_FILTER=""
|
|
18
|
+
JSON_OUTPUT=false
|
|
19
|
+
|
|
20
|
+
# Parse arguments
|
|
21
|
+
while [[ $# -gt 0 ]]; do
|
|
22
|
+
case $1 in
|
|
23
|
+
--task-id)
|
|
24
|
+
TASK_ID_FILTER="$2"
|
|
25
|
+
shift 2
|
|
26
|
+
;;
|
|
27
|
+
--mode)
|
|
28
|
+
MODE_FILTER="$2"
|
|
29
|
+
shift 2
|
|
30
|
+
;;
|
|
31
|
+
--json)
|
|
32
|
+
JSON_OUTPUT=true
|
|
33
|
+
shift
|
|
34
|
+
;;
|
|
35
|
+
*)
|
|
36
|
+
echo "Unknown option: $1"
|
|
37
|
+
echo "Usage: $0 [--task-id <id>] [--mode <mode>] [--json]"
|
|
38
|
+
exit 1
|
|
39
|
+
;;
|
|
40
|
+
esac
|
|
41
|
+
done
|
|
42
|
+
|
|
43
|
+
# Get all swarm metadata keys
|
|
44
|
+
SWARM_KEYS=$(redis-cli --scan --pattern "swarm:*:metadata" 2>/dev/null || echo "")
|
|
45
|
+
|
|
46
|
+
if [ -z "$SWARM_KEYS" ]; then
|
|
47
|
+
if [ "$JSON_OUTPUT" = true ]; then
|
|
48
|
+
echo '{"swarms": [], "count": 0}'
|
|
49
|
+
else
|
|
50
|
+
echo "No active swarms found"
|
|
51
|
+
fi
|
|
52
|
+
exit 0
|
|
53
|
+
fi
|
|
54
|
+
|
|
55
|
+
# Initialize JSON array
|
|
56
|
+
if [ "$JSON_OUTPUT" = true ]; then
|
|
57
|
+
echo '{"swarms": ['
|
|
58
|
+
FIRST=true
|
|
59
|
+
fi
|
|
60
|
+
|
|
61
|
+
# Process each swarm
|
|
62
|
+
while IFS= read -r KEY; do
|
|
63
|
+
if [ -z "$KEY" ]; then
|
|
64
|
+
continue
|
|
65
|
+
fi
|
|
66
|
+
|
|
67
|
+
# Extract swarm ID from key (swarm:swarm-<task-id>:metadata)
|
|
68
|
+
SWARM_ID=$(echo "$KEY" | sed 's/swarm:\(.*\):metadata/\1/')
|
|
69
|
+
|
|
70
|
+
# Get metadata
|
|
71
|
+
TASK_ID=$(redis-cli hget "$KEY" task_id 2>/dev/null || echo "")
|
|
72
|
+
MODE=$(redis-cli hget "$KEY" mode 2>/dev/null || echo "")
|
|
73
|
+
MAX_AGENTS=$(redis-cli hget "$KEY" max_agents 2>/dev/null || echo "")
|
|
74
|
+
LOOP3_AGENTS=$(redis-cli hget "$KEY" loop3_agents 2>/dev/null || echo "")
|
|
75
|
+
LOOP2_AGENTS=$(redis-cli hget "$KEY" loop2_agents 2>/dev/null || echo "")
|
|
76
|
+
PRODUCT_OWNER=$(redis-cli hget "$KEY" product_owner 2>/dev/null || echo "")
|
|
77
|
+
CREATED_AT=$(redis-cli hget "$KEY" created_at 2>/dev/null || echo "")
|
|
78
|
+
STATUS=$(redis-cli hget "$KEY" status 2>/dev/null || echo "in_progress")
|
|
79
|
+
FINAL_CONSENSUS=$(redis-cli hget "$KEY" final_consensus 2>/dev/null || echo "")
|
|
80
|
+
TOTAL_ITERATIONS=$(redis-cli hget "$KEY" total_iterations 2>/dev/null || echo "")
|
|
81
|
+
COMPLETED_AT=$(redis-cli hget "$KEY" completed_at 2>/dev/null || echo "")
|
|
82
|
+
|
|
83
|
+
# Apply filters
|
|
84
|
+
if [ -n "$TASK_ID_FILTER" ] && [ "$TASK_ID" != "$TASK_ID_FILTER" ]; then
|
|
85
|
+
continue
|
|
86
|
+
fi
|
|
87
|
+
|
|
88
|
+
if [ -n "$MODE_FILTER" ] && [ "$MODE" != "$MODE_FILTER" ]; then
|
|
89
|
+
continue
|
|
90
|
+
fi
|
|
91
|
+
|
|
92
|
+
# Output
|
|
93
|
+
if [ "$JSON_OUTPUT" = true ]; then
|
|
94
|
+
if [ "$FIRST" = false ]; then
|
|
95
|
+
echo ","
|
|
96
|
+
fi
|
|
97
|
+
FIRST=false
|
|
98
|
+
|
|
99
|
+
cat <<EOF
|
|
100
|
+
{
|
|
101
|
+
"swarm_id": "$SWARM_ID",
|
|
102
|
+
"task_id": "$TASK_ID",
|
|
103
|
+
"mode": "$MODE",
|
|
104
|
+
"status": "$STATUS",
|
|
105
|
+
"max_agents": $MAX_AGENTS,
|
|
106
|
+
"loop3_agents": "$LOOP3_AGENTS",
|
|
107
|
+
"loop2_agents": "$LOOP2_AGENTS",
|
|
108
|
+
"product_owner": "$PRODUCT_OWNER",
|
|
109
|
+
"created_at": "$CREATED_AT",
|
|
110
|
+
"final_consensus": "$FINAL_CONSENSUS",
|
|
111
|
+
"total_iterations": "$TOTAL_ITERATIONS",
|
|
112
|
+
"completed_at": "$COMPLETED_AT"
|
|
113
|
+
}
|
|
114
|
+
EOF
|
|
115
|
+
else
|
|
116
|
+
echo "========================================="
|
|
117
|
+
echo "Swarm ID: $SWARM_ID"
|
|
118
|
+
echo "Task ID: $TASK_ID"
|
|
119
|
+
echo "Mode: $MODE"
|
|
120
|
+
echo "Status: $STATUS"
|
|
121
|
+
echo "Agents: $MAX_AGENTS total"
|
|
122
|
+
echo " Loop 3: $LOOP3_AGENTS"
|
|
123
|
+
echo " Loop 2: $LOOP2_AGENTS"
|
|
124
|
+
echo " Product Owner: $PRODUCT_OWNER"
|
|
125
|
+
echo "Created: $CREATED_AT"
|
|
126
|
+
|
|
127
|
+
if [ -n "$COMPLETED_AT" ]; then
|
|
128
|
+
echo "Completed: $COMPLETED_AT"
|
|
129
|
+
echo "Final Consensus: $FINAL_CONSENSUS"
|
|
130
|
+
echo "Total Iterations: $TOTAL_ITERATIONS"
|
|
131
|
+
fi
|
|
132
|
+
|
|
133
|
+
echo ""
|
|
134
|
+
fi
|
|
135
|
+
|
|
136
|
+
done <<< "$SWARM_KEYS"
|
|
137
|
+
|
|
138
|
+
# Close JSON array
|
|
139
|
+
if [ "$JSON_OUTPUT" = true ]; then
|
|
140
|
+
echo ""
|
|
141
|
+
echo "],"
|
|
142
|
+
|
|
143
|
+
# Count swarms
|
|
144
|
+
COUNT=$(echo "$SWARM_KEYS" | wc -l)
|
|
145
|
+
echo "\"count\": $COUNT"
|
|
146
|
+
echo "}"
|
|
147
|
+
fi
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
##############################################################################
|
|
3
|
+
# CFN Loop Event Logging to SQLite
|
|
4
|
+
#
|
|
5
|
+
# Usage:
|
|
6
|
+
# ./log-event.sh --task-id <id> --event-type <type> [options]
|
|
7
|
+
#
|
|
8
|
+
# Parameters:
|
|
9
|
+
# --task-id Task/swarm identifier (required)
|
|
10
|
+
# --event-type Event type: spawn, complete, gate_check, decision, error, etc. (required)
|
|
11
|
+
# --details JSON payload with event-specific data (optional, default: {})
|
|
12
|
+
# --level Log level: DEBUG, INFO, WARN, ERROR (optional, default: INFO)
|
|
13
|
+
# --loop Loop identifier: loop3, loop2, product_owner, coordinator (optional)
|
|
14
|
+
# --agent-id Agent identifier (optional)
|
|
15
|
+
# --iteration Iteration number (optional)
|
|
16
|
+
#
|
|
17
|
+
# Example:
|
|
18
|
+
# ./log-event.sh \
|
|
19
|
+
# --task-id "cfn-task-123" \
|
|
20
|
+
# --event-type "agent_spawn" \
|
|
21
|
+
# --loop "loop3" \
|
|
22
|
+
# --agent-id "coder-1" \
|
|
23
|
+
# --iteration 1 \
|
|
24
|
+
# --details '{"agent_type": "coder", "timeout": 900}' \
|
|
25
|
+
# --level "INFO"
|
|
26
|
+
##############################################################################
|
|
27
|
+
|
|
28
|
+
set -euo pipefail
|
|
29
|
+
|
|
30
|
+
# Configuration
|
|
31
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
32
|
+
# Default to project root data/ directory (consistent with web portal)
|
|
33
|
+
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.claude/skills/cfn-cfn-.." && pwd)"
|
|
34
|
+
DB_PATH="${DB_PATH:-${PROJECT_ROOT}/data/cfn-loop.db}"
|
|
35
|
+
|
|
36
|
+
# Parameters
|
|
37
|
+
TASK_ID=""
|
|
38
|
+
EVENT_TYPE=""
|
|
39
|
+
DETAILS="{}"
|
|
40
|
+
LEVEL="INFO"
|
|
41
|
+
LOOP=""
|
|
42
|
+
AGENT_ID=""
|
|
43
|
+
ITERATION=""
|
|
44
|
+
|
|
45
|
+
# Parse arguments
|
|
46
|
+
while [[ $# -gt 0 ]]; do
|
|
47
|
+
case $1 in
|
|
48
|
+
--task-id) TASK_ID="$2"; shift 2 ;;
|
|
49
|
+
--event-type) EVENT_TYPE="$2"; shift 2 ;;
|
|
50
|
+
--details) DETAILS="$2"; shift 2 ;;
|
|
51
|
+
--level) LEVEL="$2"; shift 2 ;;
|
|
52
|
+
--loop) LOOP="$2"; shift 2 ;;
|
|
53
|
+
--agent-id) AGENT_ID="$2"; shift 2 ;;
|
|
54
|
+
--iteration) ITERATION="$2"; shift 2 ;;
|
|
55
|
+
*) echo "Unknown option: $1" >&2; exit 1 ;;
|
|
56
|
+
esac
|
|
57
|
+
done
|
|
58
|
+
|
|
59
|
+
# Validate required parameters
|
|
60
|
+
if [ -z "$TASK_ID" ] || [ -z "$EVENT_TYPE" ]; then
|
|
61
|
+
echo "Error: --task-id and --event-type are required" >&2
|
|
62
|
+
echo "Usage: $0 --task-id <id> --event-type <type> [--details <json>] [--level <level>] [--loop <loop>] [--agent-id <id>] [--iteration <n>]" >&2
|
|
63
|
+
exit 1
|
|
64
|
+
fi
|
|
65
|
+
|
|
66
|
+
# Validate JSON
|
|
67
|
+
if ! echo "$DETAILS" | jq empty 2>/dev/null; then
|
|
68
|
+
echo "Error: --details must be valid JSON" >&2
|
|
69
|
+
exit 1
|
|
70
|
+
fi
|
|
71
|
+
|
|
72
|
+
# Create data directory if it doesn't exist
|
|
73
|
+
mkdir -p "$(dirname "$DB_PATH")"
|
|
74
|
+
|
|
75
|
+
# Initialize database schema if needed
|
|
76
|
+
sqlite3 "$DB_PATH" <<'EOF'
|
|
77
|
+
CREATE TABLE IF NOT EXISTS cfn_loop_logs (
|
|
78
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
79
|
+
task_id TEXT NOT NULL,
|
|
80
|
+
timestamp TEXT DEFAULT (datetime('now')),
|
|
81
|
+
event_type TEXT NOT NULL,
|
|
82
|
+
loop TEXT,
|
|
83
|
+
agent_id TEXT,
|
|
84
|
+
iteration INTEGER,
|
|
85
|
+
details TEXT,
|
|
86
|
+
level TEXT DEFAULT 'INFO'
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
CREATE INDEX IF NOT EXISTS idx_task_id ON cfn_loop_logs(task_id);
|
|
90
|
+
CREATE INDEX IF NOT EXISTS idx_event_type ON cfn_loop_logs(event_type);
|
|
91
|
+
CREATE INDEX IF NOT EXISTS idx_timestamp ON cfn_loop_logs(timestamp);
|
|
92
|
+
CREATE INDEX IF NOT EXISTS idx_level ON cfn_loop_logs(level);
|
|
93
|
+
EOF
|
|
94
|
+
|
|
95
|
+
# Escape single quotes in JSON for SQLite
|
|
96
|
+
DETAILS_ESCAPED="${DETAILS//\'/\'\'}"
|
|
97
|
+
|
|
98
|
+
# Insert log entry
|
|
99
|
+
sqlite3 "$DB_PATH" <<EOF
|
|
100
|
+
INSERT INTO cfn_loop_logs (task_id, event_type, loop, agent_id, iteration, details, level)
|
|
101
|
+
VALUES ('$TASK_ID', '$EVENT_TYPE', '$LOOP', '$AGENT_ID', '$ITERATION', '$DETAILS_ESCAPED', '$LEVEL');
|
|
102
|
+
EOF
|
|
103
|
+
|
|
104
|
+
# Also echo to stderr for orchestrator visibility (with timestamp)
|
|
105
|
+
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
|
106
|
+
echo "[$TIMESTAMP] [$LEVEL] [$EVENT_TYPE] $DETAILS" >&2
|
|
107
|
+
|
|
108
|
+
# Return success
|
|
109
|
+
exit 0
|