claude-flow-novice 1.0.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/MIGRATION_SUMMARY.md +222 -0
- package/.claude/agents/README.md +89 -0
- package/.claude/agents/analysis/code-analyzer.md +209 -0
- package/.claude/agents/analysis/code-review/analyze-code-quality.md +180 -0
- package/.claude/agents/architecture/system-design/arch-system-design.md +156 -0
- package/.claude/agents/base-template-generator.md +42 -0
- package/.claude/agents/consensus/README.md +253 -0
- package/.claude/agents/consensus/byzantine-coordinator.md +63 -0
- package/.claude/agents/consensus/consensus-builder.md +242 -0
- package/.claude/agents/consensus/crdt-synchronizer.md +997 -0
- package/.claude/agents/consensus/gossip-coordinator.md +63 -0
- package/.claude/agents/consensus/performance-benchmarker.md +851 -0
- package/.claude/agents/consensus/quorum-manager.md +823 -0
- package/.claude/agents/consensus/raft-manager.md +63 -0
- package/.claude/agents/consensus/security-manager.md +622 -0
- package/.claude/agents/core/coder.md +211 -0
- package/.claude/agents/core/planner.md +116 -0
- package/.claude/agents/core/researcher.md +136 -0
- package/.claude/agents/core/reviewer.md +272 -0
- package/.claude/agents/core/tester.md +266 -0
- package/.claude/agents/data/ml/data-ml-model.md +193 -0
- package/.claude/agents/development/backend/dev-backend-api.md +142 -0
- package/.claude/agents/devops/ci-cd/ops-cicd-github.md +164 -0
- package/.claude/agents/documentation/api-docs/docs-api-openapi.md +174 -0
- package/.claude/agents/flow-nexus/app-store.md +88 -0
- package/.claude/agents/flow-nexus/authentication.md +69 -0
- package/.claude/agents/flow-nexus/challenges.md +81 -0
- package/.claude/agents/flow-nexus/neural-network.md +88 -0
- package/.claude/agents/flow-nexus/payments.md +83 -0
- package/.claude/agents/flow-nexus/sandbox.md +76 -0
- package/.claude/agents/flow-nexus/swarm.md +76 -0
- package/.claude/agents/flow-nexus/user-tools.md +96 -0
- package/.claude/agents/flow-nexus/workflow.md +84 -0
- package/.claude/agents/github/code-review-swarm.md +538 -0
- package/.claude/agents/github/github-modes.md +173 -0
- package/.claude/agents/github/issue-tracker.md +319 -0
- package/.claude/agents/github/multi-repo-swarm.md +553 -0
- package/.claude/agents/github/pr-manager.md +191 -0
- package/.claude/agents/github/project-board-sync.md +509 -0
- package/.claude/agents/github/release-manager.md +367 -0
- package/.claude/agents/github/release-swarm.md +583 -0
- package/.claude/agents/github/repo-architect.md +398 -0
- package/.claude/agents/github/swarm-issue.md +573 -0
- package/.claude/agents/github/swarm-pr.md +428 -0
- package/.claude/agents/github/sync-coordinator.md +452 -0
- package/.claude/agents/github/workflow-automation.md +635 -0
- package/.claude/agents/goal/goal-planner.md +73 -0
- package/.claude/agents/neural/safla-neural.md +74 -0
- package/.claude/agents/optimization/README.md +250 -0
- package/.claude/agents/optimization/benchmark-suite.md +665 -0
- package/.claude/agents/optimization/load-balancer.md +431 -0
- package/.claude/agents/optimization/performance-monitor.md +672 -0
- package/.claude/agents/optimization/resource-allocator.md +674 -0
- package/.claude/agents/optimization/topology-optimizer.md +808 -0
- package/.claude/agents/sparc/architecture.md +472 -0
- package/.claude/agents/sparc/pseudocode.md +318 -0
- package/.claude/agents/sparc/refinement.md +525 -0
- package/.claude/agents/sparc/specification.md +276 -0
- package/.claude/agents/specialized/mobile/spec-mobile-react-native.md +226 -0
- package/.claude/agents/sublinear/consciousness-evolution-agent.md +499 -0
- package/.claude/agents/sublinear/matrix-solver-agent.md +113 -0
- package/.claude/agents/sublinear/nanosecond-scheduler-agent.md +644 -0
- package/.claude/agents/sublinear/pagerank-agent.md +699 -0
- package/.claude/agents/sublinear/phi-calculator-agent.md +749 -0
- package/.claude/agents/sublinear/psycho-symbolic-agent.md +543 -0
- package/.claude/agents/sublinear/sublinear.md +816 -0
- package/.claude/agents/sublinear/temporal-advantage-agent.md +360 -0
- package/.claude/agents/swarm/README.md +190 -0
- package/.claude/agents/swarm/adaptive-coordinator.md +396 -0
- package/.claude/agents/swarm/hierarchical-coordinator.md +300 -0
- package/.claude/agents/swarm/mesh-coordinator.md +435 -0
- package/.claude/agents/templates/automation-smart-agent.md +205 -0
- package/.claude/agents/templates/coordinator-swarm-init.md +90 -0
- package/.claude/agents/templates/github-pr-manager.md +177 -0
- package/.claude/agents/templates/implementer-sparc-coder.md +259 -0
- package/.claude/agents/templates/memory-coordinator.md +187 -0
- package/.claude/agents/templates/migration-plan.md +746 -0
- package/.claude/agents/templates/orchestrator-task.md +139 -0
- package/.claude/agents/templates/performance-analyzer.md +199 -0
- package/.claude/agents/templates/sparc-coordinator.md +183 -0
- package/.claude/agents/testing/e2e/playwright-agent.md +249 -0
- package/.claude/agents/testing/unit/tdd-london-swarm.md +244 -0
- package/.claude/agents/testing/validation/production-validator.md +395 -0
- package/.claude/commands/agents/README.md +10 -0
- package/.claude/commands/agents/agent-capabilities.md +21 -0
- package/.claude/commands/agents/agent-coordination.md +28 -0
- package/.claude/commands/agents/agent-spawning.md +28 -0
- package/.claude/commands/agents/agent-types.md +26 -0
- package/.claude/commands/analysis/COMMAND_COMPLIANCE_REPORT.md +54 -0
- package/.claude/commands/analysis/README.md +9 -0
- package/.claude/commands/analysis/bottleneck-detect.md +162 -0
- package/.claude/commands/analysis/performance-bottlenecks.md +59 -0
- package/.claude/commands/analysis/performance-report.md +25 -0
- package/.claude/commands/analysis/token-efficiency.md +45 -0
- package/.claude/commands/analysis/token-usage.md +25 -0
- package/.claude/commands/automation/README.md +9 -0
- package/.claude/commands/automation/auto-agent.md +122 -0
- package/.claude/commands/automation/self-healing.md +106 -0
- package/.claude/commands/automation/session-memory.md +90 -0
- package/.claude/commands/automation/smart-agents.md +73 -0
- package/.claude/commands/automation/smart-spawn.md +25 -0
- package/.claude/commands/automation/workflow-select.md +25 -0
- package/.claude/commands/coordination/README.md +9 -0
- package/.claude/commands/coordination/agent-spawn.md +25 -0
- package/.claude/commands/coordination/init.md +44 -0
- package/.claude/commands/coordination/orchestrate.md +43 -0
- package/.claude/commands/coordination/spawn.md +45 -0
- package/.claude/commands/coordination/swarm-init.md +85 -0
- package/.claude/commands/coordination/task-orchestrate.md +25 -0
- package/.claude/commands/flow-nexus/app-store.md +124 -0
- package/.claude/commands/flow-nexus/challenges.md +120 -0
- package/.claude/commands/flow-nexus/login-registration.md +65 -0
- package/.claude/commands/flow-nexus/neural-network.md +134 -0
- package/.claude/commands/flow-nexus/payments.md +116 -0
- package/.claude/commands/flow-nexus/sandbox.md +83 -0
- package/.claude/commands/flow-nexus/swarm.md +87 -0
- package/.claude/commands/flow-nexus/user-tools.md +152 -0
- package/.claude/commands/flow-nexus/workflow.md +115 -0
- package/.claude/commands/github/README.md +11 -0
- package/.claude/commands/github/code-review-swarm.md +514 -0
- package/.claude/commands/github/code-review.md +25 -0
- package/.claude/commands/github/github-modes.md +147 -0
- package/.claude/commands/github/github-swarm.md +121 -0
- package/.claude/commands/github/issue-tracker.md +292 -0
- package/.claude/commands/github/issue-triage.md +25 -0
- package/.claude/commands/github/multi-repo-swarm.md +519 -0
- package/.claude/commands/github/pr-enhance.md +26 -0
- package/.claude/commands/github/pr-manager.md +170 -0
- package/.claude/commands/github/project-board-sync.md +471 -0
- package/.claude/commands/github/release-manager.md +338 -0
- package/.claude/commands/github/release-swarm.md +544 -0
- package/.claude/commands/github/repo-analyze.md +25 -0
- package/.claude/commands/github/repo-architect.md +367 -0
- package/.claude/commands/github/swarm-issue.md +482 -0
- package/.claude/commands/github/swarm-pr.md +285 -0
- package/.claude/commands/github/sync-coordinator.md +301 -0
- package/.claude/commands/github/workflow-automation.md +442 -0
- package/.claude/commands/hive-mind/README.md +17 -0
- package/.claude/commands/hive-mind/hive-mind-consensus.md +8 -0
- package/.claude/commands/hive-mind/hive-mind-init.md +18 -0
- package/.claude/commands/hive-mind/hive-mind-memory.md +8 -0
- package/.claude/commands/hive-mind/hive-mind-metrics.md +8 -0
- package/.claude/commands/hive-mind/hive-mind-resume.md +8 -0
- package/.claude/commands/hive-mind/hive-mind-sessions.md +8 -0
- package/.claude/commands/hive-mind/hive-mind-spawn.md +21 -0
- package/.claude/commands/hive-mind/hive-mind-status.md +8 -0
- package/.claude/commands/hive-mind/hive-mind-stop.md +8 -0
- package/.claude/commands/hive-mind/hive-mind-wizard.md +8 -0
- package/.claude/commands/hive-mind/hive-mind.md +27 -0
- package/.claude/commands/hooks/README.md +11 -0
- package/.claude/commands/hooks/overview.md +58 -0
- package/.claude/commands/hooks/post-edit.md +117 -0
- package/.claude/commands/hooks/post-task.md +112 -0
- package/.claude/commands/hooks/pre-edit.md +113 -0
- package/.claude/commands/hooks/pre-task.md +111 -0
- package/.claude/commands/hooks/session-end.md +118 -0
- package/.claude/commands/hooks/setup.md +103 -0
- package/.claude/commands/memory/README.md +9 -0
- package/.claude/commands/memory/memory-persist.md +25 -0
- package/.claude/commands/memory/memory-search.md +25 -0
- package/.claude/commands/memory/memory-usage.md +25 -0
- package/.claude/commands/memory/neural.md +47 -0
- package/.claude/commands/memory/usage.md +46 -0
- package/.claude/commands/monitoring/README.md +9 -0
- package/.claude/commands/monitoring/agent-metrics.md +25 -0
- package/.claude/commands/monitoring/agents.md +44 -0
- package/.claude/commands/monitoring/real-time-view.md +25 -0
- package/.claude/commands/monitoring/status.md +46 -0
- package/.claude/commands/monitoring/swarm-monitor.md +25 -0
- package/.claude/commands/optimization/README.md +9 -0
- package/.claude/commands/optimization/auto-topology.md +62 -0
- package/.claude/commands/optimization/cache-manage.md +25 -0
- package/.claude/commands/optimization/parallel-execute.md +25 -0
- package/.claude/commands/optimization/parallel-execution.md +50 -0
- package/.claude/commands/optimization/topology-optimize.md +25 -0
- package/.claude/commands/pair/README.md +261 -0
- package/.claude/commands/pair/commands.md +546 -0
- package/.claude/commands/pair/config.md +510 -0
- package/.claude/commands/pair/examples.md +512 -0
- package/.claude/commands/pair/modes.md +348 -0
- package/.claude/commands/pair/session.md +407 -0
- package/.claude/commands/pair/start.md +209 -0
- package/.claude/commands/sparc/analyzer.md +52 -0
- package/.claude/commands/sparc/architect.md +53 -0
- package/.claude/commands/sparc/batch-executor.md +54 -0
- package/.claude/commands/sparc/coder.md +54 -0
- package/.claude/commands/sparc/debugger.md +54 -0
- package/.claude/commands/sparc/designer.md +53 -0
- package/.claude/commands/sparc/documenter.md +54 -0
- package/.claude/commands/sparc/innovator.md +54 -0
- package/.claude/commands/sparc/memory-manager.md +54 -0
- package/.claude/commands/sparc/optimizer.md +54 -0
- package/.claude/commands/sparc/orchestrator.md +132 -0
- package/.claude/commands/sparc/researcher.md +54 -0
- package/.claude/commands/sparc/reviewer.md +54 -0
- package/.claude/commands/sparc/sparc-modes.md +174 -0
- package/.claude/commands/sparc/swarm-coordinator.md +54 -0
- package/.claude/commands/sparc/tdd.md +54 -0
- package/.claude/commands/sparc/tester.md +54 -0
- package/.claude/commands/sparc/workflow-manager.md +54 -0
- package/.claude/commands/stream-chain/pipeline.md +121 -0
- package/.claude/commands/stream-chain/run.md +70 -0
- package/.claude/commands/swarm/README.md +15 -0
- package/.claude/commands/swarm/analysis.md +95 -0
- package/.claude/commands/swarm/development.md +96 -0
- package/.claude/commands/swarm/examples.md +168 -0
- package/.claude/commands/swarm/maintenance.md +102 -0
- package/.claude/commands/swarm/optimization.md +117 -0
- package/.claude/commands/swarm/research.md +136 -0
- package/.claude/commands/swarm/swarm-analysis.md +8 -0
- package/.claude/commands/swarm/swarm-background.md +8 -0
- package/.claude/commands/swarm/swarm-init.md +19 -0
- package/.claude/commands/swarm/swarm-modes.md +8 -0
- package/.claude/commands/swarm/swarm-monitor.md +8 -0
- package/.claude/commands/swarm/swarm-spawn.md +19 -0
- package/.claude/commands/swarm/swarm-status.md +8 -0
- package/.claude/commands/swarm/swarm-strategies.md +8 -0
- package/.claude/commands/swarm/swarm.md +27 -0
- package/.claude/commands/swarm/testing.md +131 -0
- package/.claude/commands/testing/playwright-e2e.md +288 -0
- package/.claude/commands/training/README.md +9 -0
- package/.claude/commands/training/model-update.md +25 -0
- package/.claude/commands/training/neural-patterns.md +74 -0
- package/.claude/commands/training/neural-train.md +25 -0
- package/.claude/commands/training/pattern-learn.md +25 -0
- package/.claude/commands/training/specialization.md +63 -0
- package/.claude/commands/truth/start.md +143 -0
- package/.claude/commands/verify/check.md +50 -0
- package/.claude/commands/verify/start.md +128 -0
- package/.claude/commands/workflows/README.md +9 -0
- package/.claude/commands/workflows/development.md +78 -0
- package/.claude/commands/workflows/research.md +63 -0
- package/.claude/commands/workflows/workflow-create.md +25 -0
- package/.claude/commands/workflows/workflow-execute.md +25 -0
- package/.claude/commands/workflows/workflow-export.md +25 -0
- package/.claude/helpers/checkpoint-manager.sh +251 -0
- package/.claude/helpers/github-safe.js +106 -0
- package/.claude/helpers/github-setup.sh +28 -0
- package/.claude/helpers/quick-start.sh +19 -0
- package/.claude/helpers/setup-mcp.sh +18 -0
- package/.claude/helpers/standard-checkpoint-hooks.sh +179 -0
- package/.claude/settings.json +112 -0
- package/.claude/settings.local.json +10 -0
- package/CHANGELOG.md +1517 -0
- package/LICENSE +21 -0
- package/README.md +338 -0
- package/dist/src/adapters/cliffy-node.js +70 -0
- package/dist/src/adapters/cliffy-node.js.map +1 -0
- package/dist/src/agents/agent-loader.js +208 -0
- package/dist/src/agents/agent-loader.js.map +1 -0
- package/dist/src/agents/agent-manager.js +1786 -0
- package/dist/src/agents/agent-manager.js.map +1 -0
- package/dist/src/agents/agent-registry.js +356 -0
- package/dist/src/agents/agent-registry.js.map +1 -0
- package/dist/src/agents/agent-validator.js +273 -0
- package/dist/src/agents/agent-validator.js.map +1 -0
- package/dist/src/agents/github/agent-factory.js +553 -0
- package/dist/src/agents/github/agent-factory.js.map +1 -0
- package/dist/src/agents/github/compatibility/legacy-agent-mappings.js +307 -0
- package/dist/src/agents/github/compatibility/legacy-agent-mappings.js.map +1 -0
- package/dist/src/agents/github/compatibility/legacy-agent-proxy.js +334 -0
- package/dist/src/agents/github/compatibility/legacy-agent-proxy.js.map +1 -0
- package/dist/src/agents/github/core/github-collaboration-manager.js +796 -0
- package/dist/src/agents/github/core/github-collaboration-manager.js.map +1 -0
- package/dist/src/agents/github/core/github-integration-manager.js +546 -0
- package/dist/src/agents/github/core/github-integration-manager.js.map +1 -0
- package/dist/src/agents/github/core/github-release-coordinator.js +718 -0
- package/dist/src/agents/github/core/github-release-coordinator.js.map +1 -0
- package/dist/src/agents/github/index.js +68 -0
- package/dist/src/agents/github/index.js.map +1 -0
- package/dist/src/agents/github/types/index.js +6 -0
- package/dist/src/agents/github/types/index.js.map +1 -0
- package/dist/src/agents/github/utils/error-handling.js +496 -0
- package/dist/src/agents/github/utils/error-handling.js.map +1 -0
- package/dist/src/agents/github/utils/github-client.js +158 -0
- package/dist/src/agents/github/utils/github-client.js.map +1 -0
- package/dist/src/agents/github/utils/hook-integration.js +450 -0
- package/dist/src/agents/github/utils/hook-integration.js.map +1 -0
- package/dist/src/agents/github/utils/performance-optimizer.js +501 -0
- package/dist/src/agents/github/utils/performance-optimizer.js.map +1 -0
- package/dist/src/agents/hierarchical-coordinator.js +775 -0
- package/dist/src/agents/hierarchical-coordinator.js.map +1 -0
- package/dist/src/agents/lifecycle-manager.js +613 -0
- package/dist/src/agents/lifecycle-manager.js.map +1 -0
- package/dist/src/agents/mesh-coordinator.js +580 -0
- package/dist/src/agents/mesh-coordinator.js.map +1 -0
- package/dist/src/agents/simple-agent.js +89 -0
- package/dist/src/agents/simple-agent.js.map +1 -0
- package/dist/src/agents/task-agent-integration.js +240 -0
- package/dist/src/agents/task-agent-integration.js.map +1 -0
- package/dist/src/api/auth-service.js +474 -0
- package/dist/src/api/auth-service.js.map +1 -0
- package/dist/src/api/claude-api-errors.js +171 -0
- package/dist/src/api/claude-api-errors.js.map +1 -0
- package/dist/src/api/claude-client-enhanced.js +473 -0
- package/dist/src/api/claude-client-enhanced.js.map +1 -0
- package/dist/src/api/claude-client.js +527 -0
- package/dist/src/api/claude-client.js.map +1 -0
- package/dist/src/api/database-service.js +666 -0
- package/dist/src/api/database-service.js.map +1 -0
- package/dist/src/api/swarm-api.js +585 -0
- package/dist/src/api/swarm-api.js.map +1 -0
- package/dist/src/automation/test-pipeline/E2ETestGenerator.js +448 -0
- package/dist/src/automation/test-pipeline/E2ETestGenerator.js.map +1 -0
- package/dist/src/automation/test-pipeline/PerformanceMonitor.js +572 -0
- package/dist/src/automation/test-pipeline/PerformanceMonitor.js.map +1 -0
- package/dist/src/automation/test-pipeline/PipelineValidator.js +654 -0
- package/dist/src/automation/test-pipeline/PipelineValidator.js.map +1 -0
- package/dist/src/automation/test-pipeline/RegressionTestManager.js +545 -0
- package/dist/src/automation/test-pipeline/RegressionTestManager.js.map +1 -0
- package/dist/src/automation/test-pipeline/SwarmTestCoordinator.js +450 -0
- package/dist/src/automation/test-pipeline/SwarmTestCoordinator.js.map +1 -0
- package/dist/src/automation/test-pipeline/TestDataManager.js +708 -0
- package/dist/src/automation/test-pipeline/TestDataManager.js.map +1 -0
- package/dist/src/automation/test-pipeline/TestReportingSystem.js +527 -0
- package/dist/src/automation/test-pipeline/TestReportingSystem.js.map +1 -0
- package/dist/src/automation/test-pipeline/utils/chrome-mcp-integration.js +353 -0
- package/dist/src/automation/test-pipeline/utils/chrome-mcp-integration.js.map +1 -0
- package/dist/src/automation/test-pipeline/utils/swarm-coordinator.js +448 -0
- package/dist/src/automation/test-pipeline/utils/swarm-coordinator.js.map +1 -0
- package/dist/src/ci-cd/deployment-orchestrator.js +477 -0
- package/dist/src/ci-cd/deployment-orchestrator.js.map +1 -0
- package/dist/src/ci-cd/github-actions-templates.js +972 -0
- package/dist/src/ci-cd/github-actions-templates.js.map +1 -0
- package/dist/src/ci-cd/performance/PerformanceGate.js +383 -0
- package/dist/src/ci-cd/performance/PerformanceGate.js.map +1 -0
- package/dist/src/cli/agents/analyst.js +788 -0
- package/dist/src/cli/agents/analyst.js.map +1 -0
- package/dist/src/cli/agents/architect.js +846 -0
- package/dist/src/cli/agents/architect.js.map +1 -0
- package/dist/src/cli/agents/base-agent.js +437 -0
- package/dist/src/cli/agents/base-agent.js.map +1 -0
- package/dist/src/cli/agents/capabilities.js +701 -0
- package/dist/src/cli/agents/capabilities.js.map +1 -0
- package/dist/src/cli/agents/coder.js +936 -0
- package/dist/src/cli/agents/coder.js.map +1 -0
- package/dist/src/cli/agents/coordinator.js +489 -0
- package/dist/src/cli/agents/coordinator.js.map +1 -0
- package/dist/src/cli/agents/hive-agents.js +708 -0
- package/dist/src/cli/agents/hive-agents.js.map +1 -0
- package/dist/src/cli/agents/index.js +299 -0
- package/dist/src/cli/agents/index.js.map +1 -0
- package/dist/src/cli/agents/researcher.js +388 -0
- package/dist/src/cli/agents/researcher.js.map +1 -0
- package/dist/src/cli/agents/tester.js +634 -0
- package/dist/src/cli/agents/tester.js.map +1 -0
- package/dist/src/cli/cli-core.js +264 -0
- package/dist/src/cli/cli-core.js.map +1 -0
- package/dist/src/cli/commands/advanced-memory-commands.js +834 -0
- package/dist/src/cli/commands/advanced-memory-commands.js.map +1 -0
- package/dist/src/cli/commands/agent-simple.js +346 -0
- package/dist/src/cli/commands/agent-simple.js.map +1 -0
- package/dist/src/cli/commands/agent.js +368 -0
- package/dist/src/cli/commands/agent.js.map +1 -0
- package/dist/src/cli/commands/claude-api.js +237 -0
- package/dist/src/cli/commands/claude-api.js.map +1 -0
- package/dist/src/cli/commands/claude.js +132 -0
- package/dist/src/cli/commands/claude.js.map +1 -0
- package/dist/src/cli/commands/config-integration.js +395 -0
- package/dist/src/cli/commands/config-integration.js.map +1 -0
- package/dist/src/cli/commands/config.js +67 -0
- package/dist/src/cli/commands/config.js.map +1 -0
- package/dist/src/cli/commands/enterprise.js +1523 -0
- package/dist/src/cli/commands/enterprise.js.map +1 -0
- package/dist/src/cli/commands/goal-init.js +262 -0
- package/dist/src/cli/commands/goal-init.js.map +1 -0
- package/dist/src/cli/commands/help-new.js +276 -0
- package/dist/src/cli/commands/help-new.js.map +1 -0
- package/dist/src/cli/commands/help.js +1055 -0
- package/dist/src/cli/commands/help.js.map +1 -0
- package/dist/src/cli/commands/hive-mind/index.js +20 -0
- package/dist/src/cli/commands/hive-mind/index.js.map +1 -0
- package/dist/src/cli/commands/hive-mind/init.js +58 -0
- package/dist/src/cli/commands/hive-mind/init.js.map +1 -0
- package/dist/src/cli/commands/hive-mind/optimize-memory.js +362 -0
- package/dist/src/cli/commands/hive-mind/optimize-memory.js.map +1 -0
- package/dist/src/cli/commands/hive-mind/pause.js +73 -0
- package/dist/src/cli/commands/hive-mind/pause.js.map +1 -0
- package/dist/src/cli/commands/hive-mind/ps.js +104 -0
- package/dist/src/cli/commands/hive-mind/ps.js.map +1 -0
- package/dist/src/cli/commands/hive-mind/resume.js +56 -0
- package/dist/src/cli/commands/hive-mind/resume.js.map +1 -0
- package/dist/src/cli/commands/hive-mind/spawn.js +242 -0
- package/dist/src/cli/commands/hive-mind/spawn.js.map +1 -0
- package/dist/src/cli/commands/hive-mind/status.js +250 -0
- package/dist/src/cli/commands/hive-mind/status.js.map +1 -0
- package/dist/src/cli/commands/hive-mind/stop.js +116 -0
- package/dist/src/cli/commands/hive-mind/stop.js.map +1 -0
- package/dist/src/cli/commands/hive-mind/task.js +302 -0
- package/dist/src/cli/commands/hive-mind/task.js.map +1 -0
- package/dist/src/cli/commands/hive-mind/wizard.js +705 -0
- package/dist/src/cli/commands/hive-mind/wizard.js.map +1 -0
- package/dist/src/cli/commands/hive.js +506 -0
- package/dist/src/cli/commands/hive.js.map +1 -0
- package/dist/src/cli/commands/hook-types.js +5 -0
- package/dist/src/cli/commands/hook-types.js.map +1 -0
- package/dist/src/cli/commands/hook-validator.js +177 -0
- package/dist/src/cli/commands/hook-validator.js.map +1 -0
- package/dist/src/cli/commands/hook.js +303 -0
- package/dist/src/cli/commands/hook.js.map +1 -0
- package/dist/src/cli/commands/index.js +2745 -0
- package/dist/src/cli/commands/index.js.map +1 -0
- package/dist/src/cli/commands/maestro.js +242 -0
- package/dist/src/cli/commands/maestro.js.map +1 -0
- package/dist/src/cli/commands/mcp.js +148 -0
- package/dist/src/cli/commands/mcp.js.map +1 -0
- package/dist/src/cli/commands/memory.js +193 -0
- package/dist/src/cli/commands/memory.js.map +1 -0
- package/dist/src/cli/commands/migrate.js +107 -0
- package/dist/src/cli/commands/migrate.js.map +1 -0
- package/dist/src/cli/commands/monitor.js +574 -0
- package/dist/src/cli/commands/monitor.js.map +1 -0
- package/dist/src/cli/commands/neural-init.js +211 -0
- package/dist/src/cli/commands/neural-init.js.map +1 -0
- package/dist/src/cli/commands/ruv-swarm.js +555 -0
- package/dist/src/cli/commands/ruv-swarm.js.map +1 -0
- package/dist/src/cli/commands/session.js +517 -0
- package/dist/src/cli/commands/session.js.map +1 -0
- package/dist/src/cli/commands/sparc.js +486 -0
- package/dist/src/cli/commands/sparc.js.map +1 -0
- package/dist/src/cli/commands/start/event-emitter.js +35 -0
- package/dist/src/cli/commands/start/event-emitter.js.map +1 -0
- package/dist/src/cli/commands/start/index.js +9 -0
- package/dist/src/cli/commands/start/index.js.map +1 -0
- package/dist/src/cli/commands/start/process-manager.js +294 -0
- package/dist/src/cli/commands/start/process-manager.js.map +1 -0
- package/dist/src/cli/commands/start/process-ui-simple.js +322 -0
- package/dist/src/cli/commands/start/process-ui-simple.js.map +1 -0
- package/dist/src/cli/commands/start/process-ui.js +5 -0
- package/dist/src/cli/commands/start/process-ui.js.map +1 -0
- package/dist/src/cli/commands/start/start-command.js +463 -0
- package/dist/src/cli/commands/start/start-command.js.map +1 -0
- package/dist/src/cli/commands/start/system-monitor.js +268 -0
- package/dist/src/cli/commands/start/system-monitor.js.map +1 -0
- package/dist/src/cli/commands/start/types.js +22 -0
- package/dist/src/cli/commands/start/types.js.map +1 -0
- package/dist/src/cli/commands/start.js +6 -0
- package/dist/src/cli/commands/start.js.map +1 -0
- package/dist/src/cli/commands/status.js +328 -0
- package/dist/src/cli/commands/status.js.map +1 -0
- package/dist/src/cli/commands/swarm-spawn.js +56 -0
- package/dist/src/cli/commands/swarm-spawn.js.map +1 -0
- package/dist/src/cli/commands/swarm.js +567 -0
- package/dist/src/cli/commands/swarm.js.map +1 -0
- package/dist/src/cli/commands/task.js +44 -0
- package/dist/src/cli/commands/task.js.map +1 -0
- package/dist/src/cli/commands/validate-integration.js +122 -0
- package/dist/src/cli/commands/validate-integration.js.map +1 -0
- package/dist/src/cli/commands/verification.js +351 -0
- package/dist/src/cli/commands/verification.js.map +1 -0
- package/dist/src/cli/commands/workflow.js +615 -0
- package/dist/src/cli/commands/workflow.js.map +1 -0
- package/dist/src/cli/completion.js +578 -0
- package/dist/src/cli/completion.js.map +1 -0
- package/dist/src/cli/consolidated/ConsolidatedCLI.js +379 -0
- package/dist/src/cli/consolidated/ConsolidatedCLI.js.map +1 -0
- package/dist/src/cli/consolidated/core/CommandHandlers.js +833 -0
- package/dist/src/cli/consolidated/core/CommandHandlers.js.map +1 -0
- package/dist/src/cli/consolidated/core/TierManager.js +291 -0
- package/dist/src/cli/consolidated/core/TierManager.js.map +1 -0
- package/dist/src/cli/consolidated/help/InteractiveHelp.js +714 -0
- package/dist/src/cli/consolidated/help/InteractiveHelp.js.map +1 -0
- package/dist/src/cli/consolidated/index.js +62 -0
- package/dist/src/cli/consolidated/index.js.map +1 -0
- package/dist/src/cli/consolidated/intelligence/IntelligenceEngine.js +457 -0
- package/dist/src/cli/consolidated/intelligence/IntelligenceEngine.js.map +1 -0
- package/dist/src/cli/consolidated/routing/CommandRouter.js +526 -0
- package/dist/src/cli/consolidated/routing/CommandRouter.js.map +1 -0
- package/dist/src/cli/consolidated/utils/IntelligentDefaults.js +729 -0
- package/dist/src/cli/consolidated/utils/IntelligentDefaults.js.map +1 -0
- package/dist/src/cli/consolidated/utils/PerformanceOptimizer.js +416 -0
- package/dist/src/cli/consolidated/utils/PerformanceOptimizer.js.map +1 -0
- package/dist/src/cli/formatter.js +284 -0
- package/dist/src/cli/formatter.js.map +1 -0
- package/dist/src/cli/help-formatter.js +111 -0
- package/dist/src/cli/help-formatter.js.map +1 -0
- package/dist/src/cli/index-remote.js +125 -0
- package/dist/src/cli/index-remote.js.map +1 -0
- package/dist/src/cli/index.js +159 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cli/init/batch-tools.js +388 -0
- package/dist/src/cli/init/batch-tools.js.map +1 -0
- package/dist/src/cli/init/claude-config.js +401 -0
- package/dist/src/cli/init/claude-config.js.map +1 -0
- package/dist/src/cli/init/directory-structure.js +146 -0
- package/dist/src/cli/init/directory-structure.js.map +1 -0
- package/dist/src/cli/init/index.js +52 -0
- package/dist/src/cli/init/index.js.map +1 -0
- package/dist/src/cli/init/sparc-environment.js +543 -0
- package/dist/src/cli/init/sparc-environment.js.map +1 -0
- package/dist/src/cli/init/swarm-commands.js +796 -0
- package/dist/src/cli/init/swarm-commands.js.map +1 -0
- package/dist/src/cli/init/utils.js +15 -0
- package/dist/src/cli/init/utils.js.map +1 -0
- package/dist/src/cli/maestro-cli-bridge.js +426 -0
- package/dist/src/cli/maestro-cli-bridge.js.map +1 -0
- package/dist/src/cli/main.js +26 -0
- package/dist/src/cli/main.js.map +1 -0
- package/dist/src/cli/node-repl.js +652 -0
- package/dist/src/cli/node-repl.js.map +1 -0
- package/dist/src/cli/repl.js +1078 -0
- package/dist/src/cli/repl.js.map +1 -0
- package/dist/src/cli/simple-cli.js +3026 -0
- package/dist/src/cli/simple-cli.js.map +1 -0
- package/dist/src/cli/simple-mcp.js +87 -0
- package/dist/src/cli/simple-mcp.js.map +1 -0
- package/dist/src/cli/simple-orchestrator.js +857 -0
- package/dist/src/cli/simple-orchestrator.js.map +1 -0
- package/dist/src/cli/ui/compatible-ui.js +322 -0
- package/dist/src/cli/ui/compatible-ui.js.map +1 -0
- package/dist/src/cli/ui/fallback-handler.js +156 -0
- package/dist/src/cli/ui/fallback-handler.js.map +1 -0
- package/dist/src/cli/ui/index.js +32 -0
- package/dist/src/cli/ui/index.js.map +1 -0
- package/dist/src/cli/utils/environment-detector.js +228 -0
- package/dist/src/cli/utils/environment-detector.js.map +1 -0
- package/dist/src/cli/utils/prompt-defaults.js +234 -0
- package/dist/src/cli/utils/prompt-defaults.js.map +1 -0
- package/dist/src/cli/validation-helper.js +66 -0
- package/dist/src/cli/validation-helper.js.map +1 -0
- package/dist/src/communication/message-bus.js +1007 -0
- package/dist/src/communication/message-bus.js.map +1 -0
- package/dist/src/communication/reliable-communication-manager.js +374 -0
- package/dist/src/communication/reliable-communication-manager.js.map +1 -0
- package/dist/src/config/ai/decision-tree-generator.js +763 -0
- package/dist/src/config/ai/decision-tree-generator.js.map +1 -0
- package/dist/src/config/ai/project-detection-engine.js +1081 -0
- package/dist/src/config/ai/project-detection-engine.js.map +1 -0
- package/dist/src/config/config-manager.js +1285 -0
- package/dist/src/config/config-manager.js.map +1 -0
- package/dist/src/config/consent-manager.js +433 -0
- package/dist/src/config/consent-manager.js.map +1 -0
- package/dist/src/config/core/intelligent-configuration-manager.js +674 -0
- package/dist/src/config/core/intelligent-configuration-manager.js.map +1 -0
- package/dist/src/config/index.js +110 -0
- package/dist/src/config/index.js.map +1 -0
- package/dist/src/config/integration/hooks-integration.js +548 -0
- package/dist/src/config/integration/hooks-integration.js.map +1 -0
- package/dist/src/config/migration/config-migration.js +285 -0
- package/dist/src/config/migration/config-migration.js.map +1 -0
- package/dist/src/config/migration/version-migration-engine.js +984 -0
- package/dist/src/config/migration/version-migration-engine.js.map +1 -0
- package/dist/src/config/migration-manager.js +529 -0
- package/dist/src/config/migration-manager.js.map +1 -0
- package/dist/src/config/ruv-swarm-config.js +332 -0
- package/dist/src/config/ruv-swarm-config.js.map +1 -0
- package/dist/src/config/ruv-swarm-integration.js +285 -0
- package/dist/src/config/ruv-swarm-integration.js.map +1 -0
- package/dist/src/config/storage/multi-tier-storage.js +626 -0
- package/dist/src/config/storage/multi-tier-storage.js.map +1 -0
- package/dist/src/config/test-migration-fixer.js +332 -0
- package/dist/src/config/test-migration-fixer.js.map +1 -0
- package/dist/src/config/ui/progressive-disclosure-engine.js +876 -0
- package/dist/src/config/ui/progressive-disclosure-engine.js.map +1 -0
- package/dist/src/config/utils/config-export-import.js +454 -0
- package/dist/src/config/utils/config-export-import.js.map +1 -0
- package/dist/src/config/utils/zero-config-setup.js +238 -0
- package/dist/src/config/utils/zero-config-setup.js.map +1 -0
- package/dist/src/config/validation/config-validator.js +462 -0
- package/dist/src/config/validation/config-validator.js.map +1 -0
- package/dist/src/config/web-portal-config.js +343 -0
- package/dist/src/config/web-portal-config.js.map +1 -0
- package/dist/src/config/zero-config-setup.js +294 -0
- package/dist/src/config/zero-config-setup.js.map +1 -0
- package/dist/src/constants/agent-types.js +51 -0
- package/dist/src/constants/agent-types.js.map +1 -0
- package/dist/src/coordination/advanced-scheduler.js +370 -0
- package/dist/src/coordination/advanced-scheduler.js.map +1 -0
- package/dist/src/coordination/advanced-task-executor.js +481 -0
- package/dist/src/coordination/advanced-task-executor.js.map +1 -0
- package/dist/src/coordination/background-executor.js +366 -0
- package/dist/src/coordination/background-executor.js.map +1 -0
- package/dist/src/coordination/circuit-breaker.js +286 -0
- package/dist/src/coordination/circuit-breaker.js.map +1 -0
- package/dist/src/coordination/conflict-resolution.js +348 -0
- package/dist/src/coordination/conflict-resolution.js.map +1 -0
- package/dist/src/coordination/dependency-graph.js +398 -0
- package/dist/src/coordination/dependency-graph.js.map +1 -0
- package/dist/src/coordination/hive-orchestrator.js +309 -0
- package/dist/src/coordination/hive-orchestrator.js.map +1 -0
- package/dist/src/coordination/hive-protocol.js +363 -0
- package/dist/src/coordination/hive-protocol.js.map +1 -0
- package/dist/src/coordination/index.js +21 -0
- package/dist/src/coordination/index.js.map +1 -0
- package/dist/src/coordination/load-balancer.js +737 -0
- package/dist/src/coordination/load-balancer.js.map +1 -0
- package/dist/src/coordination/manager.js +360 -0
- package/dist/src/coordination/manager.js.map +1 -0
- package/dist/src/coordination/messaging.js +221 -0
- package/dist/src/coordination/messaging.js.map +1 -0
- package/dist/src/coordination/metrics.js +415 -0
- package/dist/src/coordination/metrics.js.map +1 -0
- package/dist/src/coordination/resources.js +276 -0
- package/dist/src/coordination/resources.js.map +1 -0
- package/dist/src/coordination/scheduler.js +322 -0
- package/dist/src/coordination/scheduler.js.map +1 -0
- package/dist/src/coordination/swarm-coordinator.js +585 -0
- package/dist/src/coordination/swarm-coordinator.js.map +1 -0
- package/dist/src/coordination/swarm-monitor.js +359 -0
- package/dist/src/coordination/swarm-monitor.js.map +1 -0
- package/dist/src/coordination/work-stealing.js +164 -0
- package/dist/src/coordination/work-stealing.js.map +1 -0
- package/dist/src/core/agent-manager.js +80 -0
- package/dist/src/core/agent-manager.js.map +1 -0
- package/dist/src/core/config.js +1221 -0
- package/dist/src/core/config.js.map +1 -0
- package/dist/src/core/event-bus.js +136 -0
- package/dist/src/core/event-bus.js.map +1 -0
- package/dist/src/core/index.js +6 -0
- package/dist/src/core/index.js.map +1 -0
- package/dist/src/core/json-persistence.js +112 -0
- package/dist/src/core/json-persistence.js.map +1 -0
- package/dist/src/core/logger.js +245 -0
- package/dist/src/core/logger.js.map +1 -0
- package/dist/src/core/orchestrator-fixed.js +236 -0
- package/dist/src/core/orchestrator-fixed.js.map +1 -0
- package/dist/src/core/orchestrator.js +1136 -0
- package/dist/src/core/orchestrator.js.map +1 -0
- package/dist/src/core/persistence.js +185 -0
- package/dist/src/core/persistence.js.map +1 -0
- package/dist/src/core/project-manager.js +80 -0
- package/dist/src/core/project-manager.js.map +1 -0
- package/dist/src/core/version.js +35 -0
- package/dist/src/core/version.js.map +1 -0
- package/dist/src/crdt/types.js +509 -0
- package/dist/src/crdt/types.js.map +1 -0
- package/dist/src/enterprise/analytics-manager.js +1133 -0
- package/dist/src/enterprise/analytics-manager.js.map +1 -0
- package/dist/src/enterprise/audit-manager.js +1112 -0
- package/dist/src/enterprise/audit-manager.js.map +1 -0
- package/dist/src/enterprise/cloud-manager.js +886 -0
- package/dist/src/enterprise/cloud-manager.js.map +1 -0
- package/dist/src/enterprise/deployment-manager.js +963 -0
- package/dist/src/enterprise/deployment-manager.js.map +1 -0
- package/dist/src/enterprise/index.js +8 -0
- package/dist/src/enterprise/index.js.map +1 -0
- package/dist/src/enterprise/project-manager.js +577 -0
- package/dist/src/enterprise/project-manager.js.map +1 -0
- package/dist/src/enterprise/security-manager.js +987 -0
- package/dist/src/enterprise/security-manager.js.map +1 -0
- package/dist/src/feature-flags/cli/Phase4CLI.js +463 -0
- package/dist/src/feature-flags/cli/Phase4CLI.js.map +1 -0
- package/dist/src/feature-flags/core/FeatureFlagManager.js +324 -0
- package/dist/src/feature-flags/core/FeatureFlagManager.js.map +1 -0
- package/dist/src/feature-flags/index.js +237 -0
- package/dist/src/feature-flags/index.js.map +1 -0
- package/dist/src/feature-flags/monitoring/RolloutMonitor.js +275 -0
- package/dist/src/feature-flags/monitoring/RolloutMonitor.js.map +1 -0
- package/dist/src/feature-flags/rollout/RolloutController.js +301 -0
- package/dist/src/feature-flags/rollout/RolloutController.js.map +1 -0
- package/dist/src/feature-flags/validation/HookInterceptor.js +310 -0
- package/dist/src/feature-flags/validation/HookInterceptor.js.map +1 -0
- package/dist/src/feature-flags/validation/TruthBasedValidator.js +263 -0
- package/dist/src/feature-flags/validation/TruthBasedValidator.js.map +1 -0
- package/dist/src/hive-mind/core/Agent.js +569 -0
- package/dist/src/hive-mind/core/Agent.js.map +1 -0
- package/dist/src/hive-mind/core/Communication.js +411 -0
- package/dist/src/hive-mind/core/Communication.js.map +1 -0
- package/dist/src/hive-mind/core/DatabaseManager.js +599 -0
- package/dist/src/hive-mind/core/DatabaseManager.js.map +1 -0
- package/dist/src/hive-mind/core/HiveMind.js +575 -0
- package/dist/src/hive-mind/core/HiveMind.js.map +1 -0
- package/dist/src/hive-mind/core/Memory.js +1159 -0
- package/dist/src/hive-mind/core/Memory.js.map +1 -0
- package/dist/src/hive-mind/core/MemoryMonitor.js +525 -0
- package/dist/src/hive-mind/core/MemoryMonitor.js.map +1 -0
- package/dist/src/hive-mind/core/Queen.js +753 -0
- package/dist/src/hive-mind/core/Queen.js.map +1 -0
- package/dist/src/hive-mind/index.js +21 -0
- package/dist/src/hive-mind/index.js.map +1 -0
- package/dist/src/hive-mind/integration/ConsensusEngine.js +460 -0
- package/dist/src/hive-mind/integration/ConsensusEngine.js.map +1 -0
- package/dist/src/hive-mind/integration/MCPToolWrapper.js +243 -0
- package/dist/src/hive-mind/integration/MCPToolWrapper.js.map +1 -0
- package/dist/src/hive-mind/integration/SwarmOrchestrator.js +812 -0
- package/dist/src/hive-mind/integration/SwarmOrchestrator.js.map +1 -0
- package/dist/src/hive-mind/types.js +9 -0
- package/dist/src/hive-mind/types.js.map +1 -0
- package/dist/src/hooks/index.js +197 -0
- package/dist/src/hooks/index.js.map +1 -0
- package/dist/src/index.js +11 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/integration/mock-components.js +362 -0
- package/dist/src/integration/mock-components.js.map +1 -0
- package/dist/src/integration/system-integration.js +428 -0
- package/dist/src/integration/system-integration.js.map +1 -0
- package/dist/src/integration/types.js +5 -0
- package/dist/src/integration/types.js.map +1 -0
- package/dist/src/lifecycle/communication-protocols.js +568 -0
- package/dist/src/lifecycle/communication-protocols.js.map +1 -0
- package/dist/src/lifecycle/dependency-tracker.js +799 -0
- package/dist/src/lifecycle/dependency-tracker.js.map +1 -0
- package/dist/src/lifecycle/memory-schema.js +622 -0
- package/dist/src/lifecycle/memory-schema.js.map +1 -0
- package/dist/src/maestro/maestro-swarm-coordinator.js +504 -0
- package/dist/src/maestro/maestro-swarm-coordinator.js.map +1 -0
- package/dist/src/maestro/maestro-types.js +3 -0
- package/dist/src/maestro/maestro-types.js.map +1 -0
- package/dist/src/maestro/tests/native-hive-mind-integration.test.js +382 -0
- package/dist/src/maestro/tests/native-hive-mind-integration.test.js.map +1 -0
- package/dist/src/mcp/auth.js +347 -0
- package/dist/src/mcp/auth.js.map +1 -0
- package/dist/src/mcp/claude-code-wrapper.js +717 -0
- package/dist/src/mcp/claude-code-wrapper.js.map +1 -0
- package/dist/src/mcp/claude-flow-tools.js +1365 -0
- package/dist/src/mcp/claude-flow-tools.js.map +1 -0
- package/dist/src/mcp/client.js +201 -0
- package/dist/src/mcp/client.js.map +1 -0
- package/dist/src/mcp/index.js +192 -0
- package/dist/src/mcp/index.js.map +1 -0
- package/dist/src/mcp/integrate-wrapper.js +85 -0
- package/dist/src/mcp/integrate-wrapper.js.map +1 -0
- package/dist/src/mcp/lifecycle-manager.js +348 -0
- package/dist/src/mcp/lifecycle-manager.js.map +1 -0
- package/dist/src/mcp/load-balancer.js +386 -0
- package/dist/src/mcp/load-balancer.js.map +1 -0
- package/dist/src/mcp/orchestration-integration.js +800 -0
- package/dist/src/mcp/orchestration-integration.js.map +1 -0
- package/dist/src/mcp/performance-monitor.js +489 -0
- package/dist/src/mcp/performance-monitor.js.map +1 -0
- package/dist/src/mcp/protocol-manager.js +376 -0
- package/dist/src/mcp/protocol-manager.js.map +1 -0
- package/dist/src/mcp/recovery/connection-health-monitor.js +240 -0
- package/dist/src/mcp/recovery/connection-health-monitor.js.map +1 -0
- package/dist/src/mcp/recovery/connection-state-manager.js +309 -0
- package/dist/src/mcp/recovery/connection-state-manager.js.map +1 -0
- package/dist/src/mcp/recovery/fallback-coordinator.js +288 -0
- package/dist/src/mcp/recovery/fallback-coordinator.js.map +1 -0
- package/dist/src/mcp/recovery/index.js +10 -0
- package/dist/src/mcp/recovery/index.js.map +1 -0
- package/dist/src/mcp/recovery/reconnection-manager.js +219 -0
- package/dist/src/mcp/recovery/reconnection-manager.js.map +1 -0
- package/dist/src/mcp/recovery/recovery-manager.js +262 -0
- package/dist/src/mcp/recovery/recovery-manager.js.map +1 -0
- package/dist/src/mcp/router.js +220 -0
- package/dist/src/mcp/router.js.map +1 -0
- package/dist/src/mcp/ruv-swarm-tools.js +671 -0
- package/dist/src/mcp/ruv-swarm-tools.js.map +1 -0
- package/dist/src/mcp/server-with-wrapper.js +32 -0
- package/dist/src/mcp/server-with-wrapper.js.map +1 -0
- package/dist/src/mcp/server-wrapper-mode.js +26 -0
- package/dist/src/mcp/server-wrapper-mode.js.map +1 -0
- package/dist/src/mcp/server.js +539 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/dist/src/mcp/session-manager.js +338 -0
- package/dist/src/mcp/session-manager.js.map +1 -0
- package/dist/src/mcp/sparc-modes.js +455 -0
- package/dist/src/mcp/sparc-modes.js.map +1 -0
- package/dist/src/mcp/swarm-tools.js +903 -0
- package/dist/src/mcp/swarm-tools.js.map +1 -0
- package/dist/src/mcp/tests/mcp-integration.test.js +493 -0
- package/dist/src/mcp/tests/mcp-integration.test.js.map +1 -0
- package/dist/src/mcp/tools.js +426 -0
- package/dist/src/mcp/tools.js.map +1 -0
- package/dist/src/mcp/transports/base.js +5 -0
- package/dist/src/mcp/transports/base.js.map +1 -0
- package/dist/src/mcp/transports/http.js +414 -0
- package/dist/src/mcp/transports/http.js.map +1 -0
- package/dist/src/mcp/transports/stdio.js +217 -0
- package/dist/src/mcp/transports/stdio.js.map +1 -0
- package/dist/src/memory/advanced-memory-manager.js +1522 -0
- package/dist/src/memory/advanced-memory-manager.js.map +1 -0
- package/dist/src/memory/backends/base.js +5 -0
- package/dist/src/memory/backends/base.js.map +1 -0
- package/dist/src/memory/backends/markdown.js +235 -0
- package/dist/src/memory/backends/markdown.js.map +1 -0
- package/dist/src/memory/backends/sqlite.js +295 -0
- package/dist/src/memory/backends/sqlite.js.map +1 -0
- package/dist/src/memory/cache.js +177 -0
- package/dist/src/memory/cache.js.map +1 -0
- package/dist/src/memory/distributed-memory.js +745 -0
- package/dist/src/memory/distributed-memory.js.map +1 -0
- package/dist/src/memory/indexer.js +184 -0
- package/dist/src/memory/indexer.js.map +1 -0
- package/dist/src/memory/manager.js +457 -0
- package/dist/src/memory/manager.js.map +1 -0
- package/dist/src/memory/sqlite-enhanced-backend.js +529 -0
- package/dist/src/memory/sqlite-enhanced-backend.js.map +1 -0
- package/dist/src/memory/swarm-memory.js +446 -0
- package/dist/src/memory/swarm-memory.js.map +1 -0
- package/dist/src/migration/index.js +94 -0
- package/dist/src/migration/index.js.map +1 -0
- package/dist/src/migration/logger.js +110 -0
- package/dist/src/migration/logger.js.map +1 -0
- package/dist/src/migration/migration-analyzer.js +255 -0
- package/dist/src/migration/migration-analyzer.js.map +1 -0
- package/dist/src/migration/migration-runner.js +511 -0
- package/dist/src/migration/migration-runner.js.map +1 -0
- package/dist/src/migration/migration-validator.js +272 -0
- package/dist/src/migration/migration-validator.js.map +1 -0
- package/dist/src/migration/progress-reporter.js +139 -0
- package/dist/src/migration/progress-reporter.js.map +1 -0
- package/dist/src/migration/rollback-manager.js +310 -0
- package/dist/src/migration/rollback-manager.js.map +1 -0
- package/dist/src/migration/tests/migration-system.test.js +9 -0
- package/dist/src/migration/tests/migration-system.test.js.map +1 -0
- package/dist/src/migration/types.js +5 -0
- package/dist/src/migration/types.js.map +1 -0
- package/dist/src/monitoring/diagnostics.js +532 -0
- package/dist/src/monitoring/diagnostics.js.map +1 -0
- package/dist/src/monitoring/health-check.js +355 -0
- package/dist/src/monitoring/health-check.js.map +1 -0
- package/dist/src/monitoring/phase4/analytics/consensus-tracker.js +764 -0
- package/dist/src/monitoring/phase4/analytics/consensus-tracker.js.map +1 -0
- package/dist/src/monitoring/phase4/analytics/performance-assessor.js +859 -0
- package/dist/src/monitoring/phase4/analytics/performance-assessor.js.map +1 -0
- package/dist/src/monitoring/phase4/analytics/truth-score-analyzer.js +667 -0
- package/dist/src/monitoring/phase4/analytics/truth-score-analyzer.js.map +1 -0
- package/dist/src/monitoring/phase4/dashboard/monitoring-dashboard.js +1008 -0
- package/dist/src/monitoring/phase4/dashboard/monitoring-dashboard.js.map +1 -0
- package/dist/src/monitoring/phase4/rollout-decision-engine.js +849 -0
- package/dist/src/monitoring/phase4/rollout-decision-engine.js.map +1 -0
- package/dist/src/monitoring/real-time-feedback-system.js +688 -0
- package/dist/src/monitoring/real-time-feedback-system.js.map +1 -0
- package/dist/src/monitoring/real-time-monitor.js +981 -0
- package/dist/src/monitoring/real-time-monitor.js.map +1 -0
- package/dist/src/monitoring/regression/RegressionDetector.js +525 -0
- package/dist/src/monitoring/regression/RegressionDetector.js.map +1 -0
- package/dist/src/neural/NeuralDomainMapper.js +1137 -0
- package/dist/src/neural/NeuralDomainMapper.js.map +1 -0
- package/dist/src/neural/index.js +418 -0
- package/dist/src/neural/index.js.map +1 -0
- package/dist/src/neural/integration.js +590 -0
- package/dist/src/neural/integration.js.map +1 -0
- package/dist/src/providers/anthropic-provider.js +245 -0
- package/dist/src/providers/anthropic-provider.js.map +1 -0
- package/dist/src/providers/base-provider.js +389 -0
- package/dist/src/providers/base-provider.js.map +1 -0
- package/dist/src/providers/cohere-provider.js +405 -0
- package/dist/src/providers/cohere-provider.js.map +1 -0
- package/dist/src/providers/google-provider.js +376 -0
- package/dist/src/providers/google-provider.js.map +1 -0
- package/dist/src/providers/index.js +18 -0
- package/dist/src/providers/index.js.map +1 -0
- package/dist/src/providers/ollama-provider.js +400 -0
- package/dist/src/providers/ollama-provider.js.map +1 -0
- package/dist/src/providers/openai-provider.js +364 -0
- package/dist/src/providers/openai-provider.js.map +1 -0
- package/dist/src/providers/provider-manager.js +487 -0
- package/dist/src/providers/provider-manager.js.map +1 -0
- package/dist/src/providers/types.js +55 -0
- package/dist/src/providers/types.js.map +1 -0
- package/dist/src/providers/utils.js +343 -0
- package/dist/src/providers/utils.js.map +1 -0
- package/dist/src/quality-gates/automated-review-system.js +645 -0
- package/dist/src/quality-gates/automated-review-system.js.map +1 -0
- package/dist/src/resources/resource-manager.js +1275 -0
- package/dist/src/resources/resource-manager.js.map +1 -0
- package/dist/src/rollback/recovery-manager.js +1065 -0
- package/dist/src/rollback/recovery-manager.js.map +1 -0
- package/dist/src/services/agent-manager.js +308 -0
- package/dist/src/services/agent-manager.js.map +1 -0
- package/dist/src/services/agentic-flow-hooks/hook-manager.js +506 -0
- package/dist/src/services/agentic-flow-hooks/hook-manager.js.map +1 -0
- package/dist/src/services/agentic-flow-hooks/index.js +322 -0
- package/dist/src/services/agentic-flow-hooks/index.js.map +1 -0
- package/dist/src/services/agentic-flow-hooks/llm-hooks.js +445 -0
- package/dist/src/services/agentic-flow-hooks/llm-hooks.js.map +1 -0
- package/dist/src/services/agentic-flow-hooks/memory-hooks.js +558 -0
- package/dist/src/services/agentic-flow-hooks/memory-hooks.js.map +1 -0
- package/dist/src/services/agentic-flow-hooks/neural-hooks.js +595 -0
- package/dist/src/services/agentic-flow-hooks/neural-hooks.js.map +1 -0
- package/dist/src/services/agentic-flow-hooks/performance-hooks.js +640 -0
- package/dist/src/services/agentic-flow-hooks/performance-hooks.js.map +1 -0
- package/dist/src/services/agentic-flow-hooks/types.js +8 -0
- package/dist/src/services/agentic-flow-hooks/types.js.map +1 -0
- package/dist/src/services/agentic-flow-hooks/workflow-hooks.js +746 -0
- package/dist/src/services/agentic-flow-hooks/workflow-hooks.js.map +1 -0
- package/dist/src/services/performance-metrics-collector.js +529 -0
- package/dist/src/services/performance-metrics-collector.js.map +1 -0
- package/dist/src/services/swarm-coordinator.js +431 -0
- package/dist/src/services/swarm-coordinator.js.map +1 -0
- package/dist/src/services/swarm-memory-manager.js +513 -0
- package/dist/src/services/swarm-memory-manager.js.map +1 -0
- package/dist/src/services/swarm-relaunch-manager.js +408 -0
- package/dist/src/services/swarm-relaunch-manager.js.map +1 -0
- package/dist/src/services/task-handoff-service.js +361 -0
- package/dist/src/services/task-handoff-service.js.map +1 -0
- package/dist/src/swarm/__tests__/integration.test.js +229 -0
- package/dist/src/swarm/__tests__/integration.test.js.map +1 -0
- package/dist/src/swarm/__tests__/prompt-copier.test.js +346 -0
- package/dist/src/swarm/__tests__/prompt-copier.test.js.map +1 -0
- package/dist/src/swarm/advanced-orchestrator.js +1093 -0
- package/dist/src/swarm/advanced-orchestrator.js.map +1 -0
- package/dist/src/swarm/claude-code-interface.js +959 -0
- package/dist/src/swarm/claude-code-interface.js.map +1 -0
- package/dist/src/swarm/claude-flow-executor.js +218 -0
- package/dist/src/swarm/claude-flow-executor.js.map +1 -0
- package/dist/src/swarm/coordinator.js +3001 -0
- package/dist/src/swarm/coordinator.js.map +1 -0
- package/dist/src/swarm/direct-executor.js +1169 -0
- package/dist/src/swarm/direct-executor.js.map +1 -0
- package/dist/src/swarm/executor-v2.js +312 -0
- package/dist/src/swarm/executor-v2.js.map +1 -0
- package/dist/src/swarm/executor.js +813 -0
- package/dist/src/swarm/executor.js.map +1 -0
- package/dist/src/swarm/hive-mind-integration.js +700 -0
- package/dist/src/swarm/hive-mind-integration.js.map +1 -0
- package/dist/src/swarm/index.js +43 -0
- package/dist/src/swarm/index.js.map +1 -0
- package/dist/src/swarm/json-output-aggregator.js +269 -0
- package/dist/src/swarm/json-output-aggregator.js.map +1 -0
- package/dist/src/swarm/mcp-integration-wrapper.js +623 -0
- package/dist/src/swarm/mcp-integration-wrapper.js.map +1 -0
- package/dist/src/swarm/memory.js +1119 -0
- package/dist/src/swarm/memory.js.map +1 -0
- package/dist/src/swarm/optimizations/__tests__/optimization.test.js +350 -0
- package/dist/src/swarm/optimizations/__tests__/optimization.test.js.map +1 -0
- package/dist/src/swarm/optimizations/async-file-manager.js +273 -0
- package/dist/src/swarm/optimizations/async-file-manager.js.map +1 -0
- package/dist/src/swarm/optimizations/circular-buffer.js +148 -0
- package/dist/src/swarm/optimizations/circular-buffer.js.map +1 -0
- package/dist/src/swarm/optimizations/connection-pool.js +239 -0
- package/dist/src/swarm/optimizations/connection-pool.js.map +1 -0
- package/dist/src/swarm/optimizations/index.js +30 -0
- package/dist/src/swarm/optimizations/index.js.map +1 -0
- package/dist/src/swarm/optimizations/optimized-executor.js +318 -0
- package/dist/src/swarm/optimizations/optimized-executor.js.map +1 -0
- package/dist/src/swarm/optimizations/ttl-map.js +223 -0
- package/dist/src/swarm/optimizations/ttl-map.js.map +1 -0
- package/dist/src/swarm/prompt-cli.js +202 -0
- package/dist/src/swarm/prompt-cli.js.map +1 -0
- package/dist/src/swarm/prompt-copier-enhanced.js +193 -0
- package/dist/src/swarm/prompt-copier-enhanced.js.map +1 -0
- package/dist/src/swarm/prompt-copier.js +376 -0
- package/dist/src/swarm/prompt-copier.js.map +1 -0
- package/dist/src/swarm/prompt-manager.js +287 -0
- package/dist/src/swarm/prompt-manager.js.map +1 -0
- package/dist/src/swarm/prompt-utils.js +299 -0
- package/dist/src/swarm/prompt-utils.js.map +1 -0
- package/dist/src/swarm/result-aggregator.js +713 -0
- package/dist/src/swarm/result-aggregator.js.map +1 -0
- package/dist/src/swarm/sparc-executor.js +1557 -0
- package/dist/src/swarm/sparc-executor.js.map +1 -0
- package/dist/src/swarm/strategies/auto.js +751 -0
- package/dist/src/swarm/strategies/auto.js.map +1 -0
- package/dist/src/swarm/strategies/base.js +117 -0
- package/dist/src/swarm/strategies/base.js.map +1 -0
- package/dist/src/swarm/strategies/research.js +911 -0
- package/dist/src/swarm/strategies/research.js.map +1 -0
- package/dist/src/swarm/strategies/strategy-metrics-patch.js +4 -0
- package/dist/src/swarm/strategies/strategy-metrics-patch.js.map +1 -0
- package/dist/src/swarm/types.js +54 -0
- package/dist/src/swarm/types.js.map +1 -0
- package/dist/src/swarm/workers/copy-worker.js +58 -0
- package/dist/src/swarm/workers/copy-worker.js.map +1 -0
- package/dist/src/swarm-fullstack/adapters/chrome-mcp-adapter.js +412 -0
- package/dist/src/swarm-fullstack/adapters/chrome-mcp-adapter.js.map +1 -0
- package/dist/src/swarm-fullstack/adapters/shadcn-mcp-adapter.js +560 -0
- package/dist/src/swarm-fullstack/adapters/shadcn-mcp-adapter.js.map +1 -0
- package/dist/src/swarm-fullstack/cli/fullstack-cli.js +582 -0
- package/dist/src/swarm-fullstack/cli/fullstack-cli.js.map +1 -0
- package/dist/src/swarm-fullstack/config/fullstack-config.js +369 -0
- package/dist/src/swarm-fullstack/config/fullstack-config.js.map +1 -0
- package/dist/src/swarm-fullstack/core/dynamic-agent-spawner.js +687 -0
- package/dist/src/swarm-fullstack/core/dynamic-agent-spawner.js.map +1 -0
- package/dist/src/swarm-fullstack/core/enhanced-swarm-message-router.js +589 -0
- package/dist/src/swarm-fullstack/core/enhanced-swarm-message-router.js.map +1 -0
- package/dist/src/swarm-fullstack/core/fullstack-orchestrator.js +538 -0
- package/dist/src/swarm-fullstack/core/fullstack-orchestrator.js.map +1 -0
- package/dist/src/swarm-fullstack/types/index.js +8 -0
- package/dist/src/swarm-fullstack/types/index.js.map +1 -0
- package/dist/src/task/commands.js +130 -0
- package/dist/src/task/commands.js.map +1 -0
- package/dist/src/task/coordination.js +737 -0
- package/dist/src/task/coordination.js.map +1 -0
- package/dist/src/task/engine.js +490 -0
- package/dist/src/task/engine.js.map +1 -0
- package/dist/src/task/index.js +269 -0
- package/dist/src/task/index.js.map +1 -0
- package/dist/src/task/types.js +5 -0
- package/dist/src/task/types.js.map +1 -0
- package/dist/src/terminal/adapters/base.js +5 -0
- package/dist/src/terminal/adapters/base.js.map +1 -0
- package/dist/src/terminal/adapters/native.js +473 -0
- package/dist/src/terminal/adapters/native.js.map +1 -0
- package/dist/src/terminal/adapters/vscode.js +285 -0
- package/dist/src/terminal/adapters/vscode.js.map +1 -0
- package/dist/src/terminal/manager.js +237 -0
- package/dist/src/terminal/manager.js.map +1 -0
- package/dist/src/terminal/pool.js +209 -0
- package/dist/src/terminal/pool.js.map +1 -0
- package/dist/src/terminal/session.js +211 -0
- package/dist/src/terminal/session.js.map +1 -0
- package/dist/src/terminal/vscode-bridge.js +186 -0
- package/dist/src/terminal/vscode-bridge.js.map +1 -0
- package/dist/src/testing/performance/PerformanceTestRunner.js +401 -0
- package/dist/src/testing/performance/PerformanceTestRunner.js.map +1 -0
- package/dist/src/testing-integration/chrome-mcp-integration.js +556 -0
- package/dist/src/testing-integration/chrome-mcp-integration.js.map +1 -0
- package/dist/src/testing-integration/continuous-test-runner.js +509 -0
- package/dist/src/testing-integration/continuous-test-runner.js.map +1 -0
- package/dist/src/tests/validation-consistency.test.js +52 -0
- package/dist/src/tests/validation-consistency.test.js.map +1 -0
- package/dist/src/topology/adaptive-coordinator.js +691 -0
- package/dist/src/topology/adaptive-coordinator.js.map +1 -0
- package/dist/src/topology/communication-bridge.js +551 -0
- package/dist/src/topology/communication-bridge.js.map +1 -0
- package/dist/src/topology/enhanced-hierarchical-coordinator.js +1732 -0
- package/dist/src/topology/enhanced-hierarchical-coordinator.js.map +1 -0
- package/dist/src/topology/enhanced-mesh-coordinator.js +1271 -0
- package/dist/src/topology/enhanced-mesh-coordinator.js.map +1 -0
- package/dist/src/topology/topology-manager.js +797 -0
- package/dist/src/topology/topology-manager.js.map +1 -0
- package/dist/src/topology/types.js +8 -0
- package/dist/src/topology/types.js.map +1 -0
- package/dist/src/types/agent-lifecycle-types.js +172 -0
- package/dist/src/types/agent-lifecycle-types.js.map +1 -0
- package/dist/src/types/agent-types.js +11 -0
- package/dist/src/types/agent-types.js.map +1 -0
- package/dist/src/types/cliffy.d.js +9 -0
- package/dist/src/types/cliffy.d.js.map +1 -0
- package/dist/src/types/global.d.js +5 -0
- package/dist/src/types/global.d.js.map +1 -0
- package/dist/src/types/index.js +16 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/types/mcp.d.js +3 -0
- package/dist/src/types/mcp.d.js.map +1 -0
- package/dist/src/types/vscode.d.js +4 -0
- package/dist/src/types/vscode.d.js.map +1 -0
- package/dist/src/ui/hive-dashboard.js +284 -0
- package/dist/src/ui/hive-dashboard.js.map +1 -0
- package/dist/src/utils/error-handler.js +27 -0
- package/dist/src/utils/error-handler.js.map +1 -0
- package/dist/src/utils/errors.js +195 -0
- package/dist/src/utils/errors.js.map +1 -0
- package/dist/src/utils/formatters.js +66 -0
- package/dist/src/utils/formatters.js.map +1 -0
- package/dist/src/utils/helpers.js +451 -0
- package/dist/src/utils/helpers.js.map +1 -0
- package/dist/src/utils/paths.js +43 -0
- package/dist/src/utils/paths.js.map +1 -0
- package/dist/src/utils/type-guards.js +119 -0
- package/dist/src/utils/type-guards.js.map +1 -0
- package/dist/src/utils/types.js +38 -0
- package/dist/src/utils/types.js.map +1 -0
- package/dist/src/verification/agent-scorer.js +633 -0
- package/dist/src/verification/agent-scorer.js.map +1 -0
- package/dist/src/verification/alert-manager.js +1126 -0
- package/dist/src/verification/alert-manager.js.map +1 -0
- package/dist/src/verification/api/types/index.js +6 -0
- package/dist/src/verification/api/types/index.js.map +1 -0
- package/dist/src/verification/checkpoint-manager.js +519 -0
- package/dist/src/verification/checkpoint-manager.js.map +1 -0
- package/dist/src/verification/cli-integration.js +500 -0
- package/dist/src/verification/cli-integration.js.map +1 -0
- package/dist/src/verification/conflict-resolver.js +534 -0
- package/dist/src/verification/conflict-resolver.js.map +1 -0
- package/dist/src/verification/crdt-coordinator.js +506 -0
- package/dist/src/verification/crdt-coordinator.js.map +1 -0
- package/dist/src/verification/dashboard-exporter.js +876 -0
- package/dist/src/verification/dashboard-exporter.js.map +1 -0
- package/dist/src/verification/demo.js +320 -0
- package/dist/src/verification/demo.js.map +1 -0
- package/dist/src/verification/examples.js +508 -0
- package/dist/src/verification/examples.js.map +1 -0
- package/dist/src/verification/hooks.js +961 -0
- package/dist/src/verification/hooks.js.map +1 -0
- package/dist/src/verification/index.js +73 -0
- package/dist/src/verification/index.js.map +1 -0
- package/dist/src/verification/interfaces.js +7 -0
- package/dist/src/verification/interfaces.js.map +1 -0
- package/dist/src/verification/memory-manager.js +510 -0
- package/dist/src/verification/memory-manager.js.map +1 -0
- package/dist/src/verification/middleware.js +579 -0
- package/dist/src/verification/middleware.js.map +1 -0
- package/dist/src/verification/rollback-engine.js +511 -0
- package/dist/src/verification/rollback-engine.js.map +1 -0
- package/dist/src/verification/rollback.js +1710 -0
- package/dist/src/verification/rollback.js.map +1 -0
- package/dist/src/verification/security-bypass-test.js +704 -0
- package/dist/src/verification/security-bypass-test.js.map +1 -0
- package/dist/src/verification/security.js +1125 -0
- package/dist/src/verification/security.js.map +1 -0
- package/dist/src/verification/simple-hooks.js +189 -0
- package/dist/src/verification/simple-hooks.js.map +1 -0
- package/dist/src/verification/system-tracker.js +657 -0
- package/dist/src/verification/system-tracker.js.map +1 -0
- package/dist/src/verification/telemetry.js +922 -0
- package/dist/src/verification/telemetry.js.map +1 -0
- package/dist/src/verification/test-verification.js +43 -0
- package/dist/src/verification/test-verification.js.map +1 -0
- package/dist/src/verification/tests/e2e/verification-pipeline.test.js +1027 -0
- package/dist/src/verification/tests/e2e/verification-pipeline.test.js.map +1 -0
- package/dist/src/verification/tests/integration/cross-agent-communication.test.js +638 -0
- package/dist/src/verification/tests/integration/cross-agent-communication.test.js.map +1 -0
- package/dist/src/verification/tests/mocks/false-reporting-scenarios.test.js +1029 -0
- package/dist/src/verification/tests/mocks/false-reporting-scenarios.test.js.map +1 -0
- package/dist/src/verification/tests/performance/verification-overhead.test.js +587 -0
- package/dist/src/verification/tests/performance/verification-overhead.test.js.map +1 -0
- package/dist/src/verification/tests/unit/truth-scoring.test.js +579 -0
- package/dist/src/verification/tests/unit/truth-scoring.test.js.map +1 -0
- package/dist/src/verification/tests.js +611 -0
- package/dist/src/verification/tests.js.map +1 -0
- package/dist/src/verification/truth-scorer.js +584 -0
- package/dist/src/verification/truth-scorer.js.map +1 -0
- package/dist/src/verification/types.js +56 -0
- package/dist/src/verification/types.js.map +1 -0
- package/dist/src/verification/verification-pipeline.js +884 -0
- package/dist/src/verification/verification-pipeline.js.map +1 -0
- package/dist/src/web/messaging/agent-status-tracker.js +447 -0
- package/dist/src/web/messaging/agent-status-tracker.js.map +1 -0
- package/dist/src/web/messaging/human-intervention-system.js +298 -0
- package/dist/src/web/messaging/human-intervention-system.js.map +1 -0
- package/dist/src/web/messaging/message-filter.js +289 -0
- package/dist/src/web/messaging/message-filter.js.map +1 -0
- package/dist/src/web/messaging/swarm-message-router.js +320 -0
- package/dist/src/web/messaging/swarm-message-router.js.map +1 -0
- package/dist/src/web/messaging/transparency-logger.js +415 -0
- package/dist/src/web/messaging/transparency-logger.js.map +1 -0
- package/dist/src/web/portal-server.js +440 -0
- package/dist/src/web/portal-server.js.map +1 -0
- package/dist/src/web/server.js +311 -0
- package/dist/src/web/server.js.map +1 -0
- package/dist/src/web/websocket/websocket-manager.js +509 -0
- package/dist/src/web/websocket/websocket-manager.js.map +1 -0
- package/dist/src/workflows/feature-lifecycle-manager.js +386 -0
- package/dist/src/workflows/feature-lifecycle-manager.js.map +1 -0
- package/dist/src/workflows/fullstack-coordination-manager.js +801 -0
- package/dist/src/workflows/fullstack-coordination-manager.js.map +1 -0
- package/dist/src/workflows/iterative-development-orchestrator.js +1128 -0
- package/dist/src/workflows/iterative-development-orchestrator.js.map +1 -0
- package/dist/src/workflows/progressive-rollout-manager.js +710 -0
- package/dist/src/workflows/progressive-rollout-manager.js.map +1 -0
- package/package.json +264 -0
- package/scripts/README.md +339 -0
- package/scripts/post-install-claude-md.js +50 -0
- package/src/commands/dependency-recommendations.js +551 -0
- package/src/commands/suggest-improvements.js +492 -0
- package/src/commands/suggest-templates.js +916 -0
- package/src/npx/claude-md-protection.js +169 -0
- package/wiki/INDEX.md +264 -0
- package/wiki/NAVIGATION.md +270 -0
- package/wiki/README.md +101 -0
- package/wiki/accessibility/README.md +103 -0
- package/wiki/accessibility/assistive-tech/screen-reader-support.md +912 -0
- package/wiki/accessibility/automation/agent-testing-automation.md +880 -0
- package/wiki/accessibility/guidelines/wcag-compliance.md +278 -0
- package/wiki/accessibility/i18n/internationalization-strategies.md +1022 -0
- package/wiki/accessibility/motor-accessibility/keyboard-navigation.md +1182 -0
- package/wiki/accessibility/patterns/inclusive-design-patterns.md +715 -0
- package/wiki/accessibility/testing/automated-testing.md +665 -0
- package/wiki/accessibility/visual-design/color-contrast.md +926 -0
- package/wiki/accessibility/workflows/accessibility-first-development.md +916 -0
- package/wiki/accessibility/workflows/inclusive-design-review.md +835 -0
- package/wiki/api-reference/README.md +565 -0
- package/wiki/api-reference/agent-management-api.md +931 -0
- package/wiki/api-reference/cli-api.md +630 -0
- package/wiki/api-reference/configuration-api.md +1355 -0
- package/wiki/api-reference/examples-code-samples.md +2241 -0
- package/wiki/api-reference/hooks-coordination-api.md +1406 -0
- package/wiki/api-reference/mcp-tool-specifications.md +944 -0
- package/wiki/api-reference/plugin-development.md +1695 -0
- package/wiki/api-reference/technical-architecture.md +1729 -0
- package/wiki/command-reference/README.md +305 -0
- package/wiki/command-reference/agent-commands.md +571 -0
- package/wiki/command-reference/cli-commands.md +516 -0
- package/wiki/command-reference/command-syntax.md +676 -0
- package/wiki/command-reference/expert/README.md +616 -0
- package/wiki/command-reference/expert-tier.md +791 -0
- package/wiki/command-reference/intermediate/README.md +628 -0
- package/wiki/command-reference/intermediate-tier.md +1024 -0
- package/wiki/command-reference/mcp-integration.md +412 -0
- package/wiki/command-reference/mcp-tools/README.md +1743 -0
- package/wiki/command-reference/mcp-tools/dual-access-workflows.md +911 -0
- package/wiki/command-reference/mcp-tools/index.md +201 -0
- package/wiki/command-reference/mcp-tools/integration-patterns.md +830 -0
- package/wiki/command-reference/mcp-tools/quick-reference.md +383 -0
- package/wiki/command-reference/mcp-tools/session-management.md +1183 -0
- package/wiki/command-reference/mcp-tools/task-tool-integration.md +827 -0
- package/wiki/command-reference/novice/README.md +661 -0
- package/wiki/command-reference/novice-tier.md +1142 -0
- package/wiki/command-reference/progression-guide.md +772 -0
- package/wiki/command-reference/troubleshooting.md +803 -0
- package/wiki/command-reference/workflows.md +752 -0
- package/wiki/community/README.md +328 -0
- package/wiki/community/contributing/README.md +623 -0
- package/wiki/community/contributing/code-of-conduct.md +388 -0
- package/wiki/community/contributing/collaboration-workflows.md +1 -0
- package/wiki/community/contributing/issue-reporting.md +1 -0
- package/wiki/community/contributing/onboarding-guide.md +1 -0
- package/wiki/community/contributing/recognition-system.md +1 -0
- package/wiki/community/discussions/README.md +54 -0
- package/wiki/community/learning-resources.md +476 -0
- package/wiki/community/showcase/README.md +1 -0
- package/wiki/core-concepts/README.md +656 -0
- package/wiki/core-concepts/agent-feedback-hooks/README.md +298 -0
- package/wiki/core-concepts/agents/README.md +392 -0
- package/wiki/core-concepts/agents/agent-creation-guide.md +431 -0
- package/wiki/core-concepts/agents.md +301 -0
- package/wiki/core-concepts/architecture.md +227 -0
- package/wiki/core-concepts/hooks-lifecycle/README.md +543 -0
- package/wiki/core-concepts/integration.md +507 -0
- package/wiki/core-concepts/memory-system/README.md +521 -0
- package/wiki/core-concepts/performance.md +463 -0
- package/wiki/core-concepts/sparc-methodology/README.md +465 -0
- package/wiki/core-concepts/sparc-workflow.md +407 -0
- package/wiki/core-concepts/swarm-coordination/README.md +525 -0
- package/wiki/core-concepts/swarm-coordination.md +453 -0
- package/wiki/cost-optimization/enterprise-cost-management.md +1356 -0
- package/wiki/deployment/enterprise-deployment-patterns.md +1739 -0
- package/wiki/enterprise-architecture/enterprise-architecture-overview.md +348 -0
- package/wiki/enterprise-architecture/enterprise-scaling-patterns.md +1184 -0
- package/wiki/examples/README.md +288 -0
- package/wiki/examples/automation/cicd-pipeline/README.md +1265 -0
- package/wiki/examples/basic/hello-world/README.md +434 -0
- package/wiki/examples/basic-projects/README.md +427 -0
- package/wiki/examples/enterprise-integration/README.md +602 -0
- package/wiki/examples/integration-patterns.md +825 -0
- package/wiki/examples/legacy-migration/README.md +656 -0
- package/wiki/examples/multi-cloud/README.md +1071 -0
- package/wiki/examples/performance-benchmarks.md +729 -0
- package/wiki/examples/performance-optimization/README.md +1214 -0
- package/wiki/examples/projects/rest-api/README.md +845 -0
- package/wiki/examples/real-time-collaboration/README.md +1092 -0
- package/wiki/examples/scenarios/ecommerce/README.md +1273 -0
- package/wiki/examples/swarm-patterns.md +1026 -0
- package/wiki/examples/templates/download-system.md +993 -0
- package/wiki/examples/templates/javascript/README.md +487 -0
- package/wiki/examples/templates/javascript/package.json +119 -0
- package/wiki/examples/troubleshooting/README.md +1317 -0
- package/wiki/examples/utilities/patterns/README.md +1347 -0
- package/wiki/examples/videos/01-setup.md +403 -0
- package/wiki/examples/workflow-automation/README.md +1023 -0
- package/wiki/getting-started/README.md +398 -0
- package/wiki/getting-started/benefits.md +451 -0
- package/wiki/getting-started/claude-code-mcp/README.md +319 -0
- package/wiki/getting-started/claude-code-mcp/setup.md +431 -0
- package/wiki/getting-started/claude-code-mcp/usage-examples.md +501 -0
- package/wiki/getting-started/cli-access/README.md +300 -0
- package/wiki/getting-started/cli-access/first-commands.md +319 -0
- package/wiki/getting-started/installation/README.md +469 -0
- package/wiki/getting-started/installation/troubleshooting.md +617 -0
- package/wiki/getting-started/learning-path.md +494 -0
- package/wiki/getting-started/learning-plan-generator.md +434 -0
- package/wiki/getting-started/quick-start/README.md +255 -0
- package/wiki/getting-started/quick-start/cli-tutorial.md +680 -0
- package/wiki/getting-started/quick-start/mcp-tutorial.md +544 -0
- package/wiki/governance/multi-project-coordination.md +820 -0
- package/wiki/languages/README.md +349 -0
- package/wiki/languages/go/README.md +124 -0
- package/wiki/languages/go/examples/README.md +1066 -0
- package/wiki/languages/go/frameworks/README.md +708 -0
- package/wiki/languages/go/integration/README.md +748 -0
- package/wiki/languages/go/microservices/README.md +1185 -0
- package/wiki/languages/go/performance/README.md +1310 -0
- package/wiki/languages/go/setup/README.md +397 -0
- package/wiki/languages/go/systems/README.md +1116 -0
- package/wiki/languages/go/testing/README.md +999 -0
- package/wiki/languages/java/README.md +217 -0
- package/wiki/languages/java/claude-flow-integration.md +1220 -0
- package/wiki/languages/java/enterprise-java.md +1247 -0
- package/wiki/languages/java/examples.md +1712 -0
- package/wiki/languages/java/microservices.md +1600 -0
- package/wiki/languages/java/performance.md +1122 -0
- package/wiki/languages/java/project-setup.md +504 -0
- package/wiki/languages/java/spring-boot.md +756 -0
- package/wiki/languages/java/testing.md +1323 -0
- package/wiki/languages/javascript/README.md +575 -0
- package/wiki/languages/javascript/api/README.md +1445 -0
- package/wiki/languages/javascript/backend/README.md +748 -0
- package/wiki/languages/javascript/frontend/README.md +1048 -0
- package/wiki/languages/javascript/integration.md +1107 -0
- package/wiki/languages/javascript/setup/README.md +438 -0
- package/wiki/languages/javascript/testing/README.md +1775 -0
- package/wiki/languages/python/README.md +1002 -0
- package/wiki/languages/python/data-science/README.md +1317 -0
- package/wiki/languages/python/examples/README.md +911 -0
- package/wiki/languages/python/integration.md +1515 -0
- package/wiki/languages/python/mcp-integration.md +843 -0
- package/wiki/languages/python/setup/README.md +622 -0
- package/wiki/languages/python/testing/README.md +1680 -0
- package/wiki/languages/python/web-development/README.md +974 -0
- package/wiki/languages/rust/README.md +936 -0
- package/wiki/languages/rust/examples/cli-mcp-workflows.md +850 -0
- package/wiki/languages/rust/examples/rest-api.md +1927 -0
- package/wiki/languages/rust/setup/cargo-integration.md +780 -0
- package/wiki/languages/rust/testing/quality-validation.md +1098 -0
- package/wiki/languages/rust/web-development/axum.md +1497 -0
- package/wiki/languages/rust/workflows/systems-programming.md +1189 -0
- package/wiki/languages/typescript/README.md +581 -0
- package/wiki/languages/typescript/automation.md +1070 -0
- package/wiki/languages/typescript/coordination.md +971 -0
- package/wiki/languages/typescript/enterprise.md +1368 -0
- package/wiki/languages/typescript/frameworks.md +970 -0
- package/wiki/languages/typescript/migration.md +1384 -0
- package/wiki/languages/typescript/patterns.md +694 -0
- package/wiki/languages/typescript/performance.md +1195 -0
- package/wiki/languages/typescript/setup.md +516 -0
- package/wiki/languages/typescript/workflows.md +481 -0
- package/wiki/monitoring/enterprise-observability.md +1141 -0
- package/wiki/security/enterprise-security-framework.md +1174 -0
- package/wiki/team-coordination/team-scaling-strategies.md +1486 -0
- package/wiki/troubleshooting/README.md +654 -0
- package/wiki/troubleshooting/common-issues/README.md +659 -0
- package/wiki/troubleshooting/common-issues.md +458 -0
- package/wiki/troubleshooting/error-resolution.md +763 -0
- package/wiki/troubleshooting/performance-optimization.md +540 -0
- package/wiki/tutorials/README.md +607 -0
- package/wiki/tutorials/advanced/01-multi-agent-orchestration-patterns.md +585 -0
- package/wiki/tutorials/advanced/02-enterprise-architecture-development.md +661 -0
- package/wiki/tutorials/advanced/03-advanced-sparc-methodology.md +595 -0
- package/wiki/tutorials/advanced/04-performance-optimization-workflows.md +613 -0
- package/wiki/tutorials/advanced/05-custom-agent-development.md +681 -0
- package/wiki/tutorials/advanced/06-legacy-system-integration.md +574 -0
- package/wiki/tutorials/advanced/07-production-deployment-monitoring.md +684 -0
- package/wiki/tutorials/advanced/08-enterprise-scenarios.md +700 -0
- package/wiki/tutorials/advanced/README.md +577 -0
- package/wiki/tutorials/advanced/performance-optimization.md +476 -0
- package/wiki/tutorials/advanced/swarm-orchestration.md +627 -0
- package/wiki/tutorials/beginner/01-first-project.md +532 -0
- package/wiki/tutorials/beginner/02-basic-workflows.md +523 -0
- package/wiki/tutorials/beginner/03-simple-automation.md +641 -0
- package/wiki/tutorials/beginner/04-quality-testing.md +984 -0
- package/wiki/tutorials/beginner/README.md +388 -0
- package/wiki/tutorials/exercises/ecommerce-platform.md +1370 -0
- package/wiki/tutorials/intermediate/01-multi-agent-teams.md +961 -0
- package/wiki/tutorials/intermediate/README.md +452 -0
- package/wiki/tutorials/intermediate/optimization.md +402 -0
- package/wiki/tutorials/skill-assessment.md +522 -0
- package/wiki/tutorials/skill-competency-matrix.md +548 -0
- package/wiki/tutorials/troubleshooting/command-cheatsheet.md +425 -0
- package/wiki/tutorials/troubleshooting/setup-issues.md +717 -0
- package/wiki/video-tutorials/README.md +202 -0
- package/wiki/video-tutorials/accessibility/README.md +1349 -0
- package/wiki/video-tutorials/community/README.md +1366 -0
- package/wiki/video-tutorials/content-organization/README.md +1295 -0
- package/wiki/video-tutorials/distribution/README.md +1093 -0
- package/wiki/video-tutorials/editing/README.md +751 -0
- package/wiki/video-tutorials/interactive/README.md +1151 -0
- package/wiki/video-tutorials/multi-language/README.md +1384 -0
- package/wiki/video-tutorials/planning/README.md +461 -0
- package/wiki/video-tutorials/recording/README.md +619 -0
- package/wiki/video-tutorials/technical-specs/README.md +1018 -0
|
@@ -0,0 +1,1775 @@
|
|
|
1
|
+
# Testing & Automation with Claude-Flow
|
|
2
|
+
|
|
3
|
+
Comprehensive guide to testing JavaScript applications using Claude-Flow agent coordination for automated testing strategies.
|
|
4
|
+
|
|
5
|
+
## š Testing Workflow Overview
|
|
6
|
+
|
|
7
|
+
### 1. Initialize Testing Environment
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# Generate comprehensive testing setup with agent
|
|
11
|
+
npx claude-flow sparc run tester "Complete testing environment with Jest, React Testing Library, and E2E testing"
|
|
12
|
+
|
|
13
|
+
# Alternative: TDD workflow
|
|
14
|
+
npx claude-flow sparc tdd "User authentication feature with test-driven development"
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### 2. Agent-Driven Testing
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
# Parallel testing development
|
|
21
|
+
npx claude-flow sparc batch "tester,reviewer,perf-analyzer" "Comprehensive testing strategy implementation"
|
|
22
|
+
|
|
23
|
+
# Sequential testing pipeline
|
|
24
|
+
npx claude-flow sparc run tester "Unit tests for components and utilities"
|
|
25
|
+
npx claude-flow sparc run tester "Integration tests for API endpoints"
|
|
26
|
+
npx claude-flow sparc run tester "End-to-end tests for user workflows"
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## š Testing Architecture
|
|
30
|
+
|
|
31
|
+
### 1. Testing Strategy Structure
|
|
32
|
+
|
|
33
|
+
**Agent-Generated Testing Structure**:
|
|
34
|
+
```
|
|
35
|
+
testing/
|
|
36
|
+
āāā __tests__/ # Test files
|
|
37
|
+
ā āāā unit/ # Unit tests
|
|
38
|
+
ā ā āāā components/ # Component tests
|
|
39
|
+
ā ā āāā hooks/ # Hook tests
|
|
40
|
+
ā ā āāā utils/ # Utility tests
|
|
41
|
+
ā ā āāā services/ # Service tests
|
|
42
|
+
ā āāā integration/ # Integration tests
|
|
43
|
+
ā ā āāā api/ # API integration tests
|
|
44
|
+
ā ā āāā database/ # Database tests
|
|
45
|
+
ā ā āāā auth/ # Authentication tests
|
|
46
|
+
ā āāā e2e/ # End-to-end tests
|
|
47
|
+
ā ā āāā user-flows/ # User journey tests
|
|
48
|
+
ā ā āāā admin-flows/ # Admin workflow tests
|
|
49
|
+
ā ā āāā api-flows/ # API workflow tests
|
|
50
|
+
ā āāā performance/ # Performance tests
|
|
51
|
+
ā āāā load/ # Load testing
|
|
52
|
+
ā āāā stress/ # Stress testing
|
|
53
|
+
āāā fixtures/ # Test data
|
|
54
|
+
ā āāā users.json
|
|
55
|
+
ā āāā products.json
|
|
56
|
+
ā āāā orders.json
|
|
57
|
+
āāā mocks/ # Mock implementations
|
|
58
|
+
ā āāā api/ # API mocks
|
|
59
|
+
ā āāā services/ # Service mocks
|
|
60
|
+
ā āāā components/ # Component mocks
|
|
61
|
+
āāā utils/ # Testing utilities
|
|
62
|
+
ā āāā test-helpers.ts
|
|
63
|
+
ā āāā mock-factories.ts
|
|
64
|
+
ā āāā setup.ts
|
|
65
|
+
āāā config/ # Test configuration
|
|
66
|
+
ā āāā jest.config.js
|
|
67
|
+
ā āāā playwright.config.ts
|
|
68
|
+
ā āāā k6.config.js
|
|
69
|
+
āāā reports/ # Test reports
|
|
70
|
+
āāā coverage/
|
|
71
|
+
āāā performance/
|
|
72
|
+
āāā e2e/
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### 2. Generate Testing Environment with Agent
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
# Complete testing environment generation
|
|
79
|
+
npx claude-flow sparc run tester "Comprehensive testing setup with:
|
|
80
|
+
- Jest configuration for unit and integration tests
|
|
81
|
+
- React Testing Library for component testing
|
|
82
|
+
- Playwright for end-to-end testing
|
|
83
|
+
- K6 for performance testing
|
|
84
|
+
- MSW for API mocking
|
|
85
|
+
- Test utilities and helpers
|
|
86
|
+
- CI/CD integration
|
|
87
|
+
- Coverage reporting"
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## š§Ŗ Unit Testing
|
|
91
|
+
|
|
92
|
+
### 1. Component Testing
|
|
93
|
+
|
|
94
|
+
**tests/unit/components/Button.test.tsx** (Agent-generated):
|
|
95
|
+
```typescript
|
|
96
|
+
import React from 'react';
|
|
97
|
+
import { render, screen, fireEvent, waitFor } from '@testing-library/react';
|
|
98
|
+
import userEvent from '@testing-library/user-event';
|
|
99
|
+
import { Button } from '@/components/ui/Button';
|
|
100
|
+
|
|
101
|
+
// Mock implementations
|
|
102
|
+
const mockOnClick = jest.fn();
|
|
103
|
+
|
|
104
|
+
describe('Button Component', () => {
|
|
105
|
+
beforeEach(() => {
|
|
106
|
+
jest.clearAllMocks();
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
describe('Rendering', () => {
|
|
110
|
+
it('renders with default props', () => {
|
|
111
|
+
render(<Button>Click me</Button>);
|
|
112
|
+
|
|
113
|
+
const button = screen.getByRole('button', { name: /click me/i });
|
|
114
|
+
expect(button).toBeInTheDocument();
|
|
115
|
+
expect(button).toHaveClass('bg-primary');
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it('renders with custom variant', () => {
|
|
119
|
+
render(<Button variant="destructive">Delete</Button>);
|
|
120
|
+
|
|
121
|
+
const button = screen.getByRole('button');
|
|
122
|
+
expect(button).toHaveClass('bg-destructive');
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
it('renders with custom size', () => {
|
|
126
|
+
render(<Button size="lg">Large button</Button>);
|
|
127
|
+
|
|
128
|
+
const button = screen.getByRole('button');
|
|
129
|
+
expect(button).toHaveClass('h-11');
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it('renders with custom className', () => {
|
|
133
|
+
render(<Button className="custom-class">Custom</Button>);
|
|
134
|
+
|
|
135
|
+
const button = screen.getByRole('button');
|
|
136
|
+
expect(button).toHaveClass('custom-class');
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
describe('Interaction', () => {
|
|
141
|
+
it('calls onClick when clicked', async () => {
|
|
142
|
+
const user = userEvent.setup();
|
|
143
|
+
render(<Button onClick={mockOnClick}>Click me</Button>);
|
|
144
|
+
|
|
145
|
+
const button = screen.getByRole('button');
|
|
146
|
+
await user.click(button);
|
|
147
|
+
|
|
148
|
+
expect(mockOnClick).toHaveBeenCalledTimes(1);
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
it('does not call onClick when disabled', async () => {
|
|
152
|
+
const user = userEvent.setup();
|
|
153
|
+
render(<Button onClick={mockOnClick} disabled>Disabled</Button>);
|
|
154
|
+
|
|
155
|
+
const button = screen.getByRole('button');
|
|
156
|
+
await user.click(button);
|
|
157
|
+
|
|
158
|
+
expect(mockOnClick).not.toHaveBeenCalled();
|
|
159
|
+
expect(button).toBeDisabled();
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it('handles keyboard navigation', async () => {
|
|
163
|
+
const user = userEvent.setup();
|
|
164
|
+
render(<Button onClick={mockOnClick}>Press me</Button>);
|
|
165
|
+
|
|
166
|
+
const button = screen.getByRole('button');
|
|
167
|
+
button.focus();
|
|
168
|
+
await user.keyboard('{Enter}');
|
|
169
|
+
|
|
170
|
+
expect(mockOnClick).toHaveBeenCalledTimes(1);
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
describe('Loading State', () => {
|
|
175
|
+
it('shows loading spinner when loading', () => {
|
|
176
|
+
render(<Button loading>Loading</Button>);
|
|
177
|
+
|
|
178
|
+
const button = screen.getByRole('button');
|
|
179
|
+
const spinner = screen.getByRole('status', { hidden: true });
|
|
180
|
+
|
|
181
|
+
expect(button).toBeDisabled();
|
|
182
|
+
expect(spinner).toBeInTheDocument();
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
it('disables button when loading', () => {
|
|
186
|
+
render(<Button loading onClick={mockOnClick}>Loading</Button>);
|
|
187
|
+
|
|
188
|
+
const button = screen.getByRole('button');
|
|
189
|
+
fireEvent.click(button);
|
|
190
|
+
|
|
191
|
+
expect(button).toBeDisabled();
|
|
192
|
+
expect(mockOnClick).not.toHaveBeenCalled();
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
describe('Accessibility', () => {
|
|
197
|
+
it('has correct ARIA attributes', () => {
|
|
198
|
+
render(<Button aria-label="Custom label">Button</Button>);
|
|
199
|
+
|
|
200
|
+
const button = screen.getByRole('button');
|
|
201
|
+
expect(button).toHaveAttribute('aria-label', 'Custom label');
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
it('supports ref forwarding', () => {
|
|
205
|
+
const ref = React.createRef<HTMLButtonElement>();
|
|
206
|
+
render(<Button ref={ref}>Button</Button>);
|
|
207
|
+
|
|
208
|
+
expect(ref.current).toBeInstanceOf(HTMLButtonElement);
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
it('maintains focus styles', () => {
|
|
212
|
+
render(<Button>Focus me</Button>);
|
|
213
|
+
|
|
214
|
+
const button = screen.getByRole('button');
|
|
215
|
+
button.focus();
|
|
216
|
+
|
|
217
|
+
expect(button).toHaveFocus();
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
describe('Edge Cases', () => {
|
|
222
|
+
it('handles extremely long text', () => {
|
|
223
|
+
const longText = 'A'.repeat(1000);
|
|
224
|
+
render(<Button>{longText}</Button>);
|
|
225
|
+
|
|
226
|
+
const button = screen.getByRole('button');
|
|
227
|
+
expect(button).toBeInTheDocument();
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
it('handles special characters', () => {
|
|
231
|
+
render(<Button>{'<>&"\\''}</Button>);
|
|
232
|
+
|
|
233
|
+
const button = screen.getByRole('button');
|
|
234
|
+
expect(button).toHaveTextContent('<>&"\\\'');
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### 2. Hook Testing
|
|
241
|
+
|
|
242
|
+
**tests/unit/hooks/useApi.test.ts** (Agent-generated):
|
|
243
|
+
```typescript
|
|
244
|
+
import { renderHook, waitFor } from '@testing-library/react';
|
|
245
|
+
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
|
|
246
|
+
import { useApi, useApiMutation } from '@/hooks/useApi';
|
|
247
|
+
import { apiClient } from '@/services/apiClient';
|
|
248
|
+
|
|
249
|
+
// Mock the API client
|
|
250
|
+
jest.mock('@/services/apiClient', () => ({
|
|
251
|
+
apiClient: {
|
|
252
|
+
get: jest.fn(),
|
|
253
|
+
post: jest.fn(),
|
|
254
|
+
put: jest.fn(),
|
|
255
|
+
delete: jest.fn(),
|
|
256
|
+
},
|
|
257
|
+
}));
|
|
258
|
+
|
|
259
|
+
const mockedApiClient = apiClient as jest.Mocked<typeof apiClient>;
|
|
260
|
+
|
|
261
|
+
// Create a test wrapper
|
|
262
|
+
const createWrapper = () => {
|
|
263
|
+
const queryClient = new QueryClient({
|
|
264
|
+
defaultOptions: {
|
|
265
|
+
queries: { retry: false, cacheTime: 0 },
|
|
266
|
+
mutations: { retry: false },
|
|
267
|
+
},
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
return ({ children }: { children: React.ReactNode }) => (
|
|
271
|
+
<QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
|
|
272
|
+
);
|
|
273
|
+
};
|
|
274
|
+
|
|
275
|
+
describe('useApi Hook', () => {
|
|
276
|
+
beforeEach(() => {
|
|
277
|
+
jest.clearAllMocks();
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
describe('Successful Data Fetching', () => {
|
|
281
|
+
it('fetches and returns data successfully', async () => {
|
|
282
|
+
const mockData = { id: 1, name: 'Test User', email: 'test@example.com' };
|
|
283
|
+
mockedApiClient.get.mockResolvedValueOnce({ data: mockData });
|
|
284
|
+
|
|
285
|
+
const { result } = renderHook(
|
|
286
|
+
() => useApi('user', '/users/1'),
|
|
287
|
+
{ wrapper: createWrapper() }
|
|
288
|
+
);
|
|
289
|
+
|
|
290
|
+
expect(result.current.isLoading).toBe(true);
|
|
291
|
+
|
|
292
|
+
await waitFor(() => {
|
|
293
|
+
expect(result.current.isSuccess).toBe(true);
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
expect(result.current.data).toEqual(mockData);
|
|
297
|
+
expect(result.current.error).toBeNull();
|
|
298
|
+
expect(mockedApiClient.get).toHaveBeenCalledWith('/users/1');
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
it('handles empty response data', async () => {
|
|
302
|
+
mockedApiClient.get.mockResolvedValueOnce({ data: null });
|
|
303
|
+
|
|
304
|
+
const { result } = renderHook(
|
|
305
|
+
() => useApi('empty', '/empty'),
|
|
306
|
+
{ wrapper: createWrapper() }
|
|
307
|
+
);
|
|
308
|
+
|
|
309
|
+
await waitFor(() => {
|
|
310
|
+
expect(result.current.isSuccess).toBe(true);
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
expect(result.current.data).toBeNull();
|
|
314
|
+
});
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
describe('Error Handling', () => {
|
|
318
|
+
it('handles API errors correctly', async () => {
|
|
319
|
+
const mockError = new Error('API Error');
|
|
320
|
+
mockedApiClient.get.mockRejectedValueOnce(mockError);
|
|
321
|
+
|
|
322
|
+
const { result } = renderHook(
|
|
323
|
+
() => useApi('error', '/error'),
|
|
324
|
+
{ wrapper: createWrapper() }
|
|
325
|
+
);
|
|
326
|
+
|
|
327
|
+
await waitFor(() => {
|
|
328
|
+
expect(result.current.isError).toBe(true);
|
|
329
|
+
});
|
|
330
|
+
|
|
331
|
+
expect(result.current.error).toEqual(mockError);
|
|
332
|
+
expect(result.current.data).toBeUndefined();
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
it('handles network errors', async () => {
|
|
336
|
+
const networkError = new Error('Network Error');
|
|
337
|
+
networkError.name = 'NetworkError';
|
|
338
|
+
mockedApiClient.get.mockRejectedValueOnce(networkError);
|
|
339
|
+
|
|
340
|
+
const { result } = renderHook(
|
|
341
|
+
() => useApi('network-error', '/network-error'),
|
|
342
|
+
{ wrapper: createWrapper() }
|
|
343
|
+
);
|
|
344
|
+
|
|
345
|
+
await waitFor(() => {
|
|
346
|
+
expect(result.current.isError).toBe(true);
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
expect(result.current.error).toEqual(networkError);
|
|
350
|
+
});
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
describe('Configuration Options', () => {
|
|
354
|
+
it('respects enabled option', async () => {
|
|
355
|
+
const { result } = renderHook(
|
|
356
|
+
() => useApi('disabled', '/disabled', { enabled: false }),
|
|
357
|
+
{ wrapper: createWrapper() }
|
|
358
|
+
);
|
|
359
|
+
|
|
360
|
+
expect(result.current.isLoading).toBe(false);
|
|
361
|
+
expect(result.current.isFetching).toBe(false);
|
|
362
|
+
expect(mockedApiClient.get).not.toHaveBeenCalled();
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
it('respects stale time option', async () => {
|
|
366
|
+
const mockData = { id: 1, name: 'Test' };
|
|
367
|
+
mockedApiClient.get.mockResolvedValue({ data: mockData });
|
|
368
|
+
|
|
369
|
+
const { result, rerender } = renderHook(
|
|
370
|
+
() => useApi('stale', '/stale', { staleTime: 10000 }),
|
|
371
|
+
{ wrapper: createWrapper() }
|
|
372
|
+
);
|
|
373
|
+
|
|
374
|
+
await waitFor(() => {
|
|
375
|
+
expect(result.current.isSuccess).toBe(true);
|
|
376
|
+
});
|
|
377
|
+
|
|
378
|
+
// Rerender should not trigger new fetch due to stale time
|
|
379
|
+
rerender();
|
|
380
|
+
expect(mockedApiClient.get).toHaveBeenCalledTimes(1);
|
|
381
|
+
});
|
|
382
|
+
});
|
|
383
|
+
});
|
|
384
|
+
|
|
385
|
+
describe('useApiMutation Hook', () => {
|
|
386
|
+
beforeEach(() => {
|
|
387
|
+
jest.clearAllMocks();
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
describe('Successful Mutations', () => {
|
|
391
|
+
it('executes mutation successfully', async () => {
|
|
392
|
+
const mockData = { id: 1, name: 'Created User' };
|
|
393
|
+
const mutationFn = jest.fn().mockResolvedValue(mockData);
|
|
394
|
+
const onSuccess = jest.fn();
|
|
395
|
+
|
|
396
|
+
const { result } = renderHook(
|
|
397
|
+
() => useApiMutation(mutationFn, { onSuccess }),
|
|
398
|
+
{ wrapper: createWrapper() }
|
|
399
|
+
);
|
|
400
|
+
|
|
401
|
+
const variables = { name: 'Test User', email: 'test@example.com' };
|
|
402
|
+
result.current.mutate(variables);
|
|
403
|
+
|
|
404
|
+
await waitFor(() => {
|
|
405
|
+
expect(result.current.isSuccess).toBe(true);
|
|
406
|
+
});
|
|
407
|
+
|
|
408
|
+
expect(mutationFn).toHaveBeenCalledWith(variables);
|
|
409
|
+
expect(onSuccess).toHaveBeenCalledWith(mockData);
|
|
410
|
+
expect(result.current.data).toEqual(mockData);
|
|
411
|
+
});
|
|
412
|
+
|
|
413
|
+
it('invalidates queries on success', async () => {
|
|
414
|
+
const queryClient = new QueryClient();
|
|
415
|
+
const invalidateQueriesSpy = jest.spyOn(queryClient, 'invalidateQueries');
|
|
416
|
+
|
|
417
|
+
const mockData = { id: 1, name: 'Updated User' };
|
|
418
|
+
const mutationFn = jest.fn().mockResolvedValue(mockData);
|
|
419
|
+
|
|
420
|
+
const wrapper = ({ children }: { children: React.ReactNode }) => (
|
|
421
|
+
<QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
|
|
422
|
+
);
|
|
423
|
+
|
|
424
|
+
const { result } = renderHook(
|
|
425
|
+
() => useApiMutation(mutationFn, { invalidateKeys: ['users'] }),
|
|
426
|
+
{ wrapper }
|
|
427
|
+
);
|
|
428
|
+
|
|
429
|
+
result.current.mutate({ id: 1, name: 'Updated User' });
|
|
430
|
+
|
|
431
|
+
await waitFor(() => {
|
|
432
|
+
expect(result.current.isSuccess).toBe(true);
|
|
433
|
+
});
|
|
434
|
+
|
|
435
|
+
expect(invalidateQueriesSpy).toHaveBeenCalledWith({ queryKey: ['users'] });
|
|
436
|
+
});
|
|
437
|
+
});
|
|
438
|
+
|
|
439
|
+
describe('Error Handling', () => {
|
|
440
|
+
it('handles mutation errors', async () => {
|
|
441
|
+
const mockError = new Error('Mutation failed');
|
|
442
|
+
const mutationFn = jest.fn().mockRejectedValue(mockError);
|
|
443
|
+
const onError = jest.fn();
|
|
444
|
+
|
|
445
|
+
const { result } = renderHook(
|
|
446
|
+
() => useApiMutation(mutationFn, { onError }),
|
|
447
|
+
{ wrapper: createWrapper() }
|
|
448
|
+
);
|
|
449
|
+
|
|
450
|
+
result.current.mutate({ data: 'test' });
|
|
451
|
+
|
|
452
|
+
await waitFor(() => {
|
|
453
|
+
expect(result.current.isError).toBe(true);
|
|
454
|
+
});
|
|
455
|
+
|
|
456
|
+
expect(onError).toHaveBeenCalledWith(mockError);
|
|
457
|
+
expect(result.current.error).toEqual(mockError);
|
|
458
|
+
});
|
|
459
|
+
});
|
|
460
|
+
});
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
```bash
|
|
464
|
+
# Generate comprehensive unit tests with agent
|
|
465
|
+
npx claude-flow sparc run tester "Complete unit testing suite for components, hooks, and utilities"
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
## š Integration Testing
|
|
469
|
+
|
|
470
|
+
### 1. API Integration Tests
|
|
471
|
+
|
|
472
|
+
**tests/integration/api/auth.test.ts** (Agent-generated):
|
|
473
|
+
```typescript
|
|
474
|
+
import request from 'supertest';
|
|
475
|
+
import { app } from '../../../src/app';
|
|
476
|
+
import { User } from '../../../src/models/User.model';
|
|
477
|
+
import { connectTestDB, clearTestDB, closeTestDB } from '../../utils/test-db';
|
|
478
|
+
|
|
479
|
+
describe('Authentication API Integration', () => {
|
|
480
|
+
beforeAll(async () => {
|
|
481
|
+
await connectTestDB();
|
|
482
|
+
});
|
|
483
|
+
|
|
484
|
+
afterAll(async () => {
|
|
485
|
+
await closeTestDB();
|
|
486
|
+
});
|
|
487
|
+
|
|
488
|
+
afterEach(async () => {
|
|
489
|
+
await clearTestDB();
|
|
490
|
+
});
|
|
491
|
+
|
|
492
|
+
describe('POST /api/auth/register', () => {
|
|
493
|
+
const validUserData = {
|
|
494
|
+
name: 'John Doe',
|
|
495
|
+
email: 'john@example.com',
|
|
496
|
+
password: 'password123',
|
|
497
|
+
};
|
|
498
|
+
|
|
499
|
+
it('should register a new user successfully', async () => {
|
|
500
|
+
const response = await request(app)
|
|
501
|
+
.post('/api/auth/register')
|
|
502
|
+
.send(validUserData)
|
|
503
|
+
.expect(201);
|
|
504
|
+
|
|
505
|
+
expect(response.body).toMatchObject({
|
|
506
|
+
success: true,
|
|
507
|
+
data: {
|
|
508
|
+
user: {
|
|
509
|
+
name: validUserData.name,
|
|
510
|
+
email: validUserData.email,
|
|
511
|
+
role: 'user',
|
|
512
|
+
},
|
|
513
|
+
},
|
|
514
|
+
});
|
|
515
|
+
|
|
516
|
+
expect(response.body.token).toBeDefined();
|
|
517
|
+
expect(response.body.data.user.password).toBeUndefined();
|
|
518
|
+
|
|
519
|
+
// Verify user was created in database
|
|
520
|
+
const user = await User.findOne({ email: validUserData.email });
|
|
521
|
+
expect(user).toBeTruthy();
|
|
522
|
+
expect(user?.name).toBe(validUserData.name);
|
|
523
|
+
});
|
|
524
|
+
|
|
525
|
+
it('should hash the password before saving', async () => {
|
|
526
|
+
await request(app)
|
|
527
|
+
.post('/api/auth/register')
|
|
528
|
+
.send(validUserData)
|
|
529
|
+
.expect(201);
|
|
530
|
+
|
|
531
|
+
const user = await User.findOne({ email: validUserData.email }).select('+password');
|
|
532
|
+
expect(user?.password).not.toBe(validUserData.password);
|
|
533
|
+
expect(user?.password.length).toBeGreaterThan(50); // Hashed password length
|
|
534
|
+
});
|
|
535
|
+
|
|
536
|
+
it('should reject duplicate email addresses', async () => {
|
|
537
|
+
// Create first user
|
|
538
|
+
await request(app)
|
|
539
|
+
.post('/api/auth/register')
|
|
540
|
+
.send(validUserData)
|
|
541
|
+
.expect(201);
|
|
542
|
+
|
|
543
|
+
// Attempt to create second user with same email
|
|
544
|
+
const response = await request(app)
|
|
545
|
+
.post('/api/auth/register')
|
|
546
|
+
.send(validUserData)
|
|
547
|
+
.expect(400);
|
|
548
|
+
|
|
549
|
+
expect(response.body.success).toBe(false);
|
|
550
|
+
expect(response.body.message).toContain('already exists');
|
|
551
|
+
});
|
|
552
|
+
|
|
553
|
+
it('should validate required fields', async () => {
|
|
554
|
+
const testCases = [
|
|
555
|
+
{ field: 'name', data: { ...validUserData, name: '' } },
|
|
556
|
+
{ field: 'email', data: { ...validUserData, email: '' } },
|
|
557
|
+
{ field: 'password', data: { ...validUserData, password: '' } },
|
|
558
|
+
];
|
|
559
|
+
|
|
560
|
+
for (const testCase of testCases) {
|
|
561
|
+
const response = await request(app)
|
|
562
|
+
.post('/api/auth/register')
|
|
563
|
+
.send(testCase.data)
|
|
564
|
+
.expect(400);
|
|
565
|
+
|
|
566
|
+
expect(response.body.success).toBe(false);
|
|
567
|
+
}
|
|
568
|
+
});
|
|
569
|
+
|
|
570
|
+
it('should validate email format', async () => {
|
|
571
|
+
const invalidEmails = ['invalid', 'invalid@', '@invalid.com', 'invalid.com'];
|
|
572
|
+
|
|
573
|
+
for (const email of invalidEmails) {
|
|
574
|
+
const response = await request(app)
|
|
575
|
+
.post('/api/auth/register')
|
|
576
|
+
.send({ ...validUserData, email })
|
|
577
|
+
.expect(400);
|
|
578
|
+
|
|
579
|
+
expect(response.body.success).toBe(false);
|
|
580
|
+
}
|
|
581
|
+
});
|
|
582
|
+
|
|
583
|
+
it('should validate password strength', async () => {
|
|
584
|
+
const weakPasswords = ['123', 'pass', '12345'];
|
|
585
|
+
|
|
586
|
+
for (const password of weakPasswords) {
|
|
587
|
+
const response = await request(app)
|
|
588
|
+
.post('/api/auth/register')
|
|
589
|
+
.send({ ...validUserData, password })
|
|
590
|
+
.expect(400);
|
|
591
|
+
|
|
592
|
+
expect(response.body.success).toBe(false);
|
|
593
|
+
}
|
|
594
|
+
});
|
|
595
|
+
});
|
|
596
|
+
|
|
597
|
+
describe('POST /api/auth/login', () => {
|
|
598
|
+
const userData = {
|
|
599
|
+
name: 'John Doe',
|
|
600
|
+
email: 'john@example.com',
|
|
601
|
+
password: 'password123',
|
|
602
|
+
};
|
|
603
|
+
|
|
604
|
+
beforeEach(async () => {
|
|
605
|
+
// Register user for login tests
|
|
606
|
+
await request(app)
|
|
607
|
+
.post('/api/auth/register')
|
|
608
|
+
.send(userData)
|
|
609
|
+
.expect(201);
|
|
610
|
+
});
|
|
611
|
+
|
|
612
|
+
it('should login with valid credentials', async () => {
|
|
613
|
+
const response = await request(app)
|
|
614
|
+
.post('/api/auth/login')
|
|
615
|
+
.send({
|
|
616
|
+
email: userData.email,
|
|
617
|
+
password: userData.password,
|
|
618
|
+
})
|
|
619
|
+
.expect(200);
|
|
620
|
+
|
|
621
|
+
expect(response.body).toMatchObject({
|
|
622
|
+
success: true,
|
|
623
|
+
data: {
|
|
624
|
+
user: {
|
|
625
|
+
name: userData.name,
|
|
626
|
+
email: userData.email,
|
|
627
|
+
},
|
|
628
|
+
},
|
|
629
|
+
});
|
|
630
|
+
|
|
631
|
+
expect(response.body.token).toBeDefined();
|
|
632
|
+
expect(response.body.data.user.password).toBeUndefined();
|
|
633
|
+
});
|
|
634
|
+
|
|
635
|
+
it('should reject invalid email', async () => {
|
|
636
|
+
const response = await request(app)
|
|
637
|
+
.post('/api/auth/login')
|
|
638
|
+
.send({
|
|
639
|
+
email: 'wrong@example.com',
|
|
640
|
+
password: userData.password,
|
|
641
|
+
})
|
|
642
|
+
.expect(401);
|
|
643
|
+
|
|
644
|
+
expect(response.body.success).toBe(false);
|
|
645
|
+
expect(response.body.message).toContain('Invalid credentials');
|
|
646
|
+
});
|
|
647
|
+
|
|
648
|
+
it('should reject invalid password', async () => {
|
|
649
|
+
const response = await request(app)
|
|
650
|
+
.post('/api/auth/login')
|
|
651
|
+
.send({
|
|
652
|
+
email: userData.email,
|
|
653
|
+
password: 'wrongpassword',
|
|
654
|
+
})
|
|
655
|
+
.expect(401);
|
|
656
|
+
|
|
657
|
+
expect(response.body.success).toBe(false);
|
|
658
|
+
expect(response.body.message).toContain('Invalid credentials');
|
|
659
|
+
});
|
|
660
|
+
|
|
661
|
+
it('should require email and password', async () => {
|
|
662
|
+
const testCases = [
|
|
663
|
+
{ email: '', password: userData.password },
|
|
664
|
+
{ email: userData.email, password: '' },
|
|
665
|
+
{ email: '', password: '' },
|
|
666
|
+
];
|
|
667
|
+
|
|
668
|
+
for (const testCase of testCases) {
|
|
669
|
+
const response = await request(app)
|
|
670
|
+
.post('/api/auth/login')
|
|
671
|
+
.send(testCase)
|
|
672
|
+
.expect(400);
|
|
673
|
+
|
|
674
|
+
expect(response.body.success).toBe(false);
|
|
675
|
+
}
|
|
676
|
+
});
|
|
677
|
+
|
|
678
|
+
it('should handle case-insensitive email login', async () => {
|
|
679
|
+
const response = await request(app)
|
|
680
|
+
.post('/api/auth/login')
|
|
681
|
+
.send({
|
|
682
|
+
email: userData.email.toUpperCase(),
|
|
683
|
+
password: userData.password,
|
|
684
|
+
})
|
|
685
|
+
.expect(200);
|
|
686
|
+
|
|
687
|
+
expect(response.body.success).toBe(true);
|
|
688
|
+
});
|
|
689
|
+
});
|
|
690
|
+
|
|
691
|
+
describe('GET /api/auth/me', () => {
|
|
692
|
+
let authToken: string;
|
|
693
|
+
const userData = {
|
|
694
|
+
name: 'John Doe',
|
|
695
|
+
email: 'john@example.com',
|
|
696
|
+
password: 'password123',
|
|
697
|
+
};
|
|
698
|
+
|
|
699
|
+
beforeEach(async () => {
|
|
700
|
+
const response = await request(app)
|
|
701
|
+
.post('/api/auth/register')
|
|
702
|
+
.send(userData)
|
|
703
|
+
.expect(201);
|
|
704
|
+
|
|
705
|
+
authToken = response.body.token;
|
|
706
|
+
});
|
|
707
|
+
|
|
708
|
+
it('should return user profile with valid token', async () => {
|
|
709
|
+
const response = await request(app)
|
|
710
|
+
.get('/api/auth/me')
|
|
711
|
+
.set('Authorization', `Bearer ${authToken}`)
|
|
712
|
+
.expect(200);
|
|
713
|
+
|
|
714
|
+
expect(response.body).toMatchObject({
|
|
715
|
+
success: true,
|
|
716
|
+
data: {
|
|
717
|
+
user: {
|
|
718
|
+
name: userData.name,
|
|
719
|
+
email: userData.email,
|
|
720
|
+
},
|
|
721
|
+
},
|
|
722
|
+
});
|
|
723
|
+
|
|
724
|
+
expect(response.body.data.user.password).toBeUndefined();
|
|
725
|
+
});
|
|
726
|
+
|
|
727
|
+
it('should reject requests without token', async () => {
|
|
728
|
+
const response = await request(app)
|
|
729
|
+
.get('/api/auth/me')
|
|
730
|
+
.expect(401);
|
|
731
|
+
|
|
732
|
+
expect(response.body.success).toBe(false);
|
|
733
|
+
expect(response.body.message).toContain('token');
|
|
734
|
+
});
|
|
735
|
+
|
|
736
|
+
it('should reject requests with invalid token', async () => {
|
|
737
|
+
const response = await request(app)
|
|
738
|
+
.get('/api/auth/me')
|
|
739
|
+
.set('Authorization', 'Bearer invalid-token')
|
|
740
|
+
.expect(401);
|
|
741
|
+
|
|
742
|
+
expect(response.body.success).toBe(false);
|
|
743
|
+
});
|
|
744
|
+
|
|
745
|
+
it('should reject requests with malformed authorization header', async () => {
|
|
746
|
+
const testCases = [
|
|
747
|
+
'invalid-header',
|
|
748
|
+
'Bearer',
|
|
749
|
+
'Token ' + authToken,
|
|
750
|
+
authToken,
|
|
751
|
+
];
|
|
752
|
+
|
|
753
|
+
for (const header of testCases) {
|
|
754
|
+
const response = await request(app)
|
|
755
|
+
.get('/api/auth/me')
|
|
756
|
+
.set('Authorization', header)
|
|
757
|
+
.expect(401);
|
|
758
|
+
|
|
759
|
+
expect(response.body.success).toBe(false);
|
|
760
|
+
}
|
|
761
|
+
});
|
|
762
|
+
});
|
|
763
|
+
|
|
764
|
+
describe('Rate Limiting', () => {
|
|
765
|
+
it('should apply rate limiting to registration endpoint', async () => {
|
|
766
|
+
const requests = Array(6).fill(null).map((_, i) =>
|
|
767
|
+
request(app)
|
|
768
|
+
.post('/api/auth/register')
|
|
769
|
+
.send({
|
|
770
|
+
name: `User ${i}`,
|
|
771
|
+
email: `user${i}@example.com`,
|
|
772
|
+
password: 'password123',
|
|
773
|
+
})
|
|
774
|
+
);
|
|
775
|
+
|
|
776
|
+
const responses = await Promise.all(requests);
|
|
777
|
+
|
|
778
|
+
// First 5 should succeed, 6th should be rate limited
|
|
779
|
+
expect(responses.slice(0, 5).every(res => res.status === 201)).toBe(true);
|
|
780
|
+
expect(responses[5].status).toBe(429);
|
|
781
|
+
});
|
|
782
|
+
});
|
|
783
|
+
});
|
|
784
|
+
```
|
|
785
|
+
|
|
786
|
+
### 2. Database Integration Tests
|
|
787
|
+
|
|
788
|
+
**tests/integration/database/user.test.ts** (Agent-generated):
|
|
789
|
+
```typescript
|
|
790
|
+
import { User, IUser } from '../../../src/models/User.model';
|
|
791
|
+
import { connectTestDB, clearTestDB, closeTestDB } from '../../utils/test-db';
|
|
792
|
+
|
|
793
|
+
describe('User Model Integration', () => {
|
|
794
|
+
beforeAll(async () => {
|
|
795
|
+
await connectTestDB();
|
|
796
|
+
});
|
|
797
|
+
|
|
798
|
+
afterAll(async () => {
|
|
799
|
+
await closeTestDB();
|
|
800
|
+
});
|
|
801
|
+
|
|
802
|
+
afterEach(async () => {
|
|
803
|
+
await clearTestDB();
|
|
804
|
+
});
|
|
805
|
+
|
|
806
|
+
describe('User Creation', () => {
|
|
807
|
+
it('should create a user with valid data', async () => {
|
|
808
|
+
const userData = {
|
|
809
|
+
name: 'John Doe',
|
|
810
|
+
email: 'john@example.com',
|
|
811
|
+
password: 'hashedpassword',
|
|
812
|
+
};
|
|
813
|
+
|
|
814
|
+
const user = new User(userData);
|
|
815
|
+
const savedUser = await user.save();
|
|
816
|
+
|
|
817
|
+
expect(savedUser._id).toBeDefined();
|
|
818
|
+
expect(savedUser.name).toBe(userData.name);
|
|
819
|
+
expect(savedUser.email).toBe(userData.email);
|
|
820
|
+
expect(savedUser.role).toBe('user'); // Default role
|
|
821
|
+
expect(savedUser.isActive).toBe(true); // Default active
|
|
822
|
+
expect(savedUser.createdAt).toBeDefined();
|
|
823
|
+
expect(savedUser.updatedAt).toBeDefined();
|
|
824
|
+
});
|
|
825
|
+
|
|
826
|
+
it('should enforce unique email constraint', async () => {
|
|
827
|
+
const userData = {
|
|
828
|
+
name: 'John Doe',
|
|
829
|
+
email: 'john@example.com',
|
|
830
|
+
password: 'hashedpassword',
|
|
831
|
+
};
|
|
832
|
+
|
|
833
|
+
await User.create(userData);
|
|
834
|
+
|
|
835
|
+
// Attempt to create user with same email
|
|
836
|
+
await expect(User.create(userData)).rejects.toThrow();
|
|
837
|
+
});
|
|
838
|
+
|
|
839
|
+
it('should validate required fields', async () => {
|
|
840
|
+
const testCases = [
|
|
841
|
+
{ name: '', email: 'test@example.com', password: 'password' },
|
|
842
|
+
{ name: 'Test', email: '', password: 'password' },
|
|
843
|
+
{ name: 'Test', email: 'test@example.com', password: '' },
|
|
844
|
+
];
|
|
845
|
+
|
|
846
|
+
for (const userData of testCases) {
|
|
847
|
+
await expect(User.create(userData)).rejects.toThrow();
|
|
848
|
+
}
|
|
849
|
+
});
|
|
850
|
+
|
|
851
|
+
it('should validate email format', async () => {
|
|
852
|
+
const invalidEmails = ['invalid', 'invalid@', '@invalid.com'];
|
|
853
|
+
|
|
854
|
+
for (const email of invalidEmails) {
|
|
855
|
+
const userData = {
|
|
856
|
+
name: 'Test User',
|
|
857
|
+
email,
|
|
858
|
+
password: 'password123',
|
|
859
|
+
};
|
|
860
|
+
|
|
861
|
+
await expect(User.create(userData)).rejects.toThrow();
|
|
862
|
+
}
|
|
863
|
+
});
|
|
864
|
+
|
|
865
|
+
it('should convert email to lowercase', async () => {
|
|
866
|
+
const userData = {
|
|
867
|
+
name: 'John Doe',
|
|
868
|
+
email: 'JOHN@EXAMPLE.COM',
|
|
869
|
+
password: 'hashedpassword',
|
|
870
|
+
};
|
|
871
|
+
|
|
872
|
+
const user = await User.create(userData);
|
|
873
|
+
expect(user.email).toBe('john@example.com');
|
|
874
|
+
});
|
|
875
|
+
});
|
|
876
|
+
|
|
877
|
+
describe('User Queries', () => {
|
|
878
|
+
beforeEach(async () => {
|
|
879
|
+
const users = [
|
|
880
|
+
{
|
|
881
|
+
name: 'John Doe',
|
|
882
|
+
email: 'john@example.com',
|
|
883
|
+
password: 'hashedpassword',
|
|
884
|
+
role: 'user',
|
|
885
|
+
isActive: true,
|
|
886
|
+
},
|
|
887
|
+
{
|
|
888
|
+
name: 'Jane Smith',
|
|
889
|
+
email: 'jane@example.com',
|
|
890
|
+
password: 'hashedpassword',
|
|
891
|
+
role: 'admin',
|
|
892
|
+
isActive: true,
|
|
893
|
+
},
|
|
894
|
+
{
|
|
895
|
+
name: 'Bob Johnson',
|
|
896
|
+
email: 'bob@example.com',
|
|
897
|
+
password: 'hashedpassword',
|
|
898
|
+
role: 'user',
|
|
899
|
+
isActive: false,
|
|
900
|
+
},
|
|
901
|
+
];
|
|
902
|
+
|
|
903
|
+
await User.create(users);
|
|
904
|
+
});
|
|
905
|
+
|
|
906
|
+
it('should find users by email', async () => {
|
|
907
|
+
const user = await User.findOne({ email: 'john@example.com' });
|
|
908
|
+
expect(user).toBeTruthy();
|
|
909
|
+
expect(user?.name).toBe('John Doe');
|
|
910
|
+
});
|
|
911
|
+
|
|
912
|
+
it('should find users by role', async () => {
|
|
913
|
+
const adminUsers = await User.find({ role: 'admin' });
|
|
914
|
+
expect(adminUsers).toHaveLength(1);
|
|
915
|
+
expect(adminUsers[0].name).toBe('Jane Smith');
|
|
916
|
+
});
|
|
917
|
+
|
|
918
|
+
it('should find active users', async () => {
|
|
919
|
+
const activeUsers = await User.find({ isActive: true });
|
|
920
|
+
expect(activeUsers).toHaveLength(2);
|
|
921
|
+
});
|
|
922
|
+
|
|
923
|
+
it('should exclude password by default', async () => {
|
|
924
|
+
const user = await User.findOne({ email: 'john@example.com' });
|
|
925
|
+
expect(user?.password).toBeUndefined();
|
|
926
|
+
});
|
|
927
|
+
|
|
928
|
+
it('should include password when explicitly selected', async () => {
|
|
929
|
+
const user = await User.findOne({ email: 'john@example.com' }).select('+password');
|
|
930
|
+
expect(user?.password).toBeDefined();
|
|
931
|
+
});
|
|
932
|
+
});
|
|
933
|
+
|
|
934
|
+
describe('User Updates', () => {
|
|
935
|
+
let userId: string;
|
|
936
|
+
|
|
937
|
+
beforeEach(async () => {
|
|
938
|
+
const user = await User.create({
|
|
939
|
+
name: 'John Doe',
|
|
940
|
+
email: 'john@example.com',
|
|
941
|
+
password: 'hashedpassword',
|
|
942
|
+
});
|
|
943
|
+
userId = user._id.toString();
|
|
944
|
+
});
|
|
945
|
+
|
|
946
|
+
it('should update user fields', async () => {
|
|
947
|
+
const updateData = { name: 'John Smith' };
|
|
948
|
+
const updatedUser = await User.findByIdAndUpdate(
|
|
949
|
+
userId,
|
|
950
|
+
updateData,
|
|
951
|
+
{ new: true }
|
|
952
|
+
);
|
|
953
|
+
|
|
954
|
+
expect(updatedUser?.name).toBe('John Smith');
|
|
955
|
+
expect(updatedUser?.email).toBe('john@example.com'); // Unchanged
|
|
956
|
+
});
|
|
957
|
+
|
|
958
|
+
it('should update timestamps on modification', async () => {
|
|
959
|
+
const originalUser = await User.findById(userId);
|
|
960
|
+
const originalUpdatedAt = originalUser?.updatedAt;
|
|
961
|
+
|
|
962
|
+
// Wait a moment to ensure timestamp difference
|
|
963
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
964
|
+
|
|
965
|
+
await User.findByIdAndUpdate(userId, { name: 'Updated Name' });
|
|
966
|
+
const updatedUser = await User.findById(userId);
|
|
967
|
+
|
|
968
|
+
expect(updatedUser?.updatedAt.getTime()).toBeGreaterThan(
|
|
969
|
+
originalUpdatedAt?.getTime() || 0
|
|
970
|
+
);
|
|
971
|
+
});
|
|
972
|
+
|
|
973
|
+
it('should validate updates', async () => {
|
|
974
|
+
await expect(
|
|
975
|
+
User.findByIdAndUpdate(
|
|
976
|
+
userId,
|
|
977
|
+
{ email: 'invalid-email' },
|
|
978
|
+
{ runValidators: true }
|
|
979
|
+
)
|
|
980
|
+
).rejects.toThrow();
|
|
981
|
+
});
|
|
982
|
+
});
|
|
983
|
+
|
|
984
|
+
describe('User Indexes', () => {
|
|
985
|
+
it('should have index on email field', async () => {
|
|
986
|
+
const indexes = await User.collection.getIndexes();
|
|
987
|
+
const emailIndex = Object.keys(indexes).find(key =>
|
|
988
|
+
key.includes('email')
|
|
989
|
+
);
|
|
990
|
+
expect(emailIndex).toBeDefined();
|
|
991
|
+
});
|
|
992
|
+
|
|
993
|
+
it('should have index on isActive field', async () => {
|
|
994
|
+
const indexes = await User.collection.getIndexes();
|
|
995
|
+
const isActiveIndex = Object.keys(indexes).find(key =>
|
|
996
|
+
key.includes('isActive')
|
|
997
|
+
);
|
|
998
|
+
expect(isActiveIndex).toBeDefined();
|
|
999
|
+
});
|
|
1000
|
+
});
|
|
1001
|
+
});
|
|
1002
|
+
```
|
|
1003
|
+
|
|
1004
|
+
```bash
|
|
1005
|
+
# Generate integration tests with agent
|
|
1006
|
+
npx claude-flow sparc run tester "Comprehensive integration testing for API endpoints and database operations"
|
|
1007
|
+
```
|
|
1008
|
+
|
|
1009
|
+
## š End-to-End Testing
|
|
1010
|
+
|
|
1011
|
+
### 1. E2E Test Setup with Playwright
|
|
1012
|
+
|
|
1013
|
+
**tests/e2e/setup/global-setup.ts** (Agent-generated):
|
|
1014
|
+
```typescript
|
|
1015
|
+
import { chromium, FullConfig } from '@playwright/test';
|
|
1016
|
+
import { connectTestDB, seedTestDB } from '../utils/test-db';
|
|
1017
|
+
|
|
1018
|
+
async function globalSetup(config: FullConfig) {
|
|
1019
|
+
// Setup test database
|
|
1020
|
+
await connectTestDB();
|
|
1021
|
+
await seedTestDB();
|
|
1022
|
+
|
|
1023
|
+
// Create browser instance for authentication
|
|
1024
|
+
const browser = await chromium.launch();
|
|
1025
|
+
const context = await browser.newContext();
|
|
1026
|
+
const page = await context.newPage();
|
|
1027
|
+
|
|
1028
|
+
// Login as admin and save auth state
|
|
1029
|
+
await page.goto('http://localhost:3000/login');
|
|
1030
|
+
await page.fill('[data-testid="email"]', 'admin@example.com');
|
|
1031
|
+
await page.fill('[data-testid="password"]', 'admin123');
|
|
1032
|
+
await page.click('[data-testid="login-button"]');
|
|
1033
|
+
await page.waitForURL('**/dashboard');
|
|
1034
|
+
|
|
1035
|
+
// Save admin auth state
|
|
1036
|
+
await context.storageState({ path: 'tests/e2e/auth/admin-auth.json' });
|
|
1037
|
+
|
|
1038
|
+
// Login as regular user and save auth state
|
|
1039
|
+
await page.goto('http://localhost:3000/logout');
|
|
1040
|
+
await page.goto('http://localhost:3000/login');
|
|
1041
|
+
await page.fill('[data-testid="email"]', 'user@example.com');
|
|
1042
|
+
await page.fill('[data-testid="password"]', 'user123');
|
|
1043
|
+
await page.click('[data-testid="login-button"]');
|
|
1044
|
+
await page.waitForURL('**/dashboard');
|
|
1045
|
+
|
|
1046
|
+
// Save user auth state
|
|
1047
|
+
await context.storageState({ path: 'tests/e2e/auth/user-auth.json' });
|
|
1048
|
+
|
|
1049
|
+
await browser.close();
|
|
1050
|
+
}
|
|
1051
|
+
|
|
1052
|
+
export default globalSetup;
|
|
1053
|
+
```
|
|
1054
|
+
|
|
1055
|
+
### 2. User Journey Tests
|
|
1056
|
+
|
|
1057
|
+
**tests/e2e/user-flows/authentication.spec.ts** (Agent-generated):
|
|
1058
|
+
```typescript
|
|
1059
|
+
import { test, expect } from '@playwright/test';
|
|
1060
|
+
|
|
1061
|
+
test.describe('Authentication Flow', () => {
|
|
1062
|
+
test.beforeEach(async ({ page }) => {
|
|
1063
|
+
await page.goto('/');
|
|
1064
|
+
});
|
|
1065
|
+
|
|
1066
|
+
test('should allow user to register and login', async ({ page }) => {
|
|
1067
|
+
const timestamp = Date.now();
|
|
1068
|
+
const email = `test${timestamp}@example.com`;
|
|
1069
|
+
const password = 'testpassword123';
|
|
1070
|
+
const name = 'Test User';
|
|
1071
|
+
|
|
1072
|
+
// Navigate to registration
|
|
1073
|
+
await page.click('[data-testid="register-link"]');
|
|
1074
|
+
await expect(page).toHaveURL('/register');
|
|
1075
|
+
|
|
1076
|
+
// Fill registration form
|
|
1077
|
+
await page.fill('[data-testid="name"]', name);
|
|
1078
|
+
await page.fill('[data-testid="email"]', email);
|
|
1079
|
+
await page.fill('[data-testid="password"]', password);
|
|
1080
|
+
await page.fill('[data-testid="confirm-password"]', password);
|
|
1081
|
+
|
|
1082
|
+
// Submit registration
|
|
1083
|
+
await page.click('[data-testid="register-button"]');
|
|
1084
|
+
|
|
1085
|
+
// Should redirect to dashboard after successful registration
|
|
1086
|
+
await expect(page).toHaveURL('/dashboard');
|
|
1087
|
+
await expect(page.locator('[data-testid="user-name"]')).toContainText(name);
|
|
1088
|
+
|
|
1089
|
+
// Logout
|
|
1090
|
+
await page.click('[data-testid="user-menu"]');
|
|
1091
|
+
await page.click('[data-testid="logout-button"]');
|
|
1092
|
+
await expect(page).toHaveURL('/');
|
|
1093
|
+
|
|
1094
|
+
// Login with the same credentials
|
|
1095
|
+
await page.click('[data-testid="login-link"]');
|
|
1096
|
+
await page.fill('[data-testid="email"]', email);
|
|
1097
|
+
await page.fill('[data-testid="password"]', password);
|
|
1098
|
+
await page.click('[data-testid="login-button"]');
|
|
1099
|
+
|
|
1100
|
+
// Should be redirected to dashboard
|
|
1101
|
+
await expect(page).toHaveURL('/dashboard');
|
|
1102
|
+
await expect(page.locator('[data-testid="user-name"]')).toContainText(name);
|
|
1103
|
+
});
|
|
1104
|
+
|
|
1105
|
+
test('should show validation errors for invalid registration', async ({ page }) => {
|
|
1106
|
+
await page.click('[data-testid="register-link"]');
|
|
1107
|
+
|
|
1108
|
+
// Submit empty form
|
|
1109
|
+
await page.click('[data-testid="register-button"]');
|
|
1110
|
+
|
|
1111
|
+
// Check for validation errors
|
|
1112
|
+
await expect(page.locator('[data-testid="name-error"]')).toBeVisible();
|
|
1113
|
+
await expect(page.locator('[data-testid="email-error"]')).toBeVisible();
|
|
1114
|
+
await expect(page.locator('[data-testid="password-error"]')).toBeVisible();
|
|
1115
|
+
|
|
1116
|
+
// Test invalid email format
|
|
1117
|
+
await page.fill('[data-testid="email"]', 'invalid-email');
|
|
1118
|
+
await page.blur('[data-testid="email"]');
|
|
1119
|
+
await expect(page.locator('[data-testid="email-error"]')).toContainText('valid email');
|
|
1120
|
+
|
|
1121
|
+
// Test password mismatch
|
|
1122
|
+
await page.fill('[data-testid="password"]', 'password123');
|
|
1123
|
+
await page.fill('[data-testid="confirm-password"]', 'different');
|
|
1124
|
+
await page.blur('[data-testid="confirm-password"]');
|
|
1125
|
+
await expect(page.locator('[data-testid="confirm-password-error"]')).toContainText('match');
|
|
1126
|
+
});
|
|
1127
|
+
|
|
1128
|
+
test('should show error for invalid login credentials', async ({ page }) => {
|
|
1129
|
+
await page.click('[data-testid="login-link"]');
|
|
1130
|
+
|
|
1131
|
+
// Try to login with invalid credentials
|
|
1132
|
+
await page.fill('[data-testid="email"]', 'invalid@example.com');
|
|
1133
|
+
await page.fill('[data-testid="password"]', 'wrongpassword');
|
|
1134
|
+
await page.click('[data-testid="login-button"]');
|
|
1135
|
+
|
|
1136
|
+
// Should show error message
|
|
1137
|
+
await expect(page.locator('[data-testid="error-message"]')).toContainText('Invalid credentials');
|
|
1138
|
+
await expect(page).toHaveURL('/login');
|
|
1139
|
+
});
|
|
1140
|
+
|
|
1141
|
+
test('should handle forgot password flow', async ({ page }) => {
|
|
1142
|
+
await page.click('[data-testid="login-link"]');
|
|
1143
|
+
await page.click('[data-testid="forgot-password-link"]');
|
|
1144
|
+
await expect(page).toHaveURL('/forgot-password');
|
|
1145
|
+
|
|
1146
|
+
// Fill email for password reset
|
|
1147
|
+
await page.fill('[data-testid="email"]', 'user@example.com');
|
|
1148
|
+
await page.click('[data-testid="reset-button"]');
|
|
1149
|
+
|
|
1150
|
+
// Should show success message
|
|
1151
|
+
await expect(page.locator('[data-testid="success-message"]')).toContainText('reset link sent');
|
|
1152
|
+
});
|
|
1153
|
+
|
|
1154
|
+
test('should persist authentication across page refreshes', async ({ page }) => {
|
|
1155
|
+
// Login
|
|
1156
|
+
await page.click('[data-testid="login-link"]');
|
|
1157
|
+
await page.fill('[data-testid="email"]', 'user@example.com');
|
|
1158
|
+
await page.fill('[data-testid="password"]', 'user123');
|
|
1159
|
+
await page.click('[data-testid="login-button"]');
|
|
1160
|
+
await expect(page).toHaveURL('/dashboard');
|
|
1161
|
+
|
|
1162
|
+
// Refresh page
|
|
1163
|
+
await page.reload();
|
|
1164
|
+
|
|
1165
|
+
// Should still be authenticated
|
|
1166
|
+
await expect(page).toHaveURL('/dashboard');
|
|
1167
|
+
await expect(page.locator('[data-testid="user-name"]')).toBeVisible();
|
|
1168
|
+
});
|
|
1169
|
+
});
|
|
1170
|
+
```
|
|
1171
|
+
|
|
1172
|
+
### 3. E2E Product Management Tests
|
|
1173
|
+
|
|
1174
|
+
**tests/e2e/admin-flows/product-management.spec.ts** (Agent-generated):
|
|
1175
|
+
```typescript
|
|
1176
|
+
import { test, expect } from '@playwright/test';
|
|
1177
|
+
|
|
1178
|
+
test.describe('Product Management', () => {
|
|
1179
|
+
test.use({ storageState: 'tests/e2e/auth/admin-auth.json' });
|
|
1180
|
+
|
|
1181
|
+
test('should create, edit, and delete products', async ({ page }) => {
|
|
1182
|
+
await page.goto('/admin/products');
|
|
1183
|
+
|
|
1184
|
+
// Create new product
|
|
1185
|
+
await page.click('[data-testid="add-product-button"]');
|
|
1186
|
+
await expect(page).toHaveURL('/admin/products/new');
|
|
1187
|
+
|
|
1188
|
+
const productName = `Test Product ${Date.now()}`;
|
|
1189
|
+
await page.fill('[data-testid="product-name"]', productName);
|
|
1190
|
+
await page.fill('[data-testid="product-description"]', 'Test product description');
|
|
1191
|
+
await page.fill('[data-testid="product-price"]', '29.99');
|
|
1192
|
+
await page.selectOption('[data-testid="product-category"]', 'electronics');
|
|
1193
|
+
await page.check('[data-testid="product-in-stock"]');
|
|
1194
|
+
|
|
1195
|
+
// Upload product image
|
|
1196
|
+
await page.setInputFiles(
|
|
1197
|
+
'[data-testid="product-image"]',
|
|
1198
|
+
'tests/e2e/fixtures/test-image.jpg'
|
|
1199
|
+
);
|
|
1200
|
+
|
|
1201
|
+
// Save product
|
|
1202
|
+
await page.click('[data-testid="save-product-button"]');
|
|
1203
|
+
await expect(page).toHaveURL('/admin/products');
|
|
1204
|
+
|
|
1205
|
+
// Verify product appears in list
|
|
1206
|
+
await expect(page.locator('[data-testid="product-list"]')).toContainText(productName);
|
|
1207
|
+
|
|
1208
|
+
// Edit product
|
|
1209
|
+
await page.click(`[data-testid="edit-product-${productName}"]`);
|
|
1210
|
+
const updatedName = `${productName} Updated`;
|
|
1211
|
+
await page.fill('[data-testid="product-name"]', updatedName);
|
|
1212
|
+
await page.click('[data-testid="save-product-button"]');
|
|
1213
|
+
|
|
1214
|
+
// Verify updated name appears
|
|
1215
|
+
await expect(page.locator('[data-testid="product-list"]')).toContainText(updatedName);
|
|
1216
|
+
|
|
1217
|
+
// Delete product
|
|
1218
|
+
await page.click(`[data-testid="delete-product-${updatedName}"]`);
|
|
1219
|
+
await page.click('[data-testid="confirm-delete"]');
|
|
1220
|
+
|
|
1221
|
+
// Verify product is removed
|
|
1222
|
+
await expect(page.locator('[data-testid="product-list"]')).not.toContainText(updatedName);
|
|
1223
|
+
});
|
|
1224
|
+
|
|
1225
|
+
test('should search and filter products', async ({ page }) => {
|
|
1226
|
+
await page.goto('/admin/products');
|
|
1227
|
+
|
|
1228
|
+
// Search for products
|
|
1229
|
+
await page.fill('[data-testid="search-input"]', 'iPhone');
|
|
1230
|
+
await page.press('[data-testid="search-input"]', 'Enter');
|
|
1231
|
+
|
|
1232
|
+
// Verify search results
|
|
1233
|
+
const productItems = page.locator('[data-testid="product-item"]');
|
|
1234
|
+
await expect(productItems).toHaveCountGreaterThan(0);
|
|
1235
|
+
|
|
1236
|
+
// Filter by category
|
|
1237
|
+
await page.selectOption('[data-testid="category-filter"]', 'electronics');
|
|
1238
|
+
await expect(productItems).toHaveCountGreaterThan(0);
|
|
1239
|
+
|
|
1240
|
+
// Filter by stock status
|
|
1241
|
+
await page.selectOption('[data-testid="stock-filter"]', 'in-stock');
|
|
1242
|
+
await expect(productItems).toHaveCountGreaterThan(0);
|
|
1243
|
+
|
|
1244
|
+
// Clear filters
|
|
1245
|
+
await page.click('[data-testid="clear-filters"]');
|
|
1246
|
+
await expect(productItems).toHaveCountGreaterThan(0);
|
|
1247
|
+
});
|
|
1248
|
+
|
|
1249
|
+
test('should bulk manage products', async ({ page }) => {
|
|
1250
|
+
await page.goto('/admin/products');
|
|
1251
|
+
|
|
1252
|
+
// Select multiple products
|
|
1253
|
+
await page.check('[data-testid="select-all-products"]');
|
|
1254
|
+
|
|
1255
|
+
// Verify bulk actions are enabled
|
|
1256
|
+
await expect(page.locator('[data-testid="bulk-actions"]')).toBeVisible();
|
|
1257
|
+
|
|
1258
|
+
// Bulk update status
|
|
1259
|
+
await page.selectOption('[data-testid="bulk-action-select"]', 'update-stock');
|
|
1260
|
+
await page.click('[data-testid="execute-bulk-action"]');
|
|
1261
|
+
|
|
1262
|
+
// Fill bulk update form
|
|
1263
|
+
await page.check('[data-testid="bulk-in-stock"]');
|
|
1264
|
+
await page.click('[data-testid="confirm-bulk-update"]');
|
|
1265
|
+
|
|
1266
|
+
// Verify success message
|
|
1267
|
+
await expect(page.locator('[data-testid="success-message"]')).toContainText('updated successfully');
|
|
1268
|
+
});
|
|
1269
|
+
|
|
1270
|
+
test('should handle product image upload and preview', async ({ page }) => {
|
|
1271
|
+
await page.goto('/admin/products/new');
|
|
1272
|
+
|
|
1273
|
+
// Upload image
|
|
1274
|
+
await page.setInputFiles(
|
|
1275
|
+
'[data-testid="product-image"]',
|
|
1276
|
+
'tests/e2e/fixtures/test-image.jpg'
|
|
1277
|
+
);
|
|
1278
|
+
|
|
1279
|
+
// Verify image preview appears
|
|
1280
|
+
await expect(page.locator('[data-testid="image-preview"]')).toBeVisible();
|
|
1281
|
+
|
|
1282
|
+
// Remove image
|
|
1283
|
+
await page.click('[data-testid="remove-image"]');
|
|
1284
|
+
await expect(page.locator('[data-testid="image-preview"]')).not.toBeVisible();
|
|
1285
|
+
});
|
|
1286
|
+
|
|
1287
|
+
test('should validate product form inputs', async ({ page }) => {
|
|
1288
|
+
await page.goto('/admin/products/new');
|
|
1289
|
+
|
|
1290
|
+
// Submit empty form
|
|
1291
|
+
await page.click('[data-testid="save-product-button"]');
|
|
1292
|
+
|
|
1293
|
+
// Check validation errors
|
|
1294
|
+
await expect(page.locator('[data-testid="name-error"]')).toContainText('required');
|
|
1295
|
+
await expect(page.locator('[data-testid="price-error"]')).toContainText('required');
|
|
1296
|
+
await expect(page.locator('[data-testid="category-error"]')).toContainText('required');
|
|
1297
|
+
|
|
1298
|
+
// Test invalid price
|
|
1299
|
+
await page.fill('[data-testid="product-price"]', 'invalid');
|
|
1300
|
+
await page.blur('[data-testid="product-price"]');
|
|
1301
|
+
await expect(page.locator('[data-testid="price-error"]')).toContainText('valid number');
|
|
1302
|
+
|
|
1303
|
+
// Test negative price
|
|
1304
|
+
await page.fill('[data-testid="product-price"]', '-10');
|
|
1305
|
+
await page.blur('[data-testid="product-price"]');
|
|
1306
|
+
await expect(page.locator('[data-testid="price-error"]')).toContainText('positive');
|
|
1307
|
+
});
|
|
1308
|
+
});
|
|
1309
|
+
```
|
|
1310
|
+
|
|
1311
|
+
```bash
|
|
1312
|
+
# Generate E2E tests with agent
|
|
1313
|
+
npx claude-flow sparc run tester "Comprehensive end-to-end testing with Playwright for user journeys and admin workflows"
|
|
1314
|
+
```
|
|
1315
|
+
|
|
1316
|
+
## ā” Performance Testing
|
|
1317
|
+
|
|
1318
|
+
### 1. Load Testing with K6
|
|
1319
|
+
|
|
1320
|
+
**tests/performance/load/api-load.test.js** (Agent-generated):
|
|
1321
|
+
```javascript
|
|
1322
|
+
import http from 'k6/http';
|
|
1323
|
+
import { check, sleep, group } from 'k6';
|
|
1324
|
+
import { Rate, Counter, Trend } from 'k6/metrics';
|
|
1325
|
+
|
|
1326
|
+
// Custom metrics
|
|
1327
|
+
const errorRate = new Rate('errors');
|
|
1328
|
+
const apiCalls = new Counter('api_calls');
|
|
1329
|
+
const responseTime = new Trend('response_time');
|
|
1330
|
+
|
|
1331
|
+
// Test configuration
|
|
1332
|
+
export const options = {
|
|
1333
|
+
stages: [
|
|
1334
|
+
{ duration: '2m', target: 10 }, // Ramp up
|
|
1335
|
+
{ duration: '5m', target: 100 }, // Stay at 100 users
|
|
1336
|
+
{ duration: '2m', target: 200 }, // Ramp up to 200 users
|
|
1337
|
+
{ duration: '5m', target: 200 }, // Stay at 200 users
|
|
1338
|
+
{ duration: '2m', target: 0 }, // Ramp down
|
|
1339
|
+
],
|
|
1340
|
+
thresholds: {
|
|
1341
|
+
http_req_duration: ['p(95)<500', 'p(99)<1000'], // 95% under 500ms, 99% under 1s
|
|
1342
|
+
http_req_failed: ['rate<0.05'], // Error rate under 5%
|
|
1343
|
+
errors: ['rate<0.1'], // Custom error rate under 10%
|
|
1344
|
+
api_calls: ['count>10000'], // Minimum API calls
|
|
1345
|
+
},
|
|
1346
|
+
};
|
|
1347
|
+
|
|
1348
|
+
const BASE_URL = __ENV.API_URL || 'http://localhost:3001/api';
|
|
1349
|
+
let authToken = '';
|
|
1350
|
+
|
|
1351
|
+
export function setup() {
|
|
1352
|
+
// Login to get auth token
|
|
1353
|
+
const loginRes = http.post(`${BASE_URL}/auth/login`, {
|
|
1354
|
+
email: 'test@example.com',
|
|
1355
|
+
password: 'password123',
|
|
1356
|
+
});
|
|
1357
|
+
|
|
1358
|
+
if (loginRes.status === 200) {
|
|
1359
|
+
authToken = JSON.parse(loginRes.body).token;
|
|
1360
|
+
}
|
|
1361
|
+
|
|
1362
|
+
return { authToken };
|
|
1363
|
+
}
|
|
1364
|
+
|
|
1365
|
+
export default function (data) {
|
|
1366
|
+
const token = data.authToken;
|
|
1367
|
+
|
|
1368
|
+
group('API Load Test', () => {
|
|
1369
|
+
// Test product listing
|
|
1370
|
+
group('Product Listing', () => {
|
|
1371
|
+
const res = http.get(`${BASE_URL}/products?page=1&limit=20`);
|
|
1372
|
+
apiCalls.add(1);
|
|
1373
|
+
responseTime.add(res.timings.duration);
|
|
1374
|
+
|
|
1375
|
+
const success = check(res, {
|
|
1376
|
+
'products list status is 200': (r) => r.status === 200,
|
|
1377
|
+
'products list has data': (r) => {
|
|
1378
|
+
try {
|
|
1379
|
+
const body = JSON.parse(r.body);
|
|
1380
|
+
return body.data && body.data.length > 0;
|
|
1381
|
+
} catch {
|
|
1382
|
+
return false;
|
|
1383
|
+
}
|
|
1384
|
+
},
|
|
1385
|
+
'response time < 500ms': (r) => r.timings.duration < 500,
|
|
1386
|
+
});
|
|
1387
|
+
|
|
1388
|
+
errorRate.add(!success);
|
|
1389
|
+
});
|
|
1390
|
+
|
|
1391
|
+
// Test product search
|
|
1392
|
+
group('Product Search', () => {
|
|
1393
|
+
const searchTerms = ['phone', 'laptop', 'book', 'electronics'];
|
|
1394
|
+
const term = searchTerms[Math.floor(Math.random() * searchTerms.length)];
|
|
1395
|
+
|
|
1396
|
+
const res = http.get(`${BASE_URL}/products/search?q=${term}`);
|
|
1397
|
+
apiCalls.add(1);
|
|
1398
|
+
responseTime.add(res.timings.duration);
|
|
1399
|
+
|
|
1400
|
+
const success = check(res, {
|
|
1401
|
+
'search status is 200': (r) => r.status === 200,
|
|
1402
|
+
'search response is valid': (r) => {
|
|
1403
|
+
try {
|
|
1404
|
+
const body = JSON.parse(r.body);
|
|
1405
|
+
return body.success !== undefined;
|
|
1406
|
+
} catch {
|
|
1407
|
+
return false;
|
|
1408
|
+
}
|
|
1409
|
+
},
|
|
1410
|
+
'response time < 300ms': (r) => r.timings.duration < 300,
|
|
1411
|
+
});
|
|
1412
|
+
|
|
1413
|
+
errorRate.add(!success);
|
|
1414
|
+
});
|
|
1415
|
+
|
|
1416
|
+
// Test authenticated endpoints
|
|
1417
|
+
if (token) {
|
|
1418
|
+
group('Authenticated Requests', () => {
|
|
1419
|
+
const headers = { Authorization: `Bearer ${token}` };
|
|
1420
|
+
|
|
1421
|
+
const res = http.get(`${BASE_URL}/auth/me`, { headers });
|
|
1422
|
+
apiCalls.add(1);
|
|
1423
|
+
responseTime.add(res.timings.duration);
|
|
1424
|
+
|
|
1425
|
+
const success = check(res, {
|
|
1426
|
+
'auth check status is 200': (r) => r.status === 200,
|
|
1427
|
+
'user data is returned': (r) => {
|
|
1428
|
+
try {
|
|
1429
|
+
const body = JSON.parse(r.body);
|
|
1430
|
+
return body.data && body.data.user;
|
|
1431
|
+
} catch {
|
|
1432
|
+
return false;
|
|
1433
|
+
}
|
|
1434
|
+
},
|
|
1435
|
+
'response time < 200ms': (r) => r.timings.duration < 200,
|
|
1436
|
+
});
|
|
1437
|
+
|
|
1438
|
+
errorRate.add(!success);
|
|
1439
|
+
});
|
|
1440
|
+
}
|
|
1441
|
+
|
|
1442
|
+
// Test database-heavy operations
|
|
1443
|
+
group('Database Operations', () => {
|
|
1444
|
+
const categoryRes = http.get(`${BASE_URL}/products?category=electronics&limit=50`);
|
|
1445
|
+
apiCalls.add(1);
|
|
1446
|
+
responseTime.add(categoryRes.timings.duration);
|
|
1447
|
+
|
|
1448
|
+
const success = check(categoryRes, {
|
|
1449
|
+
'category filter status is 200': (r) => r.status === 200,
|
|
1450
|
+
'category filter works': (r) => {
|
|
1451
|
+
try {
|
|
1452
|
+
const body = JSON.parse(r.body);
|
|
1453
|
+
return body.data && Array.isArray(body.data);
|
|
1454
|
+
} catch {
|
|
1455
|
+
return false;
|
|
1456
|
+
}
|
|
1457
|
+
},
|
|
1458
|
+
'response time < 400ms': (r) => r.timings.duration < 400,
|
|
1459
|
+
});
|
|
1460
|
+
|
|
1461
|
+
errorRate.add(!success);
|
|
1462
|
+
});
|
|
1463
|
+
});
|
|
1464
|
+
|
|
1465
|
+
sleep(Math.random() * 2 + 1); // Random sleep between 1-3 seconds
|
|
1466
|
+
}
|
|
1467
|
+
|
|
1468
|
+
export function teardown(data) {
|
|
1469
|
+
// Cleanup operations if needed
|
|
1470
|
+
console.log('Load test completed');
|
|
1471
|
+
}
|
|
1472
|
+
|
|
1473
|
+
export function handleSummary(data) {
|
|
1474
|
+
const avgResponseTime = data.metrics.response_time.avg;
|
|
1475
|
+
const p95ResponseTime = data.metrics['http_req_duration{p=95}'].value;
|
|
1476
|
+
const errorRate = data.metrics.errors.rate;
|
|
1477
|
+
const totalRequests = data.metrics.api_calls.count;
|
|
1478
|
+
|
|
1479
|
+
return {
|
|
1480
|
+
'load-test-summary.json': JSON.stringify(data, null, 2),
|
|
1481
|
+
stdout: `
|
|
1482
|
+
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
1483
|
+
ā LOAD TEST RESULTS ā
|
|
1484
|
+
ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā£
|
|
1485
|
+
ā Total API Calls: ${String(totalRequests).padStart(10)} requests ā
|
|
1486
|
+
ā Average Response Time: ${String(avgResponseTime.toFixed(2)).padStart(10)}ms ā
|
|
1487
|
+
ā 95th Percentile: ${String(p95ResponseTime.toFixed(2)).padStart(10)}ms ā
|
|
1488
|
+
ā Error Rate: ${String((errorRate * 100).toFixed(2)).padStart(10)}% ā
|
|
1489
|
+
ā ā
|
|
1490
|
+
ā Status: ${errorRate < 0.05 ? 'PASSED ā
' : 'FAILED ā'} ā
|
|
1491
|
+
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
1492
|
+
`,
|
|
1493
|
+
};
|
|
1494
|
+
}
|
|
1495
|
+
```
|
|
1496
|
+
|
|
1497
|
+
### 2. Frontend Performance Testing
|
|
1498
|
+
|
|
1499
|
+
**tests/performance/frontend/lighthouse.test.js** (Agent-generated):
|
|
1500
|
+
```javascript
|
|
1501
|
+
const lighthouse = require('lighthouse');
|
|
1502
|
+
const chromeLauncher = require('chrome-launcher');
|
|
1503
|
+
const fs = require('fs');
|
|
1504
|
+
const path = require('path');
|
|
1505
|
+
|
|
1506
|
+
const performanceConfig = {
|
|
1507
|
+
extends: 'lighthouse:default',
|
|
1508
|
+
settings: {
|
|
1509
|
+
onlyAudits: [
|
|
1510
|
+
'first-contentful-paint',
|
|
1511
|
+
'largest-contentful-paint',
|
|
1512
|
+
'cumulative-layout-shift',
|
|
1513
|
+
'total-blocking-time',
|
|
1514
|
+
'speed-index',
|
|
1515
|
+
],
|
|
1516
|
+
},
|
|
1517
|
+
};
|
|
1518
|
+
|
|
1519
|
+
async function runLighthouseTest(url, options = {}) {
|
|
1520
|
+
const chrome = await chromeLauncher.launch({ chromeFlags: ['--headless'] });
|
|
1521
|
+
|
|
1522
|
+
try {
|
|
1523
|
+
const result = await lighthouse(url, {
|
|
1524
|
+
port: chrome.port,
|
|
1525
|
+
disableDeviceEmulation: false,
|
|
1526
|
+
...options,
|
|
1527
|
+
}, performanceConfig);
|
|
1528
|
+
|
|
1529
|
+
return result.lhr;
|
|
1530
|
+
} finally {
|
|
1531
|
+
await chrome.kill();
|
|
1532
|
+
}
|
|
1533
|
+
}
|
|
1534
|
+
|
|
1535
|
+
async function runPerformanceTests() {
|
|
1536
|
+
const baseUrl = process.env.APP_URL || 'http://localhost:3000';
|
|
1537
|
+
|
|
1538
|
+
const testPages = [
|
|
1539
|
+
{ name: 'Homepage', url: `${baseUrl}/` },
|
|
1540
|
+
{ name: 'Products', url: `${baseUrl}/products` },
|
|
1541
|
+
{ name: 'Product Detail', url: `${baseUrl}/products/1` },
|
|
1542
|
+
{ name: 'Login', url: `${baseUrl}/login` },
|
|
1543
|
+
{ name: 'Dashboard', url: `${baseUrl}/dashboard` },
|
|
1544
|
+
];
|
|
1545
|
+
|
|
1546
|
+
const results = [];
|
|
1547
|
+
|
|
1548
|
+
for (const page of testPages) {
|
|
1549
|
+
console.log(`Testing ${page.name}...`);
|
|
1550
|
+
|
|
1551
|
+
try {
|
|
1552
|
+
const result = await runLighthouseTest(page.url);
|
|
1553
|
+
|
|
1554
|
+
const metrics = {
|
|
1555
|
+
name: page.name,
|
|
1556
|
+
url: page.url,
|
|
1557
|
+
timestamp: new Date().toISOString(),
|
|
1558
|
+
scores: {
|
|
1559
|
+
performance: result.categories.performance.score * 100,
|
|
1560
|
+
},
|
|
1561
|
+
metrics: {
|
|
1562
|
+
firstContentfulPaint: result.audits['first-contentful-paint'].numericValue,
|
|
1563
|
+
largestContentfulPaint: result.audits['largest-contentful-paint'].numericValue,
|
|
1564
|
+
cumulativeLayoutShift: result.audits['cumulative-layout-shift'].numericValue,
|
|
1565
|
+
totalBlockingTime: result.audits['total-blocking-time'].numericValue,
|
|
1566
|
+
speedIndex: result.audits['speed-index'].numericValue,
|
|
1567
|
+
},
|
|
1568
|
+
thresholds: {
|
|
1569
|
+
performance: 90,
|
|
1570
|
+
firstContentfulPaint: 1500,
|
|
1571
|
+
largestContentfulPaint: 2500,
|
|
1572
|
+
cumulativeLayoutShift: 0.1,
|
|
1573
|
+
totalBlockingTime: 200,
|
|
1574
|
+
speedIndex: 1300,
|
|
1575
|
+
},
|
|
1576
|
+
};
|
|
1577
|
+
|
|
1578
|
+
// Check if metrics meet thresholds
|
|
1579
|
+
metrics.passed = {
|
|
1580
|
+
performance: metrics.scores.performance >= metrics.thresholds.performance,
|
|
1581
|
+
firstContentfulPaint: metrics.metrics.firstContentfulPaint <= metrics.thresholds.firstContentfulPaint,
|
|
1582
|
+
largestContentfulPaint: metrics.metrics.largestContentfulPaint <= metrics.thresholds.largestContentfulPaint,
|
|
1583
|
+
cumulativeLayoutShift: metrics.metrics.cumulativeLayoutShift <= metrics.thresholds.cumulativeLayoutShift,
|
|
1584
|
+
totalBlockingTime: metrics.metrics.totalBlockingTime <= metrics.thresholds.totalBlockingTime,
|
|
1585
|
+
speedIndex: metrics.metrics.speedIndex <= metrics.thresholds.speedIndex,
|
|
1586
|
+
};
|
|
1587
|
+
|
|
1588
|
+
metrics.allPassed = Object.values(metrics.passed).every(passed => passed);
|
|
1589
|
+
|
|
1590
|
+
results.push(metrics);
|
|
1591
|
+
|
|
1592
|
+
console.log(`ā
${page.name} completed`);
|
|
1593
|
+
} catch (error) {
|
|
1594
|
+
console.error(`ā Error testing ${page.name}:`, error.message);
|
|
1595
|
+
results.push({
|
|
1596
|
+
name: page.name,
|
|
1597
|
+
url: page.url,
|
|
1598
|
+
error: error.message,
|
|
1599
|
+
allPassed: false,
|
|
1600
|
+
});
|
|
1601
|
+
}
|
|
1602
|
+
}
|
|
1603
|
+
|
|
1604
|
+
// Generate report
|
|
1605
|
+
const report = {
|
|
1606
|
+
timestamp: new Date().toISOString(),
|
|
1607
|
+
summary: {
|
|
1608
|
+
totalPages: results.length,
|
|
1609
|
+
passedPages: results.filter(r => r.allPassed).length,
|
|
1610
|
+
failedPages: results.filter(r => !r.allPassed).length,
|
|
1611
|
+
},
|
|
1612
|
+
results,
|
|
1613
|
+
};
|
|
1614
|
+
|
|
1615
|
+
// Save report
|
|
1616
|
+
const reportsDir = path.join(__dirname, '../../reports/performance');
|
|
1617
|
+
if (!fs.existsSync(reportsDir)) {
|
|
1618
|
+
fs.mkdirSync(reportsDir, { recursive: true });
|
|
1619
|
+
}
|
|
1620
|
+
|
|
1621
|
+
const reportPath = path.join(reportsDir, `lighthouse-${Date.now()}.json`);
|
|
1622
|
+
fs.writeFileSync(reportPath, JSON.stringify(report, null, 2));
|
|
1623
|
+
|
|
1624
|
+
// Print summary
|
|
1625
|
+
console.log('\nš Performance Test Summary:');
|
|
1626
|
+
console.log(`Total Pages: ${report.summary.totalPages}`);
|
|
1627
|
+
console.log(`Passed: ${report.summary.passedPages}`);
|
|
1628
|
+
console.log(`Failed: ${report.summary.failedPages}`);
|
|
1629
|
+
console.log(`Report saved: ${reportPath}`);
|
|
1630
|
+
|
|
1631
|
+
// Exit with error code if any tests failed
|
|
1632
|
+
if (report.summary.failedPages > 0) {
|
|
1633
|
+
process.exit(1);
|
|
1634
|
+
}
|
|
1635
|
+
}
|
|
1636
|
+
|
|
1637
|
+
// Run tests if called directly
|
|
1638
|
+
if (require.main === module) {
|
|
1639
|
+
runPerformanceTests().catch(console.error);
|
|
1640
|
+
}
|
|
1641
|
+
|
|
1642
|
+
module.exports = { runLighthouseTest, runPerformanceTests };
|
|
1643
|
+
```
|
|
1644
|
+
|
|
1645
|
+
```bash
|
|
1646
|
+
# Generate performance testing with agent
|
|
1647
|
+
npx claude-flow sparc run perf-analyzer "Comprehensive performance testing with Lighthouse and K6"
|
|
1648
|
+
```
|
|
1649
|
+
|
|
1650
|
+
## š MCP Integration for Testing
|
|
1651
|
+
|
|
1652
|
+
### Initialize Testing Swarm
|
|
1653
|
+
|
|
1654
|
+
```javascript
|
|
1655
|
+
// Setup swarm for comprehensive testing
|
|
1656
|
+
await mcp__claude_flow__swarm_init({
|
|
1657
|
+
topology: "star",
|
|
1658
|
+
maxAgents: 8,
|
|
1659
|
+
strategy: "balanced"
|
|
1660
|
+
});
|
|
1661
|
+
|
|
1662
|
+
// Spawn testing agents
|
|
1663
|
+
await mcp__claude_flow__agent_spawn({
|
|
1664
|
+
type: "tester",
|
|
1665
|
+
capabilities: ["unit-testing", "integration-testing", "e2e-testing"]
|
|
1666
|
+
});
|
|
1667
|
+
|
|
1668
|
+
await mcp__claude_flow__agent_spawn({
|
|
1669
|
+
type: "perf-analyzer",
|
|
1670
|
+
capabilities: ["load-testing", "performance-monitoring", "lighthouse"]
|
|
1671
|
+
});
|
|
1672
|
+
|
|
1673
|
+
await mcp__claude_flow__agent_spawn({
|
|
1674
|
+
type: "reviewer",
|
|
1675
|
+
capabilities: ["test-review", "coverage-analysis", "quality-gates"]
|
|
1676
|
+
});
|
|
1677
|
+
```
|
|
1678
|
+
|
|
1679
|
+
### Orchestrate Testing Workflow
|
|
1680
|
+
|
|
1681
|
+
```javascript
|
|
1682
|
+
// Orchestrate comprehensive testing
|
|
1683
|
+
await mcp__claude_flow__task_orchestrate({
|
|
1684
|
+
task: "Implement comprehensive testing strategy with unit, integration, E2E, and performance tests",
|
|
1685
|
+
strategy: "sequential",
|
|
1686
|
+
priority: "high",
|
|
1687
|
+
maxAgents: 6
|
|
1688
|
+
});
|
|
1689
|
+
|
|
1690
|
+
// Monitor testing progress
|
|
1691
|
+
const status = await mcp__claude_flow__task_status({
|
|
1692
|
+
taskId: "testing-task-id",
|
|
1693
|
+
detailed: true
|
|
1694
|
+
});
|
|
1695
|
+
```
|
|
1696
|
+
|
|
1697
|
+
## š Test Reporting & Coverage
|
|
1698
|
+
|
|
1699
|
+
### 1. Coverage Configuration
|
|
1700
|
+
|
|
1701
|
+
**jest.config.js** (Agent-generated):
|
|
1702
|
+
```javascript
|
|
1703
|
+
module.exports = {
|
|
1704
|
+
preset: 'ts-jest',
|
|
1705
|
+
testEnvironment: 'jsdom',
|
|
1706
|
+
setupFilesAfterEnv: ['<rootDir>/tests/utils/setup.ts'],
|
|
1707
|
+
collectCoverageFrom: [
|
|
1708
|
+
'src/**/*.{ts,tsx}',
|
|
1709
|
+
'!src/**/*.d.ts',
|
|
1710
|
+
'!src/main.tsx',
|
|
1711
|
+
'!src/vite-env.d.ts',
|
|
1712
|
+
'!src/**/*.stories.{ts,tsx}',
|
|
1713
|
+
'!src/**/*.test.{ts,tsx}',
|
|
1714
|
+
],
|
|
1715
|
+
coverageThreshold: {
|
|
1716
|
+
global: {
|
|
1717
|
+
branches: 80,
|
|
1718
|
+
functions: 80,
|
|
1719
|
+
lines: 80,
|
|
1720
|
+
statements: 80,
|
|
1721
|
+
},
|
|
1722
|
+
'./src/components/': {
|
|
1723
|
+
branches: 90,
|
|
1724
|
+
functions: 90,
|
|
1725
|
+
lines: 90,
|
|
1726
|
+
statements: 90,
|
|
1727
|
+
},
|
|
1728
|
+
'./src/hooks/': {
|
|
1729
|
+
branches: 85,
|
|
1730
|
+
functions: 85,
|
|
1731
|
+
lines: 85,
|
|
1732
|
+
statements: 85,
|
|
1733
|
+
},
|
|
1734
|
+
},
|
|
1735
|
+
coverageReporters: ['text', 'lcov', 'html', 'json-summary'],
|
|
1736
|
+
testMatch: [
|
|
1737
|
+
'<rootDir>/tests/**/*.test.{ts,tsx}',
|
|
1738
|
+
'<rootDir>/src/**/*.test.{ts,tsx}',
|
|
1739
|
+
],
|
|
1740
|
+
moduleNameMapping: {
|
|
1741
|
+
'^@/(.*)$': '<rootDir>/src/$1',
|
|
1742
|
+
},
|
|
1743
|
+
transform: {
|
|
1744
|
+
'^.+\\.(ts|tsx)$': 'ts-jest',
|
|
1745
|
+
},
|
|
1746
|
+
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json'],
|
|
1747
|
+
};
|
|
1748
|
+
```
|
|
1749
|
+
|
|
1750
|
+
### 2. Test Reporting Dashboard
|
|
1751
|
+
|
|
1752
|
+
```bash
|
|
1753
|
+
# Generate test reporting dashboard with agent
|
|
1754
|
+
npx claude-flow sparc run tester "Test reporting dashboard with coverage metrics and trend analysis"
|
|
1755
|
+
```
|
|
1756
|
+
|
|
1757
|
+
## š CI/CD Integration
|
|
1758
|
+
|
|
1759
|
+
### 1. GitHub Actions Testing Workflow
|
|
1760
|
+
|
|
1761
|
+
```bash
|
|
1762
|
+
# Generate CI/CD testing pipeline with agent
|
|
1763
|
+
npx claude-flow sparc run cicd-engineer "GitHub Actions workflow for automated testing pipeline"
|
|
1764
|
+
```
|
|
1765
|
+
|
|
1766
|
+
### 2. Test Automation Scripts
|
|
1767
|
+
|
|
1768
|
+
```bash
|
|
1769
|
+
# Generate test automation scripts with agent
|
|
1770
|
+
npx claude-flow sparc run tester "Test automation scripts for local development and CI/CD"
|
|
1771
|
+
```
|
|
1772
|
+
|
|
1773
|
+
---
|
|
1774
|
+
|
|
1775
|
+
This completes the comprehensive JavaScript documentation covering project setup, backend development, frontend development, API development, and testing automation with Claude-Flow agent coordination. Each section includes practical examples, best practices, and real-world scenarios for modern JavaScript development.
|