claude-flow-novice 2.15.5 → 2.15.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/cfn-extras/.gs-api-quota.json +16 -0
- package/.claude/cfn-extras/.gs-progress-state.json +22 -0
- package/.claude/cfn-extras/GOOGLE_SHEETS_IMPLEMENTATION_SUMMARY.md +414 -0
- package/.claude/cfn-extras/agents/google-sheets/README.md +114 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-advanced-analytics-specialist.md +288 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-api-integrator.md +127 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-automation-scripting-specialist.md +195 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-business-validator.md +179 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-collaboration-security-specialist.md +240 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-coordinator.md +214 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-data-transformer.md +127 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-data-validation-quality-specialist.md +177 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-data-validator.md +119 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-data-visualization-specialist.md +135 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-design-layout-specialist.md +109 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-formula-engineer.md +127 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-formula-engineering-specialist.md +138 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-formula-validator.md +128 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-generalist.md +645 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-integration-api-specialist.md +258 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-performance-analyst.md +125 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-performance-optimization-specialist.md +211 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-schema-designer.md +130 -0
- package/.claude/cfn-extras/agents/google-sheets/google-sheets-template-architecture-specialist.md +259 -0
- package/.claude/cfn-extras/docs/GOOGLE_SHEETS_CFN_LOOP.md +617 -0
- package/.claude/cfn-extras/skills/GOOGLE_SHEETS_SKILLS_README.md +453 -0
- package/.claude/cfn-extras/skills/google-sheets-api-coordinator/SKILL.md +272 -0
- package/.claude/cfn-extras/skills/google-sheets-api-coordinator/api-call.sh +254 -0
- package/.claude/cfn-extras/skills/google-sheets-api-coordinator/test.sh +174 -0
- package/.claude/cfn-extras/skills/google-sheets-api-coordinator/validate.sh +98 -0
- package/.claude/cfn-extras/skills/google-sheets-decomposition/SKILL.md +269 -0
- package/.claude/cfn-extras/skills/google-sheets-decomposition/decompose.sh +313 -0
- package/.claude/cfn-extras/skills/google-sheets-formula-builder/SKILL.md +237 -0
- package/.claude/cfn-extras/skills/google-sheets-formula-builder/build-formula.sh +220 -0
- package/.claude/cfn-extras/skills/google-sheets-formula-builder/test.sh +172 -0
- package/.claude/cfn-extras/skills/google-sheets-formula-builder/validate.sh +98 -0
- package/.claude/cfn-extras/skills/google-sheets-progress/SKILL.md +287 -0
- package/.claude/cfn-extras/skills/google-sheets-progress/test.sh +385 -0
- package/.claude/cfn-extras/skills/google-sheets-progress/track-progress.sh +516 -0
- package/.claude/cfn-extras/skills/google-sheets-progress/validate.sh +119 -0
- package/.claude/cfn-extras/skills/google-sheets-sprint-order/SKILL.md +277 -0
- package/.claude/cfn-extras/skills/google-sheets-sprint-order/order-sprints.sh +233 -0
- package/.claude/cfn-extras/skills/google-sheets-validation/SKILL.md +352 -0
- package/.claude/cfn-extras/skills/google-sheets-validation/test.sh +355 -0
- package/.claude/cfn-extras/skills/google-sheets-validation/validate-state.sh +374 -0
- package/.claude/cfn-extras/skills/google-sheets-validation/validate.sh +128 -0
- package/.claude/commands/cfn-context.md +10 -0
- package/.claude/commands/cfn-loop-cli.md +36 -15
- package/.claude/commands/google-sheets/google-sheets-loop.md +289 -0
- package/.claude/skills/cfn-agent-selector/SKILL.md +143 -0
- package/.claude/skills/cfn-agent-selector/select-agents.sh +94 -0
- package/.claude/skills/cfn-agent-spawning/get-agent-provider-env.sh +22 -2
- package/.claude/skills/cfn-docker-agent-spawning/spawn-agent.sh +21 -2
- package/.claude/skills/cfn-docker-loop-orchestration/orchestrate.sh +11 -5
- package/.claude/skills/cfn-docker-redis-coordination/MIGRATION_SUMMARY.md +348 -0
- package/.claude/skills/cfn-docker-redis-coordination/README.md +294 -0
- package/.claude/skills/cfn-docker-redis-coordination/jest.config.js +37 -0
- package/.claude/skills/cfn-docker-redis-coordination/package-lock.json +5259 -0
- package/.claude/skills/cfn-docker-redis-coordination/package.json +40 -0
- package/.claude/skills/cfn-docker-redis-coordination/src/coordinator.ts +801 -0
- package/.claude/skills/cfn-docker-redis-coordination/src/index.ts +42 -0
- package/.claude/skills/cfn-docker-redis-coordination/src/types.ts +351 -0
- package/.claude/skills/cfn-docker-redis-coordination/tests/coordinator.test.ts +1464 -0
- package/.claude/skills/cfn-docker-redis-coordination/tsconfig.json +30 -0
- package/.claude/skills/cfn-loop-orchestration/.eslintrc.js +56 -0
- package/.claude/skills/cfn-loop-orchestration/.prettierrc.json +18 -0
- package/.claude/skills/cfn-loop-orchestration/README.md +149 -41
- package/.claude/skills/cfn-loop-orchestration/jest.config.js +67 -0
- package/.claude/skills/cfn-loop-orchestration/orchestrate-wrapper.sh +268 -0
- package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +91 -8
- package/.claude/skills/cfn-loop-orchestration/package-lock.json +5470 -0
- package/.claude/skills/cfn-loop-orchestration/package.json +49 -0
- package/.claude/skills/cfn-loop-orchestration/src/agent-spawner/agent-spawner.ts +34 -0
- package/.claude/skills/cfn-loop-orchestration/src/gate-checker/gate-checker.ts +36 -0
- package/.claude/skills/cfn-loop-orchestration/src/index.ts +14 -0
- package/.claude/skills/cfn-loop-orchestration/src/orchestrator/orchestrator.ts +31 -0
- package/.claude/skills/cfn-loop-orchestration/src/redis/redis-coordinator.ts +72 -0
- package/.claude/skills/cfn-loop-orchestration/src/types.ts +188 -0
- package/.claude/skills/cfn-loop-orchestration/src/utils/logger.ts +32 -0
- package/.claude/skills/cfn-loop-orchestration/tests/setup.ts +22 -0
- package/.claude/skills/cfn-loop-orchestration/tests/types.test.ts +132 -0
- package/.claude/skills/cfn-loop-orchestration/tsconfig.json +54 -0
- package/.claude/skills/cfn-redis-coordination/bash-wrappers/store-context.sh +23 -0
- package/.claude/skills/cfn-redis-coordination/dist/agent-logger.d.ts +92 -0
- package/.claude/skills/cfn-redis-coordination/dist/agent-logger.d.ts.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/agent-logger.js +329 -0
- package/.claude/skills/cfn-redis-coordination/dist/agent-logger.js.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/agent-recovery.d.ts +75 -0
- package/.claude/skills/cfn-redis-coordination/dist/agent-recovery.d.ts.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/agent-recovery.js +302 -0
- package/.claude/skills/cfn-redis-coordination/dist/agent-recovery.js.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/completion-reporter.d.ts +58 -0
- package/.claude/skills/cfn-redis-coordination/dist/completion-reporter.d.ts.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/completion-reporter.js +237 -0
- package/.claude/skills/cfn-redis-coordination/dist/completion-reporter.js.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/context-manager.d.ts +63 -0
- package/.claude/skills/cfn-redis-coordination/dist/context-manager.d.ts.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/context-manager.js +230 -0
- package/.claude/skills/cfn-redis-coordination/dist/context-manager.js.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/index.d.ts +45 -0
- package/.claude/skills/cfn-redis-coordination/dist/index.d.ts.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/index.js +114 -0
- package/.claude/skills/cfn-redis-coordination/dist/index.js.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/mode-detector.d.ts +31 -0
- package/.claude/skills/cfn-redis-coordination/dist/mode-detector.d.ts.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/mode-detector.js +185 -0
- package/.claude/skills/cfn-redis-coordination/dist/mode-detector.js.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/redis-client.d.ts +191 -0
- package/.claude/skills/cfn-redis-coordination/dist/redis-client.d.ts.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/redis-client.js +509 -0
- package/.claude/skills/cfn-redis-coordination/dist/redis-client.js.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/result-collector.d.ts +75 -0
- package/.claude/skills/cfn-redis-coordination/dist/result-collector.d.ts.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/result-collector.js +281 -0
- package/.claude/skills/cfn-redis-coordination/dist/result-collector.js.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/swarm-manager.d.ts +75 -0
- package/.claude/skills/cfn-redis-coordination/dist/swarm-manager.d.ts.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/swarm-manager.js +354 -0
- package/.claude/skills/cfn-redis-coordination/dist/swarm-manager.js.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/task-analyzer.d.ts +62 -0
- package/.claude/skills/cfn-redis-coordination/dist/task-analyzer.d.ts.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/task-analyzer.js +305 -0
- package/.claude/skills/cfn-redis-coordination/dist/task-analyzer.js.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/task-executor.d.ts +97 -0
- package/.claude/skills/cfn-redis-coordination/dist/task-executor.d.ts.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/task-executor.js +283 -0
- package/.claude/skills/cfn-redis-coordination/dist/task-executor.js.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/types.d.ts +176 -0
- package/.claude/skills/cfn-redis-coordination/dist/types.d.ts.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/types.js +81 -0
- package/.claude/skills/cfn-redis-coordination/dist/types.js.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/waiting-coordinator.d.ts +86 -0
- package/.claude/skills/cfn-redis-coordination/dist/waiting-coordinator.d.ts.map +1 -0
- package/.claude/skills/cfn-redis-coordination/dist/waiting-coordinator.js +419 -0
- package/.claude/skills/cfn-redis-coordination/dist/waiting-coordinator.js.map +1 -0
- package/.claude/skills/cfn-redis-coordination/docs/migration/PHASE_3_REDIS_COORDINATION_COMPLETION_REPORT.md +553 -0
- package/.claude/skills/cfn-redis-coordination/jest.config.js +23 -0
- package/.claude/skills/cfn-redis-coordination/package-lock.json +5272 -0
- package/.claude/skills/cfn-redis-coordination/package.json +45 -0
- package/.claude/skills/cfn-redis-coordination/redis-cli-wrapper.sh +21 -8
- package/.claude/skills/cfn-redis-coordination/src/agent-logger.ts +446 -0
- package/.claude/skills/cfn-redis-coordination/src/agent-recovery.ts +454 -0
- package/.claude/skills/cfn-redis-coordination/src/completion-reporter.ts +396 -0
- package/.claude/skills/cfn-redis-coordination/src/context-manager.ts +327 -0
- package/.claude/skills/cfn-redis-coordination/src/index.ts +82 -0
- package/.claude/skills/cfn-redis-coordination/src/mode-detector.ts +155 -0
- package/.claude/skills/cfn-redis-coordination/src/redis/redis-client.ts +305 -0
- package/.claude/skills/cfn-redis-coordination/src/redis/redis-functions.ts +283 -0
- package/.claude/skills/cfn-redis-coordination/src/redis-client.ts +654 -0
- package/.claude/skills/cfn-redis-coordination/src/result-collector.ts +437 -0
- package/.claude/skills/cfn-redis-coordination/src/swarm-manager.ts +494 -0
- package/.claude/skills/cfn-redis-coordination/src/task-analyzer.ts +404 -0
- package/.claude/skills/cfn-redis-coordination/src/task-executor.ts +423 -0
- package/.claude/skills/cfn-redis-coordination/src/types.ts +235 -0
- package/.claude/skills/cfn-redis-coordination/src/waiting-coordinator.ts +587 -0
- package/.claude/skills/cfn-redis-coordination/test-connection-attempts.js +70 -0
- package/.claude/skills/cfn-redis-coordination/test-mode-simple.js +121 -0
- package/.claude/skills/cfn-redis-coordination/test-redis-check.js +84 -0
- package/.claude/skills/cfn-redis-coordination/test-task-mode-redis.cjs +391 -0
- package/.claude/skills/cfn-redis-coordination/tests/coordination.test.ts +779 -0
- package/.claude/skills/cfn-redis-coordination/tsconfig.json +31 -0
- package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +172 -2
- package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +1 -1
- package/claude-assets/agents/custom/cfn-redis-operations.md +530 -0
- package/claude-assets/agents/custom/cfn-system-expert.md +77 -0
- package/claude-assets/cfn-extras/.gs-api-quota.json +16 -0
- package/claude-assets/cfn-extras/.gs-progress-state.json +22 -0
- package/claude-assets/cfn-extras/GOOGLE_SHEETS_IMPLEMENTATION_SUMMARY.md +414 -0
- package/claude-assets/cfn-extras/agents/google-sheets/README.md +114 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-advanced-analytics-specialist.md +288 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-api-integrator.md +127 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-automation-scripting-specialist.md +195 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-business-validator.md +179 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-collaboration-security-specialist.md +240 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-coordinator.md +214 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-data-transformer.md +127 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-data-validation-quality-specialist.md +177 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-data-validator.md +119 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-data-visualization-specialist.md +135 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-design-layout-specialist.md +109 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-formula-engineer.md +127 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-formula-engineering-specialist.md +138 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-formula-validator.md +128 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-generalist.md +645 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-integration-api-specialist.md +258 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-performance-analyst.md +125 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-performance-optimization-specialist.md +211 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-schema-designer.md +130 -0
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-template-architecture-specialist.md +259 -0
- package/claude-assets/cfn-extras/docs/GOOGLE_SHEETS_CFN_LOOP.md +617 -0
- package/claude-assets/cfn-extras/skills/GOOGLE_SHEETS_SKILLS_README.md +453 -0
- package/claude-assets/cfn-extras/skills/google-sheets-api-coordinator/SKILL.md +272 -0
- package/claude-assets/cfn-extras/skills/google-sheets-api-coordinator/api-call.sh +254 -0
- package/claude-assets/cfn-extras/skills/google-sheets-api-coordinator/test.sh +174 -0
- package/claude-assets/cfn-extras/skills/google-sheets-api-coordinator/validate.sh +98 -0
- package/claude-assets/cfn-extras/skills/google-sheets-decomposition/SKILL.md +269 -0
- package/claude-assets/cfn-extras/skills/google-sheets-decomposition/decompose.sh +313 -0
- package/claude-assets/cfn-extras/skills/google-sheets-formula-builder/SKILL.md +237 -0
- package/claude-assets/cfn-extras/skills/google-sheets-formula-builder/build-formula.sh +220 -0
- package/claude-assets/cfn-extras/skills/google-sheets-formula-builder/test.sh +172 -0
- package/claude-assets/cfn-extras/skills/google-sheets-formula-builder/validate.sh +98 -0
- package/claude-assets/cfn-extras/skills/google-sheets-progress/SKILL.md +287 -0
- package/claude-assets/cfn-extras/skills/google-sheets-progress/test.sh +385 -0
- package/claude-assets/cfn-extras/skills/google-sheets-progress/track-progress.sh +516 -0
- package/claude-assets/cfn-extras/skills/google-sheets-progress/validate.sh +119 -0
- package/claude-assets/cfn-extras/skills/google-sheets-sprint-order/SKILL.md +277 -0
- package/claude-assets/cfn-extras/skills/google-sheets-sprint-order/order-sprints.sh +233 -0
- package/claude-assets/cfn-extras/skills/google-sheets-validation/SKILL.md +352 -0
- package/claude-assets/cfn-extras/skills/google-sheets-validation/test.sh +355 -0
- package/claude-assets/cfn-extras/skills/google-sheets-validation/validate-state.sh +374 -0
- package/claude-assets/cfn-extras/skills/google-sheets-validation/validate.sh +128 -0
- package/claude-assets/commands/cfn-context.md +10 -0
- package/claude-assets/commands/cfn-loop-cli.md +36 -15
- package/claude-assets/commands/google-sheets/google-sheets-loop.md +289 -0
- package/claude-assets/hooks/cfn-pre-execution/SESSION_START_README.md +87 -0
- package/claude-assets/hooks/cfn-pre-execution/TEST_SESSION_START.md +128 -0
- package/claude-assets/hooks/cfn-pre-execution/session-start-context.sh +111 -0
- package/claude-assets/skills/cfn-agent-selection-with-fallback/INTEGRATION_EXAMPLE.md +209 -0
- package/claude-assets/skills/cfn-agent-selection-with-fallback/README.md +130 -0
- package/claude-assets/skills/cfn-agent-selection-with-fallback/SKILL.md +243 -0
- package/claude-assets/skills/cfn-agent-selection-with-fallback/agent-mappings.json +142 -0
- package/claude-assets/skills/cfn-agent-selection-with-fallback/select-agents.sh +173 -0
- package/claude-assets/skills/cfn-agent-selection-with-fallback/task-classifier.sh +71 -0
- package/claude-assets/skills/cfn-agent-selection-with-fallback/test-agent-selection.sh +282 -0
- package/claude-assets/skills/cfn-agent-selector/SKILL.md +143 -0
- package/claude-assets/skills/cfn-agent-selector/select-agents.sh +94 -0
- package/claude-assets/skills/cfn-agent-spawning/get-agent-provider-env.sh +22 -2
- package/claude-assets/skills/cfn-docker-agent-spawning/spawn-agent.sh +21 -2
- package/claude-assets/skills/cfn-docker-coordination/.eslintrc.json +33 -0
- package/claude-assets/skills/cfn-docker-coordination/README.md +349 -0
- package/claude-assets/skills/cfn-docker-coordination/docker-helpers.sh +433 -0
- package/claude-assets/skills/cfn-docker-coordination/jest.config.js +25 -0
- package/claude-assets/skills/cfn-docker-coordination/package-lock.json +6827 -0
- package/claude-assets/skills/cfn-docker-coordination/package.json +38 -0
- package/claude-assets/skills/cfn-docker-coordination/src/agent-container.ts +471 -0
- package/claude-assets/skills/cfn-docker-coordination/src/docker-client.ts +483 -0
- package/claude-assets/skills/cfn-docker-coordination/src/health-checker.ts +418 -0
- package/claude-assets/skills/cfn-docker-coordination/src/index.ts +45 -0
- package/claude-assets/skills/cfn-docker-coordination/src/network-manager.ts +377 -0
- package/claude-assets/skills/cfn-docker-coordination/src/types.ts +412 -0
- package/claude-assets/skills/cfn-docker-coordination/src/volume-manager.ts +389 -0
- package/claude-assets/skills/cfn-docker-coordination/tests/agent-container.test.ts +379 -0
- package/claude-assets/skills/cfn-docker-coordination/tests/docker-client.test.ts +345 -0
- package/claude-assets/skills/cfn-docker-coordination/tests/health-checker.test.ts +535 -0
- package/claude-assets/skills/cfn-docker-coordination/tests/integration.test.ts +193 -0
- package/claude-assets/skills/cfn-docker-coordination/tests/network-manager.test.ts +352 -0
- package/claude-assets/skills/cfn-docker-coordination/tests/setup.ts +36 -0
- package/claude-assets/skills/cfn-docker-coordination/tsconfig.json +29 -0
- package/claude-assets/skills/cfn-docker-logging/INTEGRATION.md +268 -0
- package/claude-assets/skills/cfn-docker-logging/SAMPLE_OUTPUTS.md +237 -0
- package/claude-assets/skills/cfn-docker-logging/SKILL.md +442 -0
- package/claude-assets/skills/cfn-docker-logging/capture-container-logs.sh +120 -0
- package/claude-assets/skills/cfn-docker-logging/enable-logging.sh +430 -0
- package/claude-assets/skills/cfn-docker-logging/init-hybrid-logging.sh +210 -0
- package/claude-assets/skills/cfn-docker-logging/queries/analytics-summary.sh +87 -0
- package/claude-assets/skills/cfn-docker-logging/queries/query-agent-timeline.sh +51 -0
- package/claude-assets/skills/cfn-docker-logging/queries/query-consensus-history.sh +56 -0
- package/claude-assets/skills/cfn-docker-logging/queries/query-coordination-timeline.sh +39 -0
- package/claude-assets/skills/cfn-docker-logging/queries/query-failed-containers.sh +40 -0
- package/claude-assets/skills/cfn-docker-logging/queries/query-gate-checks.sh +39 -0
- package/claude-assets/skills/cfn-docker-logging/schema.sql +111 -0
- package/claude-assets/skills/cfn-docker-logging/sqlite-helpers.sh +240 -0
- package/claude-assets/skills/cfn-docker-logging/test-hybrid-logging.sh +331 -0
- package/claude-assets/skills/cfn-docker-loop-orchestration/orchestrate.sh +11 -5
- package/claude-assets/skills/cfn-docker-redis-coordination/MIGRATION_SUMMARY.md +348 -0
- package/claude-assets/skills/cfn-docker-redis-coordination/README.md +294 -0
- package/claude-assets/skills/cfn-docker-redis-coordination/jest.config.js +37 -0
- package/claude-assets/skills/cfn-docker-redis-coordination/package-lock.json +5259 -0
- package/claude-assets/skills/cfn-docker-redis-coordination/package.json +40 -0
- package/claude-assets/skills/cfn-docker-redis-coordination/src/coordinator.ts +801 -0
- package/claude-assets/skills/cfn-docker-redis-coordination/src/index.ts +42 -0
- package/claude-assets/skills/cfn-docker-redis-coordination/src/types.ts +351 -0
- package/claude-assets/skills/cfn-docker-redis-coordination/tests/coordinator.test.ts +1464 -0
- package/claude-assets/skills/cfn-docker-redis-coordination/tsconfig.json +30 -0
- package/claude-assets/skills/cfn-error-logging/.eslintrc.json +57 -0
- package/claude-assets/skills/cfn-error-logging/.prettierrc.json +10 -0
- package/claude-assets/skills/cfn-error-logging/MIGRATION_SUMMARY.md +485 -0
- package/claude-assets/skills/cfn-error-logging/package.json +47 -0
- package/claude-assets/skills/cfn-error-logging/src/error-logger.ts +1042 -0
- package/claude-assets/skills/cfn-error-logging/src/index.ts +12 -0
- package/claude-assets/skills/cfn-error-logging/src/types.ts +456 -0
- package/claude-assets/skills/cfn-error-logging/tests/error-logger.test.ts +1302 -0
- package/claude-assets/skills/cfn-error-logging/tsconfig.json +38 -0
- package/claude-assets/skills/cfn-loop-orchestration/.eslintrc.js +56 -0
- package/claude-assets/skills/cfn-loop-orchestration/.prettierrc.json +18 -0
- package/claude-assets/skills/cfn-loop-orchestration/README.md +149 -41
- package/claude-assets/skills/cfn-loop-orchestration/jest.config.js +67 -0
- package/claude-assets/skills/cfn-loop-orchestration/orchestrate-wrapper.sh +268 -0
- package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +91 -8
- package/claude-assets/skills/cfn-loop-orchestration/package-lock.json +5470 -0
- package/claude-assets/skills/cfn-loop-orchestration/package.json +49 -0
- package/claude-assets/skills/cfn-loop-orchestration/src/agent-spawner/agent-spawner.ts +34 -0
- package/claude-assets/skills/cfn-loop-orchestration/src/gate-checker/gate-checker.ts +36 -0
- package/claude-assets/skills/cfn-loop-orchestration/src/index.ts +14 -0
- package/claude-assets/skills/cfn-loop-orchestration/src/orchestrator/orchestrator.ts +31 -0
- package/claude-assets/skills/cfn-loop-orchestration/src/redis/redis-coordinator.ts +72 -0
- package/claude-assets/skills/cfn-loop-orchestration/src/types.ts +188 -0
- package/claude-assets/skills/cfn-loop-orchestration/src/utils/logger.ts +32 -0
- package/claude-assets/skills/cfn-loop-orchestration/tests/setup.ts +22 -0
- package/claude-assets/skills/cfn-loop-orchestration/tests/types.test.ts +132 -0
- package/claude-assets/skills/cfn-loop-orchestration/tsconfig.json +54 -0
- package/claude-assets/skills/cfn-redis-coordination/bash-wrappers/store-context.sh +23 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/agent-logger.d.ts +92 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/agent-logger.d.ts.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/agent-logger.js +329 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/agent-logger.js.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/agent-recovery.d.ts +75 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/agent-recovery.d.ts.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/agent-recovery.js +302 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/agent-recovery.js.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/completion-reporter.d.ts +58 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/completion-reporter.d.ts.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/completion-reporter.js +237 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/completion-reporter.js.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/context-manager.d.ts +63 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/context-manager.d.ts.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/context-manager.js +230 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/context-manager.js.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/index.d.ts +45 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/index.d.ts.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/index.js +114 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/index.js.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/mode-detector.d.ts +31 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/mode-detector.d.ts.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/mode-detector.js +185 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/mode-detector.js.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/redis-client.d.ts +191 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/redis-client.d.ts.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/redis-client.js +509 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/redis-client.js.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/result-collector.d.ts +75 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/result-collector.d.ts.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/result-collector.js +281 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/result-collector.js.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/swarm-manager.d.ts +75 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/swarm-manager.d.ts.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/swarm-manager.js +354 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/swarm-manager.js.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/task-analyzer.d.ts +62 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/task-analyzer.d.ts.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/task-analyzer.js +305 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/task-analyzer.js.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/task-executor.d.ts +97 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/task-executor.d.ts.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/task-executor.js +283 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/task-executor.js.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/types.d.ts +176 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/types.d.ts.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/types.js +81 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/types.js.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/waiting-coordinator.d.ts +86 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/waiting-coordinator.d.ts.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/waiting-coordinator.js +419 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/waiting-coordinator.js.map +1 -0
- package/claude-assets/skills/cfn-redis-coordination/docs/migration/PHASE_3_REDIS_COORDINATION_COMPLETION_REPORT.md +553 -0
- package/claude-assets/skills/cfn-redis-coordination/jest.config.js +23 -0
- package/claude-assets/skills/cfn-redis-coordination/package-lock.json +5272 -0
- package/claude-assets/skills/cfn-redis-coordination/package.json +45 -0
- package/claude-assets/skills/cfn-redis-coordination/redis-cli-wrapper.sh +21 -8
- package/claude-assets/skills/cfn-redis-coordination/src/agent-logger.ts +446 -0
- package/claude-assets/skills/cfn-redis-coordination/src/agent-recovery.ts +454 -0
- package/claude-assets/skills/cfn-redis-coordination/src/completion-reporter.ts +396 -0
- package/claude-assets/skills/cfn-redis-coordination/src/context-manager.ts +327 -0
- package/claude-assets/skills/cfn-redis-coordination/src/index.ts +82 -0
- package/claude-assets/skills/cfn-redis-coordination/src/mode-detector.ts +155 -0
- package/claude-assets/skills/cfn-redis-coordination/src/redis/redis-client.ts +305 -0
- package/claude-assets/skills/cfn-redis-coordination/src/redis/redis-functions.ts +283 -0
- package/claude-assets/skills/cfn-redis-coordination/src/redis-client.ts +654 -0
- package/claude-assets/skills/cfn-redis-coordination/src/result-collector.ts +437 -0
- package/claude-assets/skills/cfn-redis-coordination/src/swarm-manager.ts +494 -0
- package/claude-assets/skills/cfn-redis-coordination/src/task-analyzer.ts +404 -0
- package/claude-assets/skills/cfn-redis-coordination/src/task-executor.ts +423 -0
- package/claude-assets/skills/cfn-redis-coordination/src/types.ts +235 -0
- package/claude-assets/skills/cfn-redis-coordination/src/waiting-coordinator.ts +587 -0
- package/claude-assets/skills/cfn-redis-coordination/test-connection-attempts.js +70 -0
- package/claude-assets/skills/cfn-redis-coordination/test-mode-simple.js +121 -0
- package/claude-assets/skills/cfn-redis-coordination/test-redis-check.js +84 -0
- package/claude-assets/skills/cfn-redis-coordination/test-task-mode-redis.cjs +391 -0
- package/claude-assets/skills/cfn-redis-coordination/tests/coordination.test.ts +779 -0
- package/claude-assets/skills/cfn-redis-coordination/tsconfig.json +31 -0
- package/claude-assets/skills/cfn-skill-propagation/README.md +233 -0
- package/claude-assets/skills/cfn-skill-propagation/package-lock.json +5174 -0
- package/claude-assets/skills/cfn-skill-propagation/package.json +52 -0
- package/claude-assets/skills/cfn-skill-propagation/propagate-skill-update.sh +32 -0
- package/claude-assets/skills/cfn-skill-propagation/src/cli.ts +75 -0
- package/claude-assets/skills/cfn-skill-propagation/src/database-adapter.ts +239 -0
- package/claude-assets/skills/cfn-skill-propagation/src/file-system-adapter.ts +113 -0
- package/claude-assets/skills/cfn-skill-propagation/src/index.ts +72 -0
- package/claude-assets/skills/cfn-skill-propagation/src/logger.ts +43 -0
- package/claude-assets/skills/cfn-skill-propagation/src/metadata-parser.ts +154 -0
- package/claude-assets/skills/cfn-skill-propagation/src/skill-propagator.ts +274 -0
- package/claude-assets/skills/cfn-skill-propagation/src/skill-validator.ts +179 -0
- package/claude-assets/skills/cfn-skill-propagation/src/types.ts +143 -0
- package/claude-assets/skills/cfn-skill-propagation/src/version-manager.ts +118 -0
- package/claude-assets/skills/cfn-skill-propagation/tests/file-system-adapter.test.ts +91 -0
- package/claude-assets/skills/cfn-skill-propagation/tests/metadata-parser.test.ts +176 -0
- package/claude-assets/skills/cfn-skill-propagation/tests/skill-propagator.test.ts +209 -0
- package/claude-assets/skills/cfn-skill-propagation/tests/skill-validator.test.ts +203 -0
- package/claude-assets/skills/cfn-skill-propagation/tests/version-manager.test.ts +115 -0
- package/claude-assets/skills/cfn-skill-propagation/tsconfig.json +34 -0
- package/claude-assets/skills/task-classifier/SKILL.md +81 -0
- package/claude-assets/skills/task-classifier/classify-task.sh +62 -0
- package/claude-assets/skills/workflow-codification/package-lock.json +5170 -0
- package/claude-assets/skills/workflow-codification/package.json +30 -0
- package/claude-assets/skills/workflow-codification/src/index.ts +24 -0
- package/claude-assets/skills/workflow-codification/src/pattern-analyzer.ts +537 -0
- package/claude-assets/skills/workflow-codification/src/types.ts +180 -0
- package/claude-assets/skills/workflow-codification/tests/pattern-analyzer.test.ts +960 -0
- package/claude-assets/skills/workflow-codification/tsconfig.json +34 -0
- package/claude-assets/skills/workflow-codification/workflow-codification.db +0 -0
- package/dist/agent-spawner/agent-spawner.js +448 -0
- package/dist/agent-spawner/agent-spawner.js.map +1 -0
- package/dist/agent-spawner/index.js +10 -0
- package/dist/agent-spawner/index.js.map +1 -0
- package/dist/agent-spawner/types.js +14 -0
- package/dist/agent-spawner/types.js.map +1 -0
- package/dist/agents/agent-loader.js +146 -165
- package/dist/agents/agent-loader.js.map +1 -1
- package/dist/cli/agent-executor.js +47 -1
- package/dist/cli/agent-executor.js.map +1 -1
- package/dist/cli/agent-spawn.js +4 -1
- package/dist/cli/agent-spawn.js.map +1 -1
- package/dist/cli/tool-executor.js +3 -1
- package/dist/cli/tool-executor.js.map +1 -1
- package/dist/gate-checker/gate-checker.js +292 -0
- package/dist/gate-checker/gate-checker.js.map +1 -0
- package/dist/gate-checker/types.js +94 -0
- package/dist/gate-checker/types.js.map +1 -0
- package/dist/lib/database-service/connection-pool-manager.js +2 -1
- package/dist/lib/database-service/connection-pool-manager.js.map +1 -1
- package/dist/orchestrator/index.js +10 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/orchestrator/orchestrate.js +496 -0
- package/dist/orchestrator/orchestrate.js.map +1 -0
- package/dist/orchestrator/types.js +58 -0
- package/dist/orchestrator/types.js.map +1 -0
- package/package.json +1 -1
- package/scripts/switch-api.sh +142 -4
- package/scripts/verify-no-secrets.sh +6 -13
- package/tests/README.md +175 -58
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Completion Reporter
|
|
3
|
+
*
|
|
4
|
+
* Handles reporting agent completion, confidence, and test results to Redis.
|
|
5
|
+
*
|
|
6
|
+
* Migrated from:
|
|
7
|
+
* - report-completion.sh (89 lines)
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type {
|
|
11
|
+
TaskId,
|
|
12
|
+
AgentId,
|
|
13
|
+
Logger,
|
|
14
|
+
CompletionReport,
|
|
15
|
+
TestResults
|
|
16
|
+
} from './types';
|
|
17
|
+
import {
|
|
18
|
+
CoordinationError,
|
|
19
|
+
CoordinationErrorType,
|
|
20
|
+
validateTaskId,
|
|
21
|
+
validateAgentId,
|
|
22
|
+
validateConfidence,
|
|
23
|
+
isValidTaskId,
|
|
24
|
+
isValidAgentId,
|
|
25
|
+
isValidConfidence
|
|
26
|
+
} from './types';
|
|
27
|
+
import { RedisCoordinator } from './redis-client';
|
|
28
|
+
|
|
29
|
+
export interface CompletionReportOptions {
|
|
30
|
+
result?: {
|
|
31
|
+
status: 'complete' | 'failed' | 'blocked';
|
|
32
|
+
deliverablesCreated?: string[];
|
|
33
|
+
testsRun?: number;
|
|
34
|
+
testsPassed?: number;
|
|
35
|
+
testsFailed?: number;
|
|
36
|
+
errors?: string[];
|
|
37
|
+
metadata?: Record<string, unknown>;
|
|
38
|
+
};
|
|
39
|
+
iteration?: number;
|
|
40
|
+
namespace?: string;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export class CompletionReporter {
|
|
44
|
+
constructor(
|
|
45
|
+
private redis: RedisCoordinator,
|
|
46
|
+
private logger: Logger
|
|
47
|
+
) {}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Report agent completion with confidence score
|
|
51
|
+
*
|
|
52
|
+
* In Task Mode: Logs and returns gracefully
|
|
53
|
+
* In CLI Mode: Stores in Redis and signals completion
|
|
54
|
+
*/
|
|
55
|
+
async reportCompletion(
|
|
56
|
+
taskId: TaskId,
|
|
57
|
+
agentId: AgentId,
|
|
58
|
+
confidence: number,
|
|
59
|
+
options: CompletionReportOptions = {}
|
|
60
|
+
): Promise<void> {
|
|
61
|
+
// Validate inputs
|
|
62
|
+
if (!isValidTaskId(taskId)) {
|
|
63
|
+
throw new CoordinationError(
|
|
64
|
+
CoordinationErrorType.VALIDATION_ERROR,
|
|
65
|
+
`Invalid task ID: ${taskId}`
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (!isValidAgentId(agentId)) {
|
|
70
|
+
throw new CoordinationError(
|
|
71
|
+
CoordinationErrorType.VALIDATION_ERROR,
|
|
72
|
+
`Invalid agent ID: ${agentId}`
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (!isValidConfidence(confidence)) {
|
|
77
|
+
throw new CoordinationError(
|
|
78
|
+
CoordinationErrorType.VALIDATION_ERROR,
|
|
79
|
+
`Invalid confidence value: ${confidence}. Must be between 0.0 and 1.0.`
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Graceful no-op in Task Mode
|
|
84
|
+
if (!this.redis.canUseRedis) {
|
|
85
|
+
this.logger.info(
|
|
86
|
+
`Task Mode: Agent completion reported (no Redis storage) - Agent: ${agentId}, Confidence: ${confidence}`
|
|
87
|
+
);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// CLI Mode: Report to Redis with optimized pipeline
|
|
92
|
+
const iteration = options.iteration || 1;
|
|
93
|
+
const namespace = options.namespace || 'swarm';
|
|
94
|
+
const timestamp = new Date().toISOString();
|
|
95
|
+
|
|
96
|
+
try {
|
|
97
|
+
// Signal completion (for waiting mode)
|
|
98
|
+
await this.redis.lpush(`${namespace}:${taskId}:${agentId}:done`, 'complete');
|
|
99
|
+
|
|
100
|
+
// Store confidence score
|
|
101
|
+
await this.redis.set(
|
|
102
|
+
`${namespace}:${taskId}:${agentId}:confidence`,
|
|
103
|
+
String(confidence),
|
|
104
|
+
'EX',
|
|
105
|
+
3600
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
// Store detailed result
|
|
109
|
+
const resultData: Record<string, string> = {
|
|
110
|
+
confidence: String(confidence),
|
|
111
|
+
iteration: String(iteration),
|
|
112
|
+
timestamp
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
if (options.result) {
|
|
116
|
+
resultData.status = options.result.status;
|
|
117
|
+
if (options.result.deliverablesCreated) {
|
|
118
|
+
resultData.deliverablesCreated = JSON.stringify(options.result.deliverablesCreated);
|
|
119
|
+
}
|
|
120
|
+
if (options.result.testsRun !== undefined) {
|
|
121
|
+
resultData.testsRun = String(options.result.testsRun);
|
|
122
|
+
}
|
|
123
|
+
if (options.result.testsPassed !== undefined) {
|
|
124
|
+
resultData.testsPassed = String(options.result.testsPassed);
|
|
125
|
+
}
|
|
126
|
+
if (options.result.testsFailed !== undefined) {
|
|
127
|
+
resultData.testsFailed = String(options.result.testsFailed);
|
|
128
|
+
}
|
|
129
|
+
if (options.result.errors) {
|
|
130
|
+
resultData.errors = JSON.stringify(options.result.errors);
|
|
131
|
+
}
|
|
132
|
+
if (options.result.metadata) {
|
|
133
|
+
resultData.metadata = JSON.stringify(options.result.metadata);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
await this.redis.hset(
|
|
138
|
+
`${namespace}:${taskId}:${agentId}:result`,
|
|
139
|
+
...Object.entries(resultData).flat()
|
|
140
|
+
);
|
|
141
|
+
|
|
142
|
+
// Track in completed agents list
|
|
143
|
+
await this.redis.lpush(`${namespace}:${taskId}:completed_agents`, agentId);
|
|
144
|
+
|
|
145
|
+
// Set TTLs
|
|
146
|
+
await this.redis.expire(`${namespace}:${taskId}:${agentId}:result`, 3600);
|
|
147
|
+
await this.redis.expire(`${namespace}:${taskId}:${agentId}:done`, 3600);
|
|
148
|
+
|
|
149
|
+
this.logger.info(
|
|
150
|
+
`✅ Completion reported: Agent ${agentId}, Confidence: ${confidence}, Iteration: ${iteration}`
|
|
151
|
+
);
|
|
152
|
+
} catch (error) {
|
|
153
|
+
this.logger.error('Failed to report completion', error as Error);
|
|
154
|
+
throw new CoordinationError(
|
|
155
|
+
CoordinationErrorType.REDIS_UNAVAILABLE,
|
|
156
|
+
`Failed to report completion for agent ${agentId}: ${(error as Error).message}`
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Report test results with pass rate
|
|
163
|
+
*
|
|
164
|
+
* In Task Mode: Logs and returns gracefully
|
|
165
|
+
* In CLI Mode: Stores in Redis for gate checking
|
|
166
|
+
*/
|
|
167
|
+
async reportTestResults(
|
|
168
|
+
taskId: TaskId,
|
|
169
|
+
agentId: AgentId,
|
|
170
|
+
results: TestResults,
|
|
171
|
+
iteration: number = 1,
|
|
172
|
+
namespace: string = 'swarm'
|
|
173
|
+
): Promise<void> {
|
|
174
|
+
// Validate inputs
|
|
175
|
+
if (!isValidTaskId(taskId)) {
|
|
176
|
+
throw new CoordinationError(
|
|
177
|
+
CoordinationErrorType.VALIDATION_ERROR,
|
|
178
|
+
`Invalid task ID: ${taskId}`
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
if (!isValidAgentId(agentId)) {
|
|
183
|
+
throw new CoordinationError(
|
|
184
|
+
CoordinationErrorType.VALIDATION_ERROR,
|
|
185
|
+
`Invalid agent ID: ${agentId}`
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
if (!Number.isFinite(results.passRate) || results.passRate < 0 || results.passRate > 1) {
|
|
190
|
+
throw new CoordinationError(
|
|
191
|
+
CoordinationErrorType.VALIDATION_ERROR,
|
|
192
|
+
`Invalid pass rate: ${results.passRate}. Must be between 0.0 and 1.0.`
|
|
193
|
+
);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Graceful no-op in Task Mode
|
|
197
|
+
if (!this.redis.canUseRedis) {
|
|
198
|
+
this.logger.info(
|
|
199
|
+
`Task Mode: Test results reported (no Redis storage) - Pass Rate: ${(results.passRate * 100).toFixed(1)}%`
|
|
200
|
+
);
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// CLI Mode: Store in Redis
|
|
205
|
+
const timestamp = new Date().toISOString();
|
|
206
|
+
|
|
207
|
+
try {
|
|
208
|
+
const testResultsKey = `${namespace}:${taskId}:${agentId}:test-results`;
|
|
209
|
+
|
|
210
|
+
await this.redis.hset(
|
|
211
|
+
testResultsKey,
|
|
212
|
+
'pass', String(results.pass),
|
|
213
|
+
'fail', String(results.fail),
|
|
214
|
+
'skip', String(results.skip || 0),
|
|
215
|
+
'total', String(results.total),
|
|
216
|
+
'passRate', String(results.passRate),
|
|
217
|
+
'iteration', String(iteration),
|
|
218
|
+
'timestamp', timestamp
|
|
219
|
+
);
|
|
220
|
+
|
|
221
|
+
// Set TTL (24 hours)
|
|
222
|
+
await this.redis.expire(testResultsKey, 86400);
|
|
223
|
+
|
|
224
|
+
this.logger.info(
|
|
225
|
+
`✅ Test results reported: Pass Rate ${(results.passRate * 100).toFixed(1)}% (${results.pass}/${results.total})`
|
|
226
|
+
);
|
|
227
|
+
} catch (error) {
|
|
228
|
+
this.logger.error('Failed to report test results', error as Error);
|
|
229
|
+
throw new CoordinationError(
|
|
230
|
+
CoordinationErrorType.REDIS_UNAVAILABLE,
|
|
231
|
+
`Failed to report test results for agent ${agentId}: ${(error as Error).message}`
|
|
232
|
+
);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Signal agent done for waiting mode
|
|
238
|
+
*
|
|
239
|
+
* In Task Mode: Logs and returns gracefully
|
|
240
|
+
* In CLI Mode: Signals via Redis list
|
|
241
|
+
*/
|
|
242
|
+
async signalDone(
|
|
243
|
+
taskId: TaskId,
|
|
244
|
+
agentId: AgentId,
|
|
245
|
+
namespace: string = 'swarm'
|
|
246
|
+
): Promise<void> {
|
|
247
|
+
// Validate inputs
|
|
248
|
+
if (!isValidTaskId(taskId)) {
|
|
249
|
+
throw new CoordinationError(
|
|
250
|
+
CoordinationErrorType.VALIDATION_ERROR,
|
|
251
|
+
`Invalid task ID: ${taskId}`
|
|
252
|
+
);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
if (!isValidAgentId(agentId)) {
|
|
256
|
+
throw new CoordinationError(
|
|
257
|
+
CoordinationErrorType.VALIDATION_ERROR,
|
|
258
|
+
`Invalid agent ID: ${agentId}`
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// Graceful no-op in Task Mode
|
|
263
|
+
if (!this.redis.canUseRedis) {
|
|
264
|
+
this.logger.info(`Task Mode: Agent done signal ignored (no Redis) - Agent: ${agentId}`);
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// CLI Mode: Push to done list
|
|
269
|
+
try {
|
|
270
|
+
const doneKey = `${namespace}:${taskId}:${agentId}:done`;
|
|
271
|
+
await this.redis.lpush(doneKey, 'done');
|
|
272
|
+
await this.redis.expire(doneKey, 3600);
|
|
273
|
+
|
|
274
|
+
this.logger.info(`✅ Done signal sent for agent: ${agentId}`);
|
|
275
|
+
} catch (error) {
|
|
276
|
+
this.logger.error('Failed to signal done', error as Error);
|
|
277
|
+
throw new CoordinationError(
|
|
278
|
+
CoordinationErrorType.REDIS_UNAVAILABLE,
|
|
279
|
+
`Failed to signal done for agent ${agentId}: ${(error as Error).message}`
|
|
280
|
+
);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* Get completion report for an agent
|
|
286
|
+
*/
|
|
287
|
+
async getCompletionReport(
|
|
288
|
+
taskId: TaskId,
|
|
289
|
+
agentId: AgentId,
|
|
290
|
+
namespace: string = 'swarm'
|
|
291
|
+
): Promise<CompletionReport | null> {
|
|
292
|
+
// Validate inputs
|
|
293
|
+
if (!isValidTaskId(taskId)) {
|
|
294
|
+
throw new CoordinationError(
|
|
295
|
+
CoordinationErrorType.VALIDATION_ERROR,
|
|
296
|
+
`Invalid task ID: ${taskId}`
|
|
297
|
+
);
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
if (!isValidAgentId(agentId)) {
|
|
301
|
+
throw new CoordinationError(
|
|
302
|
+
CoordinationErrorType.VALIDATION_ERROR,
|
|
303
|
+
`Invalid agent ID: ${agentId}`
|
|
304
|
+
);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// Graceful no-op in Task Mode
|
|
308
|
+
if (!this.redis.canUseRedis) {
|
|
309
|
+
this.logger.info('Task Mode: No completion reports available in Redis');
|
|
310
|
+
return null;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
// CLI Mode: Retrieve from Redis
|
|
314
|
+
try {
|
|
315
|
+
const resultKey = `${namespace}:${taskId}:${agentId}:result`;
|
|
316
|
+
const data = await this.redis.hgetall(resultKey);
|
|
317
|
+
|
|
318
|
+
if (!data || Object.keys(data).length === 0) {
|
|
319
|
+
this.logger.warn(`No completion report found for agent: ${agentId}`);
|
|
320
|
+
return null;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
const confidence = parseFloat(data.confidence || '0');
|
|
324
|
+
const report: CompletionReport = {
|
|
325
|
+
agentId,
|
|
326
|
+
taskId,
|
|
327
|
+
confidence,
|
|
328
|
+
iteration: parseInt(data.iteration || '1', 10),
|
|
329
|
+
result: {
|
|
330
|
+
status: (data.status as 'complete' | 'failed' | 'blocked') || 'complete',
|
|
331
|
+
deliverablesCreated: data.deliverablesCreated ? JSON.parse(data.deliverablesCreated) : undefined,
|
|
332
|
+
testsRun: data.testsRun ? parseInt(data.testsRun, 10) : undefined,
|
|
333
|
+
testsPassed: data.testsPassed ? parseInt(data.testsPassed, 10) : undefined,
|
|
334
|
+
testsFailed: data.testsFailed ? parseInt(data.testsFailed, 10) : undefined,
|
|
335
|
+
errors: data.errors ? JSON.parse(data.errors) : undefined,
|
|
336
|
+
metadata: data.metadata ? JSON.parse(data.metadata) : undefined
|
|
337
|
+
},
|
|
338
|
+
timestamp: data.timestamp || new Date().toISOString()
|
|
339
|
+
};
|
|
340
|
+
|
|
341
|
+
return report;
|
|
342
|
+
} catch (error) {
|
|
343
|
+
this.logger.error('Failed to get completion report', error as Error);
|
|
344
|
+
throw new CoordinationError(
|
|
345
|
+
CoordinationErrorType.REDIS_UNAVAILABLE,
|
|
346
|
+
`Failed to retrieve completion report for agent ${agentId}: ${(error as Error).message}`
|
|
347
|
+
);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* Clear completion data for an agent
|
|
353
|
+
*/
|
|
354
|
+
async clearCompletion(
|
|
355
|
+
taskId: TaskId,
|
|
356
|
+
agentId: AgentId,
|
|
357
|
+
namespace: string = 'swarm'
|
|
358
|
+
): Promise<void> {
|
|
359
|
+
if (!isValidTaskId(taskId)) {
|
|
360
|
+
throw new CoordinationError(
|
|
361
|
+
CoordinationErrorType.VALIDATION_ERROR,
|
|
362
|
+
`Invalid task ID: ${taskId}`
|
|
363
|
+
);
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
if (!isValidAgentId(agentId)) {
|
|
367
|
+
throw new CoordinationError(
|
|
368
|
+
CoordinationErrorType.VALIDATION_ERROR,
|
|
369
|
+
`Invalid agent ID: ${agentId}`
|
|
370
|
+
);
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
if (!this.redis.canUseRedis) {
|
|
374
|
+
this.logger.info('Task Mode: Completion data cleanup skipped');
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
try {
|
|
379
|
+
const keys = [
|
|
380
|
+
`${namespace}:${taskId}:${agentId}:done`,
|
|
381
|
+
`${namespace}:${taskId}:${agentId}:confidence`,
|
|
382
|
+
`${namespace}:${taskId}:${agentId}:result`,
|
|
383
|
+
`${namespace}:${taskId}:${agentId}:test-results`
|
|
384
|
+
];
|
|
385
|
+
|
|
386
|
+
await this.redis.del(...keys);
|
|
387
|
+
this.logger.info(`✅ Completion data cleared for agent: ${agentId}`);
|
|
388
|
+
} catch (error) {
|
|
389
|
+
this.logger.error('Failed to clear completion data', error as Error);
|
|
390
|
+
throw new CoordinationError(
|
|
391
|
+
CoordinationErrorType.REDIS_UNAVAILABLE,
|
|
392
|
+
`Failed to clear completion data for agent ${agentId}: ${(error as Error).message}`
|
|
393
|
+
);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
}
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task Context Manager
|
|
3
|
+
*
|
|
4
|
+
* Handles storing and retrieving task context in Redis (CLI Mode)
|
|
5
|
+
* or gracefully stubbing in Task Mode.
|
|
6
|
+
*
|
|
7
|
+
* Migrated from:
|
|
8
|
+
* - store-context.sh (93 lines)
|
|
9
|
+
* - get-context.sh (145 lines)
|
|
10
|
+
* - store-success-criteria.sh (85 lines)
|
|
11
|
+
* - get-success-criteria.sh (54 lines)
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import type {
|
|
15
|
+
TaskId,
|
|
16
|
+
Logger,
|
|
17
|
+
TaskContext,
|
|
18
|
+
ValidationResult
|
|
19
|
+
} from './types';
|
|
20
|
+
import {
|
|
21
|
+
CoordinationError,
|
|
22
|
+
CoordinationErrorType,
|
|
23
|
+
validateTaskId,
|
|
24
|
+
isValidTaskId
|
|
25
|
+
} from './types';
|
|
26
|
+
import { RedisCoordinator } from './redis-client';
|
|
27
|
+
|
|
28
|
+
export interface SuccessCriteria {
|
|
29
|
+
taskId: TaskId;
|
|
30
|
+
criteria: string[];
|
|
31
|
+
testSuites?: string[];
|
|
32
|
+
passThreshold?: number;
|
|
33
|
+
timestamp?: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export class ContextManager {
|
|
37
|
+
constructor(
|
|
38
|
+
private redis: RedisCoordinator,
|
|
39
|
+
private logger: Logger
|
|
40
|
+
) {}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Store task context in Redis
|
|
44
|
+
*
|
|
45
|
+
* In Task Mode: Logs and returns gracefully
|
|
46
|
+
* In CLI Mode: Stores in Redis with 24h TTL
|
|
47
|
+
*/
|
|
48
|
+
async storeContext(taskId: TaskId, context: TaskContext): Promise<void> {
|
|
49
|
+
// Validate input
|
|
50
|
+
if (!isValidTaskId(taskId)) {
|
|
51
|
+
throw new CoordinationError(
|
|
52
|
+
CoordinationErrorType.VALIDATION_ERROR,
|
|
53
|
+
`Invalid task ID: ${taskId}`
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Graceful no-op in Task Mode
|
|
58
|
+
if (!this.redis.canUseRedis) {
|
|
59
|
+
this.logger.info('Task Mode: Context passed via Task() parameters (no Redis storage)');
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// CLI Mode: Store in Redis
|
|
64
|
+
const key = `swarm:${taskId}:context`;
|
|
65
|
+
const epic = context.epic || '';
|
|
66
|
+
const scope = JSON.stringify(context.scope || {});
|
|
67
|
+
const deliverables = JSON.stringify(context.deliverables || []);
|
|
68
|
+
const successCriteria = JSON.stringify(context.successCriteria || []);
|
|
69
|
+
const mode = context.mode || 'standard';
|
|
70
|
+
const timestamp = context.timestamp || new Date().toISOString();
|
|
71
|
+
|
|
72
|
+
try {
|
|
73
|
+
await this.redis.hset(
|
|
74
|
+
key,
|
|
75
|
+
'epic', epic,
|
|
76
|
+
'scope', scope,
|
|
77
|
+
'deliverables', deliverables,
|
|
78
|
+
'successCriteria', successCriteria,
|
|
79
|
+
'mode', mode,
|
|
80
|
+
'updated_at', timestamp
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
// Set TTL (24 hours)
|
|
84
|
+
await this.redis.expire(key, 86400);
|
|
85
|
+
|
|
86
|
+
this.logger.info(`✅ Context stored for task: ${taskId}`);
|
|
87
|
+
} catch (error) {
|
|
88
|
+
this.logger.error('Failed to store context', error as Error);
|
|
89
|
+
throw new CoordinationError(
|
|
90
|
+
CoordinationErrorType.REDIS_UNAVAILABLE,
|
|
91
|
+
`Failed to store context for task ${taskId}: ${(error as Error).message}`
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Retrieve task context from Redis
|
|
98
|
+
*
|
|
99
|
+
* In Task Mode: Returns empty context
|
|
100
|
+
* In CLI Mode: Retrieves from Redis
|
|
101
|
+
*/
|
|
102
|
+
async getContext(taskId: TaskId): Promise<TaskContext | null> {
|
|
103
|
+
// Validate input
|
|
104
|
+
if (!isValidTaskId(taskId)) {
|
|
105
|
+
throw new CoordinationError(
|
|
106
|
+
CoordinationErrorType.VALIDATION_ERROR,
|
|
107
|
+
`Invalid task ID: ${taskId}`
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Graceful no-op in Task Mode
|
|
112
|
+
if (!this.redis.canUseRedis) {
|
|
113
|
+
this.logger.info('Task Mode: No context available in Redis');
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// CLI Mode: Retrieve from Redis
|
|
118
|
+
const key = `swarm:${taskId}:context`;
|
|
119
|
+
|
|
120
|
+
try {
|
|
121
|
+
const data = await this.redis.hgetall(key);
|
|
122
|
+
|
|
123
|
+
if (!data || Object.keys(data).length === 0) {
|
|
124
|
+
this.logger.warn(`No context found for task: ${taskId}`);
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Parse JSON fields
|
|
129
|
+
const scope = data.scope ? JSON.parse(data.scope) : {};
|
|
130
|
+
const deliverables = data.deliverables ? JSON.parse(data.deliverables) : [];
|
|
131
|
+
const successCriteria = data.successCriteria ? JSON.parse(data.successCriteria) : [];
|
|
132
|
+
|
|
133
|
+
const context: TaskContext = {
|
|
134
|
+
taskId,
|
|
135
|
+
epic: data.epic || undefined,
|
|
136
|
+
scope: Object.keys(scope).length > 0 ? scope : undefined,
|
|
137
|
+
deliverables: deliverables.length > 0 ? deliverables : undefined,
|
|
138
|
+
successCriteria: successCriteria.length > 0 ? successCriteria : undefined,
|
|
139
|
+
mode: (data.mode as 'mvp' | 'standard' | 'enterprise') || 'standard',
|
|
140
|
+
timestamp: data.updated_at
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
this.logger.info(`✅ Context retrieved for task: ${taskId}`);
|
|
144
|
+
return context;
|
|
145
|
+
} catch (error) {
|
|
146
|
+
this.logger.error('Failed to get context', error as Error);
|
|
147
|
+
throw new CoordinationError(
|
|
148
|
+
CoordinationErrorType.REDIS_UNAVAILABLE,
|
|
149
|
+
`Failed to retrieve context for task ${taskId}: ${(error as Error).message}`
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Store success criteria for a task
|
|
156
|
+
*
|
|
157
|
+
* In Task Mode: Logs and returns gracefully
|
|
158
|
+
* In CLI Mode: Stores in Redis with 24h TTL
|
|
159
|
+
*/
|
|
160
|
+
async storeSuccessCriteria(taskId: TaskId, criteria: SuccessCriteria): Promise<void> {
|
|
161
|
+
// Validate input
|
|
162
|
+
if (!isValidTaskId(taskId)) {
|
|
163
|
+
throw new CoordinationError(
|
|
164
|
+
CoordinationErrorType.VALIDATION_ERROR,
|
|
165
|
+
`Invalid task ID: ${taskId}`
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
if (!criteria.criteria || criteria.criteria.length === 0) {
|
|
170
|
+
throw new CoordinationError(
|
|
171
|
+
CoordinationErrorType.VALIDATION_ERROR,
|
|
172
|
+
'Success criteria must contain at least one criterion'
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Graceful no-op in Task Mode
|
|
177
|
+
if (!this.redis.canUseRedis) {
|
|
178
|
+
this.logger.info('Task Mode: Success criteria passed via Task() parameters');
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// CLI Mode: Store in Redis
|
|
183
|
+
const key = `swarm:${taskId}:success_criteria`;
|
|
184
|
+
|
|
185
|
+
try {
|
|
186
|
+
const criteriaJson = JSON.stringify(criteria.criteria);
|
|
187
|
+
const testSuitesJson = JSON.stringify(criteria.testSuites || []);
|
|
188
|
+
const timestamp = criteria.timestamp || new Date().toISOString();
|
|
189
|
+
|
|
190
|
+
await this.redis.hset(
|
|
191
|
+
key,
|
|
192
|
+
'criteria', criteriaJson,
|
|
193
|
+
'testSuites', testSuitesJson,
|
|
194
|
+
'passThreshold', String(criteria.passThreshold || 0.95),
|
|
195
|
+
'stored_at', timestamp
|
|
196
|
+
);
|
|
197
|
+
|
|
198
|
+
// Set TTL (24 hours)
|
|
199
|
+
await this.redis.expire(key, 86400);
|
|
200
|
+
|
|
201
|
+
this.logger.info(`✅ Success criteria stored for task: ${taskId}`);
|
|
202
|
+
} catch (error) {
|
|
203
|
+
this.logger.error('Failed to store success criteria', error as Error);
|
|
204
|
+
throw new CoordinationError(
|
|
205
|
+
CoordinationErrorType.REDIS_UNAVAILABLE,
|
|
206
|
+
`Failed to store success criteria for task ${taskId}: ${(error as Error).message}`
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Retrieve success criteria from Redis
|
|
213
|
+
*
|
|
214
|
+
* In Task Mode: Returns null
|
|
215
|
+
* In CLI Mode: Retrieves from Redis
|
|
216
|
+
*/
|
|
217
|
+
async getSuccessCriteria(taskId: TaskId): Promise<SuccessCriteria | null> {
|
|
218
|
+
// Validate input
|
|
219
|
+
if (!isValidTaskId(taskId)) {
|
|
220
|
+
throw new CoordinationError(
|
|
221
|
+
CoordinationErrorType.VALIDATION_ERROR,
|
|
222
|
+
`Invalid task ID: ${taskId}`
|
|
223
|
+
);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// Graceful no-op in Task Mode
|
|
227
|
+
if (!this.redis.canUseRedis) {
|
|
228
|
+
this.logger.info('Task Mode: No success criteria available in Redis');
|
|
229
|
+
return null;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// CLI Mode: Retrieve from Redis
|
|
233
|
+
const key = `swarm:${taskId}:success_criteria`;
|
|
234
|
+
|
|
235
|
+
try {
|
|
236
|
+
const data = await this.redis.hgetall(key);
|
|
237
|
+
|
|
238
|
+
if (!data || Object.keys(data).length === 0) {
|
|
239
|
+
this.logger.warn(`No success criteria found for task: ${taskId}`);
|
|
240
|
+
return null;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// Parse JSON fields
|
|
244
|
+
const criteria = data.criteria ? JSON.parse(data.criteria) : [];
|
|
245
|
+
const testSuites = data.testSuites ? JSON.parse(data.testSuites) : [];
|
|
246
|
+
const passThreshold = data.passThreshold ? parseFloat(data.passThreshold) : 0.95;
|
|
247
|
+
|
|
248
|
+
const result: SuccessCriteria = {
|
|
249
|
+
taskId,
|
|
250
|
+
criteria,
|
|
251
|
+
testSuites: testSuites.length > 0 ? testSuites : undefined,
|
|
252
|
+
passThreshold,
|
|
253
|
+
timestamp: data.stored_at
|
|
254
|
+
};
|
|
255
|
+
|
|
256
|
+
this.logger.info(`✅ Success criteria retrieved for task: ${taskId}`);
|
|
257
|
+
return result;
|
|
258
|
+
} catch (error) {
|
|
259
|
+
this.logger.error('Failed to get success criteria', error as Error);
|
|
260
|
+
throw new CoordinationError(
|
|
261
|
+
CoordinationErrorType.REDIS_UNAVAILABLE,
|
|
262
|
+
`Failed to retrieve success criteria for task ${taskId}: ${(error as Error).message}`
|
|
263
|
+
);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Validate context structure
|
|
269
|
+
*/
|
|
270
|
+
validateContext(context: TaskContext): ValidationResult {
|
|
271
|
+
const errors: string[] = [];
|
|
272
|
+
|
|
273
|
+
if (!isValidTaskId(context.taskId)) {
|
|
274
|
+
errors.push(`Invalid task ID: ${context.taskId}`);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
if (context.deliverables && !Array.isArray(context.deliverables)) {
|
|
278
|
+
errors.push('Deliverables must be an array');
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
if (context.successCriteria && !Array.isArray(context.successCriteria)) {
|
|
282
|
+
errors.push('Success criteria must be an array');
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
if (context.mode && !['mvp', 'standard', 'enterprise'].includes(context.mode)) {
|
|
286
|
+
errors.push(`Invalid mode: ${context.mode}`);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
return {
|
|
290
|
+
valid: errors.length === 0,
|
|
291
|
+
errors
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Clear context for a task
|
|
297
|
+
*/
|
|
298
|
+
async clearContext(taskId: TaskId): Promise<void> {
|
|
299
|
+
if (!isValidTaskId(taskId)) {
|
|
300
|
+
throw new CoordinationError(
|
|
301
|
+
CoordinationErrorType.VALIDATION_ERROR,
|
|
302
|
+
`Invalid task ID: ${taskId}`
|
|
303
|
+
);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
if (!this.redis.canUseRedis) {
|
|
307
|
+
this.logger.info('Task Mode: Context cleanup skipped');
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
try {
|
|
312
|
+
const keys = [
|
|
313
|
+
`swarm:${taskId}:context`,
|
|
314
|
+
`swarm:${taskId}:success_criteria`
|
|
315
|
+
];
|
|
316
|
+
|
|
317
|
+
await this.redis.del(...keys);
|
|
318
|
+
this.logger.info(`✅ Context cleared for task: ${taskId}`);
|
|
319
|
+
} catch (error) {
|
|
320
|
+
this.logger.error('Failed to clear context', error as Error);
|
|
321
|
+
throw new CoordinationError(
|
|
322
|
+
CoordinationErrorType.REDIS_UNAVAILABLE,
|
|
323
|
+
`Failed to clear context for task ${taskId}: ${(error as Error).message}`
|
|
324
|
+
);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|