claude-flow-novice 2.9.1 → 2.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/cfn-dev-team/CLAUDE.md +1086 -0
- package/.claude/agents/cfn-dev-team/README.md +116 -0
- package/.claude/agents/cfn-dev-team/architecture/api-designer-persona.md +149 -0
- package/.claude/agents/cfn-dev-team/architecture/base-template-generator.md +196 -0
- package/.claude/agents/cfn-dev-team/architecture/goal-planner.md +183 -0
- package/.claude/agents/cfn-dev-team/architecture/planner.md +182 -0
- package/.claude/agents/cfn-dev-team/architecture/system-architect.md +162 -0
- package/.claude/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +540 -0
- package/.claude/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +20 -14
- package/.claude/agents/cfn-dev-team/coordinators/consensus-builder.md +167 -0
- package/.claude/agents/cfn-dev-team/dev-ops/devops-engineer.md +148 -0
- package/.claude/agents/cfn-dev-team/dev-ops/github-commit-agent.md +118 -0
- package/.claude/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +540 -0
- package/.claude/agents/cfn-dev-team/developers/backend-dev.md +20 -0
- package/.claude/agents/cfn-dev-team/developers/data/data-engineer.md +585 -0
- package/.claude/agents/cfn-dev-team/developers/database/database-architect.md +276 -0
- package/.claude/agents/cfn-dev-team/developers/dev-backend-api.md +147 -0
- package/.claude/agents/cfn-dev-team/developers/frontend/mobile-dev.md +218 -0
- package/.claude/agents/cfn-dev-team/developers/{react-frontend-engineer.md → frontend/react-frontend-engineer.md} +53 -5
- package/.claude/agents/cfn-dev-team/developers/frontend/spec-mobile-react-native.md +199 -0
- package/.claude/agents/cfn-dev-team/developers/graphql-specialist.md +615 -0
- package/.claude/agents/cfn-dev-team/developers/rust-developer.md +174 -0
- package/.claude/agents/cfn-dev-team/documentation/README-VALIDATION.md +243 -0
- package/.claude/agents/cfn-dev-team/documentation/agent-type-guidelines.md +465 -0
- package/.claude/agents/cfn-dev-team/documentation/api-docs.md +103 -0
- package/.claude/agents/cfn-dev-team/documentation/docs-api-openapi.md +98 -0
- package/.claude/agents/cfn-dev-team/documentation/pseudocode.md +159 -0
- package/.claude/agents/cfn-dev-team/documentation/specification.md +157 -0
- package/.claude/agents/cfn-dev-team/product-owners/accessibility-advocate-persona.md +109 -0
- package/.claude/agents/cfn-dev-team/{coordinators → product-owners}/cto-agent.md +8 -6
- package/.claude/agents/cfn-dev-team/product-owners/power-user-persona.md +190 -0
- package/.claude/agents/cfn-dev-team/{coordinators → product-owners}/product-owner.md +85 -59
- package/.claude/agents/cfn-dev-team/reviewers/quality/analyze-code-quality.md +141 -0
- package/.claude/agents/cfn-dev-team/reviewers/quality/code-analyzer.md +200 -0
- package/.claude/agents/cfn-dev-team/reviewers/quality/cyclomatic-complexity-reducer.md +321 -0
- package/.claude/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +238 -0
- package/.claude/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +101 -0
- package/.claude/agents/cfn-dev-team/reviewers/quality/quality-metrics.md +375 -0
- package/.claude/agents/cfn-dev-team/reviewers/quality/security-specialist.md +193 -0
- package/.claude/agents/cfn-dev-team/reviewers/reviewer.md +39 -0
- package/.claude/agents/cfn-dev-team/testers/interaction-tester.md +31 -0
- package/.claude/agents/cfn-dev-team/testers/load-testing-specialist.md +469 -0
- package/.claude/agents/cfn-dev-team/testers/playwright-tester.md +24 -0
- package/.claude/agents/cfn-dev-team/testers/tester.md +20 -0
- package/.claude/agents/cfn-dev-team/utility/agent-builder.md +151 -0
- package/.claude/agents/cfn-dev-team/utility/analyst.md +178 -0
- package/.claude/agents/cfn-dev-team/utility/claude-code-expert.md +1043 -0
- package/.claude/agents/cfn-dev-team/utility/code-booster.md +139 -0
- package/.claude/agents/cfn-dev-team/utility/context-curator.md +99 -0
- package/.claude/agents/cfn-dev-team/{developers → utility}/researcher.md +6 -4
- package/.claude/commands/cfn/CFN_LOOP_FRONTEND.md +741 -0
- package/.claude/commands/cfn/CFN_LOOP_TASK_MODE.md +353 -0
- package/.claude/commands/cfn/cfn-loop-frontend.md +555 -0
- package/.claude/commands/cfn/cfn-loop.md +168 -7
- package/{CFN-CLAUDE.md → .claude/root-claude-distribute/CFN-CLAUDE.md} +23 -3
- package/.claude/skills/cfn-ace-system/SKILL.md +364 -0
- package/.claude/skills/cfn-ace-system/add-bullet.sh +145 -0
- package/.claude/skills/cfn-ace-system/analyze-anti-pattern-effectiveness.sh +56 -0
- package/.claude/skills/cfn-ace-system/classify-task.sh +18 -0
- package/.claude/skills/cfn-ace-system/export-ace-metrics.sh +48 -0
- package/.claude/skills/cfn-ace-system/extract-tags.sh +385 -0
- package/.claude/skills/cfn-ace-system/format-negative-context.sh +180 -0
- package/.claude/skills/cfn-ace-system/init-indexes.sql +160 -0
- package/.claude/skills/cfn-ace-system/invoke-context-curate.sh +192 -0
- package/.claude/skills/cfn-ace-system/invoke-context-inject.sh +361 -0
- package/.claude/skills/cfn-ace-system/invoke-context-query.sh +139 -0
- package/.claude/skills/cfn-ace-system/invoke-context-reflect.sh +343 -0
- package/.claude/skills/cfn-ace-system/invoke-context-stats.sh +227 -0
- package/.claude/skills/cfn-ace-system/log-merge.sh +67 -0
- package/.claude/skills/cfn-ace-system/monitor-injection-performance.sh +138 -0
- package/.claude/skills/cfn-ace-system/optimize-injection-pipeline.sh +169 -0
- package/.claude/skills/cfn-ace-system/query-anti-patterns.sh +276 -0
- package/.claude/skills/cfn-ace-system/query-contexts.sh +150 -0
- package/.claude/skills/cfn-ace-system/query-reflections.sh +35 -0
- package/.claude/skills/cfn-ace-system/schema/001-create-context-reflections.sql +237 -0
- package/.claude/skills/cfn-ace-system/schema/README.md +723 -0
- package/.claude/skills/cfn-ace-system/schema/SCHEMA_DESIGN_SUMMARY.md +564 -0
- package/.claude/skills/cfn-ace-system/schema/populate-test-data-simple.sh +62 -0
- package/.claude/skills/cfn-ace-system/schema/populate-test-data.sh +247 -0
- package/.claude/skills/cfn-ace-system/schema/run-migration.sh +231 -0
- package/.claude/skills/cfn-ace-system/schema/validate-schema.sql +280 -0
- package/.claude/skills/cfn-ace-system/score-relevance-adapter.sh +138 -0
- package/.claude/skills/cfn-ace-system/score-relevance.sh +253 -0
- package/.claude/skills/cfn-ace-system/sprint-7-lessons.json +46 -0
- package/.claude/skills/cfn-ace-system/store-reflection.sh +46 -0
- package/.claude/skills/cfn-ace-system/test-ace-skill.sh +312 -0
- package/.claude/skills/cfn-ace-system/track-ab-test.sh +42 -0
- package/.claude/skills/cfn-ace-system/update-reflection.sh +41 -0
- package/.claude/skills/cfn-agent-discovery/SKILL.md +40 -0
- package/.claude/skills/cfn-agent-discovery/agents-registry-clean.json +0 -0
- package/.claude/skills/cfn-agent-discovery/agents-registry-fixed.json +19 -0
- package/.claude/skills/cfn-agent-discovery/agents-registry.json +718 -0
- package/.claude/skills/cfn-agent-discovery/discover-agents.py +184 -0
- package/.claude/skills/cfn-agent-discovery/discover-agents.sh +87 -0
- package/.claude/skills/cfn-agent-discovery/invoke-registry.sh +11 -0
- package/.claude/skills/cfn-agent-discovery/temp_script.py +0 -0
- package/.claude/skills/cfn-agent-execution/execute-agent.sh +126 -0
- package/.claude/skills/cfn-agent-output-processing/SKILL.md +359 -0
- package/.claude/skills/cfn-agent-selector/SKILL.md +90 -0
- package/.claude/skills/cfn-agent-selector/select-agents.sh +112 -0
- package/.claude/skills/cfn-agent-spawning/SKILL.md +135 -0
- package/.claude/skills/cfn-agent-spawning/agent-selection-guide.md +814 -0
- package/.claude/skills/cfn-agent-spawning/check-dependencies.sh +30 -0
- package/.claude/skills/cfn-agent-spawning/spawn-agent.sh +263 -0
- package/.claude/skills/cfn-agent-spawning/spawn-templates.sh +613 -0
- package/.claude/skills/cfn-analytics/description-refinement-guide.md +164 -0
- package/.claude/skills/cfn-analytics/log-skill-invocation.js +122 -0
- package/.claude/skills/cfn-analytics/run-production-criteria-tests.sh +126 -0
- package/.claude/skills/cfn-analytics/skill-analytics-dashboard.js +113 -0
- package/.claude/skills/cfn-analytics/skill-invocation-hook.sh +28 -0
- package/.claude/skills/cfn-analytics/skill-invocations.sql +58 -0
- package/.claude/skills/cfn-analytics/test-corpus.json +32 -0
- package/.claude/skills/cfn-analytics/test-data-generator.js +115 -0
- package/.claude/skills/cfn-analytics/test-manual-override-rate.js +285 -0
- package/.claude/skills/cfn-analytics/validate-skill-selection.js +188 -0
- package/.claude/skills/cfn-config-management/SKILL.md +34 -0
- package/.claude/skills/cfn-config-management/check-dependencies.sh +56 -0
- package/.claude/skills/cfn-config-management/config.json +32 -0
- package/.claude/skills/cfn-config-management/manage-config.sh +113 -0
- package/.claude/skills/cfn-event-bus/SKILL.md +412 -0
- package/.claude/skills/cfn-event-bus/config.json +111 -0
- package/.claude/skills/cfn-event-bus/eventbus-wrapper.cjs +69 -0
- package/.claude/skills/cfn-event-bus/invoke-event-publish.sh +147 -0
- package/.claude/skills/cfn-event-bus/invoke-event-subscribe.sh +171 -0
- package/.claude/skills/cfn-event-bus/invoke-lifecycle-track.sh +201 -0
- package/.claude/skills/cfn-event-bus/test-event-bus.sh +280 -0
- package/.claude/skills/cfn-fleet-manager/SKILL.md +412 -0
- package/.claude/skills/cfn-fleet-manager/config.json +60 -0
- package/.claude/skills/cfn-fleet-manager/invoke-fleet-allocate.sh +182 -0
- package/.claude/skills/cfn-fleet-manager/invoke-fleet-balance.sh +239 -0
- package/.claude/skills/cfn-fleet-manager/invoke-fleet-metrics.sh +193 -0
- package/.claude/skills/cfn-fleet-manager/invoke-fleet-register.sh +124 -0
- package/.claude/skills/cfn-fleet-manager/test-fleet-manager.sh +345 -0
- package/.claude/skills/cfn-hook-pipeline/SKILL.md +148 -0
- package/.claude/skills/cfn-hook-pipeline/auto-resolve.sh +66 -0
- package/.claude/skills/cfn-hook-pipeline/check-dependencies.sh +40 -0
- package/.claude/skills/cfn-hook-pipeline/feedback-resolver.sh +452 -0
- package/.claude/skills/cfn-hook-pipeline/post-edit-handler.sh +154 -0
- package/.claude/skills/cfn-hook-pipeline/security-scan.json +60 -0
- package/.claude/skills/cfn-hook-pipeline/security-scanner.sh +121 -0
- package/.claude/skills/cfn-hook-pipeline/test-root-warning-resolution.sh +148 -0
- package/.claude/skills/cfn-hybrid-routing/SKILL.md +46 -0
- package/.claude/skills/cfn-hybrid-routing/check-dependencies.sh +52 -0
- package/.claude/skills/cfn-hybrid-routing/config.json +26 -0
- package/.claude/skills/cfn-hybrid-routing/spawn-worker.sh +44 -0
- package/.claude/skills/cfn-loop-orchestration/SKILL.md +299 -0
- package/.claude/skills/cfn-loop-orchestration/helpers/auto-tune-timeouts.sh +228 -0
- package/.claude/skills/cfn-loop-orchestration/helpers/consensus.sh +84 -0
- package/.claude/skills/cfn-loop-orchestration/helpers/context-injection.sh +142 -0
- package/.claude/skills/cfn-loop-orchestration/helpers/context-lookup.sh +359 -0
- package/.claude/skills/cfn-loop-orchestration/helpers/deliverable-verifier.sh +71 -0
- package/.claude/skills/cfn-loop-orchestration/helpers/gate-check.sh +90 -0
- package/.claude/skills/cfn-loop-orchestration/helpers/iteration-manager.sh +87 -0
- package/.claude/skills/cfn-loop-orchestration/helpers/spawn-agents.sh +271 -0
- package/.claude/skills/cfn-loop-orchestration/helpers/timeout-calculator.sh +51 -0
- package/.claude/skills/cfn-loop-orchestration/inject-loop-context.sh +41 -0
- package/.claude/skills/cfn-loop-orchestration/monitor-execution.sh +156 -0
- package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +884 -0
- package/.claude/skills/cfn-loop-orchestration/orchestrate.sh.backup +840 -0
- package/.claude/skills/cfn-loop-orchestration/security_utils.sh +99 -0
- package/.claude/skills/cfn-loop-orchestration/test-cfn-orchestration.sh +281 -0
- package/.claude/skills/cfn-loop-orchestration/test-edge-cases.sh +188 -0
- package/.claude/skills/cfn-loop-validation/SKILL.md +353 -0
- package/.claude/skills/cfn-loop-validation/check-dependencies.sh +31 -0
- package/.claude/skills/cfn-loop-validation/config.json +161 -0
- package/.claude/skills/cfn-loop-validation/consensus-calculator.js +477 -0
- package/.claude/skills/cfn-loop-validation/evidence-chain.sql +163 -0
- package/.claude/skills/cfn-loop-validation/examples/README.md +453 -0
- package/.claude/skills/cfn-loop-validation/examples/coordinator-full-cfn-loop.sh +234 -0
- package/.claude/skills/cfn-loop-validation/examples/coordinator-loop2-consensus.sh +132 -0
- package/.claude/skills/cfn-loop-validation/examples/coordinator-loop3-gate.sh +115 -0
- package/.claude/skills/cfn-loop-validation/examples/coordinator-redis-integration.sh +186 -0
- package/.claude/skills/cfn-loop-validation/orchestrate-cfn-loop.sh +252 -0
- package/.claude/skills/cfn-loop-validation/validate-iteration.sh +134 -0
- package/.claude/skills/cfn-process-lifecycle/SKILL.md +39 -0
- package/.claude/skills/cfn-process-lifecycle/check-dependencies.sh +58 -0
- package/.claude/skills/cfn-process-lifecycle/config.json +39 -0
- package/.claude/skills/cfn-process-lifecycle/process-manager.sh +144 -0
- package/.claude/skills/cfn-product-owner-decision/SKILL.md +332 -0
- package/.claude/skills/cfn-product-owner-decision/execute-decision.sh +176 -0
- package/.claude/skills/cfn-product-owner-decision/parse-decision.sh +66 -0
- package/.claude/skills/cfn-product-owner-decision/validate-deliverables.sh +82 -0
- package/.claude/skills/cfn-redis-coordination/AGENT_LOGGING.md +280 -0
- package/.claude/skills/cfn-redis-coordination/BZPOPMIN_FIX_SUMMARY.md +209 -0
- package/.claude/skills/cfn-redis-coordination/HEARTBEAT.md +57 -0
- package/.claude/skills/cfn-redis-coordination/HEARTBEAT_MONITORING.md +267 -0
- package/.claude/skills/cfn-redis-coordination/LOGGING.md +260 -0
- package/.claude/skills/cfn-redis-coordination/SECURITY_REVIEW.md +25 -0
- package/.claude/skills/cfn-redis-coordination/SHUTDOWN_HANDLING.md +164 -0
- package/.claude/skills/cfn-redis-coordination/SKILL.md +720 -0
- package/.claude/skills/cfn-redis-coordination/agent-log.sh +124 -0
- package/.claude/skills/cfn-redis-coordination/agent-recovery.sh +75 -0
- package/.claude/skills/cfn-redis-coordination/analyze-task-complexity.sh +277 -0
- package/.claude/skills/cfn-redis-coordination/cancel-swarm.sh +221 -0
- package/.claude/skills/cfn-redis-coordination/cfn-loop-exec.sh +468 -0
- package/.claude/skills/cfn-redis-coordination/cfn-loop-relaunch.sh +29 -0
- package/.claude/skills/cfn-redis-coordination/check-dependencies.sh +32 -0
- package/.claude/skills/cfn-redis-coordination/collect-confidence-scores.sh +179 -0
- package/.claude/skills/cfn-redis-coordination/collect-results.sh +75 -0
- package/.claude/skills/cfn-redis-coordination/complete-swarm.sh +75 -0
- package/.claude/skills/cfn-redis-coordination/config.json +61 -0
- package/.claude/skills/cfn-redis-coordination/data/cfn-loop.db +0 -0
- package/.claude/skills/cfn-redis-coordination/demos/phase4-wake-queue-test-report.md +82 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-bzpopmin-fix.sh +274 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-cancel-swarm.sh +276 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-dlq.sh +129 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-iteration-feedback.sh +320 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-orchestrator.sh +249 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-priority-wake-phase4-unix.sh +148 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-priority-wake-phase4.sh +163 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-priority-wake.sh +138 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-quick-fix.sh +81 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-quorum-absolute.sh +45 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-quorum-fallback.sh +68 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-quorum-percentage.sh +56 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-quorum-with-retry.sh +81 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-quorum.sh +57 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-shutdown-handling.sh +187 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-shutdown.sh +160 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-utils-unix.sh +97 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-utils.sh +97 -0
- package/.claude/skills/cfn-redis-coordination/demos/test-waiting-mode.sh +59 -0
- package/.claude/skills/cfn-redis-coordination/examples/README.md +73 -0
- package/.claude/skills/cfn-redis-coordination/examples/grafana-dashboard.json +352 -0
- package/.claude/skills/cfn-redis-coordination/examples/hierarchical-pattern.sh +127 -0
- package/.claude/skills/cfn-redis-coordination/examples/mesh-pattern.sh +171 -0
- package/.claude/skills/cfn-redis-coordination/examples/timeout-handling.sh +227 -0
- package/.claude/skills/cfn-redis-coordination/examples/waiting-mode-pattern.sh +239 -0
- package/.claude/skills/cfn-redis-coordination/execute-product-owner-decision.sh +258 -0
- package/.claude/skills/cfn-redis-coordination/get-agent-timeout.sh +177 -0
- package/.claude/skills/cfn-redis-coordination/heartbeat-functions.sh +137 -0
- package/.claude/skills/cfn-redis-coordination/heartbeat-protocol.md +106 -0
- package/.claude/skills/cfn-redis-coordination/heartbeat.sh +126 -0
- package/.claude/skills/cfn-redis-coordination/init-swarm.sh +148 -0
- package/.claude/skills/cfn-redis-coordination/invoke-redis-pattern.sh +220 -0
- package/.claude/skills/cfn-redis-coordination/invoke-waiting-mode.sh +283 -0
- package/.claude/skills/cfn-redis-coordination/invoke-waiting-mode.sh.backup-p7 +423 -0
- package/.claude/skills/cfn-redis-coordination/list-active-swarms.sh +147 -0
- package/.claude/skills/cfn-redis-coordination/log-event.sh +109 -0
- package/.claude/skills/cfn-redis-coordination/metrics-export.sh +674 -0
- package/.claude/skills/cfn-redis-coordination/metrics-schema.json +66 -0
- package/.claude/skills/cfn-redis-coordination/metrics-storage.md +31 -0
- package/.claude/skills/cfn-redis-coordination/monitor-cfn-violations.sh +391 -0
- package/.claude/skills/cfn-redis-coordination/monitor-heartbeats.sh +101 -0
- package/.claude/skills/cfn-redis-coordination/orchestrate-cfn-loop-v3.sh +141 -0
- package/.claude/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh +31 -0
- package/.claude/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.backup +38 -0
- package/.claude/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.backup-1761167675 +1672 -0
- package/.claude/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.backup-p5 +1604 -0
- package/.claude/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.backup-phase1 +1550 -0
- package/.claude/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.backup-phase2 +1621 -0
- package/.claude/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.backup-phase3 +1621 -0
- package/.claude/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.bak +0 -0
- package/.claude/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.broken +1627 -0
- package/.claude/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.corrupted +80 -0
- package/.claude/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.deprecated +1864 -0
- package/.claude/skills/cfn-redis-coordination/priority-wake-mechanism.md +75 -0
- package/.claude/skills/cfn-redis-coordination/priority_wake.py +134 -0
- package/.claude/skills/cfn-redis-coordination/query-dlq.sh +162 -0
- package/.claude/skills/cfn-redis-coordination/query-logs.sh +103 -0
- package/.claude/skills/cfn-redis-coordination/redis-pattern.sh +619 -0
- package/.claude/skills/cfn-redis-coordination/retrieve-context.sh +58 -0
- package/.claude/skills/cfn-redis-coordination/select-specialist-agent.sh +371 -0
- package/.claude/skills/cfn-redis-coordination/semantic-match-tfidf.py +252 -0
- package/.claude/skills/cfn-redis-coordination/send-heartbeat.sh +165 -0
- package/.claude/skills/cfn-redis-coordination/signal.sh +38 -0
- package/.claude/skills/cfn-redis-coordination/store-context.sh +86 -0
- package/.claude/skills/cfn-redis-coordination/store-epic-context.sh +123 -0
- package/.claude/skills/cfn-redis-coordination/test-context-injection.sh +354 -0
- package/.claude/skills/cfn-redis-coordination/test-timeout-enforcement.sh +513 -0
- package/.claude/skills/cfn-redis-coordination/tests/convert-line-endings.sh +15 -0
- package/.claude/skills/cfn-redis-coordination/tests/dlq-functionality-test.sh +102 -0
- package/.claude/skills/cfn-redis-coordination/tests/edge-cases-test.sh +99 -0
- package/.claude/skills/cfn-redis-coordination/tests/integration-test.sh +170 -0
- package/.claude/skills/cfn-redis-coordination/tests/retry-mechanism-test.sh +82 -0
- package/.claude/skills/cfn-redis-coordination/tests/run-test-suite.sh +92 -0
- package/.claude/skills/cfn-redis-coordination/tests/run-tests.sh +4 -0
- package/.claude/skills/cfn-redis-coordination/tests/test-heartbeat-monitoring.sh +418 -0
- package/.claude/skills/cfn-redis-coordination/tests/test-heartbeat-simple.sh +124 -0
- package/.claude/skills/cfn-redis-coordination/tests/test-primitives.sh +166 -0
- package/.claude/skills/cfn-redis-coordination/tests/test-utils.sh +54 -0
- package/.claude/skills/cfn-redis-coordination/tests/test_coordination_primitives.sh.deprecated +20 -0
- package/.claude/skills/cfn-redis-coordination/tests/test_utils.sh +49 -0
- package/.claude/skills/cfn-redis-coordination/v2_modularization/core_orchestration.sh +76 -0
- package/.claude/skills/cfn-redis-coordination/validate-parameters.sh +492 -0
- package/.claude/skills/cfn-sqlite-memory/IMPLEMENTATION_REPORT.md +393 -0
- package/.claude/skills/cfn-sqlite-memory/QUICK_REFERENCE.md +204 -0
- package/.claude/skills/cfn-sqlite-memory/SKILL.md +415 -0
- package/.claude/skills/cfn-sqlite-memory/acl-queries.sql +452 -0
- package/.claude/skills/cfn-sqlite-memory/check-dependencies.sh +36 -0
- package/.claude/skills/cfn-sqlite-memory/config.json +45 -0
- package/.claude/skills/cfn-sqlite-memory/memory-cli.sh +88 -0
- package/.claude/skills/cfn-sqlite-memory/test-state-persistence.js +187 -0
- package/.claude/skills/cfn-sqlite-memory/ttl-cleanup.sh +274 -0
- package/.claude/skills/cfn-test-execution/SKILL.md +128 -0
- package/.claude/skills/cfn-test-execution/check-dependencies.sh +36 -0
- package/.claude/skills/cfn-test-execution/test-cache-reader.sh +134 -0
- package/.claude/skills/cfn-test-execution/test-concurrent-conflicts.sh +115 -0
- package/.claude/skills/cfn-test-execution/test-coordinator-pattern.sh +109 -0
- package/.claude/skills/cfn-transparency-middleware/Cargo.toml +18 -0
- package/.claude/skills/cfn-transparency-middleware/SECURITY.md +41 -0
- package/.claude/skills/cfn-transparency-middleware/SKILL.md +91 -0
- package/.claude/skills/cfn-transparency-middleware/TEST_RESULTS.md +174 -0
- package/.claude/skills/cfn-transparency-middleware/config.json +31 -0
- package/.claude/skills/cfn-transparency-middleware/examples/basic-usage.ts +39 -0
- package/.claude/skills/cfn-transparency-middleware/examples/batch-processing.ts +52 -0
- package/.claude/skills/cfn-transparency-middleware/examples/custom-filtering.ts +61 -0
- package/.claude/skills/cfn-transparency-middleware/invoke-transparency-filter.sh +98 -0
- package/.claude/skills/cfn-transparency-middleware/invoke-transparency-init.sh +224 -0
- package/.claude/skills/cfn-transparency-middleware/invoke-transparency-level.sh +333 -0
- package/.claude/skills/cfn-transparency-middleware/invoke-transparency-metrics.sh +345 -0
- package/.claude/skills/cfn-transparency-middleware/invoke-transparency-observe.sh +140 -0
- package/.claude/skills/cfn-transparency-middleware/invoke-transparency-stop.sh +235 -0
- package/.claude/skills/cfn-transparency-middleware/memory_query.rs +85 -0
- package/.claude/skills/cfn-transparency-middleware/memory_repository.rs +140 -0
- package/.claude/skills/cfn-transparency-middleware/memory_schema.rs +64 -0
- package/.claude/skills/cfn-transparency-middleware/middleware-config.sh +29 -0
- package/.claude/skills/cfn-transparency-middleware/performance-benchmark.sh +79 -0
- package/.claude/skills/cfn-transparency-middleware/test-e2e.sh +406 -0
- package/.claude/skills/cfn-transparency-middleware/test-integration.sh +162 -0
- package/.claude/skills/cfn-transparency-middleware/test-transparency-skill.sh +368 -0
- package/.claude/skills/cfn-transparency-middleware/test-transparency-skill.sh.unix +126 -0
- package/.claude/skills/cfn-transparency-middleware/tests/input-validation.sh +93 -0
- package/.claude/skills/cfn-transparency-middleware/wrap-agent.sh +132 -0
- package/.claude/skills/cfn-webapp-testing/SCREENSHOT_NAMING_CONVENTION.md +547 -0
- package/.claude/skills/cfn-webapp-testing/SKILL.md +877 -0
- package/.claude/skills/cfn-webapp-testing/capture-screenshot.sh +238 -0
- package/.claude/skills/cfn-webapp-testing/cfn-loop-integration.sh +265 -0
- package/.claude/skills/cfn-webapp-testing/compare-screenshots.sh +199 -0
- package/.claude/skills/cfn-webapp-testing/init-storage.sh +150 -0
- package/.claude/skills/cfn-webapp-testing/set-baseline.sh +196 -0
- package/.claude/skills/cfn-webapp-testing/test-webapp-testing.sh +233 -0
- package/README.md +51 -2
- package/dist/ace/ace-reflector.js +109 -10
- package/dist/ace/ace-reflector.js.map +1 -1
- package/dist/cli/agent-executor.js +1 -1
- package/dist/cli/agent-executor.js.map +1 -1
- package/package.json +43 -7
- package/readme/README.md +15 -4
- package/scripts/init-project.js +39 -2
- package/scripts/run-marketing-tests.sh +43 -0
- package/scripts/update_paths.sh +47 -0
- package/tools/install-lizard.sh +37 -0
- package/tools/simple-complexity.sh +44 -0
- package/.claude/agents/cfn-dev-team/developers/coder.md +0 -270
- package/.claude/agents/cfn-dev-team/developers/state-architect.md +0 -127
- package/.claude/agents/cfn-dev-team/reviewers/code-quality-validator.md +0 -128
- /package/.claude/agents/cfn-dev-team/developers/{ui-designer.md → frontend/ui-designer.md} +0 -0
- /package/.claude/agents/cfn-dev-team/{coordinators → product-owners}/product-owner-agent.md +0 -0
|
@@ -9,16 +9,89 @@ export class ACEReflector {
|
|
|
9
9
|
}
|
|
10
10
|
async initialize() {
|
|
11
11
|
await this.memorySystem.initialize();
|
|
12
|
-
//
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
12
|
+
// Note: Production schema is managed by .claude/skills/cfn-ace-system/schema/001-create-context-reflections.sql
|
|
13
|
+
// This initialization ensures compatibility with the production schema
|
|
14
|
+
// Apply performance indexes from init-indexes.sql
|
|
15
|
+
await this.applyPerformanceIndexes();
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Apply performance indexes for context reflection queries
|
|
19
|
+
* Based on .claude/skills/cfn-ace-system/init-indexes.sql
|
|
20
|
+
* Target: < 100ms query time with 1000+ reflections
|
|
21
|
+
*/ async applyPerformanceIndexes() {
|
|
22
|
+
const db = this.memorySystem['db'];
|
|
23
|
+
if (!db) {
|
|
24
|
+
console.warn('⚠️ Database not initialized, skipping index creation');
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
// Check if context_reflections table exists
|
|
28
|
+
const tableExists = await db.get("SELECT COUNT(*) as count FROM sqlite_master WHERE type='table' AND name='context_reflections'");
|
|
29
|
+
if (!tableExists || tableExists.count === 0) {
|
|
30
|
+
console.warn('⚠️ context_reflections table not found. Run schema migration first.');
|
|
31
|
+
console.warn(' Use: .claude/skills/cfn-ace-system/schema/run-migration.sh');
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const indexes = [
|
|
35
|
+
// JSON Tag Extraction Index (most common query pattern)
|
|
36
|
+
{
|
|
37
|
+
name: 'idx_reflections_tags',
|
|
38
|
+
sql: `CREATE INDEX IF NOT EXISTS idx_reflections_tags
|
|
39
|
+
ON context_reflections(json_extract(metadata, '$.tags'))`
|
|
40
|
+
},
|
|
41
|
+
// Domain Classification Index
|
|
42
|
+
{
|
|
43
|
+
name: 'idx_reflections_domain',
|
|
44
|
+
sql: `CREATE INDEX IF NOT EXISTS idx_reflections_domain
|
|
45
|
+
ON context_reflections(json_extract(metadata, '$.domain'))`
|
|
46
|
+
},
|
|
47
|
+
// Confidence Score Index (DESC for high-to-low sorting)
|
|
48
|
+
{
|
|
49
|
+
name: 'idx_reflections_confidence',
|
|
50
|
+
sql: `CREATE INDEX IF NOT EXISTS idx_reflections_confidence
|
|
51
|
+
ON context_reflections(confidence DESC)`
|
|
52
|
+
},
|
|
53
|
+
// Recency Index (DESC for chronological sorting)
|
|
54
|
+
{
|
|
55
|
+
name: 'idx_reflections_created_at',
|
|
56
|
+
sql: `CREATE INDEX IF NOT EXISTS idx_reflections_created_at
|
|
57
|
+
ON context_reflections(created_at DESC)`
|
|
58
|
+
},
|
|
59
|
+
// Composite Index: Domain + Confidence + Recency
|
|
60
|
+
{
|
|
61
|
+
name: 'idx_reflections_domain_conf_date',
|
|
62
|
+
sql: `CREATE INDEX IF NOT EXISTS idx_reflections_domain_conf_date
|
|
63
|
+
ON context_reflections(
|
|
64
|
+
json_extract(metadata, '$.domain'),
|
|
65
|
+
confidence,
|
|
66
|
+
created_at DESC
|
|
67
|
+
)`
|
|
68
|
+
},
|
|
69
|
+
// Composite Index: Confidence + Recency (covering index)
|
|
70
|
+
{
|
|
71
|
+
name: 'idx_reflections_conf_date',
|
|
72
|
+
sql: `CREATE INDEX IF NOT EXISTS idx_reflections_conf_date
|
|
73
|
+
ON context_reflections(
|
|
74
|
+
confidence DESC,
|
|
75
|
+
created_at DESC
|
|
76
|
+
)`
|
|
77
|
+
}
|
|
78
|
+
];
|
|
79
|
+
let successCount = 0;
|
|
80
|
+
const failedIndexes = [];
|
|
81
|
+
for (const index of indexes){
|
|
82
|
+
try {
|
|
83
|
+
await db.run(index.sql);
|
|
84
|
+
successCount++;
|
|
85
|
+
} catch (error) {
|
|
86
|
+
failedIndexes.push(index.name);
|
|
87
|
+
console.error(`❌ Failed to create index ${index.name}:`, error);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (successCount === indexes.length) {
|
|
91
|
+
console.log(`✅ Applied ${successCount} performance indexes (target: <100ms query time)`);
|
|
92
|
+
} else {
|
|
93
|
+
console.warn(`⚠️ Applied ${successCount}/${indexes.length} indexes. Failed: ${failedIndexes.join(', ')}`);
|
|
94
|
+
}
|
|
22
95
|
}
|
|
23
96
|
async reflect(context, options = {}) {
|
|
24
97
|
const reflection = {
|
|
@@ -29,6 +102,32 @@ export class ACEReflector {
|
|
|
29
102
|
insights: this.generateInsights(context)
|
|
30
103
|
};
|
|
31
104
|
await this.memorySystem.store(`reflection:${reflection.id}`, reflection, AccessLevel.SYSTEM);
|
|
105
|
+
// Insert reflection data into SQL table (production schema)
|
|
106
|
+
await this.memorySystem['db']?.run(`INSERT INTO context_reflections (
|
|
107
|
+
id, reflection_type, task_id, swarm_id, execution_trace,
|
|
108
|
+
feedback_signals, extracted_lessons, metadata, confidence
|
|
109
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
110
|
+
reflection.id,
|
|
111
|
+
'strategy',
|
|
112
|
+
reflection.context.task_id || 'unknown',
|
|
113
|
+
reflection.context.swarm_id || 'default',
|
|
114
|
+
JSON.stringify({
|
|
115
|
+
timestamp: reflection.timestamp,
|
|
116
|
+
complexity: reflection.complexity
|
|
117
|
+
}),
|
|
118
|
+
JSON.stringify({
|
|
119
|
+
insights: reflection.insights
|
|
120
|
+
}),
|
|
121
|
+
JSON.stringify({
|
|
122
|
+
strategies: reflection.insights,
|
|
123
|
+
antiPatterns: [],
|
|
124
|
+
edgeCases: []
|
|
125
|
+
}),
|
|
126
|
+
JSON.stringify({
|
|
127
|
+
complexity: reflection.complexity
|
|
128
|
+
}),
|
|
129
|
+
reflection.complexity // Use complexity as confidence proxy
|
|
130
|
+
]);
|
|
32
131
|
return reflection;
|
|
33
132
|
}
|
|
34
133
|
calculateComplexity(context) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/ace/ace-reflector.ts"],"sourcesContent":["import { SQLiteMemorySystem } from '../memory/sqlite-memory-system.js';\r\nimport { MemoryAdapter, AccessLevel } from '../memory/memory-adapter.js';\r\n\r\nexport interface CognitiveReflection {\r\n id: string;\r\n timestamp: number;\r\n complexity: number;\r\n context: Record<string, any>;\r\n insights: string[];\r\n}\r\n\r\nexport class ACEReflector {\r\n private memorySystem: SQLiteMemorySystem;\r\n private memoryAdapter: MemoryAdapter;\r\n\r\n constructor(\r\n memoryPath: string = './ace-reflections.sqlite'\r\n ) {\r\n this.memorySystem = new SQLiteMemorySystem(memoryPath);\r\n this.memoryAdapter = new MemoryAdapter(AccessLevel.SYSTEM);\r\n }\r\n\r\n async initialize(): Promise<void> {\r\n await this.memorySystem.initialize();\r\n\r\n // Create specialized reflection tables\r\n await this.memorySystem['db']?.exec(`\r\n CREATE TABLE IF NOT EXISTS cognitive_reflections (\r\n id TEXT PRIMARY KEY,\r\n timestamp INTEGER,\r\n complexity REAL,\r\n context BLOB,\r\n insights TEXT\r\n )\r\n `);\r\n }\r\n\r\n async reflect(\r\n context: Record<string, any>,\r\n options: {\r\n complexity?: number\r\n } = {}\r\n ): Promise<CognitiveReflection> {\r\n const reflection: CognitiveReflection = {\r\n id: `ref-${Date.now()}`,\r\n timestamp: Date.now(),\r\n complexity: options.complexity ?? this.calculateComplexity(context),\r\n context,\r\n insights: this.generateInsights(context)\r\n };\r\n\r\n await this.memorySystem.store(\r\n `reflection:${reflection.id}`,\r\n reflection,\r\n AccessLevel.SYSTEM\r\n );\r\n\r\n return reflection;\r\n }\r\n\r\n private calculateComplexity(\r\n context: Record<string, any>\r\n ): number {\r\n // Advanced complexity calculation\r\n const keyCount = Object.keys(context).length;\r\n const contentLength = JSON.stringify(context).length;\r\n\r\n return Math.log(keyCount * contentLength) / Math.log(10);\r\n }\r\n\r\n private generateInsights(\r\n context: Record<string, any>\r\n ): string[] {\r\n // Meta-cognitive analysis\r\n const insights: string[] = [];\r\n\r\n if (context.task && context.constraints) {\r\n insights.push(`Task complexity requires careful constraint management`);\r\n }\r\n\r\n if (context.previousResults) {\r\n insights.push(`Learning from past iterations`);\r\n }\r\n\r\n return insights;\r\n }\r\n\r\n async retrieveReflection(\r\n reflectionId: string\r\n ): Promise<CognitiveReflection | null> {\r\n return await this.memorySystem.retrieve(\r\n `reflection:${reflectionId}`,\r\n AccessLevel.SYSTEM\r\n );\r\n }\r\n}\r\n\r\nexport default ACEReflector;"],"names":["SQLiteMemorySystem","MemoryAdapter","AccessLevel","ACEReflector","memorySystem","memoryAdapter","memoryPath","SYSTEM","initialize","exec","reflect","context","options","reflection","id","Date","now","timestamp","complexity","calculateComplexity","insights","generateInsights","store","keyCount","Object","keys","length","contentLength","JSON","stringify","Math","log","task","constraints","push","previousResults","retrieveReflection","reflectionId","retrieve"],"mappings":"AAAA,SAASA,kBAAkB,QAAQ,oCAAoC;AACvE,SAASC,aAAa,EAAEC,WAAW,QAAQ,8BAA8B;AAUzE,OAAO,MAAMC;IACHC,aAAiC;IACjCC,cAA6B;IAErC,YACEC,aAAqB,0BAA0B,CAC/C;QACA,IAAI,CAACF,YAAY,GAAG,IAAIJ,mBAAmBM;QAC3C,IAAI,CAACD,aAAa,GAAG,IAAIJ,cAAcC,YAAYK,MAAM;IAC3D;IAEA,MAAMC,aAA4B;QAChC,MAAM,IAAI,CAACJ,YAAY,CAACI,UAAU;QAElC,uCAAuC;QACvC,MAAM,IAAI,CAACJ,YAAY,CAAC,KAAK,EAAEK,KAAK,CAAC;;;;;;;;IAQrC,CAAC;IACH;IAEA,MAAMC,QACJC,OAA4B,EAC5BC,UAEI,CAAC,CAAC,EACwB;QAC9B,MAAMC,aAAkC;YACtCC,IAAI,CAAC,IAAI,EAAEC,KAAKC,GAAG,IAAI;YACvBC,WAAWF,KAAKC,GAAG;YACnBE,YAAYN,QAAQM,UAAU,IAAI,IAAI,CAACC,mBAAmB,CAACR;YAC3DA;YACAS,UAAU,IAAI,CAACC,gBAAgB,CAACV;QAClC;QAEA,MAAM,IAAI,CAACP,YAAY,CAACkB,KAAK,CAC3B,CAAC,WAAW,EAAET,WAAWC,EAAE,EAAE,EAC7BD,YACAX,YAAYK,MAAM;QAGpB,OAAOM;IACT;IAEQM,oBACNR,OAA4B,EACpB;QACR,kCAAkC;QAClC,MAAMY,WAAWC,OAAOC,IAAI,CAACd,SAASe,MAAM;QAC5C,MAAMC,gBAAgBC,KAAKC,SAAS,CAAClB,SAASe,MAAM;QAEpD,OAAOI,KAAKC,GAAG,CAACR,WAAWI,iBAAiBG,KAAKC,GAAG,CAAC;IACvD;IAEQV,iBACNV,OAA4B,EAClB;QACV,0BAA0B;QAC1B,MAAMS,WAAqB,EAAE;QAE7B,IAAIT,QAAQqB,IAAI,IAAIrB,QAAQsB,WAAW,EAAE;YACvCb,SAASc,IAAI,CAAC,CAAC,sDAAsD,CAAC;QACxE;QAEA,IAAIvB,QAAQwB,eAAe,EAAE;YAC3Bf,SAASc,IAAI,CAAC,CAAC,6BAA6B,CAAC;QAC/C;QAEA,OAAOd;IACT;IAEA,MAAMgB,mBACJC,YAAoB,EACiB;QACrC,OAAO,MAAM,IAAI,CAACjC,YAAY,CAACkC,QAAQ,CACrC,CAAC,WAAW,EAAED,cAAc,EAC5BnC,YAAYK,MAAM;IAEtB;AACF;AAEA,eAAeJ,aAAa"}
|
|
1
|
+
{"version":3,"sources":["../../src/ace/ace-reflector.ts"],"sourcesContent":["import { SQLiteMemorySystem } from '../memory/sqlite-memory-system.js';\r\nimport { MemoryAdapter, AccessLevel } from '../memory/memory-adapter.js';\r\n\r\nexport interface CognitiveReflection {\r\n id: string;\r\n timestamp: number;\r\n complexity: number;\r\n context: Record<string, any>;\r\n insights: string[];\r\n}\r\n\r\nexport class ACEReflector {\r\n private memorySystem: SQLiteMemorySystem;\r\n private memoryAdapter: MemoryAdapter;\r\n\r\n constructor(\r\n memoryPath: string = './ace-reflections.sqlite'\r\n ) {\r\n this.memorySystem = new SQLiteMemorySystem(memoryPath);\r\n this.memoryAdapter = new MemoryAdapter(AccessLevel.SYSTEM);\r\n }\r\n\r\n async initialize(): Promise<void> {\r\n await this.memorySystem.initialize();\r\n\r\n // Note: Production schema is managed by .claude/skills/cfn-ace-system/schema/001-create-context-reflections.sql\r\n // This initialization ensures compatibility with the production schema\r\n\r\n // Apply performance indexes from init-indexes.sql\r\n await this.applyPerformanceIndexes();\r\n }\r\n\r\n /**\r\n * Apply performance indexes for context reflection queries\r\n * Based on .claude/skills/cfn-ace-system/init-indexes.sql\r\n * Target: < 100ms query time with 1000+ reflections\r\n */\r\n private async applyPerformanceIndexes(): Promise<void> {\r\n const db = this.memorySystem['db'];\r\n if (!db) {\r\n console.warn('⚠️ Database not initialized, skipping index creation');\r\n return;\r\n }\r\n\r\n // Check if context_reflections table exists\r\n const tableExists = await db.get<{ count: number }>(\r\n \"SELECT COUNT(*) as count FROM sqlite_master WHERE type='table' AND name='context_reflections'\"\r\n );\r\n\r\n if (!tableExists || tableExists.count === 0) {\r\n console.warn('⚠️ context_reflections table not found. Run schema migration first.');\r\n console.warn(' Use: .claude/skills/cfn-ace-system/schema/run-migration.sh');\r\n return;\r\n }\r\n\r\n const indexes = [\r\n // JSON Tag Extraction Index (most common query pattern)\r\n {\r\n name: 'idx_reflections_tags',\r\n sql: `CREATE INDEX IF NOT EXISTS idx_reflections_tags\r\n ON context_reflections(json_extract(metadata, '$.tags'))`\r\n },\r\n // Domain Classification Index\r\n {\r\n name: 'idx_reflections_domain',\r\n sql: `CREATE INDEX IF NOT EXISTS idx_reflections_domain\r\n ON context_reflections(json_extract(metadata, '$.domain'))`\r\n },\r\n // Confidence Score Index (DESC for high-to-low sorting)\r\n {\r\n name: 'idx_reflections_confidence',\r\n sql: `CREATE INDEX IF NOT EXISTS idx_reflections_confidence\r\n ON context_reflections(confidence DESC)`\r\n },\r\n // Recency Index (DESC for chronological sorting)\r\n {\r\n name: 'idx_reflections_created_at',\r\n sql: `CREATE INDEX IF NOT EXISTS idx_reflections_created_at\r\n ON context_reflections(created_at DESC)`\r\n },\r\n // Composite Index: Domain + Confidence + Recency\r\n {\r\n name: 'idx_reflections_domain_conf_date',\r\n sql: `CREATE INDEX IF NOT EXISTS idx_reflections_domain_conf_date\r\n ON context_reflections(\r\n json_extract(metadata, '$.domain'),\r\n confidence,\r\n created_at DESC\r\n )`\r\n },\r\n // Composite Index: Confidence + Recency (covering index)\r\n {\r\n name: 'idx_reflections_conf_date',\r\n sql: `CREATE INDEX IF NOT EXISTS idx_reflections_conf_date\r\n ON context_reflections(\r\n confidence DESC,\r\n created_at DESC\r\n )`\r\n }\r\n ];\r\n\r\n let successCount = 0;\r\n const failedIndexes: string[] = [];\r\n\r\n for (const index of indexes) {\r\n try {\r\n await db.run(index.sql);\r\n successCount++;\r\n } catch (error) {\r\n failedIndexes.push(index.name);\r\n console.error(`❌ Failed to create index ${index.name}:`, error);\r\n }\r\n }\r\n\r\n if (successCount === indexes.length) {\r\n console.log(`✅ Applied ${successCount} performance indexes (target: <100ms query time)`);\r\n } else {\r\n console.warn(`⚠️ Applied ${successCount}/${indexes.length} indexes. Failed: ${failedIndexes.join(', ')}`);\r\n }\r\n }\r\n\r\n async reflect(\r\n context: Record<string, any>,\r\n options: {\r\n complexity?: number\r\n } = {}\r\n ): Promise<CognitiveReflection> {\r\n const reflection: CognitiveReflection = {\r\n id: `ref-${Date.now()}`,\r\n timestamp: Date.now(),\r\n complexity: options.complexity ?? this.calculateComplexity(context),\r\n context,\r\n insights: this.generateInsights(context)\r\n };\r\n\r\n await this.memorySystem.store(\r\n `reflection:${reflection.id}`,\r\n reflection,\r\n AccessLevel.SYSTEM\r\n );\r\n\r\n // Insert reflection data into SQL table (production schema)\r\n await this.memorySystem['db']?.run(\r\n `INSERT INTO context_reflections (\r\n id, reflection_type, task_id, swarm_id, execution_trace,\r\n feedback_signals, extracted_lessons, metadata, confidence\r\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\r\n [\r\n reflection.id,\r\n 'strategy', // Default reflection type\r\n reflection.context.task_id || 'unknown',\r\n reflection.context.swarm_id || 'default',\r\n JSON.stringify({ timestamp: reflection.timestamp, complexity: reflection.complexity }),\r\n JSON.stringify({ insights: reflection.insights }),\r\n JSON.stringify({ strategies: reflection.insights, antiPatterns: [], edgeCases: [] }),\r\n JSON.stringify({ complexity: reflection.complexity }),\r\n reflection.complexity // Use complexity as confidence proxy\r\n ]\r\n );\r\n\r\n return reflection;\r\n }\r\n\r\n private calculateComplexity(\r\n context: Record<string, any>\r\n ): number {\r\n // Advanced complexity calculation\r\n const keyCount = Object.keys(context).length;\r\n const contentLength = JSON.stringify(context).length;\r\n\r\n return Math.log(keyCount * contentLength) / Math.log(10);\r\n }\r\n\r\n private generateInsights(\r\n context: Record<string, any>\r\n ): string[] {\r\n // Meta-cognitive analysis\r\n const insights: string[] = [];\r\n\r\n if (context.task && context.constraints) {\r\n insights.push(`Task complexity requires careful constraint management`);\r\n }\r\n\r\n if (context.previousResults) {\r\n insights.push(`Learning from past iterations`);\r\n }\r\n\r\n return insights;\r\n }\r\n\r\n async retrieveReflection(\r\n reflectionId: string\r\n ): Promise<CognitiveReflection | null> {\r\n return await this.memorySystem.retrieve(\r\n `reflection:${reflectionId}`,\r\n AccessLevel.SYSTEM\r\n );\r\n }\r\n}\r\n\r\nexport default ACEReflector;"],"names":["SQLiteMemorySystem","MemoryAdapter","AccessLevel","ACEReflector","memorySystem","memoryAdapter","memoryPath","SYSTEM","initialize","applyPerformanceIndexes","db","console","warn","tableExists","get","count","indexes","name","sql","successCount","failedIndexes","index","run","error","push","length","log","join","reflect","context","options","reflection","id","Date","now","timestamp","complexity","calculateComplexity","insights","generateInsights","store","task_id","swarm_id","JSON","stringify","strategies","antiPatterns","edgeCases","keyCount","Object","keys","contentLength","Math","task","constraints","previousResults","retrieveReflection","reflectionId","retrieve"],"mappings":"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"}
|
|
@@ -62,7 +62,7 @@ const execAsync = promisify(exec);
|
|
|
62
62
|
// Step 2: Extract and report confidence
|
|
63
63
|
const confidence = extractConfidence(output);
|
|
64
64
|
console.log(`[CFN Protocol] Step 2: Reporting confidence (${confidence})...`);
|
|
65
|
-
const reportCmd = `./.claude/skills/redis-coordination/invoke-waiting-mode.sh report \
|
|
65
|
+
const reportCmd = `./.claude/skills/cfn-redis-coordination/invoke-waiting-mode.sh report \
|
|
66
66
|
--task-id "${taskId}" \
|
|
67
67
|
--agent-id "${agentId}" \
|
|
68
68
|
--confidence ${confidence} \
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/agent-executor.ts"],"sourcesContent":["/**\r\n * Agent Executor\r\n *\r\n * Executes CLI-spawned agents by:\r\n * 1. Checking custom routing configuration (z.ai vs Anthropic)\r\n * 2. Invoking the appropriate API\r\n * 3. Managing agent lifecycle and output\r\n */\r\n\r\nimport { spawn } from 'child_process';\r\nimport { exec } from 'child_process';\r\nimport { promisify } from 'util';\r\nimport { AgentDefinition } from './agent-definition-parser.js';\r\nimport { TaskContext, getAgentId } from './agent-prompt-builder.js';\r\nimport { buildCLIAgentSystemPrompt, loadContextFromEnv } from './cli-agent-context.js';\r\nimport {\r\n loadMessages,\r\n storeMessage,\r\n getCurrentFork,\r\n formatMessagesForAPI,\r\n type Message\r\n} from './conversation-fork.js';\r\nimport { convertToolNames } from './tool-definitions.js';\r\nimport fs from 'fs/promises';\r\nimport path from 'path';\r\nimport os from 'os';\r\n\r\nconst execAsync = promisify(exec);\r\n\r\nexport interface AgentExecutionResult {\r\n success: boolean;\r\n agentId: string;\r\n output?: string;\r\n error?: string;\r\n exitCode: number;\r\n}\r\n\r\n/**\r\n * Extract confidence score from agent output\r\n * Looks for patterns like:\r\n * - \"confidence: 0.85\"\r\n * - \"Confidence: 0.90\"\r\n * - \"confidence score: 0.95\"\r\n * - \"self-confidence: 0.88\"\r\n */\r\nfunction extractConfidence(output: string | undefined): number {\r\n if (!output) return 0.85;\r\n\r\n // Try multiple patterns\r\n const patterns = [\r\n /confidence:\\s*([0-9.]+)/i,\r\n /confidence\\s+score:\\s*([0-9.]+)/i,\r\n /self-confidence:\\s*([0-9.]+)/i,\r\n /my\\s+confidence:\\s*([0-9.]+)/i,\r\n ];\r\n\r\n for (const pattern of patterns) {\r\n const match = output.match(pattern);\r\n if (match && match[1]) {\r\n const score = parseFloat(match[1]);\r\n if (score >= 0 && score <= 1) {\r\n return score;\r\n }\r\n }\r\n }\r\n\r\n // Default to 0.85 if not found\r\n return 0.85;\r\n}\r\n\r\n/**\r\n * Execute CFN Loop protocol after agent completes work\r\n *\r\n * Steps:\r\n * 1. Signal completion to orchestrator\r\n * 2. Report confidence score\r\n * 3. Enter waiting mode (if iterations enabled)\r\n */\r\nasync function executeCFNProtocol(\r\n taskId: string,\r\n agentId: string,\r\n output: string | undefined,\r\n iteration: number,\r\n enableIterations: boolean = false,\r\n maxIterations: number = 10\r\n): Promise<void> {\r\n console.log(`\\n[CFN Protocol] Starting for agent ${agentId}`);\r\n console.log(`[CFN Protocol] Task ID: ${taskId}, Iteration: ${iteration}`);\r\n\r\n try {\r\n // Step 1: Signal completion\r\n console.log('[CFN Protocol] Step 1: Signaling completion...');\r\n await execAsync(`redis-cli lpush \"swarm:${taskId}:${agentId}:done\" \"complete\"`);\r\n console.log('[CFN Protocol] ✓ Completion signaled');\r\n\r\n // Step 2: Extract and report confidence\r\n const confidence = extractConfidence(output);\r\n console.log(`[CFN Protocol] Step 2: Reporting confidence (${confidence})...`);\r\n\r\n const reportCmd = `./.claude/skills/redis-coordination/invoke-waiting-mode.sh report \\\r\n --task-id \"${taskId}\" \\\r\n --agent-id \"${agentId}\" \\\r\n --confidence ${confidence} \\\r\n --iteration ${iteration}`;\r\n\r\n await execAsync(reportCmd);\r\n console.log('[CFN Protocol] ✓ Confidence reported');\r\n\r\n // Step 3: Exit cleanly (BUG #18 FIX - removed waiting mode)\r\n // Orchestrator will spawn appropriate specialist agent for next iteration\r\n // This enables adaptive agent specialization based on feedback type\r\n console.log('[CFN Protocol] Step 3: Exiting cleanly (iteration complete)');\r\n console.log('[CFN Protocol] Protocol complete\\n');\r\n } catch (error) {\r\n console.error('[CFN Protocol] Error:', error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Check if custom routing (z.ai) is enabled\r\n */\r\nasync function isCustomRoutingEnabled(): Promise<boolean> {\r\n // Check environment variable\r\n if (process.env.CLAUDE_API_PROVIDER === 'zai') {\r\n return true;\r\n }\r\n\r\n // Check config file (.claude/config/api-provider.json)\r\n try {\r\n const configPath = path.join('.claude', 'config', 'api-provider.json');\r\n const config = JSON.parse(await fs.readFile(configPath, 'utf-8'));\r\n return config.provider === 'zai' || config.provider === 'z.ai';\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Get API provider configuration\r\n */\r\nasync function getAPIProvider(): Promise<'anthropic' | 'zai'> {\r\n const customEnabled = await isCustomRoutingEnabled();\r\n return customEnabled ? 'zai' : 'anthropic';\r\n}\r\n\r\n/**\r\n * Execute agent using direct API calls\r\n */\r\nasync function executeViaAPI(\r\n definition: AgentDefinition,\r\n prompt: string,\r\n context: TaskContext\r\n): Promise<AgentExecutionResult> {\r\n const agentId = getAgentId(definition, context);\r\n\r\n console.log(`[agent-executor] Executing agent via API: ${definition.name}`);\r\n console.log(`[agent-executor] Agent ID: ${agentId}`);\r\n console.log(`[agent-executor] Model: ${definition.model}`);\r\n console.log('');\r\n\r\n try {\r\n // Check for conversation fork (Sprint 4 enhancement)\r\n const forkId = process.env.FORK_ID || await getCurrentFork(context.taskId || '', agentId);\r\n const iteration = context.iteration || 1;\r\n\r\n let systemPrompt: string;\r\n let messages: Array<{role: string, content: string}> = [];\r\n\r\n if (forkId && iteration > 1) {\r\n // Continue from fork (iterations 2+)\r\n console.log(`[agent-executor] Continuing from fork: ${forkId}`);\r\n\r\n // Load fork messages\r\n const forkMessages = await loadMessages(context.taskId || '', agentId, forkId);\r\n console.log(`[agent-executor] Loaded ${forkMessages.length} messages from fork`);\r\n\r\n // Extract system prompt from first message (it's always the system message)\r\n // The fork messages are assistant/user pairs, we need to add system separately\r\n systemPrompt = forkMessages[0]?.content || '';\r\n\r\n // Format remaining messages for API\r\n messages = formatMessagesForAPI(forkMessages.slice(1));\r\n\r\n // Add new user message with feedback\r\n messages.push({\r\n role: 'user',\r\n content: prompt\r\n });\r\n\r\n console.log(`[agent-executor] Fork continuation: ${messages.length} messages`);\r\n } else {\r\n // New conversation (iteration 1)\r\n console.log('[agent-executor] Starting new conversation');\r\n console.log('[agent-executor] Building system prompt with context...');\r\n\r\n const contextOptions = loadContextFromEnv();\r\n contextOptions.agentType = definition.name;\r\n if (context.taskId) contextOptions.taskId = context.taskId;\r\n if (context.iteration) contextOptions.iteration = context.iteration;\r\n\r\n systemPrompt = await buildCLIAgentSystemPrompt(contextOptions);\r\n console.log('[agent-executor] System prompt built successfully');\r\n\r\n // Initial user message\r\n messages = [{\r\n role: 'user',\r\n content: prompt\r\n }];\r\n }\r\n\r\n console.log('');\r\n\r\n // Dynamic import to avoid bundling issues\r\n const { executeAgentAPI } = await import('./anthropic-client.js');\r\n\r\n // Convert agent tool names to Anthropic API format\r\n const tools = definition.tools && definition.tools.length > 0\r\n ? convertToolNames(definition.tools)\r\n : undefined;\r\n\r\n const result = await executeAgentAPI(\r\n definition.name,\r\n agentId,\r\n definition.model,\r\n prompt,\r\n systemPrompt,\r\n messages.length > 1 ? messages : undefined,\r\n undefined, // maxTokens (use default)\r\n tools // Pass converted tools\r\n );\r\n\r\n // Store messages in conversation history (for future forking)\r\n if (context.taskId) {\r\n // Store user message\r\n const userMessage: Message = {\r\n role: 'user',\r\n content: prompt,\r\n iteration,\r\n timestamp: new Date().toISOString()\r\n };\r\n await storeMessage(context.taskId, agentId, userMessage);\r\n\r\n // Store assistant response\r\n if (result.output) {\r\n const assistantMessage: Message = {\r\n role: 'assistant',\r\n content: result.output,\r\n iteration,\r\n timestamp: new Date().toISOString()\r\n };\r\n await storeMessage(context.taskId, agentId, assistantMessage);\r\n }\r\n\r\n console.log(`[agent-executor] Stored messages for iteration ${iteration}`);\r\n\r\n // Execute CFN Loop protocol (signal completion, report confidence, enter waiting mode)\r\n // Iterations are enabled for CFN Loop tasks (indicated by presence of taskId)\r\n try {\r\n const maxIterations = 10; // Default max iterations\r\n const enableIterations = true; // Enable iterations for all CFN Loop tasks\r\n\r\n await executeCFNProtocol(\r\n context.taskId,\r\n agentId,\r\n result.output,\r\n iteration,\r\n enableIterations,\r\n maxIterations\r\n );\r\n } catch (error) {\r\n console.error('[agent-executor] CFN Protocol execution failed:', error);\r\n // Don't fail the entire agent execution if CFN protocol fails\r\n // This allows agents to complete even if Redis coordination has issues\r\n }\r\n }\r\n\r\n return {\r\n success: result.success,\r\n agentId,\r\n output: result.output,\r\n error: result.error,\r\n exitCode: result.success ? 0 : 1,\r\n };\r\n } catch (error) {\r\n console.error('[agent-executor] API execution failed:', error);\r\n return {\r\n success: false,\r\n agentId,\r\n error: error instanceof Error ? error.message : String(error),\r\n exitCode: 1,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Execute agent using shell script (fallback/simulation)\r\n */\r\nasync function executeViaScript(\r\n definition: AgentDefinition,\r\n prompt: string,\r\n context: TaskContext\r\n): Promise<AgentExecutionResult> {\r\n const agentId = getAgentId(definition, context);\r\n\r\n // Write prompt to temporary file\r\n const tmpDir = os.tmpdir();\r\n const promptFile = path.join(tmpDir, `agent-${agentId}-${Date.now()}.md`);\r\n await fs.writeFile(promptFile, prompt, 'utf-8');\r\n\r\n console.log(`[agent-executor] Executing agent via script: ${definition.name}`);\r\n console.log(`[agent-executor] Agent ID: ${agentId}`);\r\n console.log(`[agent-executor] Model: ${definition.model}`);\r\n console.log(`[agent-executor] Prompt file: ${promptFile}`);\r\n\r\n return new Promise((resolve) => {\r\n const scriptPath = path.join('.claude', 'skills', 'agent-execution', 'execute-agent.sh');\r\n\r\n // Build environment variables\r\n const env = {\r\n ...process.env,\r\n AGENT_TYPE: definition.name,\r\n AGENT_ID: agentId,\r\n AGENT_MODEL: definition.model,\r\n AGENT_TOOLS: definition.tools.join(','),\r\n TASK_ID: context.taskId || '',\r\n ITERATION: String(context.iteration || 1),\r\n MODE: context.mode || 'cli',\r\n PROMPT_FILE: promptFile,\r\n };\r\n\r\n // Check if execute script exists\r\n fs.access(scriptPath)\r\n .then(() => {\r\n // Use execution script\r\n const proc = spawn('bash', [scriptPath], { env, stdio: 'inherit' });\r\n\r\n proc.on('exit', (code) => {\r\n resolve({\r\n success: code === 0,\r\n agentId,\r\n exitCode: code || 0,\r\n });\r\n });\r\n\r\n proc.on('error', (err) => {\r\n resolve({\r\n success: false,\r\n agentId,\r\n error: err.message,\r\n exitCode: 1,\r\n });\r\n });\r\n })\r\n .catch(() => {\r\n // Fallback: Print prompt\r\n console.log('\\n=== Agent Prompt ===');\r\n console.log(prompt.substring(0, 500) + '...');\r\n console.log('\\n[agent-executor] Execution script not found');\r\n console.log('[agent-executor] Using simulation mode\\n');\r\n\r\n resolve({\r\n success: true,\r\n agentId,\r\n output: prompt,\r\n exitCode: 0,\r\n });\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * Main agent execution function\r\n */\r\nexport async function executeAgent(\r\n definition: AgentDefinition,\r\n prompt: string,\r\n context: TaskContext,\r\n options: {\r\n method?: 'auto' | 'api' | 'script';\r\n } = {}\r\n): Promise<AgentExecutionResult> {\r\n const method = options.method || 'auto';\r\n\r\n // Auto-select execution method\r\n if (method === 'auto') {\r\n // Try API execution first, fallback to script if API key not available\r\n try {\r\n return await executeViaAPI(definition, prompt, context);\r\n } catch (error) {\r\n if (error instanceof Error && error.message.includes('API key not found')) {\r\n console.log('[agent-executor] API key not found, using script fallback');\r\n return executeViaScript(definition, prompt, context);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n if (method === 'api') {\r\n return executeViaAPI(definition, prompt, context);\r\n }\r\n\r\n return executeViaScript(definition, prompt, context);\r\n}\r\n\r\n/**\r\n * Write agent output to file for debugging\r\n */\r\nexport async function saveAgentOutput(\r\n agentId: string,\r\n output: string,\r\n outputDir: string = '.claude/tmp/agent-output'\r\n): Promise<string> {\r\n await fs.mkdir(outputDir, { recursive: true });\r\n\r\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\r\n const filename = `${agentId}-${timestamp}.txt`;\r\n const filepath = path.join(outputDir, filename);\r\n\r\n await fs.writeFile(filepath, output, 'utf-8');\r\n\r\n return filepath;\r\n}\r\n"],"names":["spawn","exec","promisify","getAgentId","buildCLIAgentSystemPrompt","loadContextFromEnv","loadMessages","storeMessage","getCurrentFork","formatMessagesForAPI","convertToolNames","fs","path","os","execAsync","extractConfidence","output","patterns","pattern","match","score","parseFloat","executeCFNProtocol","taskId","agentId","iteration","enableIterations","maxIterations","console","log","confidence","reportCmd","error","isCustomRoutingEnabled","process","env","CLAUDE_API_PROVIDER","configPath","join","config","JSON","parse","readFile","provider","getAPIProvider","customEnabled","executeViaAPI","definition","prompt","context","name","model","forkId","FORK_ID","systemPrompt","messages","forkMessages","length","content","slice","push","role","contextOptions","agentType","executeAgentAPI","tools","undefined","result","userMessage","timestamp","Date","toISOString","assistantMessage","success","exitCode","Error","message","String","executeViaScript","tmpDir","tmpdir","promptFile","now","writeFile","Promise","resolve","scriptPath","AGENT_TYPE","AGENT_ID","AGENT_MODEL","AGENT_TOOLS","TASK_ID","ITERATION","MODE","mode","PROMPT_FILE","access","then","proc","stdio","on","code","err","catch","substring","executeAgent","options","method","includes","saveAgentOutput","outputDir","mkdir","recursive","replace","filename","filepath"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/agent-executor.ts"],"sourcesContent":["/**\r\n * Agent Executor\r\n *\r\n * Executes CLI-spawned agents by:\r\n * 1. Checking custom routing configuration (z.ai vs Anthropic)\r\n * 2. Invoking the appropriate API\r\n * 3. Managing agent lifecycle and output\r\n */\r\n\r\nimport { spawn } from 'child_process';\r\nimport { exec } from 'child_process';\r\nimport { promisify } from 'util';\r\nimport { AgentDefinition } from './agent-definition-parser.js';\r\nimport { TaskContext, getAgentId } from './agent-prompt-builder.js';\r\nimport { buildCLIAgentSystemPrompt, loadContextFromEnv } from './cli-agent-context.js';\r\nimport {\r\n loadMessages,\r\n storeMessage,\r\n getCurrentFork,\r\n formatMessagesForAPI,\r\n type Message\r\n} from './conversation-fork.js';\r\nimport { convertToolNames } from './tool-definitions.js';\r\nimport fs from 'fs/promises';\r\nimport path from 'path';\r\nimport os from 'os';\r\n\r\nconst execAsync = promisify(exec);\r\n\r\nexport interface AgentExecutionResult {\r\n success: boolean;\r\n agentId: string;\r\n output?: string;\r\n error?: string;\r\n exitCode: number;\r\n}\r\n\r\n/**\r\n * Extract confidence score from agent output\r\n * Looks for patterns like:\r\n * - \"confidence: 0.85\"\r\n * - \"Confidence: 0.90\"\r\n * - \"confidence score: 0.95\"\r\n * - \"self-confidence: 0.88\"\r\n */\r\nfunction extractConfidence(output: string | undefined): number {\r\n if (!output) return 0.85;\r\n\r\n // Try multiple patterns\r\n const patterns = [\r\n /confidence:\\s*([0-9.]+)/i,\r\n /confidence\\s+score:\\s*([0-9.]+)/i,\r\n /self-confidence:\\s*([0-9.]+)/i,\r\n /my\\s+confidence:\\s*([0-9.]+)/i,\r\n ];\r\n\r\n for (const pattern of patterns) {\r\n const match = output.match(pattern);\r\n if (match && match[1]) {\r\n const score = parseFloat(match[1]);\r\n if (score >= 0 && score <= 1) {\r\n return score;\r\n }\r\n }\r\n }\r\n\r\n // Default to 0.85 if not found\r\n return 0.85;\r\n}\r\n\r\n/**\r\n * Execute CFN Loop protocol after agent completes work\r\n *\r\n * Steps:\r\n * 1. Signal completion to orchestrator\r\n * 2. Report confidence score\r\n * 3. Enter waiting mode (if iterations enabled)\r\n */\r\nasync function executeCFNProtocol(\r\n taskId: string,\r\n agentId: string,\r\n output: string | undefined,\r\n iteration: number,\r\n enableIterations: boolean = false,\r\n maxIterations: number = 10\r\n): Promise<void> {\r\n console.log(`\\n[CFN Protocol] Starting for agent ${agentId}`);\r\n console.log(`[CFN Protocol] Task ID: ${taskId}, Iteration: ${iteration}`);\r\n\r\n try {\r\n // Step 1: Signal completion\r\n console.log('[CFN Protocol] Step 1: Signaling completion...');\r\n await execAsync(`redis-cli lpush \"swarm:${taskId}:${agentId}:done\" \"complete\"`);\r\n console.log('[CFN Protocol] ✓ Completion signaled');\r\n\r\n // Step 2: Extract and report confidence\r\n const confidence = extractConfidence(output);\r\n console.log(`[CFN Protocol] Step 2: Reporting confidence (${confidence})...`);\r\n\r\n const reportCmd = `./.claude/skills/cfn-redis-coordination/invoke-waiting-mode.sh report \\\r\n --task-id \"${taskId}\" \\\r\n --agent-id \"${agentId}\" \\\r\n --confidence ${confidence} \\\r\n --iteration ${iteration}`;\r\n\r\n await execAsync(reportCmd);\r\n console.log('[CFN Protocol] ✓ Confidence reported');\r\n\r\n // Step 3: Exit cleanly (BUG #18 FIX - removed waiting mode)\r\n // Orchestrator will spawn appropriate specialist agent for next iteration\r\n // This enables adaptive agent specialization based on feedback type\r\n console.log('[CFN Protocol] Step 3: Exiting cleanly (iteration complete)');\r\n console.log('[CFN Protocol] Protocol complete\\n');\r\n } catch (error) {\r\n console.error('[CFN Protocol] Error:', error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Check if custom routing (z.ai) is enabled\r\n */\r\nasync function isCustomRoutingEnabled(): Promise<boolean> {\r\n // Check environment variable\r\n if (process.env.CLAUDE_API_PROVIDER === 'zai') {\r\n return true;\r\n }\r\n\r\n // Check config file (.claude/config/api-provider.json)\r\n try {\r\n const configPath = path.join('.claude', 'config', 'api-provider.json');\r\n const config = JSON.parse(await fs.readFile(configPath, 'utf-8'));\r\n return config.provider === 'zai' || config.provider === 'z.ai';\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Get API provider configuration\r\n */\r\nasync function getAPIProvider(): Promise<'anthropic' | 'zai'> {\r\n const customEnabled = await isCustomRoutingEnabled();\r\n return customEnabled ? 'zai' : 'anthropic';\r\n}\r\n\r\n/**\r\n * Execute agent using direct API calls\r\n */\r\nasync function executeViaAPI(\r\n definition: AgentDefinition,\r\n prompt: string,\r\n context: TaskContext\r\n): Promise<AgentExecutionResult> {\r\n const agentId = getAgentId(definition, context);\r\n\r\n console.log(`[agent-executor] Executing agent via API: ${definition.name}`);\r\n console.log(`[agent-executor] Agent ID: ${agentId}`);\r\n console.log(`[agent-executor] Model: ${definition.model}`);\r\n console.log('');\r\n\r\n try {\r\n // Check for conversation fork (Sprint 4 enhancement)\r\n const forkId = process.env.FORK_ID || await getCurrentFork(context.taskId || '', agentId);\r\n const iteration = context.iteration || 1;\r\n\r\n let systemPrompt: string;\r\n let messages: Array<{role: string, content: string}> = [];\r\n\r\n if (forkId && iteration > 1) {\r\n // Continue from fork (iterations 2+)\r\n console.log(`[agent-executor] Continuing from fork: ${forkId}`);\r\n\r\n // Load fork messages\r\n const forkMessages = await loadMessages(context.taskId || '', agentId, forkId);\r\n console.log(`[agent-executor] Loaded ${forkMessages.length} messages from fork`);\r\n\r\n // Extract system prompt from first message (it's always the system message)\r\n // The fork messages are assistant/user pairs, we need to add system separately\r\n systemPrompt = forkMessages[0]?.content || '';\r\n\r\n // Format remaining messages for API\r\n messages = formatMessagesForAPI(forkMessages.slice(1));\r\n\r\n // Add new user message with feedback\r\n messages.push({\r\n role: 'user',\r\n content: prompt\r\n });\r\n\r\n console.log(`[agent-executor] Fork continuation: ${messages.length} messages`);\r\n } else {\r\n // New conversation (iteration 1)\r\n console.log('[agent-executor] Starting new conversation');\r\n console.log('[agent-executor] Building system prompt with context...');\r\n\r\n const contextOptions = loadContextFromEnv();\r\n contextOptions.agentType = definition.name;\r\n if (context.taskId) contextOptions.taskId = context.taskId;\r\n if (context.iteration) contextOptions.iteration = context.iteration;\r\n\r\n systemPrompt = await buildCLIAgentSystemPrompt(contextOptions);\r\n console.log('[agent-executor] System prompt built successfully');\r\n\r\n // Initial user message\r\n messages = [{\r\n role: 'user',\r\n content: prompt\r\n }];\r\n }\r\n\r\n console.log('');\r\n\r\n // Dynamic import to avoid bundling issues\r\n const { executeAgentAPI } = await import('./anthropic-client.js');\r\n\r\n // Convert agent tool names to Anthropic API format\r\n const tools = definition.tools && definition.tools.length > 0\r\n ? convertToolNames(definition.tools)\r\n : undefined;\r\n\r\n const result = await executeAgentAPI(\r\n definition.name,\r\n agentId,\r\n definition.model,\r\n prompt,\r\n systemPrompt,\r\n messages.length > 1 ? messages : undefined,\r\n undefined, // maxTokens (use default)\r\n tools // Pass converted tools\r\n );\r\n\r\n // Store messages in conversation history (for future forking)\r\n if (context.taskId) {\r\n // Store user message\r\n const userMessage: Message = {\r\n role: 'user',\r\n content: prompt,\r\n iteration,\r\n timestamp: new Date().toISOString()\r\n };\r\n await storeMessage(context.taskId, agentId, userMessage);\r\n\r\n // Store assistant response\r\n if (result.output) {\r\n const assistantMessage: Message = {\r\n role: 'assistant',\r\n content: result.output,\r\n iteration,\r\n timestamp: new Date().toISOString()\r\n };\r\n await storeMessage(context.taskId, agentId, assistantMessage);\r\n }\r\n\r\n console.log(`[agent-executor] Stored messages for iteration ${iteration}`);\r\n\r\n // Execute CFN Loop protocol (signal completion, report confidence, enter waiting mode)\r\n // Iterations are enabled for CFN Loop tasks (indicated by presence of taskId)\r\n try {\r\n const maxIterations = 10; // Default max iterations\r\n const enableIterations = true; // Enable iterations for all CFN Loop tasks\r\n\r\n await executeCFNProtocol(\r\n context.taskId,\r\n agentId,\r\n result.output,\r\n iteration,\r\n enableIterations,\r\n maxIterations\r\n );\r\n } catch (error) {\r\n console.error('[agent-executor] CFN Protocol execution failed:', error);\r\n // Don't fail the entire agent execution if CFN protocol fails\r\n // This allows agents to complete even if Redis coordination has issues\r\n }\r\n }\r\n\r\n return {\r\n success: result.success,\r\n agentId,\r\n output: result.output,\r\n error: result.error,\r\n exitCode: result.success ? 0 : 1,\r\n };\r\n } catch (error) {\r\n console.error('[agent-executor] API execution failed:', error);\r\n return {\r\n success: false,\r\n agentId,\r\n error: error instanceof Error ? error.message : String(error),\r\n exitCode: 1,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Execute agent using shell script (fallback/simulation)\r\n */\r\nasync function executeViaScript(\r\n definition: AgentDefinition,\r\n prompt: string,\r\n context: TaskContext\r\n): Promise<AgentExecutionResult> {\r\n const agentId = getAgentId(definition, context);\r\n\r\n // Write prompt to temporary file\r\n const tmpDir = os.tmpdir();\r\n const promptFile = path.join(tmpDir, `agent-${agentId}-${Date.now()}.md`);\r\n await fs.writeFile(promptFile, prompt, 'utf-8');\r\n\r\n console.log(`[agent-executor] Executing agent via script: ${definition.name}`);\r\n console.log(`[agent-executor] Agent ID: ${agentId}`);\r\n console.log(`[agent-executor] Model: ${definition.model}`);\r\n console.log(`[agent-executor] Prompt file: ${promptFile}`);\r\n\r\n return new Promise((resolve) => {\r\n const scriptPath = path.join('.claude', 'skills', 'agent-execution', 'execute-agent.sh');\r\n\r\n // Build environment variables\r\n const env = {\r\n ...process.env,\r\n AGENT_TYPE: definition.name,\r\n AGENT_ID: agentId,\r\n AGENT_MODEL: definition.model,\r\n AGENT_TOOLS: definition.tools.join(','),\r\n TASK_ID: context.taskId || '',\r\n ITERATION: String(context.iteration || 1),\r\n MODE: context.mode || 'cli',\r\n PROMPT_FILE: promptFile,\r\n };\r\n\r\n // Check if execute script exists\r\n fs.access(scriptPath)\r\n .then(() => {\r\n // Use execution script\r\n const proc = spawn('bash', [scriptPath], { env, stdio: 'inherit' });\r\n\r\n proc.on('exit', (code) => {\r\n resolve({\r\n success: code === 0,\r\n agentId,\r\n exitCode: code || 0,\r\n });\r\n });\r\n\r\n proc.on('error', (err) => {\r\n resolve({\r\n success: false,\r\n agentId,\r\n error: err.message,\r\n exitCode: 1,\r\n });\r\n });\r\n })\r\n .catch(() => {\r\n // Fallback: Print prompt\r\n console.log('\\n=== Agent Prompt ===');\r\n console.log(prompt.substring(0, 500) + '...');\r\n console.log('\\n[agent-executor] Execution script not found');\r\n console.log('[agent-executor] Using simulation mode\\n');\r\n\r\n resolve({\r\n success: true,\r\n agentId,\r\n output: prompt,\r\n exitCode: 0,\r\n });\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * Main agent execution function\r\n */\r\nexport async function executeAgent(\r\n definition: AgentDefinition,\r\n prompt: string,\r\n context: TaskContext,\r\n options: {\r\n method?: 'auto' | 'api' | 'script';\r\n } = {}\r\n): Promise<AgentExecutionResult> {\r\n const method = options.method || 'auto';\r\n\r\n // Auto-select execution method\r\n if (method === 'auto') {\r\n // Try API execution first, fallback to script if API key not available\r\n try {\r\n return await executeViaAPI(definition, prompt, context);\r\n } catch (error) {\r\n if (error instanceof Error && error.message.includes('API key not found')) {\r\n console.log('[agent-executor] API key not found, using script fallback');\r\n return executeViaScript(definition, prompt, context);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n if (method === 'api') {\r\n return executeViaAPI(definition, prompt, context);\r\n }\r\n\r\n return executeViaScript(definition, prompt, context);\r\n}\r\n\r\n/**\r\n * Write agent output to file for debugging\r\n */\r\nexport async function saveAgentOutput(\r\n agentId: string,\r\n output: string,\r\n outputDir: string = '.claude/tmp/agent-output'\r\n): Promise<string> {\r\n await fs.mkdir(outputDir, { recursive: true });\r\n\r\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\r\n const filename = `${agentId}-${timestamp}.txt`;\r\n const filepath = path.join(outputDir, filename);\r\n\r\n await fs.writeFile(filepath, output, 'utf-8');\r\n\r\n return filepath;\r\n}\r\n"],"names":["spawn","exec","promisify","getAgentId","buildCLIAgentSystemPrompt","loadContextFromEnv","loadMessages","storeMessage","getCurrentFork","formatMessagesForAPI","convertToolNames","fs","path","os","execAsync","extractConfidence","output","patterns","pattern","match","score","parseFloat","executeCFNProtocol","taskId","agentId","iteration","enableIterations","maxIterations","console","log","confidence","reportCmd","error","isCustomRoutingEnabled","process","env","CLAUDE_API_PROVIDER","configPath","join","config","JSON","parse","readFile","provider","getAPIProvider","customEnabled","executeViaAPI","definition","prompt","context","name","model","forkId","FORK_ID","systemPrompt","messages","forkMessages","length","content","slice","push","role","contextOptions","agentType","executeAgentAPI","tools","undefined","result","userMessage","timestamp","Date","toISOString","assistantMessage","success","exitCode","Error","message","String","executeViaScript","tmpDir","tmpdir","promptFile","now","writeFile","Promise","resolve","scriptPath","AGENT_TYPE","AGENT_ID","AGENT_MODEL","AGENT_TOOLS","TASK_ID","ITERATION","MODE","mode","PROMPT_FILE","access","then","proc","stdio","on","code","err","catch","substring","executeAgent","options","method","includes","saveAgentOutput","outputDir","mkdir","recursive","replace","filename","filepath"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-flow-novice",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.10.0",
|
|
4
4
|
"description": "AI agent orchestration framework with namespace-isolated skills, agents, and CFN Loop validation. Safe installation with ~0.01% collision risk.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -18,7 +18,28 @@
|
|
|
18
18
|
"files": [
|
|
19
19
|
"dist/",
|
|
20
20
|
".claude/agents/cfn-dev-team/",
|
|
21
|
-
".claude/skills/cfn
|
|
21
|
+
".claude/skills/cfn-ace-system/",
|
|
22
|
+
".claude/skills/cfn-agent-discovery/",
|
|
23
|
+
".claude/skills/cfn-agent-execution/",
|
|
24
|
+
".claude/skills/cfn-agent-output-processing/",
|
|
25
|
+
".claude/skills/cfn-agent-selector/",
|
|
26
|
+
".claude/skills/cfn-agent-spawning/",
|
|
27
|
+
".claude/skills/cfn-analytics/",
|
|
28
|
+
".claude/skills/cfn-checkpoint-state/",
|
|
29
|
+
".claude/skills/cfn-config-management/",
|
|
30
|
+
".claude/skills/cfn-event-bus/",
|
|
31
|
+
".claude/skills/cfn-fleet-manager/",
|
|
32
|
+
".claude/skills/cfn-hook-pipeline/",
|
|
33
|
+
".claude/skills/cfn-hybrid-routing/",
|
|
34
|
+
".claude/skills/cfn-loop-orchestration/",
|
|
35
|
+
".claude/skills/cfn-loop-validation/",
|
|
36
|
+
".claude/skills/cfn-process-lifecycle/",
|
|
37
|
+
".claude/skills/cfn-product-owner-decision/",
|
|
38
|
+
".claude/skills/cfn-redis-coordination/",
|
|
39
|
+
".claude/skills/cfn-sqlite-memory/",
|
|
40
|
+
".claude/skills/cfn-test-execution/",
|
|
41
|
+
".claude/skills/cfn-transparency-middleware/",
|
|
42
|
+
".claude/skills/cfn-webapp-testing/",
|
|
22
43
|
".claude/hooks/cfn-*",
|
|
23
44
|
".claude/commands/cfn/",
|
|
24
45
|
".claude/cfn-data/",
|
|
@@ -28,9 +49,11 @@
|
|
|
28
49
|
"!scripts/test-*.sh",
|
|
29
50
|
"!scripts/*-validation.cjs",
|
|
30
51
|
"!scripts/deployment/",
|
|
52
|
+
"tools/simple-complexity.sh",
|
|
53
|
+
"tools/install-lizard.sh",
|
|
31
54
|
"README.md",
|
|
32
55
|
"LICENSE",
|
|
33
|
-
"CFN-CLAUDE.md"
|
|
56
|
+
".claude/root-claude-distribute/CFN-CLAUDE.md"
|
|
34
57
|
],
|
|
35
58
|
"keywords": [
|
|
36
59
|
"ai",
|
|
@@ -50,7 +73,7 @@
|
|
|
50
73
|
"license": "MIT",
|
|
51
74
|
"repository": {
|
|
52
75
|
"type": "git",
|
|
53
|
-
"url": "https://github.com/yourusername/claude-flow-novice.git"
|
|
76
|
+
"url": "git+https://github.com/yourusername/claude-flow-novice.git"
|
|
54
77
|
},
|
|
55
78
|
"bugs": {
|
|
56
79
|
"url": "https://github.com/yourusername/claude-flow-novice/issues"
|
|
@@ -62,10 +85,16 @@
|
|
|
62
85
|
"build:swc": "swc src -d dist --config-file .swcrc --ignore '**/*.test.ts' --ignore '**/*.test.tsx' --ignore '**/*.spec.ts'",
|
|
63
86
|
"clean": "rm -rf dist",
|
|
64
87
|
"test": "jest",
|
|
88
|
+
"test:cfn-v3": "bash tests/cfn-v3-orchestration/run-full-suite.sh",
|
|
89
|
+
"test:cfn-v3:connections": "node tests/cfn-v3-orchestration/tests/02-worker-connections.test.js",
|
|
90
|
+
"test:cfn-v3:confidence": "node tests/cfn-v3-orchestration/tests/03-confidence-scores.test.js",
|
|
91
|
+
"test:cfn-v3:handoffs": "node tests/cfn-v3-orchestration/tests/04-handoff-coordination.test.js",
|
|
92
|
+
"test:cfn-v3:dataflow": "node tests/cfn-v3-orchestration/tests/05-data-flow.test.js",
|
|
93
|
+
"test:cfn-v3:shutdown": "node tests/cfn-v3-orchestration/tests/06-graceful-shutdown.test.js",
|
|
65
94
|
"typecheck": "tsc --noEmit",
|
|
66
95
|
"prepublishOnly": "npm run build && ./scripts/verify-no-secrets.sh",
|
|
67
96
|
"prepack": "npm run build",
|
|
68
|
-
"postinstall": "node -
|
|
97
|
+
"postinstall": "node scripts/init-project.js",
|
|
69
98
|
"verify-package": "npm pack --dry-run",
|
|
70
99
|
"portal:start": "./scripts/start-portal.sh",
|
|
71
100
|
"portal:stop": "./scripts/stop-portal.sh",
|
|
@@ -88,6 +117,11 @@
|
|
|
88
117
|
"sqlite": "^5.1.1",
|
|
89
118
|
"sqlite3": "^5.1.7"
|
|
90
119
|
},
|
|
120
|
+
"optionalDependencies": {},
|
|
121
|
+
"peerDependencies": {},
|
|
122
|
+
"engines": {
|
|
123
|
+
"node": ">=18.0.0"
|
|
124
|
+
},
|
|
91
125
|
"devDependencies": {
|
|
92
126
|
"@swc/cli": "^0.1.62",
|
|
93
127
|
"@swc/core": "^1.3.0",
|
|
@@ -111,7 +145,9 @@
|
|
|
111
145
|
"tsx": "^4.7.0",
|
|
112
146
|
"typescript": "^5.6.3"
|
|
113
147
|
},
|
|
114
|
-
"
|
|
115
|
-
"
|
|
148
|
+
"directories": {
|
|
149
|
+
"doc": "docs",
|
|
150
|
+
"example": "examples",
|
|
151
|
+
"test": "tests"
|
|
116
152
|
}
|
|
117
153
|
}
|
package/readme/README.md
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
|
-
# Claude Flow Novice v2 Documentation
|
|
1
|
+
# Claude Flow Novice v2.9.1 Documentation
|
|
2
2
|
|
|
3
|
-
**Version:** 2.
|
|
4
|
-
**Last Updated:** 2025-10-
|
|
3
|
+
**Version:** 2.9.1 (Skills-First Architecture)
|
|
4
|
+
**Last Updated:** 2025-10-25
|
|
5
|
+
|
|
6
|
+
**Package Metrics**:
|
|
7
|
+
- 2.4 MB unpacked
|
|
8
|
+
- 303 files
|
|
9
|
+
- Namespace-isolated installation
|
|
5
10
|
|
|
6
11
|
## Overview
|
|
7
12
|
|
|
@@ -10,6 +15,10 @@ Claude Flow Novice is a production-ready AI agent orchestration framework built
|
|
|
10
15
|
## Quick Start
|
|
11
16
|
|
|
12
17
|
```bash
|
|
18
|
+
# Install and initialize
|
|
19
|
+
npm install claude-flow-novice
|
|
20
|
+
npx cfn-init
|
|
21
|
+
|
|
13
22
|
# Initialize a swarm with skills
|
|
14
23
|
npx claude-flow-novice swarm "Task Description" \
|
|
15
24
|
--skills=redis-coordination,agent-spawning \
|
|
@@ -59,11 +68,13 @@ npx claude-flow-novice swarm "Task Description" \
|
|
|
59
68
|
- **Modular Skills**: Independently maintainable, testable capabilities
|
|
60
69
|
- **Explicit Dependencies**: Redis pub/sub coordination, no implicit coupling
|
|
61
70
|
- **Thin Orchestration**: Main chat delegates to skills, minimal coordination logic
|
|
71
|
+
- **Namespace-Isolated Installation**: ~0.01% collision risk
|
|
72
|
+
- **Preserves User Custom Agents/Skills/Hooks**
|
|
62
73
|
|
|
63
74
|
### Zero-Token Coordination
|
|
64
75
|
- **Redis BLPOP**: Agents wait without API calls (0 tokens while idle)
|
|
65
76
|
- **Instant Wake-Up**: <100ms latency for agent activation
|
|
66
|
-
- **Scalable**:
|
|
77
|
+
- **Scalable**: 23 agents in cfn-dev-team
|
|
67
78
|
|
|
68
79
|
### CFN Loop (Consensus Framework)
|
|
69
80
|
- **Loop 3**: Implementation agents (coders, researchers)
|
package/scripts/init-project.js
CHANGED
|
@@ -4,6 +4,7 @@ import fs from 'fs';
|
|
|
4
4
|
import path from 'path';
|
|
5
5
|
import { fileURLToPath } from 'url';
|
|
6
6
|
import { promisify } from 'util';
|
|
7
|
+
import { spawnSync } from 'child_process';
|
|
7
8
|
import chalk from 'chalk';
|
|
8
9
|
|
|
9
10
|
const __filename = fileURLToPath(import.meta.url);
|
|
@@ -105,14 +106,14 @@ async function copyFiles(src, dest, pattern) {
|
|
|
105
106
|
}
|
|
106
107
|
|
|
107
108
|
async function copyCfnClaudeMarkdown() {
|
|
108
|
-
const cfnClaudeMdPath = path.join(cfnRoot, 'CFN-CLAUDE.md');
|
|
109
|
+
const cfnClaudeMdPath = path.join(cfnRoot, '.claude/root-claude-distribute/CFN-CLAUDE.md');
|
|
109
110
|
const destPath = path.resolve(process.cwd(), 'CFN-CLAUDE.md');
|
|
110
111
|
|
|
111
112
|
if (fs.existsSync(cfnClaudeMdPath)) {
|
|
112
113
|
try {
|
|
113
114
|
await cpAsync(cfnClaudeMdPath, destPath);
|
|
114
115
|
console.log(chalk.green('📄 CFN-CLAUDE.md copied to project root'));
|
|
115
|
-
console.log(chalk.yellow('💡
|
|
116
|
+
console.log(chalk.yellow('💡 Activate CFN workflows: cp CFN-CLAUDE.md CLAUDE.md'));
|
|
116
117
|
} catch (error) {
|
|
117
118
|
console.error(chalk.red(`❌ Failed to copy CFN-CLAUDE.md: ${error.message}`));
|
|
118
119
|
}
|
|
@@ -121,6 +122,38 @@ async function copyCfnClaudeMarkdown() {
|
|
|
121
122
|
}
|
|
122
123
|
}
|
|
123
124
|
|
|
125
|
+
async function installLizard() {
|
|
126
|
+
console.log(chalk.blue('\n🔧 Installing lizard (complexity analyzer)...'));
|
|
127
|
+
|
|
128
|
+
// Check if lizard is already installed
|
|
129
|
+
const checkResult = spawnSync('which', ['lizard'], { encoding: 'utf-8' });
|
|
130
|
+
if (checkResult.status === 0) {
|
|
131
|
+
console.log(chalk.green('✅ Lizard already installed'));
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Try to install lizard via pip3
|
|
136
|
+
const pipCommands = [
|
|
137
|
+
['pip3', 'install', '--user', '--break-system-packages', 'lizard'],
|
|
138
|
+
['pip3', 'install', '--user', 'lizard'],
|
|
139
|
+
['pip', 'install', '--user', 'lizard']
|
|
140
|
+
];
|
|
141
|
+
|
|
142
|
+
for (const cmd of pipCommands) {
|
|
143
|
+
const result = spawnSync(cmd[0], cmd.slice(1), { encoding: 'utf-8' });
|
|
144
|
+
if (result.status === 0) {
|
|
145
|
+
console.log(chalk.green('✅ Lizard installed successfully'));
|
|
146
|
+
console.log(chalk.yellow('💡 Add to PATH: export PATH="$HOME/.local/bin:$PATH"'));
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// If all attempts failed, provide instructions
|
|
152
|
+
console.log(chalk.yellow('⚠️ Could not auto-install lizard. Manual installation required:'));
|
|
153
|
+
console.log(chalk.gray(' pip3 install --user lizard'));
|
|
154
|
+
console.log(chalk.gray(' or run: ./tools/install-lizard.sh'));
|
|
155
|
+
}
|
|
156
|
+
|
|
124
157
|
async function initializeCfnProject() {
|
|
125
158
|
console.log(chalk.blue('\n🚀 Claude Flow Novice CFN Initialization\n'));
|
|
126
159
|
|
|
@@ -147,6 +180,10 @@ async function initializeCfnProject() {
|
|
|
147
180
|
|
|
148
181
|
console.log(chalk.green(`\n✅ CFN Installation Complete`));
|
|
149
182
|
console.log(chalk.blue(` Copied ${successCount}/${totalPaths} paths successfully`));
|
|
183
|
+
|
|
184
|
+
// Install lizard for complexity analysis
|
|
185
|
+
await installLizard();
|
|
186
|
+
|
|
150
187
|
console.log(chalk.yellow('\n🔍 Next Steps:'));
|
|
151
188
|
console.log(' 1. Review CFN-CLAUDE.md in project root');
|
|
152
189
|
console.log(' 2. Run your first CFN Loop: npx cfn-loop "Task description"');
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Run Marketing Infrastructure Integration Tests
|
|
3
|
+
|
|
4
|
+
set -e
|
|
5
|
+
|
|
6
|
+
# Ensure the correct working directory
|
|
7
|
+
cd "$(dirname "$0")/.." || exit 1
|
|
8
|
+
|
|
9
|
+
# Run all marketing test scripts
|
|
10
|
+
echo "🚀 Starting Marketing Infrastructure Integration Tests..."
|
|
11
|
+
|
|
12
|
+
# Function to run test and capture exit code
|
|
13
|
+
run_test() {
|
|
14
|
+
local test_script="$1"
|
|
15
|
+
local start_time=$(date +%s)
|
|
16
|
+
|
|
17
|
+
echo "Running $test_script..."
|
|
18
|
+
|
|
19
|
+
if bash "$test_script"; then
|
|
20
|
+
local end_time=$(date +%s)
|
|
21
|
+
local duration=$((end_time - start_time))
|
|
22
|
+
echo "✅ $test_script PASSED (${duration}s)"
|
|
23
|
+
else
|
|
24
|
+
echo "❌ $test_script FAILED"
|
|
25
|
+
exit 1
|
|
26
|
+
fi
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
# Array of test scripts
|
|
30
|
+
TEST_SCRIPTS=(
|
|
31
|
+
"tests/marketing-email-campaigns-test.sh"
|
|
32
|
+
"tests/marketing-social-publishing-test.sh"
|
|
33
|
+
"tests/marketing-analytics-data-test.sh"
|
|
34
|
+
"tests/marketing-crm-contacts-test.sh"
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
# Run each test script
|
|
38
|
+
for test in "${TEST_SCRIPTS[@]}"; do
|
|
39
|
+
run_test "$test"
|
|
40
|
+
done
|
|
41
|
+
|
|
42
|
+
echo "🎉 All Marketing Infrastructure Integration Tests PASSED!"
|
|
43
|
+
exit 0
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# Path replacements
|
|
4
|
+
SKILL_REPLACEMENTS=(
|
|
5
|
+
".claude/skills/redis-coordination/:\.claude/skills/cfn-redis-coordination/"
|
|
6
|
+
".claude/skills/agent-spawning/:\.claude/skills/cfn-agent-spawning/"
|
|
7
|
+
".claude/skills/playbook/:\.claude/skills/cfn-playbook/"
|
|
8
|
+
".claude/skills/:\.claude/skills/cfn-"
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
HOOK_REPLACEMENTS=(
|
|
12
|
+
".claude/hooks/invoke-post-edit.sh:\.claude/hooks/cfn-invoke-post-edit.sh"
|
|
13
|
+
".claude/hooks/post-edit.sh:\.claude/hooks/cfn-post-edit.sh"
|
|
14
|
+
".claude/hooks/:\.claude/hooks/cfn-"
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
DATA_REPLACEMENTS=(
|
|
18
|
+
".claude/data/:\.claude/cfn-data/"
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
# Function to perform replacements in a file
|
|
22
|
+
replace_paths() {
|
|
23
|
+
local file="$1"
|
|
24
|
+
local replacements=("${@:2}")
|
|
25
|
+
|
|
26
|
+
# Perform replacements for each pattern
|
|
27
|
+
for replacement in "${replacements[@]}"; do
|
|
28
|
+
IFS=':' read -r old_path new_path <<< "$replacement"
|
|
29
|
+
sed -i "s|${old_path}|${new_path}|g" "$file"
|
|
30
|
+
done
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
# Find and update markdown files
|
|
34
|
+
find .claude/agents/cfn-dev-team -name "*.md" | while read -r file; do
|
|
35
|
+
echo "Processing $file"
|
|
36
|
+
|
|
37
|
+
# Skill path replacements
|
|
38
|
+
replace_paths "$file" "${SKILL_REPLACEMENTS[@]}"
|
|
39
|
+
|
|
40
|
+
# Hook path replacements
|
|
41
|
+
replace_paths "$file" "${HOOK_REPLACEMENTS[@]}"
|
|
42
|
+
|
|
43
|
+
# Data path replacements
|
|
44
|
+
replace_paths "$file" "${DATA_REPLACEMENTS[@]}"
|
|
45
|
+
done
|
|
46
|
+
|
|
47
|
+
echo "Path replacements complete!"
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Install lizard complexity analyzer
|
|
3
|
+
|
|
4
|
+
echo "Installing lizard..."
|
|
5
|
+
|
|
6
|
+
# Try pipx first (isolated install)
|
|
7
|
+
if command -v pipx >/dev/null 2>&1; then
|
|
8
|
+
echo "Using pipx..."
|
|
9
|
+
pipx install lizard
|
|
10
|
+
exit 0
|
|
11
|
+
fi
|
|
12
|
+
|
|
13
|
+
# Try pip with user install
|
|
14
|
+
if command -v pip3 >/dev/null 2>&1; then
|
|
15
|
+
echo "Using pip3 --user..."
|
|
16
|
+
pip3 install --user lizard
|
|
17
|
+
|
|
18
|
+
# Add to PATH if needed
|
|
19
|
+
PYTHON_USER_BASE=$(python3 -m site --user-base)
|
|
20
|
+
export PATH="$PYTHON_USER_BASE/bin:$PATH"
|
|
21
|
+
|
|
22
|
+
echo ""
|
|
23
|
+
echo "Add to your ~/.bashrc or ~/.zshrc:"
|
|
24
|
+
echo "export PATH=\"$PYTHON_USER_BASE/bin:\$PATH\""
|
|
25
|
+
exit 0
|
|
26
|
+
fi
|
|
27
|
+
|
|
28
|
+
# Try pip
|
|
29
|
+
if command -v pip >/dev/null 2>&1; then
|
|
30
|
+
echo "Using pip --user..."
|
|
31
|
+
pip install --user lizard
|
|
32
|
+
exit 0
|
|
33
|
+
fi
|
|
34
|
+
|
|
35
|
+
echo "Error: No Python package manager found"
|
|
36
|
+
echo "Install pipx: sudo apt-get install pipx"
|
|
37
|
+
exit 1
|