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,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CFN Redis Coordination - TypeScript Entry Point
|
|
3
|
+
*
|
|
4
|
+
* Complete Redis coordination layer with Task Mode graceful fallback
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
// Core types
|
|
8
|
+
export * from './types';
|
|
9
|
+
|
|
10
|
+
// Mode detection
|
|
11
|
+
export { detectMode, ConsoleLogger } from './mode-detector';
|
|
12
|
+
|
|
13
|
+
// Redis client
|
|
14
|
+
export { RedisCoordinator } from './redis-client';
|
|
15
|
+
|
|
16
|
+
// Coordination modules
|
|
17
|
+
export { ContextManager } from './context-manager';
|
|
18
|
+
export type { SuccessCriteria } from './context-manager';
|
|
19
|
+
|
|
20
|
+
export { CompletionReporter } from './completion-reporter';
|
|
21
|
+
export type { CompletionReportOptions } from './completion-reporter';
|
|
22
|
+
|
|
23
|
+
export { ResultCollector } from './result-collector';
|
|
24
|
+
export type { CollectionResult, AggregatedScores } from './result-collector';
|
|
25
|
+
|
|
26
|
+
export { WaitingCoordinator } from './waiting-coordinator';
|
|
27
|
+
export type { WaitResult, SignalResult } from './waiting-coordinator';
|
|
28
|
+
|
|
29
|
+
export { SwarmManager } from './swarm-manager';
|
|
30
|
+
export type { SwarmMetadata, CancellationSignal } from './swarm-manager';
|
|
31
|
+
|
|
32
|
+
export { AgentRecoveryManager } from './agent-recovery';
|
|
33
|
+
export type { AgentHealth } from './agent-recovery';
|
|
34
|
+
|
|
35
|
+
export { AgentLogger, storeAgentLog, getAgentLogs, getTaskLogs, clearLogs } from './agent-logger';
|
|
36
|
+
export type { LogLevel, LogEntry } from './agent-logger';
|
|
37
|
+
|
|
38
|
+
export { TaskAnalyzer } from './task-analyzer';
|
|
39
|
+
export type { ComplexityAnalysis, DifficultyLevel } from './task-analyzer';
|
|
40
|
+
|
|
41
|
+
export { TaskExecutor } from './task-executor';
|
|
42
|
+
export type { ExecutionConfig, ExecutionResult, ExecutionProgress } from './task-executor';
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Factory function to initialize all coordination modules
|
|
46
|
+
*
|
|
47
|
+
* Lazy-loaded to avoid circular dependencies
|
|
48
|
+
*/
|
|
49
|
+
export async function initializeCoordination() {
|
|
50
|
+
// Dynamic imports to avoid circular dep issues
|
|
51
|
+
const { RedisCoordinator } = await import('./redis-client');
|
|
52
|
+
const { ConsoleLogger } = await import('./mode-detector');
|
|
53
|
+
const { ContextManager: CM } = await import('./context-manager');
|
|
54
|
+
const { CompletionReporter: CR } = await import('./completion-reporter');
|
|
55
|
+
const { ResultCollector: RC } = await import('./result-collector');
|
|
56
|
+
const { WaitingCoordinator: WC } = await import('./waiting-coordinator');
|
|
57
|
+
const { SwarmManager: SM } = await import('./swarm-manager');
|
|
58
|
+
const { AgentRecoveryManager: ARM } = await import('./agent-recovery');
|
|
59
|
+
const { TaskAnalyzer: TA } = await import('./task-analyzer');
|
|
60
|
+
const { TaskExecutor: TE } = await import('./task-executor');
|
|
61
|
+
|
|
62
|
+
const redis = new RedisCoordinator();
|
|
63
|
+
await redis.initialize();
|
|
64
|
+
|
|
65
|
+
const logger = new ConsoleLogger('[CFN-Coord]');
|
|
66
|
+
|
|
67
|
+
return {
|
|
68
|
+
redis,
|
|
69
|
+
logger,
|
|
70
|
+
context: new CM(redis, logger),
|
|
71
|
+
completion: new CR(redis, logger),
|
|
72
|
+
results: new RC(redis, logger),
|
|
73
|
+
waiting: new WC(redis, logger),
|
|
74
|
+
swarm: new SM(redis, logger),
|
|
75
|
+
recovery: new ARM(redis, logger),
|
|
76
|
+
analyzer: new TA(redis, logger),
|
|
77
|
+
executor: new TE(redis, logger)
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Re-export mode detection for convenience
|
|
82
|
+
export { detectMode as default } from './mode-detector';
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mode Detection for CFN Loop Agents
|
|
3
|
+
*
|
|
4
|
+
* Detects whether an agent is running in Task Mode or CLI Mode,
|
|
5
|
+
* and whether Redis operations are safe to execute.
|
|
6
|
+
*
|
|
7
|
+
* CRITICAL: Task Mode agents should NOT use Redis (per CLAUDE.md).
|
|
8
|
+
* This module enforces that distinction at runtime.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { ExecutionMode, ModeDetection, Logger } from './types';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Detect execution mode and Redis availability
|
|
15
|
+
*
|
|
16
|
+
* @param logger Optional logger for diagnostics
|
|
17
|
+
* @returns ModeDetection with full context
|
|
18
|
+
*/
|
|
19
|
+
export async function detectMode(logger?: Logger): Promise<ModeDetection> {
|
|
20
|
+
// Check environment variables
|
|
21
|
+
const cfnMode = process.env.CFN_MODE?.toLowerCase();
|
|
22
|
+
const taskId = process.env.TASK_ID;
|
|
23
|
+
const agentId = process.env.AGENT_ID;
|
|
24
|
+
|
|
25
|
+
// Check Redis availability (quick test)
|
|
26
|
+
const redisAvailable = await checkRedisAvailability();
|
|
27
|
+
|
|
28
|
+
// Determine mode
|
|
29
|
+
let mode: ExecutionMode = 'unknown';
|
|
30
|
+
let canUseRedis = false;
|
|
31
|
+
let reason = '';
|
|
32
|
+
|
|
33
|
+
// Explicit CFN_MODE takes precedence
|
|
34
|
+
if (cfnMode === 'task') {
|
|
35
|
+
mode = 'task';
|
|
36
|
+
canUseRedis = false;
|
|
37
|
+
reason = 'CFN_MODE=task (explicit Task Mode - Redis operations disabled)';
|
|
38
|
+
} else if (cfnMode === 'cli') {
|
|
39
|
+
mode = 'cli';
|
|
40
|
+
canUseRedis = redisAvailable;
|
|
41
|
+
reason = redisAvailable
|
|
42
|
+
? 'CFN_MODE=cli (CLI Mode - Redis operations enabled)'
|
|
43
|
+
: 'CFN_MODE=cli but Redis unavailable (Redis operations disabled)';
|
|
44
|
+
}
|
|
45
|
+
// Fallback: Infer mode from environment variables
|
|
46
|
+
else if (taskId && agentId) {
|
|
47
|
+
mode = 'cli';
|
|
48
|
+
canUseRedis = redisAvailable;
|
|
49
|
+
reason = redisAvailable
|
|
50
|
+
? 'TASK_ID and AGENT_ID present, Redis available (inferred CLI Mode)'
|
|
51
|
+
: 'TASK_ID and AGENT_ID present but Redis unavailable (Redis operations disabled)';
|
|
52
|
+
} else {
|
|
53
|
+
mode = 'task';
|
|
54
|
+
canUseRedis = false;
|
|
55
|
+
reason = 'No TASK_ID or AGENT_ID (inferred Task Mode - Redis operations disabled)';
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const detection: ModeDetection = {
|
|
59
|
+
mode,
|
|
60
|
+
redisAvailable,
|
|
61
|
+
taskIdPresent: !!taskId,
|
|
62
|
+
agentIdPresent: !!agentId,
|
|
63
|
+
canUseRedis,
|
|
64
|
+
reason
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
// Log detection result
|
|
68
|
+
if (logger) {
|
|
69
|
+
logger.info('Mode detection complete', detection as unknown as Record<string, unknown>);
|
|
70
|
+
|
|
71
|
+
if (mode === 'task') {
|
|
72
|
+
logger.info('⚠️ Task Mode detected: Redis operations will be stubbed');
|
|
73
|
+
logger.info('💡 Task Mode agents return results directly to Main Chat');
|
|
74
|
+
logger.info('🔧 Redis coordination is only for CLI Mode agents');
|
|
75
|
+
} else if (mode === 'cli' && !redisAvailable) {
|
|
76
|
+
logger.warn('⚠️ CLI Mode but Redis unavailable: Operations will soft-fail');
|
|
77
|
+
logger.warn('💡 Check Redis connection: REDIS_HOST, REDIS_PORT');
|
|
78
|
+
} else if (mode === 'cli' && redisAvailable) {
|
|
79
|
+
logger.info('✅ CLI Mode with Redis: Full coordination available');
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return detection;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Check if Redis is available
|
|
88
|
+
*
|
|
89
|
+
* Quick connectivity test with 1 second timeout.
|
|
90
|
+
* Returns false instead of throwing errors.
|
|
91
|
+
*/
|
|
92
|
+
async function checkRedisAvailability(): Promise<boolean> {
|
|
93
|
+
try {
|
|
94
|
+
// Dynamic import to avoid loading Redis in Task Mode
|
|
95
|
+
const Redis = (await import('ioredis')).default;
|
|
96
|
+
|
|
97
|
+
const host = process.env.REDIS_HOST || 'localhost';
|
|
98
|
+
const port = parseInt(process.env.REDIS_PORT || '6379', 10);
|
|
99
|
+
const password = process.env.REDIS_PASSWORD || process.env.CFN_REDIS_PASSWORD;
|
|
100
|
+
|
|
101
|
+
const client = new Redis({
|
|
102
|
+
host,
|
|
103
|
+
port,
|
|
104
|
+
password: password || undefined,
|
|
105
|
+
connectTimeout: 1000,
|
|
106
|
+
maxRetriesPerRequest: 0,
|
|
107
|
+
retryStrategy: () => null, // Don't retry
|
|
108
|
+
lazyConnect: true
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
try {
|
|
112
|
+
await client.connect();
|
|
113
|
+
const result = await client.ping();
|
|
114
|
+
await client.quit();
|
|
115
|
+
return result === 'PONG';
|
|
116
|
+
} catch {
|
|
117
|
+
try {
|
|
118
|
+
await client.disconnect();
|
|
119
|
+
} catch {
|
|
120
|
+
// Ignore disconnect errors
|
|
121
|
+
}
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
} catch {
|
|
125
|
+
// Redis module not available or connection failed
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Console logger implementation for mode detection
|
|
132
|
+
*
|
|
133
|
+
* Simple console-based logger that doesn't require external dependencies.
|
|
134
|
+
*/
|
|
135
|
+
export class ConsoleLogger implements Logger {
|
|
136
|
+
constructor(private prefix: string = '[CFN-Redis]') {}
|
|
137
|
+
|
|
138
|
+
debug(message: string, context?: Record<string, unknown>): void {
|
|
139
|
+
if (process.env.DEBUG) {
|
|
140
|
+
console.log(`${this.prefix} DEBUG: ${message}`, context || '');
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
info(message: string, context?: Record<string, unknown>): void {
|
|
145
|
+
console.log(`${this.prefix} ${message}`, context || '');
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
warn(message: string, context?: Record<string, unknown>): void {
|
|
149
|
+
console.warn(`${this.prefix} ⚠️ ${message}`, context || '');
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
error(message: string, error?: Error, context?: Record<string, unknown>): void {
|
|
153
|
+
console.error(`${this.prefix} ❌ ${message}`, error?.message || '', context || '');
|
|
154
|
+
}
|
|
155
|
+
}
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Redis Client Wrapper
|
|
3
|
+
*
|
|
4
|
+
* Provides graceful fallback for Task mode and robust connection management
|
|
5
|
+
* Replaces: redis-cli-wrapper.sh, redis-functions.sh
|
|
6
|
+
*
|
|
7
|
+
* Security:
|
|
8
|
+
* - CWE-400: Connection timeouts and circuit breaker
|
|
9
|
+
* - CWE-78: No shell execution
|
|
10
|
+
* - Input validation via branded types
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import Redis, { Redis as RedisClient, RedisOptions } from 'ioredis';
|
|
14
|
+
import {
|
|
15
|
+
RedisConfig,
|
|
16
|
+
RedisConnectionError,
|
|
17
|
+
TimeoutError,
|
|
18
|
+
CircuitBreakerOpenError,
|
|
19
|
+
} from '../types';
|
|
20
|
+
|
|
21
|
+
export interface RedisClientOptions extends RedisConfig {
|
|
22
|
+
gracefulFallback?: boolean; // If true, soft-fail when Redis unavailable (Task mode)
|
|
23
|
+
logger?: Logger;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface Logger {
|
|
27
|
+
info(message: string, ...args: unknown[]): void;
|
|
28
|
+
warn(message: string, ...args: unknown[]): void;
|
|
29
|
+
error(message: string, ...args: unknown[]): void;
|
|
30
|
+
debug(message: string, ...args: unknown[]): void;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
class ConsoleLogger implements Logger {
|
|
34
|
+
info(message: string, ...args: unknown[]): void {
|
|
35
|
+
console.log(`[INFO] ${message}`, ...args);
|
|
36
|
+
}
|
|
37
|
+
warn(message: string, ...args: unknown[]): void {
|
|
38
|
+
console.warn(`[WARN] ${message}`, ...args);
|
|
39
|
+
}
|
|
40
|
+
error(message: string, ...args: unknown[]): void {
|
|
41
|
+
console.error(`[ERROR] ${message}`, ...args);
|
|
42
|
+
}
|
|
43
|
+
debug(message: string, ...args: unknown[]): void {
|
|
44
|
+
if (process.env.DEBUG === 'true') {
|
|
45
|
+
console.log(`[DEBUG] ${message}`, ...args);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
type CircuitBreakerState = 'CLOSED' | 'OPEN' | 'HALF_OPEN';
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Redis Client with graceful fallback and circuit breaker
|
|
54
|
+
*/
|
|
55
|
+
export class CFNRedisClient {
|
|
56
|
+
private client: RedisClient | null = null;
|
|
57
|
+
private readonly options: RedisClientOptions;
|
|
58
|
+
private readonly logger: Logger;
|
|
59
|
+
private isConnected: boolean = false;
|
|
60
|
+
private connectionAttempts: number = 0;
|
|
61
|
+
private lastConnectionAttempt: number = 0;
|
|
62
|
+
private circuitBreakerState: CircuitBreakerState = 'CLOSED';
|
|
63
|
+
private circuitBreakerFailures: number = 0;
|
|
64
|
+
private readonly CIRCUIT_BREAKER_THRESHOLD = 5;
|
|
65
|
+
private readonly CIRCUIT_BREAKER_RESET_TIMEOUT = 60000; // 1 minute
|
|
66
|
+
|
|
67
|
+
constructor(options: RedisClientOptions) {
|
|
68
|
+
this.options = {
|
|
69
|
+
host: options.host || process.env.REDIS_HOST || 'localhost',
|
|
70
|
+
port: options.port || parseInt(process.env.REDIS_PORT || '6379', 10),
|
|
71
|
+
password: options.password || process.env.REDIS_PASSWORD || process.env.CFN_REDIS_PASSWORD,
|
|
72
|
+
db: options.db || parseInt(process.env.REDIS_DB || '0', 10),
|
|
73
|
+
connectTimeout: options.connectTimeout || 1000,
|
|
74
|
+
commandTimeout: options.commandTimeout || 5000,
|
|
75
|
+
enableOfflineQueue: options.enableOfflineQueue ?? false,
|
|
76
|
+
lazyConnect: options.lazyConnect ?? true,
|
|
77
|
+
gracefulFallback: options.gracefulFallback ?? false,
|
|
78
|
+
retryStrategy: options.retryStrategy || this.defaultRetryStrategy.bind(this),
|
|
79
|
+
};
|
|
80
|
+
this.logger = options.logger || new ConsoleLogger();
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Default retry strategy: exponential backoff with max 3 attempts
|
|
85
|
+
*/
|
|
86
|
+
private defaultRetryStrategy(times: number): number | null {
|
|
87
|
+
if (times > 3) {
|
|
88
|
+
this.logger.warn('Redis connection failed after 3 attempts');
|
|
89
|
+
return null; // Stop retrying
|
|
90
|
+
}
|
|
91
|
+
const delay = Math.min(times * 200, 3000);
|
|
92
|
+
this.logger.debug(`Redis retry ${times} in ${delay}ms`);
|
|
93
|
+
return delay;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Connect to Redis (lazy connection)
|
|
98
|
+
*/
|
|
99
|
+
async connect(): Promise<void> {
|
|
100
|
+
if (this.isConnected && this.client) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (this.circuitBreakerState === 'OPEN') {
|
|
105
|
+
const now = Date.now();
|
|
106
|
+
if (now - this.lastConnectionAttempt < this.CIRCUIT_BREAKER_RESET_TIMEOUT) {
|
|
107
|
+
throw new CircuitBreakerOpenError(
|
|
108
|
+
'Circuit breaker is OPEN. Redis connection attempts blocked.'
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
// Transition to HALF_OPEN to test connection
|
|
112
|
+
this.circuitBreakerState = 'HALF_OPEN';
|
|
113
|
+
this.logger.info('Circuit breaker transitioning to HALF_OPEN');
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
this.lastConnectionAttempt = Date.now();
|
|
117
|
+
this.connectionAttempts++;
|
|
118
|
+
|
|
119
|
+
try {
|
|
120
|
+
const redisOptions: RedisOptions = {
|
|
121
|
+
host: this.options.host,
|
|
122
|
+
port: this.options.port,
|
|
123
|
+
password: this.options.password,
|
|
124
|
+
db: this.options.db,
|
|
125
|
+
connectTimeout: this.options.connectTimeout,
|
|
126
|
+
commandTimeout: this.options.commandTimeout,
|
|
127
|
+
enableOfflineQueue: this.options.enableOfflineQueue,
|
|
128
|
+
lazyConnect: this.options.lazyConnect,
|
|
129
|
+
retryStrategy: this.options.retryStrategy,
|
|
130
|
+
maxRetriesPerRequest: 1,
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
this.client = new Redis(redisOptions);
|
|
134
|
+
|
|
135
|
+
// Wait for connection with timeout
|
|
136
|
+
await Promise.race([
|
|
137
|
+
new Promise<void>((resolve, reject) => {
|
|
138
|
+
this.client!.once('ready', () => {
|
|
139
|
+
this.isConnected = true;
|
|
140
|
+
this.circuitBreakerState = 'CLOSED';
|
|
141
|
+
this.circuitBreakerFailures = 0;
|
|
142
|
+
this.logger.info(
|
|
143
|
+
`Redis connected: ${this.options.host}:${this.options.port} (db: ${this.options.db})`
|
|
144
|
+
);
|
|
145
|
+
resolve();
|
|
146
|
+
});
|
|
147
|
+
this.client!.once('error', (err) => {
|
|
148
|
+
reject(err);
|
|
149
|
+
});
|
|
150
|
+
}),
|
|
151
|
+
new Promise<void>((_, reject) =>
|
|
152
|
+
setTimeout(() => reject(new Error('Connection timeout')), this.options.connectTimeout!)
|
|
153
|
+
),
|
|
154
|
+
]);
|
|
155
|
+
|
|
156
|
+
// Verify connection with PING
|
|
157
|
+
await this.client.ping();
|
|
158
|
+
|
|
159
|
+
} catch (error) {
|
|
160
|
+
this.isConnected = false;
|
|
161
|
+
this.circuitBreakerFailures++;
|
|
162
|
+
|
|
163
|
+
if (this.circuitBreakerFailures >= this.CIRCUIT_BREAKER_THRESHOLD) {
|
|
164
|
+
this.circuitBreakerState = 'OPEN';
|
|
165
|
+
this.logger.error(
|
|
166
|
+
`Circuit breaker opened after ${this.circuitBreakerFailures} failures`
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
if (this.options.gracefulFallback) {
|
|
171
|
+
this.logger.warn('⚠️ Redis unavailable - graceful fallback mode (Task mode)');
|
|
172
|
+
this.logger.info('💡 This is expected in Task mode (Main Chat coordination)');
|
|
173
|
+
this.logger.info('🔧 Agents should output JSON directly instead of Redis coordination');
|
|
174
|
+
return; // Soft fail - don't throw
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
178
|
+
throw new RedisConnectionError(
|
|
179
|
+
`Failed to connect to Redis at ${this.options.host}:${this.options.port}: ${errorMessage}`,
|
|
180
|
+
error instanceof Error ? error : undefined
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Check if Redis is available
|
|
187
|
+
*/
|
|
188
|
+
isAvailable(): boolean {
|
|
189
|
+
return this.isConnected && this.client !== null;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Get the underlying Redis client (throws if not connected)
|
|
194
|
+
*/
|
|
195
|
+
getClient(): RedisClient {
|
|
196
|
+
if (!this.client || !this.isConnected) {
|
|
197
|
+
if (this.options.gracefulFallback) {
|
|
198
|
+
throw new Error('Redis not available in graceful fallback mode');
|
|
199
|
+
}
|
|
200
|
+
throw new RedisConnectionError('Redis client is not connected');
|
|
201
|
+
}
|
|
202
|
+
return this.client;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Execute Redis command with timeout and error handling
|
|
207
|
+
*/
|
|
208
|
+
async execute<T>(
|
|
209
|
+
operation: (client: RedisClient) => Promise<T>,
|
|
210
|
+
operationName: string = 'command'
|
|
211
|
+
): Promise<T | null> {
|
|
212
|
+
if (!this.isAvailable()) {
|
|
213
|
+
if (this.options.gracefulFallback) {
|
|
214
|
+
this.logger.debug(`Redis unavailable, skipping: ${operationName}`);
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
217
|
+
throw new RedisConnectionError('Redis not available');
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
try {
|
|
221
|
+
const client = this.getClient();
|
|
222
|
+
const result = await Promise.race([
|
|
223
|
+
operation(client),
|
|
224
|
+
new Promise<never>((_, reject) =>
|
|
225
|
+
setTimeout(
|
|
226
|
+
() => reject(new TimeoutError(`Redis ${operationName} timeout`, this.options.commandTimeout!)),
|
|
227
|
+
this.options.commandTimeout
|
|
228
|
+
)
|
|
229
|
+
),
|
|
230
|
+
]);
|
|
231
|
+
|
|
232
|
+
return result;
|
|
233
|
+
} catch (error) {
|
|
234
|
+
this.logger.error(`Redis ${operationName} failed:`, error);
|
|
235
|
+
|
|
236
|
+
if (error instanceof TimeoutError) {
|
|
237
|
+
throw error;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
if (this.options.gracefulFallback) {
|
|
241
|
+
this.logger.warn(`Graceful fallback for failed ${operationName}`);
|
|
242
|
+
return null;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
throw error;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Ping Redis to check connectivity
|
|
251
|
+
*/
|
|
252
|
+
async ping(): Promise<boolean> {
|
|
253
|
+
try {
|
|
254
|
+
const result = await this.execute(
|
|
255
|
+
(client) => client.ping(),
|
|
256
|
+
'PING'
|
|
257
|
+
);
|
|
258
|
+
return result === 'PONG';
|
|
259
|
+
} catch {
|
|
260
|
+
return false;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Disconnect from Redis
|
|
266
|
+
*/
|
|
267
|
+
async disconnect(): Promise<void> {
|
|
268
|
+
if (this.client) {
|
|
269
|
+
await this.client.quit();
|
|
270
|
+
this.client = null;
|
|
271
|
+
this.isConnected = false;
|
|
272
|
+
this.logger.info('Redis disconnected');
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Get connection statistics
|
|
278
|
+
*/
|
|
279
|
+
getStats(): {
|
|
280
|
+
isConnected: boolean;
|
|
281
|
+
connectionAttempts: number;
|
|
282
|
+
circuitBreakerState: CircuitBreakerState;
|
|
283
|
+
circuitBreakerFailures: number;
|
|
284
|
+
} {
|
|
285
|
+
return {
|
|
286
|
+
isConnected: this.isConnected,
|
|
287
|
+
connectionAttempts: this.connectionAttempts,
|
|
288
|
+
circuitBreakerState: this.circuitBreakerState,
|
|
289
|
+
circuitBreakerFailures: this.circuitBreakerFailures,
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Create a CFNRedisClient instance from environment variables
|
|
296
|
+
*/
|
|
297
|
+
export function createRedisClientFromEnv(gracefulFallback: boolean = false): CFNRedisClient {
|
|
298
|
+
return new CFNRedisClient({
|
|
299
|
+
host: process.env.REDIS_HOST || 'localhost',
|
|
300
|
+
port: parseInt(process.env.REDIS_PORT || '6379', 10),
|
|
301
|
+
password: process.env.REDIS_PASSWORD || process.env.CFN_REDIS_PASSWORD,
|
|
302
|
+
db: parseInt(process.env.REDIS_DB || '0', 10),
|
|
303
|
+
gracefulFallback,
|
|
304
|
+
});
|
|
305
|
+
}
|