claude-flow-novice 2.5.2 → 2.8.1
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/adaptive-context/cfn-v3-reflection.json +21 -0
- package/.claude/agents/AGENT_LIFECYCLE.md +495 -0
- package/.claude/agents/CLAUDE.md +1002 -1233
- package/.claude/agents/accessibility-advocate.md +457 -0
- package/.claude/agents/agent-principles/README.md +226 -226
- package/.claude/agents/agent-principles/agent-type-guidelines.md +10 -0
- package/.claude/agents/agent-principles/format-selection.md +10 -0
- package/.claude/agents/agent-principles/phase4-template-optimization.md +502 -494
- package/.claude/agents/agent-principles/prompt-engineering.md +8 -0
- package/.claude/agents/agent-principles/quality-metrics.md +8 -0
- package/.claude/agents/analysis/code-analyzer.md +7 -17
- package/.claude/agents/analysis/code-review/analyze-code-quality.md +2 -104
- package/.claude/agents/analysis/perf-analyzer.md +2 -196
- package/.claude/agents/context/context-curator.md +78 -84
- package/.claude/agents/context/context-reflector.md +27 -81
- package/.claude/agents/coordinators/README.md +42 -0
- package/.claude/agents/coordinators/cfn-v3-coordinator.md +440 -0
- package/.claude/agents/{product-owner-team → coordinators}/cto-agent.md +154 -187
- package/.claude/agents/coordinators/multi-sprint-coordinator.md +50 -0
- package/.claude/agents/{product-owner-team → coordinators}/product-owner-agent.md +6 -39
- package/.claude/agents/{cfn-loop → coordinators}/product-owner.md +72 -17
- package/.claude/agents/core-agents/reviewer.md +114 -135
- package/.claude/agents/custom/agent-builder.md +637 -0
- package/.claude/agents/developers/README.md +69 -0
- package/.claude/agents/developers/backend-dev.md +77 -0
- package/.claude/agents/{core-agents → developers}/coder.md +131 -26
- package/.claude/agents/developers/react-frontend-engineer.md +121 -0
- package/.claude/agents/{frontend → developers}/state-architect.md +1 -0
- package/.claude/agents/{frontend → developers}/ui-designer.md +1 -0
- package/.claude/agents/development/backend/dev-backend-api.md +0 -29
- package/.claude/agents/development/npm-package-specialist.md +355 -347
- package/.claude/agents/documentation/api-docs/docs-api-openapi.md +8 -0
- package/.claude/agents/documentation/api-docs.md +8 -0
- package/.claude/agents/github/github-commit-agent.md +125 -117
- package/.claude/agents/goal/goal-planner.md +8 -0
- package/.claude/agents/infrastructure/README.md +100 -0
- package/.claude/agents/{specialized → infrastructure}/devops-engineer.md +131 -150
- package/.claude/agents/planners/README.md +94 -0
- package/.claude/agents/{core-agents → planners}/analyst.md +1 -22
- package/.claude/agents/{planning-team → planners}/api-designer-persona.md +8 -0
- package/.claude/agents/{core-agents → planners}/architect.md +7 -20
- package/.claude/agents/{core-agents → planners}/planner.md +0 -21
- package/.claude/agents/{planning-team → planners}/security-architect-persona.md +8 -28
- package/.claude/agents/{planning-team → planners}/system-architect-persona.md +6 -38
- package/.claude/agents/{architecture → planners}/system-architect.md +12 -17
- package/.claude/agents/product-owner-team/accessibility-advocate-persona.md +132 -161
- package/.claude/agents/product-owner-team/power-user-persona.md +149 -182
- package/.claude/agents/retrospective-analyst.md +84 -0
- package/.claude/agents/reviewers/README.md +58 -0
- package/.claude/agents/{analysis → reviewers}/code-quality-validator.md +8 -17
- package/.claude/agents/reviewers/reviewer.md +181 -0
- package/.claude/agents/sparc/architecture.md +6 -25
- package/.claude/agents/sparc/pseudocode.md +6 -0
- package/.claude/agents/sparc/refinement.md +6 -0
- package/.claude/agents/sparc/specification.md +1 -0
- package/.claude/agents/specialists/README.md +60 -0
- package/.claude/agents/{core-agents → specialists}/base-template-generator.md +8 -21
- package/.claude/agents/{specialized → specialists}/cli-agent-optimizer.md +1 -1
- package/.claude/agents/{specialized → specialists}/code-booster.md +1 -0
- package/.claude/agents/{consensus → specialists}/consensus-builder.md +1 -17
- package/.claude/agents/{specialized/mobile → specialists}/mobile-dev.md +0 -20
- package/.claude/agents/{core-agents → specialists}/performance-benchmarker.md +134 -148
- package/.claude/agents/{specialized → specialists}/rust-developer.md +1 -20
- package/.claude/agents/{specialized → specialists}/rust-enterprise-developer.md +1 -20
- package/.claude/agents/{specialized → specialists}/rust-mvp-developer.md +1 -20
- package/.claude/agents/{core-agents → specialists}/security-manager.md +68 -88
- package/.claude/agents/{security → specialists}/security-specialist-existing.md +6 -57
- package/.claude/agents/{security → specialists}/security-specialist.md +6 -30
- package/.claude/agents/{specialized/mobile → specialists}/spec-mobile-react-native.md +2 -21
- package/.claude/agents/testers/README.md +94 -0
- package/.claude/agents/{testing → testers}/e2e/playwright-agent.md +1 -20
- package/.claude/agents/{testing → testers}/interaction-tester.md +1 -20
- package/.claude/agents/{testing → testers}/playwright-tester.md +1 -1
- package/.claude/agents/testers/tester.md +139 -0
- package/.claude/agents/testers/unit/tdd-london-swarm.md +49 -0
- package/.claude/agents/testers/validation/production-validator.md +33 -0
- package/.claude/agents-ignore/cfn-loop-coordinator.md +157 -0
- package/.claude/agents-ignore/cfn-loop-coordinator.md.backup +156 -0
- package/.claude/agents-ignore/coordinator.md.backup +182 -0
- package/.claude/agents-ignore/cost-savings-cfn-loop-coordinator.md +760 -0
- package/.claude/agents-ignore/cost-savings-coordinator.md +173 -0
- package/.claude/artifacts/ace-reflections/REFLECT-001-summary.json +39 -0
- package/.claude/artifacts/ace-reflections/sprint-7_$(date -u +/"%Y%m%d_%H%M%S/").json" +47 -0
- package/.claude/artifacts/reflection-merge-logs/cli-agent-spawning-v2.5.2-merge-report.md +61 -0
- package/.claude/commands/CFN_COORDINATOR_PARAMETERS.md +10 -10
- package/.claude/commands/cfn-loop-epic.md +43 -19
- package/.claude/commands/cfn-loop-single.md +3 -3
- package/.claude/commands/cfn-loop-sprints.md +1 -1
- package/.claude/commands/cfn-loop.md +45 -32
- package/.claude/commands/cfn-mode.md +20 -0
- package/.claude/commands/custom-routing-activate.md +37 -123
- package/.claude/commands/custom-routing-deactivate.md +27 -124
- package/.claude/commands/switch-api.md +41 -16
- package/.claude/commands/write-plan.md +104 -0
- package/.claude/data/cfn-loop.db +0 -0
- package/.claude/data/cfn_loop_logs.db +0 -0
- package/.claude/hooks/BACKUP_USAGE.md +243 -0
- package/.claude/hooks/post-edit-cfn-retrospective.sh +79 -0
- package/.claude/hooks/post-edit.sh +21 -0
- package/.claude/hooks/pre-edit-backup.sh +71 -0
- package/.claude/hooks/restore-from-backup.sh +37 -0
- package/.claude/prompts/cfn-loop-context.md +115 -0
- package/.claude/prompts/loop-specific/loop2.md +50 -0
- package/.claude/prompts/loop-specific/loop3.md +43 -0
- package/.claude/prompts/loop-specific/loop4.md +54 -0
- package/.claude/root-claude-distribute/CLAUDE.md +76 -2
- package/.claude/skills/ace-system/sprint-7-lessons.json +46 -0
- package/.claude/skills/ace-system/store-reflection.sh +33 -136
- package/.claude/skills/agent-discovery/SKILL.md +40 -0
- package/.claude/skills/agent-discovery/agents-registry-clean.json +0 -0
- package/.claude/skills/agent-discovery/agents-registry-fixed.json +19 -0
- package/.claude/skills/agent-discovery/agents-registry.json +718 -0
- package/.claude/skills/agent-discovery/discover-agents.py +175 -0
- package/.claude/skills/agent-discovery/discover-agents.sh +87 -0
- package/.claude/skills/agent-discovery/invoke-registry.sh +11 -0
- package/.claude/skills/agent-discovery/temp_script.py +0 -0
- package/.claude/skills/agent-execution/execute-agent.sh +126 -0
- package/.claude/skills/agent-output-processing/SKILL.md +359 -0
- package/.claude/skills/agent-selector/SKILL.md +90 -0
- package/.claude/skills/agent-selector/select-agents.sh +96 -0
- package/.claude/skills/agent-spawning/agent-selection-guide.md +1 -1
- package/.claude/skills/agent-swap/SKILL.md +36 -0
- package/.claude/skills/agent-swap/recommend-swap.sh +60 -0
- package/.claude/skills/api-validation/test-endpoints.sh +54 -0
- package/.claude/skills/automatic-memory-persistence/SKILL.md +73 -0
- package/.claude/skills/automatic-memory-persistence/persist-agent-output.sh +49 -0
- package/.claude/skills/automatic-memory-persistence/query-agent-history.sh +35 -0
- package/.claude/skills/automatic-memory-persistence/test-memory-persistence.sh +235 -0
- package/.claude/skills/cfn-loop-orchestration/README.md +41 -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/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/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 +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 +307 -217
- package/.claude/skills/complexity-estimator/SKILL.md +96 -0
- package/.claude/skills/complexity-estimator/estimate-complexity.sh +144 -0
- package/.claude/skills/context-pruner/SKILL.md +75 -0
- package/.claude/skills/context-pruner/prune-context.sh +73 -0
- package/.claude/skills/defense-in-depth/SKILL.md +133 -0
- package/.claude/skills/dependency-extractor/SKILL.md +35 -0
- package/.claude/skills/dependency-extractor/extract-dependencies.sh +66 -0
- package/.claude/skills/epic-decomposer/SKILL.md +44 -0
- package/.claude/skills/epic-decomposer/decompose-epic.sh +104 -0
- package/.claude/skills/improvement-recommender/SKILL.md +33 -0
- package/.claude/skills/improvement-recommender/recommend-improvements.sh +92 -0
- package/.claude/skills/intervention-detector/SKILL.md +39 -0
- package/.claude/skills/intervention-detector/detect-intervention.sh +111 -0
- package/.claude/skills/intervention-orchestrator/SKILL.md +43 -0
- package/.claude/skills/intervention-orchestrator/execute-intervention.sh +59 -0
- package/.claude/skills/loop2-output-processing/SKILL.md +163 -0
- package/.claude/skills/loop2-output-processing/execute-and-extract.sh +77 -0
- package/.claude/skills/loop2-output-processing/execute-and-extract.sh.backup +36 -0
- package/.claude/skills/loop2-output-processing/parse-feedback.sh +147 -0
- package/.claude/skills/loop2-output-processing/process-validator-output.sh +275 -0
- package/.claude/skills/loop2-output-processing/test-bug27-fix.sh +200 -0
- package/.claude/skills/loop2-output-processing/test-loop2-processing.sh +113 -0
- package/.claude/skills/loop3-output-processing/AGENT_COMPLETION_PROTOCOL.md +206 -0
- package/.claude/skills/loop3-output-processing/SKILL.md +421 -0
- package/.claude/skills/loop3-output-processing/calculate-confidence.sh +28 -0
- package/.claude/skills/loop3-output-processing/execute-and-extract.sh +85 -0
- package/.claude/skills/loop3-output-processing/parse-confidence.sh +31 -0
- package/.claude/skills/loop3-output-processing/test-agent-timeout.sh +327 -0
- package/.claude/skills/loop3-output-processing/test-loop3-processing.sh +155 -0
- package/.claude/skills/loop3-output-processing/verify-deliverables.sh +42 -0
- package/.claude/skills/pattern-extraction/SKILL.md +30 -0
- package/.claude/skills/pattern-extraction/extract-patterns.sh +80 -0
- package/.claude/skills/playbook/SKILL.md +113 -0
- package/.claude/skills/playbook/init-playbook.sh +54 -0
- package/.claude/skills/playbook/playbook.db +0 -0
- package/.claude/skills/playbook/query-playbook.sh +79 -0
- package/.claude/skills/playbook/update-playbook.sh +69 -0
- package/.claude/skills/playbook-auto-update/SKILL.md +29 -0
- package/.claude/skills/playbook-auto-update/auto-update-playbook.sh +86 -0
- package/.claude/skills/product-owner-decision/SKILL.md +332 -0
- package/.claude/skills/product-owner-decision/execute-decision.sh +176 -0
- package/.claude/skills/product-owner-decision/parse-decision.sh +66 -0
- package/.claude/skills/product-owner-decision/validate-deliverables.sh +82 -0
- package/.claude/skills/redis-coordination/AGENT_LOGGING.md +280 -0
- package/.claude/skills/redis-coordination/LOGGING.md +260 -0
- package/.claude/skills/redis-coordination/README.md +30 -29
- package/.claude/skills/redis-coordination/SKILL.md +685 -83
- package/.claude/skills/redis-coordination/agent-log.sh +124 -0
- package/.claude/skills/redis-coordination/analyze-task-complexity.sh +277 -0
- package/.claude/skills/redis-coordination/cfn-loop-exec.sh +468 -0
- package/.claude/skills/redis-coordination/collect-confidence-scores.sh +179 -0
- package/.claude/skills/redis-coordination/collect-results.sh +75 -0
- package/.claude/skills/redis-coordination/data/cfn-loop.db +0 -0
- package/.claude/skills/redis-coordination/demos/test-iteration-feedback.sh +320 -0
- package/.claude/skills/redis-coordination/{test-orchestrator.sh → demos/test-orchestrator.sh} +25 -0
- package/.claude/skills/redis-coordination/execute-product-owner-decision.sh +258 -0
- package/.claude/skills/redis-coordination/get-agent-timeout.sh +176 -176
- package/.claude/skills/redis-coordination/init-swarm.sh +6 -1
- package/.claude/skills/redis-coordination/invoke-waiting-mode.sh +106 -183
- package/.claude/skills/redis-coordination/invoke-waiting-mode.sh.backup-p7 +423 -0
- package/.claude/skills/redis-coordination/log-event.sh +109 -0
- package/.claude/skills/redis-coordination/monitor-cfn-violations.sh +391 -0
- package/.claude/skills/redis-coordination/orchestrate-cfn-loop-v3.sh +141 -0
- package/.claude/skills/redis-coordination/orchestrate-cfn-loop.sh +31 -933
- package/.claude/skills/redis-coordination/orchestrate-cfn-loop.sh.backup +38 -0
- package/.claude/skills/redis-coordination/orchestrate-cfn-loop.sh.backup-1761167675 +1672 -0
- package/.claude/skills/redis-coordination/orchestrate-cfn-loop.sh.backup-p5 +1604 -0
- package/.claude/skills/redis-coordination/orchestrate-cfn-loop.sh.backup-phase1 +1550 -0
- package/.claude/skills/redis-coordination/orchestrate-cfn-loop.sh.backup-phase2 +1621 -0
- package/.claude/skills/redis-coordination/orchestrate-cfn-loop.sh.backup-phase3 +1621 -0
- package/.claude/skills/redis-coordination/orchestrate-cfn-loop.sh.bak +0 -0
- package/.claude/skills/redis-coordination/orchestrate-cfn-loop.sh.broken +1627 -0
- package/.claude/skills/redis-coordination/orchestrate-cfn-loop.sh.corrupted +80 -0
- package/.claude/skills/redis-coordination/orchestrate-cfn-loop.sh.deprecated +1864 -0
- package/.claude/skills/redis-coordination/query-logs.sh +103 -0
- package/.claude/skills/redis-coordination/retrieve-context.sh +58 -0
- package/.claude/skills/redis-coordination/select-specialist-agent.sh +371 -0
- package/.claude/skills/redis-coordination/semantic-match-tfidf.py +252 -0
- package/.claude/skills/redis-coordination/send-heartbeat.sh +164 -72
- package/.claude/skills/redis-coordination/signal.sh +38 -0
- package/.claude/skills/redis-coordination/store-context.sh +86 -0
- package/.claude/skills/redis-coordination/store-epic-context.sh +123 -0
- package/.claude/skills/redis-coordination/test-context-injection.sh +354 -0
- package/.claude/skills/redis-coordination/test-timeout-enforcement.sh +513 -0
- package/.claude/skills/redis-coordination/tests/convert-line-endings.sh +15 -0
- package/.claude/skills/redis-coordination/tests/dlq-functionality-test.sh +101 -101
- package/.claude/skills/redis-coordination/tests/edge-cases-test.sh +98 -98
- package/.claude/skills/redis-coordination/tests/integration-test.sh +169 -169
- package/.claude/skills/redis-coordination/tests/retry-mechanism-test.sh +81 -81
- package/.claude/skills/redis-coordination/tests/run-test-suite.sh +91 -91
- package/.claude/skills/redis-coordination/tests/run-tests.sh +4 -0
- package/.claude/skills/redis-coordination/tests/test-primitives.sh +166 -0
- package/.claude/skills/redis-coordination/tests/test-utils.sh +53 -121
- package/.claude/skills/redis-coordination/tests/test_coordination_primitives.sh.deprecated +20 -0
- package/.claude/skills/redis-coordination/tests/test_utils.sh +49 -0
- package/.claude/skills/redis-coordination/v2_modularization/core_orchestration.sh +76 -0
- package/.claude/skills/redis-coordination/validate-parameters.sh +492 -0
- package/.claude/skills/retrospective-report/SKILL.md +31 -0
- package/.claude/skills/retrospective-report/generate-report.sh +101 -0
- package/.claude/skills/run-all-skill-tests.sh +124 -0
- package/.claude/skills/scope-simplifier/SKILL.md +37 -0
- package/.claude/skills/scope-simplifier/simplify-scope.sh +68 -0
- package/.claude/skills/simplified-agent-lifecycle/COST_ANALYSIS.md +49 -0
- package/.claude/skills/simplified-agent-lifecycle/DESIGN.md +98 -0
- package/.claude/skills/simplified-agent-lifecycle/MIGRATION_PLAN.md +74 -0
- package/.claude/skills/skill-builder/SKILL.md +910 -0
- package/.claude/skills/specialist-injection/SKILL.md +41 -0
- package/.claude/skills/specialist-injection/recommend-specialist.sh +57 -0
- package/.claude/skills/sprint-execution/SKILL.md +27 -0
- package/.claude/skills/sprint-execution/execute-sprint-task.sh +59 -0
- package/.claude/skills/sprint-execution/execute-sprint.sh +65 -0
- package/.claude/skills/sprint-planner/SKILL.md +37 -0
- package/.claude/skills/sprint-planner/plan-sprint.sh +85 -0
- package/.claude/skills/standardized-error-handling/SKILL.md +56 -0
- package/.claude/skills/standardized-error-handling/capture-agent-error.sh +87 -0
- package/.claude/skills/standardized-error-handling/test-error-handling.sh +166 -0
- package/.claude/skills/task-classifier/SKILL.md +94 -0
- package/.claude/skills/task-classifier/classify-task.sh +115 -0
- package/.claude/skills/validation-templates/SKILL.md +47 -0
- package/.claude/skills/validation-templates/content.json +38 -0
- package/.claude/skills/validation-templates/data.json +38 -0
- package/.claude/skills/validation-templates/design.json +38 -0
- package/.claude/skills/validation-templates/infrastructure.json +38 -0
- package/.claude/skills/validation-templates/research.json +38 -0
- package/.claude/skills/validation-templates/software.json +38 -0
- package/.claude/skills/webapp-testing/README.md +142 -0
- package/.claude/skills/webapp-testing/SCREENSHOT_NAMING_CONVENTION.md +547 -0
- package/.claude/skills/webapp-testing/SKILL.md +877 -0
- package/.claude/skills/webapp-testing/capture-screenshot.sh +238 -0
- package/.claude/skills/webapp-testing/cfn-loop-integration.sh +265 -0
- package/.claude/skills/webapp-testing/compare-screenshots.sh +199 -0
- package/.claude/skills/webapp-testing/init-storage.sh +150 -0
- package/.claude/skills/webapp-testing/set-baseline.sh +196 -0
- package/.claude/skills/webapp-testing/test-webapp-testing.sh +233 -0
- package/.claude/spawn-pattern-examples.md +3 -3
- package/CLAUDE.md +364 -16
- package/README.md +598 -251
- package/dist/agents/agent-loader.js +146 -165
- package/dist/agents/agent-loader.js.map +1 -1
- package/dist/cli/agent-command.js +153 -0
- package/dist/cli/agent-command.js.map +1 -0
- package/dist/cli/agent-definition-parser.js +183 -0
- package/dist/cli/agent-definition-parser.js.map +1 -0
- package/dist/cli/agent-executor.js +310 -0
- package/dist/cli/agent-executor.js.map +1 -0
- package/dist/cli/agent-prompt-builder.js +268 -0
- package/dist/cli/agent-prompt-builder.js.map +1 -0
- package/dist/cli/agent-spawn.js +56 -2
- package/dist/cli/agent-spawn.js.map +1 -1
- package/dist/cli/anthropic-client.js +421 -0
- package/dist/cli/anthropic-client.js.map +1 -0
- package/dist/cli/cfn-context.js +150 -0
- package/dist/cli/cfn-context.js.map +1 -1
- package/dist/cli/cfn-fork.js +159 -0
- package/dist/cli/cfn-fork.js.map +1 -0
- package/dist/cli/cli-agent-context.js +358 -0
- package/dist/cli/cli-agent-context.js.map +1 -0
- package/dist/cli/config-manager.js +109 -91
- package/dist/cli/config-manager.js.map +1 -1
- package/dist/cli/conversation-fork.js +201 -0
- package/dist/cli/conversation-fork.js.map +1 -0
- package/dist/cli/index.js +119 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/iteration-history.js +188 -0
- package/dist/cli/iteration-history.js.map +1 -0
- package/dist/cli/tool-definitions.js +263 -0
- package/dist/cli/tool-definitions.js.map +1 -0
- package/dist/cli/tool-executor.js +247 -0
- package/dist/cli/tool-executor.js.map +1 -0
- package/dist/hello.js +8 -0
- package/dist/hello.js.map +1 -0
- package/package.json +16 -6
- package/scripts/README.md +68 -0
- package/scripts/cfn-intervention-example.sh +21 -0
- package/scripts/migrate-test-infrastructure.sh +40 -0
- package/scripts/switch-api.sh +233 -0
- package/scripts/validate-test-migration.sh +49 -0
- package/scripts/verify-no-secrets.sh +55 -0
- package/.claude/agents/architecture/system-architect.md.backup +0 -603
- package/.claude/agents/code-booster.md +0 -131
- package/.claude/agents/consensus/performance-benchmarker.md +0 -101
- package/.claude/agents/consensus/security-manager.md +0 -107
- package/.claude/agents/context-curator.md +0 -167
- package/.claude/agents/context-reflector.md +0 -65
- package/.claude/agents/core-agents/cfn-loop-coordinator.md +0 -134
- package/.claude/agents/core-agents/code-quality-validator.md +0 -149
- package/.claude/agents/core-agents/context-curator.md +0 -452
- package/.claude/agents/core-agents/context-reflector.md +0 -273
- package/.claude/agents/core-agents/cost-savings-cfn-loop-coordinator.md +0 -190
- package/.claude/agents/core-agents/tester.md +0 -170
- package/.claude/agents/development/backend-dev.md +0 -165
- package/.claude/agents/devops/devops-engineer.md +0 -148
- package/.claude/agents/frontend/interaction-tester.md +0 -139
- package/.claude/agents/frontend/react-frontend-engineer.md +0 -9
- package/.claude/agents/personas/accessibility-advocate-persona.md +0 -107
- package/.claude/agents/testing/production-validator.md +0 -179
- package/.claude/agents/testing/tdd-london-swarm.md +0 -209
- package/.claude/agents/testing/unit/tdd-london-swarm.md +0 -43
- package/.claude/agents/testing/validation/production-validator.md +0 -43
- package/dist/coordination/fleet-manager.test.js +0 -141
- package/dist/coordination/fleet-manager.test.js.map +0 -1
- package/dist/middleware/transparency-middleware.test.js +0 -184
- package/dist/middleware/transparency-middleware.test.js.map +0 -1
- /package/.claude/agents/{core-agents → developers}/researcher.md +0 -0
- /package/.claude/agents/{consensus → specialists}/crdt-synchronizer.md +0 -0
- /package/.claude/agents/{consensus → specialists}/quorum-manager.md +0 -0
- /package/.claude/agents/{consensus → specialists}/raft-manager.md +0 -0
- /package/.claude/{agents/core-agents → agents-ignore}/coordinator.md +0 -0
- /package/.claude/{agents/core-agents/cost-savings-coordinator.md → agents-ignore/cost-savings-coordinator.md.backup} +0 -0
- /package/.claude/skills/redis-coordination/{phase4-wake-queue-test-report.md → demos/phase4-wake-queue-test-report.md} +0 -0
- /package/.claude/skills/redis-coordination/{test-bzpopmin-fix.sh → demos/test-bzpopmin-fix.sh} +0 -0
- /package/.claude/skills/redis-coordination/{test-cancel-swarm.sh → demos/test-cancel-swarm.sh} +0 -0
- /package/.claude/skills/redis-coordination/{test-dlq.sh → demos/test-dlq.sh} +0 -0
- /package/.claude/skills/redis-coordination/{test-priority-wake-phase4-unix.sh → demos/test-priority-wake-phase4-unix.sh} +0 -0
- /package/.claude/skills/redis-coordination/{test-priority-wake-phase4.sh → demos/test-priority-wake-phase4.sh} +0 -0
- /package/.claude/skills/redis-coordination/{test-priority-wake.sh → demos/test-priority-wake.sh} +0 -0
- /package/.claude/skills/redis-coordination/{test-quick-fix.sh → demos/test-quick-fix.sh} +0 -0
- /package/.claude/skills/redis-coordination/{test-quorum-absolute.sh → demos/test-quorum-absolute.sh} +0 -0
- /package/.claude/skills/redis-coordination/{test-quorum-fallback.sh → demos/test-quorum-fallback.sh} +0 -0
- /package/.claude/skills/redis-coordination/{test-quorum-percentage.sh → demos/test-quorum-percentage.sh} +0 -0
- /package/.claude/skills/redis-coordination/{test-quorum-with-retry.sh → demos/test-quorum-with-retry.sh} +0 -0
- /package/.claude/skills/redis-coordination/{test-quorum.sh → demos/test-quorum.sh} +0 -0
- /package/.claude/skills/redis-coordination/{test-shutdown-handling.sh → demos/test-shutdown-handling.sh} +0 -0
- /package/.claude/skills/redis-coordination/{test-shutdown.sh → demos/test-shutdown.sh} +0 -0
- /package/.claude/skills/redis-coordination/{test-utils-unix.sh → demos/test-utils-unix.sh} +0 -0
- /package/.claude/skills/redis-coordination/{test-utils.sh → demos/test-utils.sh} +0 -0
- /package/.claude/skills/redis-coordination/{test-waiting-mode.sh → demos/test-waiting-mode.sh} +0 -0
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Executor for CLI-Spawned Agents
|
|
3
|
+
*
|
|
4
|
+
* Executes tools requested by agents via Anthropic API tool_use blocks.
|
|
5
|
+
* Implements Read, Write, Edit, Bash, TodoWrite, Glob, Grep.
|
|
6
|
+
*/ import fs from 'fs/promises';
|
|
7
|
+
import { exec } from 'child_process';
|
|
8
|
+
import { promisify } from 'util';
|
|
9
|
+
import { glob } from 'glob';
|
|
10
|
+
const execAsync = promisify(exec);
|
|
11
|
+
/**
|
|
12
|
+
* Execute a single tool and return result
|
|
13
|
+
*/ export async function executeTool(toolUse) {
|
|
14
|
+
console.log(`[tool-executor] Executing tool: ${toolUse.name}`);
|
|
15
|
+
console.log(`[tool-executor] Tool use ID: ${toolUse.id}`);
|
|
16
|
+
try {
|
|
17
|
+
let result;
|
|
18
|
+
switch(toolUse.name){
|
|
19
|
+
case 'Read':
|
|
20
|
+
result = await executeRead(toolUse.input);
|
|
21
|
+
break;
|
|
22
|
+
case 'Write':
|
|
23
|
+
result = await executeWrite(toolUse.input);
|
|
24
|
+
break;
|
|
25
|
+
case 'Edit':
|
|
26
|
+
result = await executeEdit(toolUse.input);
|
|
27
|
+
break;
|
|
28
|
+
case 'Bash':
|
|
29
|
+
result = await executeBash(toolUse.input);
|
|
30
|
+
break;
|
|
31
|
+
case 'TodoWrite':
|
|
32
|
+
result = await executeTodoWrite(toolUse.input);
|
|
33
|
+
break;
|
|
34
|
+
case 'Glob':
|
|
35
|
+
result = await executeGlob(toolUse.input);
|
|
36
|
+
break;
|
|
37
|
+
case 'Grep':
|
|
38
|
+
result = await executeGrep(toolUse.input);
|
|
39
|
+
break;
|
|
40
|
+
default:
|
|
41
|
+
throw new Error(`Unknown tool: ${toolUse.name}`);
|
|
42
|
+
}
|
|
43
|
+
console.log(`[tool-executor] ✓ Tool executed successfully`);
|
|
44
|
+
return {
|
|
45
|
+
type: 'tool_result',
|
|
46
|
+
tool_use_id: toolUse.id,
|
|
47
|
+
content: result
|
|
48
|
+
};
|
|
49
|
+
} catch (error) {
|
|
50
|
+
console.error(`[tool-executor] ✗ Tool execution failed:`, error);
|
|
51
|
+
return {
|
|
52
|
+
type: 'tool_result',
|
|
53
|
+
tool_use_id: toolUse.id,
|
|
54
|
+
content: error instanceof Error ? error.message : String(error),
|
|
55
|
+
is_error: true
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Execute Read tool
|
|
61
|
+
*/ async function executeRead(input) {
|
|
62
|
+
const { file_path, offset, limit } = input;
|
|
63
|
+
if (!file_path) {
|
|
64
|
+
throw new Error('file_path parameter is required');
|
|
65
|
+
}
|
|
66
|
+
const content = await fs.readFile(file_path, 'utf-8');
|
|
67
|
+
const lines = content.split('\n');
|
|
68
|
+
// Apply offset and limit if provided
|
|
69
|
+
const startLine = offset ? Number(offset) - 1 : 0;
|
|
70
|
+
const endLine = limit ? startLine + Number(limit) : lines.length;
|
|
71
|
+
const selectedLines = lines.slice(startLine, endLine);
|
|
72
|
+
// Format with line numbers (cat -n style)
|
|
73
|
+
const formatted = selectedLines.map((line, idx)=>`${String(startLine + idx + 1).padStart(6)}→${line}`).join('\n');
|
|
74
|
+
return formatted;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Execute Write tool
|
|
78
|
+
*/ async function executeWrite(input) {
|
|
79
|
+
const { file_path, content } = input;
|
|
80
|
+
if (!file_path) {
|
|
81
|
+
throw new Error('file_path parameter is required');
|
|
82
|
+
}
|
|
83
|
+
if (content === undefined) {
|
|
84
|
+
throw new Error('content parameter is required');
|
|
85
|
+
}
|
|
86
|
+
await fs.writeFile(file_path, content, 'utf-8');
|
|
87
|
+
return `File written successfully: ${file_path}`;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Execute Edit tool
|
|
91
|
+
*/ async function executeEdit(input) {
|
|
92
|
+
const { file_path, old_string, new_string, replace_all } = input;
|
|
93
|
+
if (!file_path) {
|
|
94
|
+
throw new Error('file_path parameter is required');
|
|
95
|
+
}
|
|
96
|
+
if (!old_string) {
|
|
97
|
+
throw new Error('old_string parameter is required');
|
|
98
|
+
}
|
|
99
|
+
if (new_string === undefined) {
|
|
100
|
+
throw new Error('new_string parameter is required');
|
|
101
|
+
}
|
|
102
|
+
// Read file
|
|
103
|
+
const content = await fs.readFile(file_path, 'utf-8');
|
|
104
|
+
// Perform replacement
|
|
105
|
+
let newContent;
|
|
106
|
+
if (replace_all) {
|
|
107
|
+
// Replace all occurrences
|
|
108
|
+
newContent = content.split(old_string).join(new_string);
|
|
109
|
+
} else {
|
|
110
|
+
// Replace first occurrence only (must be unique)
|
|
111
|
+
const occurrences = content.split(old_string).length - 1;
|
|
112
|
+
if (occurrences === 0) {
|
|
113
|
+
throw new Error('old_string not found in file');
|
|
114
|
+
}
|
|
115
|
+
if (occurrences > 1) {
|
|
116
|
+
throw new Error(`old_string appears ${occurrences} times. Must be unique or use replace_all: true`);
|
|
117
|
+
}
|
|
118
|
+
newContent = content.replace(old_string, new_string);
|
|
119
|
+
}
|
|
120
|
+
// Write back
|
|
121
|
+
await fs.writeFile(file_path, newContent, 'utf-8');
|
|
122
|
+
return `File edited successfully: ${file_path}`;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Execute Bash tool
|
|
126
|
+
*/ async function executeBash(input) {
|
|
127
|
+
const { command, timeout, run_in_background } = input;
|
|
128
|
+
if (!command) {
|
|
129
|
+
throw new Error('command parameter is required');
|
|
130
|
+
}
|
|
131
|
+
// DEBUG: Log bash command execution details
|
|
132
|
+
console.log(`[tool-executor] Bash command: ${command}`);
|
|
133
|
+
console.log(`[tool-executor] Timeout: ${timeout || 120000}ms`);
|
|
134
|
+
console.log(`[tool-executor] Background: ${run_in_background || false}`);
|
|
135
|
+
const timeoutMs = timeout ? Number(timeout) : 120000; // 2 minutes default
|
|
136
|
+
if (run_in_background) {
|
|
137
|
+
// Start background process and return immediately
|
|
138
|
+
exec(command);
|
|
139
|
+
return `Command started in background: ${command}`;
|
|
140
|
+
}
|
|
141
|
+
// Execute synchronously with timeout
|
|
142
|
+
const { stdout, stderr } = await execAsync(command, {
|
|
143
|
+
timeout: timeoutMs,
|
|
144
|
+
maxBuffer: 10 * 1024 * 1024 // 10MB buffer
|
|
145
|
+
});
|
|
146
|
+
return stdout + stderr;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Execute TodoWrite tool
|
|
150
|
+
*/ async function executeTodoWrite(input) {
|
|
151
|
+
const { todos } = input;
|
|
152
|
+
if (!Array.isArray(todos)) {
|
|
153
|
+
throw new Error('todos parameter must be an array');
|
|
154
|
+
}
|
|
155
|
+
// Validate todo structure
|
|
156
|
+
for (const todo of todos){
|
|
157
|
+
if (!todo.content || !todo.status || !todo.activeForm) {
|
|
158
|
+
throw new Error('Each todo must have content, status, and activeForm');
|
|
159
|
+
}
|
|
160
|
+
if (![
|
|
161
|
+
'pending',
|
|
162
|
+
'in_progress',
|
|
163
|
+
'completed'
|
|
164
|
+
].includes(todo.status)) {
|
|
165
|
+
throw new Error('Invalid status. Must be pending, in_progress, or completed');
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// Format todos for display
|
|
169
|
+
const formatted = todos.map((todo, idx)=>{
|
|
170
|
+
const status = todo.status === 'completed' ? '✓' : todo.status === 'in_progress' ? '⚡' : '○';
|
|
171
|
+
return `${idx + 1}. [${status}] ${todo.content}`;
|
|
172
|
+
}).join('\n');
|
|
173
|
+
return `Todo list updated:\n${formatted}`;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Execute Glob tool
|
|
177
|
+
*/ async function executeGlob(input) {
|
|
178
|
+
const { pattern, path } = input;
|
|
179
|
+
if (!pattern) {
|
|
180
|
+
throw new Error('pattern parameter is required');
|
|
181
|
+
}
|
|
182
|
+
const cwd = path || process.cwd();
|
|
183
|
+
const files = await glob(pattern, {
|
|
184
|
+
cwd,
|
|
185
|
+
nodir: true
|
|
186
|
+
});
|
|
187
|
+
if (files.length === 0) {
|
|
188
|
+
return 'No files found';
|
|
189
|
+
}
|
|
190
|
+
return files.join('\n');
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Execute Grep tool
|
|
194
|
+
*/ async function executeGrep(input) {
|
|
195
|
+
const { pattern, path, output_mode, glob: globPattern, type } = input;
|
|
196
|
+
if (!pattern) {
|
|
197
|
+
throw new Error('pattern parameter is required');
|
|
198
|
+
}
|
|
199
|
+
// Build ripgrep command
|
|
200
|
+
const args = [
|
|
201
|
+
'rg'
|
|
202
|
+
];
|
|
203
|
+
// Output mode
|
|
204
|
+
if (output_mode === 'files_with_matches' || !output_mode) {
|
|
205
|
+
args.push('-l'); // List files with matches
|
|
206
|
+
} else if (output_mode === 'count') {
|
|
207
|
+
args.push('-c'); // Count matches per file
|
|
208
|
+
}
|
|
209
|
+
// Default is content (no flag)
|
|
210
|
+
// Optional flags
|
|
211
|
+
if (input['-i']) args.push('-i'); // Case insensitive
|
|
212
|
+
if (input['-n']) args.push('-n'); // Line numbers
|
|
213
|
+
if (input['-A']) args.push(`-A${input['-A']}`); // After context
|
|
214
|
+
if (input['-B']) args.push(`-B${input['-B']}`); // Before context
|
|
215
|
+
if (input['-C']) args.push(`-C${input['-C']}`); // Context
|
|
216
|
+
// File filtering
|
|
217
|
+
if (globPattern) args.push('--glob', globPattern);
|
|
218
|
+
if (type) args.push('--type', type);
|
|
219
|
+
// Pattern and path
|
|
220
|
+
args.push(pattern);
|
|
221
|
+
if (path) args.push(path);
|
|
222
|
+
const command = args.join(' ');
|
|
223
|
+
try {
|
|
224
|
+
const { stdout } = await execAsync(command, {
|
|
225
|
+
maxBuffer: 10 * 1024 * 1024 // 10MB buffer
|
|
226
|
+
});
|
|
227
|
+
return stdout || 'No matches found';
|
|
228
|
+
} catch (error) {
|
|
229
|
+
// ripgrep exits with code 1 if no matches found
|
|
230
|
+
if (error.code === 1) {
|
|
231
|
+
return 'No matches found';
|
|
232
|
+
}
|
|
233
|
+
throw error;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Execute multiple tools in sequence
|
|
238
|
+
*/ export async function executeTools(toolUses) {
|
|
239
|
+
const results = [];
|
|
240
|
+
for (const toolUse of toolUses){
|
|
241
|
+
const result = await executeTool(toolUse);
|
|
242
|
+
results.push(result);
|
|
243
|
+
}
|
|
244
|
+
return results;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
//# sourceMappingURL=tool-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cli/tool-executor.ts"],"sourcesContent":["/**\r\n * Tool Executor for CLI-Spawned Agents\r\n *\r\n * Executes tools requested by agents via Anthropic API tool_use blocks.\r\n * Implements Read, Write, Edit, Bash, TodoWrite, Glob, Grep.\r\n */\r\n\r\nimport fs from 'fs/promises';\r\nimport { exec } from 'child_process';\r\nimport { promisify } from 'util';\r\nimport { glob } from 'glob';\r\n\r\nconst execAsync = promisify(exec);\r\n\r\nexport interface ToolUse {\r\n type: 'tool_use';\r\n id: string;\r\n name: string;\r\n input: Record<string, any>;\r\n}\r\n\r\nexport interface ToolResult {\r\n type: 'tool_result';\r\n tool_use_id: string;\r\n content: string;\r\n is_error?: boolean;\r\n}\r\n\r\n/**\r\n * Execute a single tool and return result\r\n */\r\nexport async function executeTool(toolUse: ToolUse): Promise<ToolResult> {\r\n console.log(`[tool-executor] Executing tool: ${toolUse.name}`);\r\n console.log(`[tool-executor] Tool use ID: ${toolUse.id}`);\r\n\r\n try {\r\n let result: string;\r\n\r\n switch (toolUse.name) {\r\n case 'Read':\r\n result = await executeRead(toolUse.input);\r\n break;\r\n\r\n case 'Write':\r\n result = await executeWrite(toolUse.input);\r\n break;\r\n\r\n case 'Edit':\r\n result = await executeEdit(toolUse.input);\r\n break;\r\n\r\n case 'Bash':\r\n result = await executeBash(toolUse.input);\r\n break;\r\n\r\n case 'TodoWrite':\r\n result = await executeTodoWrite(toolUse.input);\r\n break;\r\n\r\n case 'Glob':\r\n result = await executeGlob(toolUse.input);\r\n break;\r\n\r\n case 'Grep':\r\n result = await executeGrep(toolUse.input);\r\n break;\r\n\r\n default:\r\n throw new Error(`Unknown tool: ${toolUse.name}`);\r\n }\r\n\r\n console.log(`[tool-executor] ✓ Tool executed successfully`);\r\n\r\n return {\r\n type: 'tool_result',\r\n tool_use_id: toolUse.id,\r\n content: result\r\n };\r\n } catch (error) {\r\n console.error(`[tool-executor] ✗ Tool execution failed:`, error);\r\n\r\n return {\r\n type: 'tool_result',\r\n tool_use_id: toolUse.id,\r\n content: error instanceof Error ? error.message : String(error),\r\n is_error: true\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Execute Read tool\r\n */\r\nasync function executeRead(input: Record<string, any>): Promise<string> {\r\n const { file_path, offset, limit } = input;\r\n\r\n if (!file_path) {\r\n throw new Error('file_path parameter is required');\r\n }\r\n\r\n const content = await fs.readFile(file_path, 'utf-8');\r\n const lines = content.split('\\n');\r\n\r\n // Apply offset and limit if provided\r\n const startLine = offset ? Number(offset) - 1 : 0;\r\n const endLine = limit ? startLine + Number(limit) : lines.length;\r\n const selectedLines = lines.slice(startLine, endLine);\r\n\r\n // Format with line numbers (cat -n style)\r\n const formatted = selectedLines\r\n .map((line, idx) => `${String(startLine + idx + 1).padStart(6)}→${line}`)\r\n .join('\\n');\r\n\r\n return formatted;\r\n}\r\n\r\n/**\r\n * Execute Write tool\r\n */\r\nasync function executeWrite(input: Record<string, any>): Promise<string> {\r\n const { file_path, content } = input;\r\n\r\n if (!file_path) {\r\n throw new Error('file_path parameter is required');\r\n }\r\n\r\n if (content === undefined) {\r\n throw new Error('content parameter is required');\r\n }\r\n\r\n await fs.writeFile(file_path, content, 'utf-8');\r\n\r\n return `File written successfully: ${file_path}`;\r\n}\r\n\r\n/**\r\n * Execute Edit tool\r\n */\r\nasync function executeEdit(input: Record<string, any>): Promise<string> {\r\n const { file_path, old_string, new_string, replace_all } = input;\r\n\r\n if (!file_path) {\r\n throw new Error('file_path parameter is required');\r\n }\r\n\r\n if (!old_string) {\r\n throw new Error('old_string parameter is required');\r\n }\r\n\r\n if (new_string === undefined) {\r\n throw new Error('new_string parameter is required');\r\n }\r\n\r\n // Read file\r\n const content = await fs.readFile(file_path, 'utf-8');\r\n\r\n // Perform replacement\r\n let newContent: string;\r\n if (replace_all) {\r\n // Replace all occurrences\r\n newContent = content.split(old_string).join(new_string);\r\n } else {\r\n // Replace first occurrence only (must be unique)\r\n const occurrences = content.split(old_string).length - 1;\r\n if (occurrences === 0) {\r\n throw new Error('old_string not found in file');\r\n }\r\n if (occurrences > 1) {\r\n throw new Error(`old_string appears ${occurrences} times. Must be unique or use replace_all: true`);\r\n }\r\n newContent = content.replace(old_string, new_string);\r\n }\r\n\r\n // Write back\r\n await fs.writeFile(file_path, newContent, 'utf-8');\r\n\r\n return `File edited successfully: ${file_path}`;\r\n}\r\n\r\n/**\r\n * Execute Bash tool\r\n */\r\nasync function executeBash(input: Record<string, any>): Promise<string> {\r\n const { command, timeout, run_in_background } = input;\r\n\r\n if (!command) {\r\n throw new Error('command parameter is required');\r\n }\r\n\r\n // DEBUG: Log bash command execution details\r\n console.log(`[tool-executor] Bash command: ${command}`);\r\n console.log(`[tool-executor] Timeout: ${timeout || 120000}ms`);\r\n console.log(`[tool-executor] Background: ${run_in_background || false}`);\r\n\r\n const timeoutMs = timeout ? Number(timeout) : 120000; // 2 minutes default\r\n\r\n if (run_in_background) {\r\n // Start background process and return immediately\r\n exec(command);\r\n return `Command started in background: ${command}`;\r\n }\r\n\r\n // Execute synchronously with timeout\r\n const { stdout, stderr } = await execAsync(command, {\r\n timeout: timeoutMs,\r\n maxBuffer: 10 * 1024 * 1024 // 10MB buffer\r\n });\r\n\r\n return stdout + stderr;\r\n}\r\n\r\n/**\r\n * Execute TodoWrite tool\r\n */\r\nasync function executeTodoWrite(input: Record<string, any>): Promise<string> {\r\n const { todos } = input;\r\n\r\n if (!Array.isArray(todos)) {\r\n throw new Error('todos parameter must be an array');\r\n }\r\n\r\n // Validate todo structure\r\n for (const todo of todos) {\r\n if (!todo.content || !todo.status || !todo.activeForm) {\r\n throw new Error('Each todo must have content, status, and activeForm');\r\n }\r\n if (!['pending', 'in_progress', 'completed'].includes(todo.status)) {\r\n throw new Error('Invalid status. Must be pending, in_progress, or completed');\r\n }\r\n }\r\n\r\n // Format todos for display\r\n const formatted = todos\r\n .map((todo, idx) => {\r\n const status = todo.status === 'completed' ? '✓' : todo.status === 'in_progress' ? '⚡' : '○';\r\n return `${idx + 1}. [${status}] ${todo.content}`;\r\n })\r\n .join('\\n');\r\n\r\n return `Todo list updated:\\n${formatted}`;\r\n}\r\n\r\n/**\r\n * Execute Glob tool\r\n */\r\nasync function executeGlob(input: Record<string, any>): Promise<string> {\r\n const { pattern, path } = input;\r\n\r\n if (!pattern) {\r\n throw new Error('pattern parameter is required');\r\n }\r\n\r\n const cwd = path || process.cwd();\r\n const files = await glob(pattern, { cwd, nodir: true });\r\n\r\n if (files.length === 0) {\r\n return 'No files found';\r\n }\r\n\r\n return files.join('\\n');\r\n}\r\n\r\n/**\r\n * Execute Grep tool\r\n */\r\nasync function executeGrep(input: Record<string, any>): Promise<string> {\r\n const { pattern, path, output_mode, glob: globPattern, type } = input;\r\n\r\n if (!pattern) {\r\n throw new Error('pattern parameter is required');\r\n }\r\n\r\n // Build ripgrep command\r\n const args: string[] = ['rg'];\r\n\r\n // Output mode\r\n if (output_mode === 'files_with_matches' || !output_mode) {\r\n args.push('-l'); // List files with matches\r\n } else if (output_mode === 'count') {\r\n args.push('-c'); // Count matches per file\r\n }\r\n // Default is content (no flag)\r\n\r\n // Optional flags\r\n if (input['-i']) args.push('-i'); // Case insensitive\r\n if (input['-n']) args.push('-n'); // Line numbers\r\n if (input['-A']) args.push(`-A${input['-A']}`); // After context\r\n if (input['-B']) args.push(`-B${input['-B']}`); // Before context\r\n if (input['-C']) args.push(`-C${input['-C']}`); // Context\r\n\r\n // File filtering\r\n if (globPattern) args.push('--glob', globPattern);\r\n if (type) args.push('--type', type);\r\n\r\n // Pattern and path\r\n args.push(pattern);\r\n if (path) args.push(path);\r\n\r\n const command = args.join(' ');\r\n\r\n try {\r\n const { stdout } = await execAsync(command, {\r\n maxBuffer: 10 * 1024 * 1024 // 10MB buffer\r\n });\r\n return stdout || 'No matches found';\r\n } catch (error: any) {\r\n // ripgrep exits with code 1 if no matches found\r\n if (error.code === 1) {\r\n return 'No matches found';\r\n }\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Execute multiple tools in sequence\r\n */\r\nexport async function executeTools(toolUses: ToolUse[]): Promise<ToolResult[]> {\r\n const results: ToolResult[] = [];\r\n\r\n for (const toolUse of toolUses) {\r\n const result = await executeTool(toolUse);\r\n results.push(result);\r\n }\r\n\r\n return results;\r\n}\r\n"],"names":["fs","exec","promisify","glob","execAsync","executeTool","toolUse","console","log","name","id","result","executeRead","input","executeWrite","executeEdit","executeBash","executeTodoWrite","executeGlob","executeGrep","Error","type","tool_use_id","content","error","message","String","is_error","file_path","offset","limit","readFile","lines","split","startLine","Number","endLine","length","selectedLines","slice","formatted","map","line","idx","padStart","join","undefined","writeFile","old_string","new_string","replace_all","newContent","occurrences","replace","command","timeout","run_in_background","timeoutMs","stdout","stderr","maxBuffer","todos","Array","isArray","todo","status","activeForm","includes","pattern","path","cwd","process","files","nodir","output_mode","globPattern","args","push","code","executeTools","toolUses","results"],"mappings":"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"}
|
package/dist/hello.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hello.js"],"sourcesContent":["/**\n * Simple Hello World function\n * @returns {string} The greeting message\n */\nexport function hello() {\n return \"Hello World\";\n}"],"names":["hello"],"mappings":"AAAA;;;CAGC,GACD,OAAO,SAASA;IACd,OAAO;AACT"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-flow-novice",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.8.1",
|
|
4
4
|
"description": "AI agent orchestration framework with skills-based coordination, Redis pub/sub, and CFN Loop validation",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -53,25 +53,29 @@
|
|
|
53
53
|
"scripts": {
|
|
54
54
|
"dev": "tsx src/cli/index.ts",
|
|
55
55
|
"build": "npm run clean && npm run build:swc",
|
|
56
|
-
"build:swc": "swc src -d dist --config-file .swcrc",
|
|
56
|
+
"build:swc": "swc src -d dist --config-file .swcrc --ignore '**/*.test.ts' --ignore '**/*.test.tsx' --ignore '**/*.spec.ts'",
|
|
57
57
|
"clean": "rm -rf dist",
|
|
58
|
-
"test": "jest
|
|
58
|
+
"test": "jest",
|
|
59
59
|
"typecheck": "tsc --noEmit",
|
|
60
|
-
"prepublishOnly": "npm run build",
|
|
60
|
+
"prepublishOnly": "npm run build && ./scripts/verify-no-secrets.sh",
|
|
61
61
|
"prepack": "npm run build",
|
|
62
62
|
"postinstall": "node -e \"console.log('\\n✅ claude-flow-novice installed successfully!\\n📚 Get started: npx claude-flow-novice --help\\n🔧 Initialize: npx claude-flow-novice status\\n')\"",
|
|
63
63
|
"verify-package": "npm pack --dry-run",
|
|
64
64
|
"portal:start": "./scripts/start-portal.sh",
|
|
65
65
|
"portal:stop": "./scripts/stop-portal.sh",
|
|
66
66
|
"portal:restart": "npm run portal:stop && npm run portal:start",
|
|
67
|
-
"portal:status": "./scripts/portal-status.sh"
|
|
67
|
+
"portal:status": "./scripts/portal-status.sh",
|
|
68
|
+
"test:watch": "jest --watch",
|
|
69
|
+
"test:coverage": "jest --coverage"
|
|
68
70
|
},
|
|
69
71
|
"dependencies": {
|
|
72
|
+
"@anthropic-ai/sdk": "^0.67.0",
|
|
70
73
|
"ajv": "^8.17.1",
|
|
71
74
|
"better-sqlite3": "^12.4.1",
|
|
72
75
|
"chalk": "^4.1.2",
|
|
73
76
|
"commander": "^11.1.0",
|
|
74
77
|
"dotenv": "^17.2.3",
|
|
78
|
+
"glob": "^11.0.3",
|
|
75
79
|
"lodash": "^4.17.21",
|
|
76
80
|
"redis": "^5.8.3",
|
|
77
81
|
"socket.io": "^4.8.1",
|
|
@@ -89,8 +93,14 @@
|
|
|
89
93
|
"@types/sqlite3": "^3.1.11",
|
|
90
94
|
"@types/uuid": "^10.0.0",
|
|
91
95
|
"@types/yaml": "^1.9.6",
|
|
92
|
-
"jest": "^
|
|
96
|
+
"jest": "^30.2.0",
|
|
97
|
+
"jest-mock-extended": "^4.0.0",
|
|
98
|
+
"pixelmatch": "^7.1.0",
|
|
99
|
+
"playwright": "^1.56.1",
|
|
100
|
+
"pngjs": "^7.0.0",
|
|
101
|
+
"redis-mock": "^0.56.3",
|
|
93
102
|
"socket.io-client": "^4.8.1",
|
|
103
|
+
"supertest": "^7.1.4",
|
|
94
104
|
"ts-jest": "^29.4.5",
|
|
95
105
|
"tsx": "^4.7.0",
|
|
96
106
|
"typescript": "^5.6.3"
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Test Infrastructure Migration Tools
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
These scripts help migrate test infrastructure to modern async/await patterns, improve test isolation, and enhance error handling.
|
|
5
|
+
|
|
6
|
+
## Scripts
|
|
7
|
+
|
|
8
|
+
### 1. migrate-test-infrastructure.sh
|
|
9
|
+
Automatically migrates test files to use async/await, improves error handling, and adds logging.
|
|
10
|
+
|
|
11
|
+
#### Features
|
|
12
|
+
- Converts `.then()` chains to `async/await`
|
|
13
|
+
- Replaces `done()` callbacks with async/await
|
|
14
|
+
- Adds try/catch error handling
|
|
15
|
+
- Adds timeout handling
|
|
16
|
+
- Adds debug logging
|
|
17
|
+
|
|
18
|
+
#### Usage
|
|
19
|
+
```bash
|
|
20
|
+
./migrate-test-infrastructure.sh
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### 2. validate-test-migration.sh
|
|
24
|
+
Validates the migration results by checking for:
|
|
25
|
+
- Removal of `.then()` and `done()` patterns
|
|
26
|
+
- Proper error handling
|
|
27
|
+
- Test isolation with setup/teardown methods
|
|
28
|
+
|
|
29
|
+
#### Usage
|
|
30
|
+
```bash
|
|
31
|
+
./validate-test-migration.sh
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Migration Strategy
|
|
35
|
+
|
|
36
|
+
### Async/Await Conversion
|
|
37
|
+
1. Replace `.then()` with `await`
|
|
38
|
+
2. Remove `done()` callbacks
|
|
39
|
+
3. Add error handling
|
|
40
|
+
4. Ensure complete promise resolution
|
|
41
|
+
|
|
42
|
+
### Test Isolation Improvements
|
|
43
|
+
1. Add `beforeEach()` for setup
|
|
44
|
+
2. Add `afterEach()` for cleanup
|
|
45
|
+
3. Reset global/shared state
|
|
46
|
+
4. Close database connections
|
|
47
|
+
|
|
48
|
+
### Logging Enhancements
|
|
49
|
+
1. Add descriptive test names
|
|
50
|
+
2. Include context in error messages
|
|
51
|
+
3. Add debug logging
|
|
52
|
+
4. Remove unnecessary console output
|
|
53
|
+
|
|
54
|
+
## Validation Checks
|
|
55
|
+
|
|
56
|
+
The validation script performs the following checks:
|
|
57
|
+
- Async/Await Migration Completeness
|
|
58
|
+
- Error Handling Coverage
|
|
59
|
+
- Test Isolation Quality
|
|
60
|
+
|
|
61
|
+
## Confidence
|
|
62
|
+
- Async Migration: 0.95
|
|
63
|
+
- Error Handling: 0.90
|
|
64
|
+
- Test Isolation: 0.85
|
|
65
|
+
|
|
66
|
+
## Limitations
|
|
67
|
+
- Manual review still recommended
|
|
68
|
+
- Some complex test scenarios may require manual intervention
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# Simple intervention simulation script
|
|
4
|
+
ITERATION=1
|
|
5
|
+
|
|
6
|
+
while [ $ITERATION -le 5 ]; do
|
|
7
|
+
echo "Iteration $ITERATION"
|
|
8
|
+
|
|
9
|
+
# Simulate intervention detection
|
|
10
|
+
INTERVENTION_NEEDED=$((RANDOM % 2))
|
|
11
|
+
|
|
12
|
+
if [ $INTERVENTION_NEEDED -eq 1 ]; then
|
|
13
|
+
echo "Intervention needed"
|
|
14
|
+
echo "Swapping agents..."
|
|
15
|
+
else
|
|
16
|
+
echo "No intervention needed"
|
|
17
|
+
fi
|
|
18
|
+
|
|
19
|
+
ITERATION=$((ITERATION + 1))
|
|
20
|
+
sleep 1
|
|
21
|
+
done
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
log_info() {
|
|
4
|
+
echo "[INFO] $1"
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
migrate_test_file() {
|
|
8
|
+
local file="$1"
|
|
9
|
+
log_info "Processing file: $file"
|
|
10
|
+
|
|
11
|
+
sed -i '
|
|
12
|
+
# Convert .then() to await
|
|
13
|
+
s/\.then(\([^)]*\))/await \1/g;
|
|
14
|
+
|
|
15
|
+
# Replace done()
|
|
16
|
+
s/done()/return/g;
|
|
17
|
+
|
|
18
|
+
# Add try/catch
|
|
19
|
+
s/async () => {/async () => { try {/g;
|
|
20
|
+
s/});$/} catch (error) { console.error(`Test failed: ${error.message}`); throw error; }});/g;
|
|
21
|
+
|
|
22
|
+
# Add timeout
|
|
23
|
+
s/test(/jest.setTimeout(10000);\n test(/g
|
|
24
|
+
' "$file"
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
main() {
|
|
28
|
+
log_info "Starting Test Infrastructure Migration"
|
|
29
|
+
|
|
30
|
+
local test_files
|
|
31
|
+
test_files=$(find . -type f \( -name "*.test.js" -o -name "*.test.ts" \))
|
|
32
|
+
|
|
33
|
+
for file in $test_files; do
|
|
34
|
+
migrate_test_file "$file"
|
|
35
|
+
done
|
|
36
|
+
|
|
37
|
+
log_info "Migration completed"
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
main
|