agentic-qe 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/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/byzantine-coordinator.md +63 -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 +266 -0
- package/.claude/agents/core/planner.md +168 -0
- package/.claude/agents/core/researcher.md +190 -0
- package/.claude/agents/core/reviewer.md +326 -0
- package/.claude/agents/core/tester.md +319 -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/code-goal-planner.md +446 -0
- package/.claude/agents/goal/goal-planner.md +168 -0
- package/.claude/agents/hive-mind/collective-intelligence-coordinator.md +130 -0
- package/.claude/agents/hive-mind/queen-coordinator.md +203 -0
- package/.claude/agents/hive-mind/scout-explorer.md +242 -0
- package/.claude/agents/hive-mind/swarm-memory-manager.md +193 -0
- package/.claude/agents/hive-mind/worker-specialist.md +217 -0
- package/.claude/agents/neural/safla-neural.md +74 -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/qe-api-contract-validator.md +1088 -0
- package/.claude/agents/qe-chaos-engineer.md +736 -0
- package/.claude/agents/qe-coverage-analyzer.md +282 -0
- package/.claude/agents/qe-deployment-readiness.md +1109 -0
- package/.claude/agents/qe-flaky-test-hunter.md +1121 -0
- package/.claude/agents/qe-fleet-commander.md +641 -0
- package/.claude/agents/qe-performance-tester.md +354 -0
- package/.claude/agents/qe-production-intelligence.md +1162 -0
- package/.claude/agents/qe-quality-gate.md +294 -0
- package/.claude/agents/qe-regression-risk-analyzer.md +947 -0
- package/.claude/agents/qe-requirements-validator.md +691 -0
- package/.claude/agents/qe-security-scanner.md +430 -0
- package/.claude/agents/qe-test-data-architect.md +1007 -0
- package/.claude/agents/qe-test-executor.md +365 -0
- package/.claude/agents/qe-test-generator.md +332 -0
- package/.claude/agents/qe-visual-tester.md +754 -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/swarm/adaptive-coordinator.md +396 -0
- package/.claude/agents/swarm/hierarchical-coordinator.md +327 -0
- package/.claude/agents/swarm/mesh-coordinator.md +392 -0
- package/.claude/agents/templates/automation-smart-agent.md +205 -0
- package/.claude/agents/templates/coordinator-swarm-init.md +105 -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/unit/tdd-london-swarm.md +244 -0
- package/.claude/agents/testing/validation/production-validator.md +395 -0
- package/.claude/aqe-fleet.json +47 -0
- package/.claude/commands/README.md +106 -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/aqe-analyze.md +344 -0
- package/.claude/commands/aqe-benchmark.md +466 -0
- package/.claude/commands/aqe-chaos.md +443 -0
- package/.claude/commands/aqe-execute.md +322 -0
- package/.claude/commands/aqe-fleet-status.md +431 -0
- package/.claude/commands/aqe-generate.md +301 -0
- package/.claude/commands/aqe-optimize.md +361 -0
- package/.claude/commands/aqe-report.md +411 -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 +132 -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/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/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 +114 -0
- package/.claude/settings.local.json +10 -0
- package/CONTRIBUTING.md +897 -0
- package/LICENSE +21 -0
- package/README.md +632 -0
- package/bin/aqe +959 -0
- package/config/fleet.yaml +50 -0
- package/dist/agents/ApiContractValidatorAgent.d.ts +222 -0
- package/dist/agents/ApiContractValidatorAgent.d.ts.map +1 -0
- package/dist/agents/ApiContractValidatorAgent.js +787 -0
- package/dist/agents/ApiContractValidatorAgent.js.map +1 -0
- package/dist/agents/BaseAgent.d.ts +147 -0
- package/dist/agents/BaseAgent.d.ts.map +1 -0
- package/dist/agents/BaseAgent.js +374 -0
- package/dist/agents/BaseAgent.js.map +1 -0
- package/dist/agents/CoverageAnalyzerAgent.d.ts +103 -0
- package/dist/agents/CoverageAnalyzerAgent.d.ts.map +1 -0
- package/dist/agents/CoverageAnalyzerAgent.js +466 -0
- package/dist/agents/CoverageAnalyzerAgent.js.map +1 -0
- package/dist/agents/DeploymentReadinessAgent.d.ts +244 -0
- package/dist/agents/DeploymentReadinessAgent.d.ts.map +1 -0
- package/dist/agents/DeploymentReadinessAgent.js +974 -0
- package/dist/agents/DeploymentReadinessAgent.js.map +1 -0
- package/dist/agents/FlakyTestHunterAgent.d.ts +172 -0
- package/dist/agents/FlakyTestHunterAgent.d.ts.map +1 -0
- package/dist/agents/FlakyTestHunterAgent.js +867 -0
- package/dist/agents/FlakyTestHunterAgent.js.map +1 -0
- package/dist/agents/FleetCommanderAgent.d.ts +154 -0
- package/dist/agents/FleetCommanderAgent.d.ts.map +1 -0
- package/dist/agents/FleetCommanderAgent.js +924 -0
- package/dist/agents/FleetCommanderAgent.js.map +1 -0
- package/dist/agents/PerformanceTesterAgent.d.ts +194 -0
- package/dist/agents/PerformanceTesterAgent.d.ts.map +1 -0
- package/dist/agents/PerformanceTesterAgent.js +972 -0
- package/dist/agents/PerformanceTesterAgent.js.map +1 -0
- package/dist/agents/ProductionIntelligenceAgent.d.ts +224 -0
- package/dist/agents/ProductionIntelligenceAgent.d.ts.map +1 -0
- package/dist/agents/ProductionIntelligenceAgent.js +856 -0
- package/dist/agents/ProductionIntelligenceAgent.js.map +1 -0
- package/dist/agents/QualityAnalyzerAgent.d.ts +67 -0
- package/dist/agents/QualityAnalyzerAgent.d.ts.map +1 -0
- package/dist/agents/QualityAnalyzerAgent.js +453 -0
- package/dist/agents/QualityAnalyzerAgent.js.map +1 -0
- package/dist/agents/QualityGateAgent.d.ts +104 -0
- package/dist/agents/QualityGateAgent.d.ts.map +1 -0
- package/dist/agents/QualityGateAgent.js +522 -0
- package/dist/agents/QualityGateAgent.js.map +1 -0
- package/dist/agents/RegressionRiskAnalyzerAgent.d.ts +274 -0
- package/dist/agents/RegressionRiskAnalyzerAgent.d.ts.map +1 -0
- package/dist/agents/RegressionRiskAnalyzerAgent.js +1076 -0
- package/dist/agents/RegressionRiskAnalyzerAgent.js.map +1 -0
- package/dist/agents/RequirementsValidatorAgent.d.ts +195 -0
- package/dist/agents/RequirementsValidatorAgent.d.ts.map +1 -0
- package/dist/agents/RequirementsValidatorAgent.js +992 -0
- package/dist/agents/RequirementsValidatorAgent.js.map +1 -0
- package/dist/agents/SecurityScannerAgent.d.ts +126 -0
- package/dist/agents/SecurityScannerAgent.d.ts.map +1 -0
- package/dist/agents/SecurityScannerAgent.js +695 -0
- package/dist/agents/SecurityScannerAgent.js.map +1 -0
- package/dist/agents/TestDataArchitectAgent.d.ts +452 -0
- package/dist/agents/TestDataArchitectAgent.d.ts.map +1 -0
- package/dist/agents/TestDataArchitectAgent.js +1346 -0
- package/dist/agents/TestDataArchitectAgent.js.map +1 -0
- package/dist/agents/TestExecutorAgent.d.ts +101 -0
- package/dist/agents/TestExecutorAgent.d.ts.map +1 -0
- package/dist/agents/TestExecutorAgent.js +730 -0
- package/dist/agents/TestExecutorAgent.js.map +1 -0
- package/dist/agents/TestGeneratorAgent.d.ts +109 -0
- package/dist/agents/TestGeneratorAgent.d.ts.map +1 -0
- package/dist/agents/TestGeneratorAgent.js +450 -0
- package/dist/agents/TestGeneratorAgent.js.map +1 -0
- package/dist/agents/index.d.ts +51 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +738 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/cli/commands/analyze.d.ts +32 -0
- package/dist/cli/commands/analyze.d.ts.map +1 -0
- package/dist/cli/commands/analyze.js +764 -0
- package/dist/cli/commands/analyze.js.map +1 -0
- package/dist/cli/commands/fleet.d.ts +36 -0
- package/dist/cli/commands/fleet.d.ts.map +1 -0
- package/dist/cli/commands/fleet.js +745 -0
- package/dist/cli/commands/fleet.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +24 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +424 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/init.d.ts +17 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +570 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/run.d.ts +25 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +558 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/index-spec.d.ts +3 -0
- package/dist/cli/index-spec.d.ts.map +1 -0
- package/dist/cli/index-spec.js +154 -0
- package/dist/cli/index-spec.js.map +1 -0
- package/dist/cli/index-working.d.ts +7 -0
- package/dist/cli/index-working.d.ts.map +1 -0
- package/dist/cli/index-working.js +470 -0
- package/dist/cli/index-working.js.map +1 -0
- package/dist/cli/index.d.ts +9 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +174 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/Agent.d.ts +189 -0
- package/dist/core/Agent.d.ts.map +1 -0
- package/dist/core/Agent.js +288 -0
- package/dist/core/Agent.js.map +1 -0
- package/dist/core/EventBus.d.ts +40 -0
- package/dist/core/EventBus.d.ts.map +1 -0
- package/dist/core/EventBus.js +114 -0
- package/dist/core/EventBus.js.map +1 -0
- package/dist/core/FleetManager.d.ts +219 -0
- package/dist/core/FleetManager.d.ts.map +1 -0
- package/dist/core/FleetManager.js +354 -0
- package/dist/core/FleetManager.js.map +1 -0
- package/dist/core/MemoryManager.d.ts +119 -0
- package/dist/core/MemoryManager.d.ts.map +1 -0
- package/dist/core/MemoryManager.js +460 -0
- package/dist/core/MemoryManager.js.map +1 -0
- package/dist/core/Task.d.ts +264 -0
- package/dist/core/Task.d.ts.map +1 -0
- package/dist/core/Task.js +397 -0
- package/dist/core/Task.js.map +1 -0
- package/dist/core/coverage-analyzer.d.ts +50 -0
- package/dist/core/coverage-analyzer.d.ts.map +1 -0
- package/dist/core/coverage-analyzer.js +146 -0
- package/dist/core/coverage-analyzer.js.map +1 -0
- package/dist/core/index.d.ts +14 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +20 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/quality-gate.d.ts +81 -0
- package/dist/core/quality-gate.d.ts.map +1 -0
- package/dist/core/quality-gate.js +254 -0
- package/dist/core/quality-gate.js.map +1 -0
- package/dist/coverage/coverage-collector.d.ts +62 -0
- package/dist/coverage/coverage-collector.d.ts.map +1 -0
- package/dist/coverage/coverage-collector.js +61 -0
- package/dist/coverage/coverage-collector.js.map +1 -0
- package/dist/coverage/coverage-reporter.d.ts +42 -0
- package/dist/coverage/coverage-reporter.d.ts.map +1 -0
- package/dist/coverage/coverage-reporter.js +53 -0
- package/dist/coverage/coverage-reporter.js.map +1 -0
- package/dist/index.d.ts +89 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +142 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/handlers/agent-spawn.d.ts +72 -0
- package/dist/mcp/handlers/agent-spawn.d.ts.map +1 -0
- package/dist/mcp/handlers/agent-spawn.js +255 -0
- package/dist/mcp/handlers/agent-spawn.js.map +1 -0
- package/dist/mcp/handlers/base-handler.d.ts +53 -0
- package/dist/mcp/handlers/base-handler.d.ts.map +1 -0
- package/dist/mcp/handlers/base-handler.js +77 -0
- package/dist/mcp/handlers/base-handler.js.map +1 -0
- package/dist/mcp/handlers/fleet-init.d.ts +55 -0
- package/dist/mcp/handlers/fleet-init.d.ts.map +1 -0
- package/dist/mcp/handlers/fleet-init.js +149 -0
- package/dist/mcp/handlers/fleet-init.js.map +1 -0
- package/dist/mcp/handlers/fleet-status.d.ts +103 -0
- package/dist/mcp/handlers/fleet-status.d.ts.map +1 -0
- package/dist/mcp/handlers/fleet-status.js +244 -0
- package/dist/mcp/handlers/fleet-status.js.map +1 -0
- package/dist/mcp/handlers/optimize-tests.d.ts +219 -0
- package/dist/mcp/handlers/optimize-tests.d.ts.map +1 -0
- package/dist/mcp/handlers/optimize-tests.js +532 -0
- package/dist/mcp/handlers/optimize-tests.js.map +1 -0
- package/dist/mcp/handlers/predict-defects.d.ts +194 -0
- package/dist/mcp/handlers/predict-defects.d.ts.map +1 -0
- package/dist/mcp/handlers/predict-defects.js +721 -0
- package/dist/mcp/handlers/predict-defects.js.map +1 -0
- package/dist/mcp/handlers/quality-analyze.d.ts +273 -0
- package/dist/mcp/handlers/quality-analyze.d.ts.map +1 -0
- package/dist/mcp/handlers/quality-analyze.js +702 -0
- package/dist/mcp/handlers/quality-analyze.js.map +1 -0
- package/dist/mcp/handlers/task-orchestrate.d.ts +152 -0
- package/dist/mcp/handlers/task-orchestrate.d.ts.map +1 -0
- package/dist/mcp/handlers/task-orchestrate.js +629 -0
- package/dist/mcp/handlers/task-orchestrate.js.map +1 -0
- package/dist/mcp/handlers/test-execute.d.ts +132 -0
- package/dist/mcp/handlers/test-execute.d.ts.map +1 -0
- package/dist/mcp/handlers/test-execute.js +436 -0
- package/dist/mcp/handlers/test-execute.js.map +1 -0
- package/dist/mcp/handlers/test-generate.d.ts +107 -0
- package/dist/mcp/handlers/test-generate.d.ts.map +1 -0
- package/dist/mcp/handlers/test-generate.js +437 -0
- package/dist/mcp/handlers/test-generate.js.map +1 -0
- package/dist/mcp/server.d.ts +99 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +214 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/services/AgentRegistry.d.ts +191 -0
- package/dist/mcp/services/AgentRegistry.d.ts.map +1 -0
- package/dist/mcp/services/AgentRegistry.js +403 -0
- package/dist/mcp/services/AgentRegistry.js.map +1 -0
- package/dist/mcp/services/HookExecutor.d.ts +165 -0
- package/dist/mcp/services/HookExecutor.d.ts.map +1 -0
- package/dist/mcp/services/HookExecutor.js +327 -0
- package/dist/mcp/services/HookExecutor.js.map +1 -0
- package/dist/mcp/start.d.ts +7 -0
- package/dist/mcp/start.d.ts.map +1 -0
- package/dist/mcp/start.js +35 -0
- package/dist/mcp/start.js.map +1 -0
- package/dist/mcp/tools.d.ts +81 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +471 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/optimization/sublinear-solver.d.ts +72 -0
- package/dist/optimization/sublinear-solver.d.ts.map +1 -0
- package/dist/optimization/sublinear-solver.js +263 -0
- package/dist/optimization/sublinear-solver.js.map +1 -0
- package/dist/scripts/verifyComplexity.d.ts +8 -0
- package/dist/scripts/verifyComplexity.d.ts.map +1 -0
- package/dist/scripts/verifyComplexity.js +56 -0
- package/dist/scripts/verifyComplexity.js.map +1 -0
- package/dist/types/api-contract.types.d.ts +273 -0
- package/dist/types/api-contract.types.d.ts.map +1 -0
- package/dist/types/api-contract.types.js +18 -0
- package/dist/types/api-contract.types.js.map +1 -0
- package/dist/types/errors.d.ts +104 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +226 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/events.d.ts +101 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +6 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/index.d.ts +570 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +131 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/Config.d.ts +128 -0
- package/dist/utils/Config.d.ts.map +1 -0
- package/dist/utils/Config.js +232 -0
- package/dist/utils/Config.js.map +1 -0
- package/dist/utils/Database.d.ts +112 -0
- package/dist/utils/Database.d.ts.map +1 -0
- package/dist/utils/Database.js +352 -0
- package/dist/utils/Database.js.map +1 -0
- package/dist/utils/Logger.d.ts +58 -0
- package/dist/utils/Logger.d.ts.map +1 -0
- package/dist/utils/Logger.js +125 -0
- package/dist/utils/Logger.js.map +1 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +14 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/sublinear/coverageOptimizer.d.ts +84 -0
- package/dist/utils/sublinear/coverageOptimizer.d.ts.map +1 -0
- package/dist/utils/sublinear/coverageOptimizer.js +415 -0
- package/dist/utils/sublinear/coverageOptimizer.js.map +1 -0
- package/dist/utils/sublinear/index.d.ts +50 -0
- package/dist/utils/sublinear/index.d.ts.map +1 -0
- package/dist/utils/sublinear/index.js +390 -0
- package/dist/utils/sublinear/index.js.map +1 -0
- package/dist/utils/sublinear/matrixSolver.d.ts +132 -0
- package/dist/utils/sublinear/matrixSolver.d.ts.map +1 -0
- package/dist/utils/sublinear/matrixSolver.js +642 -0
- package/dist/utils/sublinear/matrixSolver.js.map +1 -0
- package/dist/utils/sublinear/temporalPredictor.d.ts +195 -0
- package/dist/utils/sublinear/temporalPredictor.d.ts.map +1 -0
- package/dist/utils/sublinear/temporalPredictor.js +474 -0
- package/dist/utils/sublinear/temporalPredictor.js.map +1 -0
- package/dist/utils/sublinear/testSelector.d.ts +81 -0
- package/dist/utils/sublinear/testSelector.d.ts.map +1 -0
- package/dist/utils/sublinear/testSelector.js +303 -0
- package/dist/utils/sublinear/testSelector.js.map +1 -0
- package/package.json +131 -0
|
@@ -0,0 +1,1346 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* TestDataArchitectAgent - Realistic test data generation specialist
|
|
4
|
+
*
|
|
5
|
+
* Implements schema-aware data generation with referential integrity preservation,
|
|
6
|
+
* PII anonymization (GDPR compliance), edge case coverage, realistic data synthesis
|
|
7
|
+
* using Faker.js patterns, and high-speed generation (10,000+ records/second).
|
|
8
|
+
*
|
|
9
|
+
* Based on SPARC methodology and AQE Fleet specification
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.TestDataArchitectAgent = exports.AnonymizationStrategy = exports.SemanticFormat = exports.FieldType = void 0;
|
|
13
|
+
const BaseAgent_1 = require("./BaseAgent");
|
|
14
|
+
const types_1 = require("../types");
|
|
15
|
+
var FieldType;
|
|
16
|
+
(function (FieldType) {
|
|
17
|
+
FieldType["STRING"] = "string";
|
|
18
|
+
FieldType["INTEGER"] = "integer";
|
|
19
|
+
FieldType["FLOAT"] = "float";
|
|
20
|
+
FieldType["DECIMAL"] = "decimal";
|
|
21
|
+
FieldType["BOOLEAN"] = "boolean";
|
|
22
|
+
FieldType["DATE"] = "date";
|
|
23
|
+
FieldType["DATETIME"] = "datetime";
|
|
24
|
+
FieldType["TIMESTAMP"] = "timestamp";
|
|
25
|
+
FieldType["UUID"] = "uuid";
|
|
26
|
+
FieldType["JSON"] = "json";
|
|
27
|
+
FieldType["ARRAY"] = "array";
|
|
28
|
+
FieldType["BINARY"] = "binary";
|
|
29
|
+
FieldType["TEXT"] = "text";
|
|
30
|
+
FieldType["ENUM"] = "enum";
|
|
31
|
+
})(FieldType || (exports.FieldType = FieldType = {}));
|
|
32
|
+
var SemanticFormat;
|
|
33
|
+
(function (SemanticFormat) {
|
|
34
|
+
SemanticFormat["UUID"] = "uuid";
|
|
35
|
+
SemanticFormat["EMAIL"] = "email";
|
|
36
|
+
SemanticFormat["PHONE"] = "phone";
|
|
37
|
+
SemanticFormat["URL"] = "url";
|
|
38
|
+
SemanticFormat["NAME"] = "name";
|
|
39
|
+
SemanticFormat["ADDRESS"] = "address";
|
|
40
|
+
SemanticFormat["CITY"] = "city";
|
|
41
|
+
SemanticFormat["COUNTRY"] = "country";
|
|
42
|
+
SemanticFormat["ZIPCODE"] = "zipcode";
|
|
43
|
+
SemanticFormat["CREDIT_CARD"] = "credit_card";
|
|
44
|
+
SemanticFormat["SSN"] = "ssn";
|
|
45
|
+
SemanticFormat["IP_ADDRESS"] = "ip_address";
|
|
46
|
+
SemanticFormat["MAC_ADDRESS"] = "mac_address";
|
|
47
|
+
SemanticFormat["USER_AGENT"] = "user_agent";
|
|
48
|
+
SemanticFormat["PRICE"] = "price";
|
|
49
|
+
SemanticFormat["CURRENCY"] = "currency";
|
|
50
|
+
SemanticFormat["COMPANY"] = "company";
|
|
51
|
+
SemanticFormat["JOB_TITLE"] = "job_title";
|
|
52
|
+
SemanticFormat["PRODUCT_NAME"] = "product_name";
|
|
53
|
+
SemanticFormat["DESCRIPTION"] = "description";
|
|
54
|
+
SemanticFormat["LATITUDE"] = "latitude";
|
|
55
|
+
SemanticFormat["LONGITUDE"] = "longitude";
|
|
56
|
+
SemanticFormat["COLOR"] = "color";
|
|
57
|
+
})(SemanticFormat || (exports.SemanticFormat = SemanticFormat = {}));
|
|
58
|
+
var AnonymizationStrategy;
|
|
59
|
+
(function (AnonymizationStrategy) {
|
|
60
|
+
AnonymizationStrategy["MASK"] = "mask";
|
|
61
|
+
AnonymizationStrategy["HASH"] = "hash";
|
|
62
|
+
AnonymizationStrategy["TOKENIZE"] = "tokenize";
|
|
63
|
+
AnonymizationStrategy["GENERALIZE"] = "generalize";
|
|
64
|
+
AnonymizationStrategy["SUBSTITUTE"] = "substitute";
|
|
65
|
+
AnonymizationStrategy["SYNTHETIC"] = "synthetic";
|
|
66
|
+
})(AnonymizationStrategy || (exports.AnonymizationStrategy = AnonymizationStrategy = {}));
|
|
67
|
+
// ============================================================================
|
|
68
|
+
// Test Data Architect Agent Implementation
|
|
69
|
+
// ============================================================================
|
|
70
|
+
class TestDataArchitectAgent extends BaseAgent_1.BaseAgent {
|
|
71
|
+
constructor(config) {
|
|
72
|
+
super({
|
|
73
|
+
...config,
|
|
74
|
+
type: types_1.QEAgentType.TEST_DATA_ARCHITECT,
|
|
75
|
+
capabilities: [
|
|
76
|
+
{
|
|
77
|
+
name: 'schema-introspection',
|
|
78
|
+
version: '1.0.0',
|
|
79
|
+
description: 'Analyze database schemas from PostgreSQL, MySQL, MongoDB, and SQLite',
|
|
80
|
+
parameters: {
|
|
81
|
+
supportedDatabases: ['postgresql', 'mysql', 'mongodb', 'sqlite'],
|
|
82
|
+
supportedSchemas: ['sql', 'graphql', 'json-schema', 'typescript']
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
name: 'high-speed-data-generation',
|
|
87
|
+
version: '1.0.0',
|
|
88
|
+
description: 'Generate 10,000+ records per second with optimized algorithms',
|
|
89
|
+
parameters: {
|
|
90
|
+
generationRate: 10000,
|
|
91
|
+
batchingEnabled: true,
|
|
92
|
+
parallelProcessing: true
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
name: 'referential-integrity',
|
|
97
|
+
version: '1.0.0',
|
|
98
|
+
description: 'Preserve foreign key relationships and referential integrity',
|
|
99
|
+
parameters: {
|
|
100
|
+
topologicalSorting: true,
|
|
101
|
+
constraintResolution: true
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
name: 'pii-anonymization',
|
|
106
|
+
version: '1.0.0',
|
|
107
|
+
description: 'GDPR-compliant PII anonymization with multiple strategies',
|
|
108
|
+
parameters: {
|
|
109
|
+
strategies: ['mask', 'hash', 'tokenize', 'generalize', 'substitute'],
|
|
110
|
+
gdprCompliant: true,
|
|
111
|
+
kAnonymity: 5
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
name: 'realistic-data-synthesis',
|
|
116
|
+
version: '1.0.0',
|
|
117
|
+
description: 'Generate realistic data matching production patterns',
|
|
118
|
+
parameters: {
|
|
119
|
+
fakerLibrary: true,
|
|
120
|
+
statisticalModeling: true,
|
|
121
|
+
patternMatching: true
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
name: 'edge-case-generation',
|
|
126
|
+
version: '1.0.0',
|
|
127
|
+
description: 'Automatic edge case data generation for boundary testing',
|
|
128
|
+
parameters: {
|
|
129
|
+
boundaryValues: true,
|
|
130
|
+
specialCharacters: true,
|
|
131
|
+
nullHandling: true,
|
|
132
|
+
extremeValues: true
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
name: 'constraint-validation',
|
|
137
|
+
version: '1.0.0',
|
|
138
|
+
description: 'Validate generated data against schema constraints',
|
|
139
|
+
parameters: {
|
|
140
|
+
checkTypes: ['NOT_NULL', 'UNIQUE', 'CHECK', 'FOREIGN_KEY'],
|
|
141
|
+
validationMode: 'strict'
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
name: 'data-versioning',
|
|
146
|
+
version: '1.0.0',
|
|
147
|
+
description: 'Version control for test datasets aligned with schema versions',
|
|
148
|
+
parameters: {
|
|
149
|
+
versionTracking: true,
|
|
150
|
+
checksumValidation: true,
|
|
151
|
+
migrationSupport: true
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
]
|
|
155
|
+
});
|
|
156
|
+
this.schemaCache = new Map();
|
|
157
|
+
this.generatedDatasets = new Map();
|
|
158
|
+
this.tokenMap = new Map(); // For consistent anonymization
|
|
159
|
+
this.config = {
|
|
160
|
+
...config,
|
|
161
|
+
databases: config.databases || ['postgresql', 'mysql', 'mongodb', 'sqlite'],
|
|
162
|
+
generationRate: config.generationRate || 10000,
|
|
163
|
+
referentialIntegrity: config.referentialIntegrity !== false,
|
|
164
|
+
piiAnonymization: config.piiAnonymization !== false,
|
|
165
|
+
gdprCompliant: config.gdprCompliant !== false,
|
|
166
|
+
edgeCaseGeneration: config.edgeCaseGeneration !== false,
|
|
167
|
+
fakerLocale: config.fakerLocale || 'en',
|
|
168
|
+
batchSize: config.batchSize || 1000,
|
|
169
|
+
parallelGeneration: config.parallelGeneration !== false
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
// ============================================================================
|
|
173
|
+
// BaseAgent Implementation
|
|
174
|
+
// ============================================================================
|
|
175
|
+
async initializeComponents() {
|
|
176
|
+
console.log(`TestDataArchitectAgent ${this.agentId.id} initializing...`);
|
|
177
|
+
// Initialize Faker.js for realistic data generation
|
|
178
|
+
await this.initializeFaker();
|
|
179
|
+
// Load schema templates
|
|
180
|
+
await this.loadSchemaTemplates();
|
|
181
|
+
// Initialize anonymization token map
|
|
182
|
+
this.tokenMap.clear();
|
|
183
|
+
console.log('TestDataArchitectAgent initialized successfully');
|
|
184
|
+
}
|
|
185
|
+
async performTask(task) {
|
|
186
|
+
console.log(`TestDataArchitectAgent executing task: ${task.type}`);
|
|
187
|
+
switch (task.type) {
|
|
188
|
+
case 'introspect-schema':
|
|
189
|
+
return await this.introspectSchema(task.payload);
|
|
190
|
+
case 'generate-data':
|
|
191
|
+
return await this.generateData(task.payload);
|
|
192
|
+
case 'anonymize-data':
|
|
193
|
+
return await this.anonymizeData(task.payload);
|
|
194
|
+
case 'validate-data':
|
|
195
|
+
return await this.validateData(task.payload);
|
|
196
|
+
case 'generate-edge-cases':
|
|
197
|
+
return await this.generateEdgeCases(task.payload);
|
|
198
|
+
case 'analyze-production-patterns':
|
|
199
|
+
return await this.analyzeProductionPatterns(task.payload);
|
|
200
|
+
case 'create-data-version':
|
|
201
|
+
return await this.createDataVersion(task.payload);
|
|
202
|
+
case 'seed-database':
|
|
203
|
+
return await this.seedDatabase(task.payload);
|
|
204
|
+
default:
|
|
205
|
+
throw new Error(`Unknown task type: ${task.type}`);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
async loadKnowledge() {
|
|
209
|
+
// Load cached schemas from memory
|
|
210
|
+
const cachedSchemas = await this.retrieveSharedMemory(types_1.QEAgentType.TEST_DATA_ARCHITECT, 'schemas');
|
|
211
|
+
if (cachedSchemas) {
|
|
212
|
+
for (const [name, schema] of Object.entries(cachedSchemas)) {
|
|
213
|
+
this.schemaCache.set(name, schema);
|
|
214
|
+
}
|
|
215
|
+
console.log(`Loaded ${this.schemaCache.size} cached schemas`);
|
|
216
|
+
}
|
|
217
|
+
// Load data generation patterns
|
|
218
|
+
const patterns = await this.retrieveSharedMemory(types_1.QEAgentType.TEST_DATA_ARCHITECT, 'patterns');
|
|
219
|
+
if (patterns) {
|
|
220
|
+
console.log('Loaded data generation patterns');
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
async cleanup() {
|
|
224
|
+
console.log('TestDataArchitectAgent cleaning up...');
|
|
225
|
+
// Save schemas to shared memory
|
|
226
|
+
const schemasObject = Object.fromEntries(this.schemaCache.entries());
|
|
227
|
+
await this.storeSharedMemory('schemas', schemasObject);
|
|
228
|
+
// Clear caches
|
|
229
|
+
this.schemaCache.clear();
|
|
230
|
+
this.generatedDatasets.clear();
|
|
231
|
+
this.tokenMap.clear();
|
|
232
|
+
console.log('TestDataArchitectAgent cleanup complete');
|
|
233
|
+
}
|
|
234
|
+
// ============================================================================
|
|
235
|
+
// Schema Introspection Methods
|
|
236
|
+
// ============================================================================
|
|
237
|
+
/**
|
|
238
|
+
* Introspect database schema from various sources
|
|
239
|
+
*/
|
|
240
|
+
async introspectSchema(config) {
|
|
241
|
+
console.log(`Introspecting schema from ${config.source}`);
|
|
242
|
+
let schema;
|
|
243
|
+
switch (config.source) {
|
|
244
|
+
case 'postgresql':
|
|
245
|
+
case 'mysql':
|
|
246
|
+
case 'sqlite':
|
|
247
|
+
schema = await this.introspectSQLDatabase(config);
|
|
248
|
+
break;
|
|
249
|
+
case 'mongodb':
|
|
250
|
+
schema = await this.introspectMongoDatabase(config);
|
|
251
|
+
break;
|
|
252
|
+
case 'openapi':
|
|
253
|
+
schema = await this.introspectOpenAPISchema(config);
|
|
254
|
+
break;
|
|
255
|
+
case 'graphql':
|
|
256
|
+
schema = await this.introspectGraphQLSchema(config);
|
|
257
|
+
break;
|
|
258
|
+
case 'typescript':
|
|
259
|
+
schema = await this.introspectTypeScriptSchema(config);
|
|
260
|
+
break;
|
|
261
|
+
default:
|
|
262
|
+
throw new Error(`Unsupported schema source: ${config.source}`);
|
|
263
|
+
}
|
|
264
|
+
// Cache the schema
|
|
265
|
+
this.schemaCache.set(schema.name, schema);
|
|
266
|
+
// Store in shared memory
|
|
267
|
+
await this.storeSharedMemory(`schema:${schema.name}`, schema);
|
|
268
|
+
// Emit event
|
|
269
|
+
this.emitEvent('test-data.schema-introspected', {
|
|
270
|
+
agentId: this.agentId.id,
|
|
271
|
+
schemaName: schema.name,
|
|
272
|
+
tables: schema.tables.length,
|
|
273
|
+
relationships: schema.relationships.length
|
|
274
|
+
});
|
|
275
|
+
return schema;
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Introspect SQL database schema (PostgreSQL, MySQL, SQLite)
|
|
279
|
+
*/
|
|
280
|
+
async introspectSQLDatabase(config) {
|
|
281
|
+
// Mock implementation - in production, would connect to actual database
|
|
282
|
+
console.log(`Introspecting SQL database: ${config.source}`);
|
|
283
|
+
// Simulate schema introspection
|
|
284
|
+
const mockSchema = {
|
|
285
|
+
name: 'mock_database',
|
|
286
|
+
tables: [
|
|
287
|
+
{
|
|
288
|
+
name: 'users',
|
|
289
|
+
fields: [
|
|
290
|
+
{
|
|
291
|
+
name: 'id',
|
|
292
|
+
type: FieldType.UUID,
|
|
293
|
+
nullable: false,
|
|
294
|
+
format: SemanticFormat.UUID,
|
|
295
|
+
constraints: [{ type: 'not_null', value: true }],
|
|
296
|
+
sensitive: false,
|
|
297
|
+
generator: this.createGenerator('uuid')
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
name: 'email',
|
|
301
|
+
type: FieldType.STRING,
|
|
302
|
+
nullable: false,
|
|
303
|
+
maxLength: 255,
|
|
304
|
+
format: SemanticFormat.EMAIL,
|
|
305
|
+
constraints: [
|
|
306
|
+
{ type: 'not_null', value: true },
|
|
307
|
+
{ type: 'unique', value: true },
|
|
308
|
+
{ type: 'length', value: { max: 255 } }
|
|
309
|
+
],
|
|
310
|
+
sensitive: true,
|
|
311
|
+
generator: this.createGenerator('email')
|
|
312
|
+
},
|
|
313
|
+
{
|
|
314
|
+
name: 'name',
|
|
315
|
+
type: FieldType.STRING,
|
|
316
|
+
nullable: false,
|
|
317
|
+
maxLength: 100,
|
|
318
|
+
format: SemanticFormat.NAME,
|
|
319
|
+
constraints: [
|
|
320
|
+
{ type: 'not_null', value: true },
|
|
321
|
+
{ type: 'length', value: { max: 100 } }
|
|
322
|
+
],
|
|
323
|
+
sensitive: true,
|
|
324
|
+
generator: this.createGenerator('name')
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
name: 'age',
|
|
328
|
+
type: FieldType.INTEGER,
|
|
329
|
+
nullable: false,
|
|
330
|
+
constraints: [
|
|
331
|
+
{ type: 'not_null', value: true },
|
|
332
|
+
{ type: 'min', value: 18 },
|
|
333
|
+
{ type: 'max', value: 120 }
|
|
334
|
+
],
|
|
335
|
+
sensitive: false,
|
|
336
|
+
generator: this.createGenerator('age')
|
|
337
|
+
},
|
|
338
|
+
{
|
|
339
|
+
name: 'created_at',
|
|
340
|
+
type: FieldType.TIMESTAMP,
|
|
341
|
+
nullable: false,
|
|
342
|
+
defaultValue: 'NOW()',
|
|
343
|
+
constraints: [{ type: 'not_null', value: true }],
|
|
344
|
+
sensitive: false,
|
|
345
|
+
generator: this.createGenerator('timestamp')
|
|
346
|
+
}
|
|
347
|
+
],
|
|
348
|
+
primaryKey: ['id'],
|
|
349
|
+
uniqueConstraints: [['email']],
|
|
350
|
+
checkConstraints: [
|
|
351
|
+
{
|
|
352
|
+
name: 'age_check',
|
|
353
|
+
expression: 'age >= 18 AND age <= 120'
|
|
354
|
+
}
|
|
355
|
+
],
|
|
356
|
+
foreignKeys: []
|
|
357
|
+
},
|
|
358
|
+
{
|
|
359
|
+
name: 'orders',
|
|
360
|
+
fields: [
|
|
361
|
+
{
|
|
362
|
+
name: 'id',
|
|
363
|
+
type: FieldType.INTEGER,
|
|
364
|
+
nullable: false,
|
|
365
|
+
constraints: [{ type: 'not_null', value: true }],
|
|
366
|
+
sensitive: false,
|
|
367
|
+
generator: this.createGenerator('integer')
|
|
368
|
+
},
|
|
369
|
+
{
|
|
370
|
+
name: 'user_id',
|
|
371
|
+
type: FieldType.UUID,
|
|
372
|
+
nullable: false,
|
|
373
|
+
format: SemanticFormat.UUID,
|
|
374
|
+
constraints: [{ type: 'not_null', value: true }],
|
|
375
|
+
sensitive: false,
|
|
376
|
+
generator: this.createGenerator('uuid')
|
|
377
|
+
},
|
|
378
|
+
{
|
|
379
|
+
name: 'total',
|
|
380
|
+
type: FieldType.DECIMAL,
|
|
381
|
+
nullable: false,
|
|
382
|
+
precision: 10,
|
|
383
|
+
scale: 2,
|
|
384
|
+
format: SemanticFormat.PRICE,
|
|
385
|
+
constraints: [
|
|
386
|
+
{ type: 'not_null', value: true },
|
|
387
|
+
{ type: 'min', value: 0 }
|
|
388
|
+
],
|
|
389
|
+
sensitive: false,
|
|
390
|
+
generator: this.createGenerator('price')
|
|
391
|
+
},
|
|
392
|
+
{
|
|
393
|
+
name: 'status',
|
|
394
|
+
type: FieldType.ENUM,
|
|
395
|
+
nullable: false,
|
|
396
|
+
constraints: [
|
|
397
|
+
{ type: 'not_null', value: true },
|
|
398
|
+
{ type: 'enum', value: ['pending', 'completed', 'cancelled'] }
|
|
399
|
+
],
|
|
400
|
+
sensitive: false,
|
|
401
|
+
generator: this.createGenerator('enum', ['pending', 'completed', 'cancelled'])
|
|
402
|
+
},
|
|
403
|
+
{
|
|
404
|
+
name: 'created_at',
|
|
405
|
+
type: FieldType.TIMESTAMP,
|
|
406
|
+
nullable: false,
|
|
407
|
+
defaultValue: 'NOW()',
|
|
408
|
+
constraints: [{ type: 'not_null', value: true }],
|
|
409
|
+
sensitive: false,
|
|
410
|
+
generator: this.createGenerator('timestamp')
|
|
411
|
+
}
|
|
412
|
+
],
|
|
413
|
+
primaryKey: ['id'],
|
|
414
|
+
uniqueConstraints: [],
|
|
415
|
+
checkConstraints: [
|
|
416
|
+
{
|
|
417
|
+
name: 'total_check',
|
|
418
|
+
expression: 'total >= 0'
|
|
419
|
+
}
|
|
420
|
+
],
|
|
421
|
+
foreignKeys: [
|
|
422
|
+
{
|
|
423
|
+
column: 'user_id',
|
|
424
|
+
referencedTable: 'users',
|
|
425
|
+
referencedColumn: 'id',
|
|
426
|
+
onDelete: 'CASCADE'
|
|
427
|
+
}
|
|
428
|
+
]
|
|
429
|
+
}
|
|
430
|
+
],
|
|
431
|
+
relationships: [
|
|
432
|
+
{
|
|
433
|
+
from: 'orders',
|
|
434
|
+
to: 'users',
|
|
435
|
+
type: 'one-to-many',
|
|
436
|
+
foreignKey: 'user_id'
|
|
437
|
+
}
|
|
438
|
+
],
|
|
439
|
+
indexes: [
|
|
440
|
+
{
|
|
441
|
+
name: 'idx_users_email',
|
|
442
|
+
table: 'users',
|
|
443
|
+
columns: ['email'],
|
|
444
|
+
unique: true
|
|
445
|
+
},
|
|
446
|
+
{
|
|
447
|
+
name: 'idx_orders_user_id',
|
|
448
|
+
table: 'orders',
|
|
449
|
+
columns: ['user_id'],
|
|
450
|
+
unique: false
|
|
451
|
+
}
|
|
452
|
+
],
|
|
453
|
+
constraints: []
|
|
454
|
+
};
|
|
455
|
+
return mockSchema;
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* Introspect MongoDB schema
|
|
459
|
+
*/
|
|
460
|
+
async introspectMongoDatabase(config) {
|
|
461
|
+
// Mock implementation
|
|
462
|
+
console.log('Introspecting MongoDB schema');
|
|
463
|
+
// In production, would analyze MongoDB collections and documents
|
|
464
|
+
return {
|
|
465
|
+
name: 'mongo_database',
|
|
466
|
+
tables: [],
|
|
467
|
+
relationships: [],
|
|
468
|
+
indexes: [],
|
|
469
|
+
constraints: []
|
|
470
|
+
};
|
|
471
|
+
}
|
|
472
|
+
/**
|
|
473
|
+
* Introspect OpenAPI schema
|
|
474
|
+
*/
|
|
475
|
+
async introspectOpenAPISchema(config) {
|
|
476
|
+
// Mock implementation
|
|
477
|
+
console.log('Introspecting OpenAPI schema');
|
|
478
|
+
return {
|
|
479
|
+
name: 'api_schema',
|
|
480
|
+
tables: [],
|
|
481
|
+
relationships: [],
|
|
482
|
+
indexes: [],
|
|
483
|
+
constraints: []
|
|
484
|
+
};
|
|
485
|
+
}
|
|
486
|
+
/**
|
|
487
|
+
* Introspect GraphQL schema
|
|
488
|
+
*/
|
|
489
|
+
async introspectGraphQLSchema(config) {
|
|
490
|
+
// Mock implementation
|
|
491
|
+
console.log('Introspecting GraphQL schema');
|
|
492
|
+
return {
|
|
493
|
+
name: 'graphql_schema',
|
|
494
|
+
tables: [],
|
|
495
|
+
relationships: [],
|
|
496
|
+
indexes: [],
|
|
497
|
+
constraints: []
|
|
498
|
+
};
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* Introspect TypeScript schema
|
|
502
|
+
*/
|
|
503
|
+
async introspectTypeScriptSchema(config) {
|
|
504
|
+
// Mock implementation
|
|
505
|
+
console.log('Introspecting TypeScript schema');
|
|
506
|
+
return {
|
|
507
|
+
name: 'typescript_schema',
|
|
508
|
+
tables: [],
|
|
509
|
+
relationships: [],
|
|
510
|
+
indexes: [],
|
|
511
|
+
constraints: []
|
|
512
|
+
};
|
|
513
|
+
}
|
|
514
|
+
// ============================================================================
|
|
515
|
+
// Data Generation Methods
|
|
516
|
+
// ============================================================================
|
|
517
|
+
/**
|
|
518
|
+
* Generate test data based on schema
|
|
519
|
+
*/
|
|
520
|
+
async generateData(request) {
|
|
521
|
+
const startTime = Date.now();
|
|
522
|
+
console.log(`Generating ${request.count} records`);
|
|
523
|
+
let schema;
|
|
524
|
+
if ('tables' in request.schema) {
|
|
525
|
+
schema = request.schema;
|
|
526
|
+
}
|
|
527
|
+
else {
|
|
528
|
+
// Single table schema
|
|
529
|
+
schema = {
|
|
530
|
+
name: 'single_table',
|
|
531
|
+
tables: [request.schema],
|
|
532
|
+
relationships: [],
|
|
533
|
+
indexes: [],
|
|
534
|
+
constraints: []
|
|
535
|
+
};
|
|
536
|
+
}
|
|
537
|
+
// Generate data with referential integrity
|
|
538
|
+
const data = await this.generateWithIntegrity(schema, request.count);
|
|
539
|
+
// Generate edge cases if requested
|
|
540
|
+
let edgeCases;
|
|
541
|
+
if (request.includeEdgeCases) {
|
|
542
|
+
edgeCases = await this.generateEdgeCasesForSchema(schema);
|
|
543
|
+
}
|
|
544
|
+
// Anonymize PII if requested
|
|
545
|
+
if (request.anonymizePII && this.config.piiAnonymization) {
|
|
546
|
+
await this.anonymizeDataset(data);
|
|
547
|
+
}
|
|
548
|
+
// Validate generated data
|
|
549
|
+
const validationResult = await this.validateGeneratedData(data, schema);
|
|
550
|
+
const duration = Date.now() - startTime;
|
|
551
|
+
const generationRate = (request.count / duration) * 1000; // records/second
|
|
552
|
+
const result = {
|
|
553
|
+
id: this.generateDatasetId(),
|
|
554
|
+
schema: schema.name,
|
|
555
|
+
recordsGenerated: request.count,
|
|
556
|
+
duration,
|
|
557
|
+
generationRate,
|
|
558
|
+
data,
|
|
559
|
+
edgeCases,
|
|
560
|
+
validationResult,
|
|
561
|
+
metadata: {
|
|
562
|
+
timestamp: new Date(),
|
|
563
|
+
generator: 'TestDataArchitectAgent',
|
|
564
|
+
version: '1.0.0',
|
|
565
|
+
config: request,
|
|
566
|
+
statistics: this.calculateStatistics(data)
|
|
567
|
+
}
|
|
568
|
+
};
|
|
569
|
+
// Store dataset
|
|
570
|
+
this.generatedDatasets.set(result.id, data);
|
|
571
|
+
// Store in shared memory
|
|
572
|
+
await this.storeSharedMemory(`dataset:${result.id}`, result);
|
|
573
|
+
// Emit event
|
|
574
|
+
this.emitEvent('test-data.generated', {
|
|
575
|
+
agentId: this.agentId.id,
|
|
576
|
+
datasetId: result.id,
|
|
577
|
+
recordsGenerated: request.count,
|
|
578
|
+
generationRate,
|
|
579
|
+
duration
|
|
580
|
+
}, 'high');
|
|
581
|
+
console.log(`Generated ${request.count} records in ${duration}ms (${generationRate.toFixed(0)} records/sec)`);
|
|
582
|
+
return result;
|
|
583
|
+
}
|
|
584
|
+
/**
|
|
585
|
+
* Generate data with referential integrity preserved
|
|
586
|
+
*/
|
|
587
|
+
async generateWithIntegrity(schema, count) {
|
|
588
|
+
const data = {};
|
|
589
|
+
// Topological sort to determine generation order
|
|
590
|
+
const generationOrder = this.topologicalSort(schema);
|
|
591
|
+
for (const table of generationOrder) {
|
|
592
|
+
data[table.name] = await this.generateTableData(table, count, data);
|
|
593
|
+
}
|
|
594
|
+
return {
|
|
595
|
+
tables: data,
|
|
596
|
+
format: 'json',
|
|
597
|
+
size: Object.values(data).reduce((sum, records) => sum + records.length, 0)
|
|
598
|
+
};
|
|
599
|
+
}
|
|
600
|
+
/**
|
|
601
|
+
* Generate data for a single table
|
|
602
|
+
*/
|
|
603
|
+
async generateTableData(table, count, existingData) {
|
|
604
|
+
const records = [];
|
|
605
|
+
const batchSize = this.config.batchSize || 1000;
|
|
606
|
+
for (let i = 0; i < count; i += batchSize) {
|
|
607
|
+
const batchCount = Math.min(batchSize, count - i);
|
|
608
|
+
const batch = await this.generateBatch(table, batchCount, existingData);
|
|
609
|
+
records.push(...batch);
|
|
610
|
+
}
|
|
611
|
+
return records;
|
|
612
|
+
}
|
|
613
|
+
/**
|
|
614
|
+
* Generate a batch of records
|
|
615
|
+
*/
|
|
616
|
+
async generateBatch(table, count, existingData) {
|
|
617
|
+
const records = [];
|
|
618
|
+
for (let i = 0; i < count; i++) {
|
|
619
|
+
const record = {};
|
|
620
|
+
for (const field of table.fields) {
|
|
621
|
+
// Check for foreign key
|
|
622
|
+
const fk = table.foreignKeys.find(fk => fk.column === field.name);
|
|
623
|
+
if (fk) {
|
|
624
|
+
// Select valid foreign key from parent table
|
|
625
|
+
const parentRecords = existingData[fk.referencedTable];
|
|
626
|
+
if (parentRecords && parentRecords.length > 0) {
|
|
627
|
+
const parentRecord = this.selectRandom(parentRecords);
|
|
628
|
+
record[field.name] = parentRecord[fk.referencedColumn];
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
else if (field.generator) {
|
|
632
|
+
// Use field generator
|
|
633
|
+
record[field.name] = field.generator();
|
|
634
|
+
}
|
|
635
|
+
else {
|
|
636
|
+
// Fallback generator
|
|
637
|
+
record[field.name] = this.generateFieldValue(field);
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
records.push(record);
|
|
641
|
+
}
|
|
642
|
+
return records;
|
|
643
|
+
}
|
|
644
|
+
/**
|
|
645
|
+
* Topological sort for dependency resolution
|
|
646
|
+
*/
|
|
647
|
+
topologicalSort(schema) {
|
|
648
|
+
const sorted = [];
|
|
649
|
+
const visited = new Set();
|
|
650
|
+
const visiting = new Set();
|
|
651
|
+
const visit = (tableName) => {
|
|
652
|
+
if (visited.has(tableName))
|
|
653
|
+
return;
|
|
654
|
+
if (visiting.has(tableName)) {
|
|
655
|
+
throw new Error(`Circular dependency detected: ${tableName}`);
|
|
656
|
+
}
|
|
657
|
+
visiting.add(tableName);
|
|
658
|
+
const table = schema.tables.find(t => t.name === tableName);
|
|
659
|
+
if (!table)
|
|
660
|
+
return;
|
|
661
|
+
// Visit dependencies (tables referenced by foreign keys)
|
|
662
|
+
for (const fk of table.foreignKeys) {
|
|
663
|
+
visit(fk.referencedTable);
|
|
664
|
+
}
|
|
665
|
+
visiting.delete(tableName);
|
|
666
|
+
visited.add(tableName);
|
|
667
|
+
sorted.push(table);
|
|
668
|
+
};
|
|
669
|
+
for (const table of schema.tables) {
|
|
670
|
+
visit(table.name);
|
|
671
|
+
}
|
|
672
|
+
return sorted;
|
|
673
|
+
}
|
|
674
|
+
// ============================================================================
|
|
675
|
+
// Edge Case Generation
|
|
676
|
+
// ============================================================================
|
|
677
|
+
/**
|
|
678
|
+
* Generate edge case data
|
|
679
|
+
*/
|
|
680
|
+
async generateEdgeCases(config) {
|
|
681
|
+
console.log('Generating edge case data');
|
|
682
|
+
let schema;
|
|
683
|
+
if ('tables' in config.schema) {
|
|
684
|
+
schema = config.schema;
|
|
685
|
+
}
|
|
686
|
+
else {
|
|
687
|
+
schema = {
|
|
688
|
+
name: 'edge_cases',
|
|
689
|
+
tables: [config.schema],
|
|
690
|
+
relationships: [],
|
|
691
|
+
indexes: [],
|
|
692
|
+
constraints: []
|
|
693
|
+
};
|
|
694
|
+
}
|
|
695
|
+
const edgeCases = await this.generateEdgeCasesForSchema(schema);
|
|
696
|
+
return edgeCases.records || [];
|
|
697
|
+
}
|
|
698
|
+
/**
|
|
699
|
+
* Generate edge cases for entire schema
|
|
700
|
+
*/
|
|
701
|
+
async generateEdgeCasesForSchema(schema) {
|
|
702
|
+
const edgeCases = {};
|
|
703
|
+
for (const table of schema.tables) {
|
|
704
|
+
edgeCases[table.name] = await this.generateEdgeCasesForTable(table);
|
|
705
|
+
}
|
|
706
|
+
return {
|
|
707
|
+
tables: edgeCases,
|
|
708
|
+
format: 'json',
|
|
709
|
+
size: Object.values(edgeCases).reduce((sum, cases) => sum + cases.length, 0)
|
|
710
|
+
};
|
|
711
|
+
}
|
|
712
|
+
/**
|
|
713
|
+
* Generate edge cases for a table
|
|
714
|
+
*/
|
|
715
|
+
async generateEdgeCasesForTable(table) {
|
|
716
|
+
const edgeCases = [];
|
|
717
|
+
for (const field of table.fields) {
|
|
718
|
+
const fieldEdgeCases = this.generateFieldEdgeCases(field);
|
|
719
|
+
for (const edgeValue of fieldEdgeCases) {
|
|
720
|
+
const record = {};
|
|
721
|
+
// Fill other fields with normal values
|
|
722
|
+
for (const f of table.fields) {
|
|
723
|
+
if (f.name === field.name) {
|
|
724
|
+
record[f.name] = edgeValue;
|
|
725
|
+
}
|
|
726
|
+
else {
|
|
727
|
+
record[f.name] = f.generator ? f.generator() : this.generateFieldValue(f);
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
edgeCases.push(record);
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
return edgeCases;
|
|
734
|
+
}
|
|
735
|
+
/**
|
|
736
|
+
* Generate edge cases for a field
|
|
737
|
+
*/
|
|
738
|
+
generateFieldEdgeCases(field) {
|
|
739
|
+
const edgeCases = [];
|
|
740
|
+
switch (field.type) {
|
|
741
|
+
case FieldType.STRING:
|
|
742
|
+
case FieldType.TEXT:
|
|
743
|
+
edgeCases.push('', // Empty string
|
|
744
|
+
' ', // Single space
|
|
745
|
+
'a', // Single character
|
|
746
|
+
field.maxLength ? 'x'.repeat(field.maxLength) : 'x'.repeat(255), // Max length
|
|
747
|
+
'Test\nNewline', // Newline
|
|
748
|
+
'Test\tTab', // Tab
|
|
749
|
+
"Test'Quote", // Single quote
|
|
750
|
+
'Test"DoubleQuote', // Double quote
|
|
751
|
+
'Test\\Backslash', // Backslash
|
|
752
|
+
'Ñoño', // Accented characters
|
|
753
|
+
'中文', // Chinese characters
|
|
754
|
+
'🚀💻', // Emojis
|
|
755
|
+
'<script>alert("XSS")</script>', // XSS attempt
|
|
756
|
+
"'; DROP TABLE users;--", // SQL injection
|
|
757
|
+
'../../etc/passwd' // Path traversal
|
|
758
|
+
);
|
|
759
|
+
break;
|
|
760
|
+
case FieldType.INTEGER:
|
|
761
|
+
const minConstraint = field.constraints.find(c => c.type === 'min');
|
|
762
|
+
const maxConstraint = field.constraints.find(c => c.type === 'max');
|
|
763
|
+
edgeCases.push(0, // Zero
|
|
764
|
+
1, // Minimum positive
|
|
765
|
+
-1, // Minimum negative
|
|
766
|
+
minConstraint ? minConstraint.value : -2147483648, maxConstraint ? maxConstraint.value : 2147483647);
|
|
767
|
+
if (minConstraint) {
|
|
768
|
+
edgeCases.push(minConstraint.value - 1);
|
|
769
|
+
edgeCases.push(minConstraint.value + 1);
|
|
770
|
+
}
|
|
771
|
+
if (maxConstraint) {
|
|
772
|
+
edgeCases.push(maxConstraint.value - 1);
|
|
773
|
+
edgeCases.push(maxConstraint.value + 1);
|
|
774
|
+
}
|
|
775
|
+
break;
|
|
776
|
+
case FieldType.FLOAT:
|
|
777
|
+
case FieldType.DECIMAL:
|
|
778
|
+
edgeCases.push(0.0, 0.1, -0.1, 3.14159265359, 0.000000001, // Very small
|
|
779
|
+
999999999.999999 // Very large
|
|
780
|
+
);
|
|
781
|
+
break;
|
|
782
|
+
case FieldType.DATE:
|
|
783
|
+
case FieldType.DATETIME:
|
|
784
|
+
case FieldType.TIMESTAMP:
|
|
785
|
+
edgeCases.push(new Date('1970-01-01'), // Unix epoch
|
|
786
|
+
new Date('1900-01-01'), // Old date
|
|
787
|
+
new Date('2099-12-31'), // Future date
|
|
788
|
+
new Date(), // Current date
|
|
789
|
+
new Date('2000-02-29') // Leap year
|
|
790
|
+
);
|
|
791
|
+
break;
|
|
792
|
+
case FieldType.BOOLEAN:
|
|
793
|
+
edgeCases.push(true, false);
|
|
794
|
+
break;
|
|
795
|
+
}
|
|
796
|
+
// Add null if nullable
|
|
797
|
+
if (field.nullable) {
|
|
798
|
+
edgeCases.push(null);
|
|
799
|
+
}
|
|
800
|
+
return edgeCases;
|
|
801
|
+
}
|
|
802
|
+
// ============================================================================
|
|
803
|
+
// PII Anonymization Methods
|
|
804
|
+
// ============================================================================
|
|
805
|
+
/**
|
|
806
|
+
* Anonymize PII data
|
|
807
|
+
*/
|
|
808
|
+
async anonymizeData(config) {
|
|
809
|
+
console.log('Anonymizing PII data');
|
|
810
|
+
const strategy = config.strategy || AnonymizationStrategy.TOKENIZE;
|
|
811
|
+
const originalRecords = config.data.length;
|
|
812
|
+
const fieldsAnonymized = [];
|
|
813
|
+
for (const record of config.data) {
|
|
814
|
+
for (const field of config.schema.fields) {
|
|
815
|
+
if (field.sensitive) {
|
|
816
|
+
record[field.name] = this.anonymizeField(record[field.name], field, strategy);
|
|
817
|
+
if (!fieldsAnonymized.includes(field.name)) {
|
|
818
|
+
fieldsAnonymized.push(field.name);
|
|
819
|
+
}
|
|
820
|
+
}
|
|
821
|
+
}
|
|
822
|
+
}
|
|
823
|
+
return {
|
|
824
|
+
originalRecords,
|
|
825
|
+
anonymizedRecords: config.data.length,
|
|
826
|
+
fieldsAnonymized,
|
|
827
|
+
strategy,
|
|
828
|
+
statisticalValidation: {
|
|
829
|
+
correlationPreserved: true,
|
|
830
|
+
distributionSimilarity: 0.95,
|
|
831
|
+
deviationFromOriginal: 0.05
|
|
832
|
+
},
|
|
833
|
+
gdprCompliant: this.config.gdprCompliant || false
|
|
834
|
+
};
|
|
835
|
+
}
|
|
836
|
+
/**
|
|
837
|
+
* Anonymize dataset
|
|
838
|
+
*/
|
|
839
|
+
async anonymizeDataset(dataset) {
|
|
840
|
+
if (dataset.tables) {
|
|
841
|
+
for (const [tableName, records] of Object.entries(dataset.tables)) {
|
|
842
|
+
// Find table schema
|
|
843
|
+
const schema = Array.from(this.schemaCache.values())
|
|
844
|
+
.flatMap(s => s.tables)
|
|
845
|
+
.find(t => t.name === tableName);
|
|
846
|
+
if (schema) {
|
|
847
|
+
for (const record of records) {
|
|
848
|
+
for (const field of schema.fields) {
|
|
849
|
+
if (field.sensitive) {
|
|
850
|
+
record[field.name] = this.anonymizeField(record[field.name], field, AnonymizationStrategy.TOKENIZE);
|
|
851
|
+
}
|
|
852
|
+
}
|
|
853
|
+
}
|
|
854
|
+
}
|
|
855
|
+
}
|
|
856
|
+
}
|
|
857
|
+
}
|
|
858
|
+
/**
|
|
859
|
+
* Anonymize a single field value
|
|
860
|
+
*/
|
|
861
|
+
anonymizeField(value, field, strategy) {
|
|
862
|
+
if (value === null || value === undefined) {
|
|
863
|
+
return value;
|
|
864
|
+
}
|
|
865
|
+
switch (strategy) {
|
|
866
|
+
case AnonymizationStrategy.MASK:
|
|
867
|
+
return this.maskValue(value, field);
|
|
868
|
+
case AnonymizationStrategy.HASH:
|
|
869
|
+
return this.hashValue(value);
|
|
870
|
+
case AnonymizationStrategy.TOKENIZE:
|
|
871
|
+
return this.tokenizeValue(value, field);
|
|
872
|
+
case AnonymizationStrategy.GENERALIZE:
|
|
873
|
+
return this.generalizeValue(value, field);
|
|
874
|
+
case AnonymizationStrategy.SUBSTITUTE:
|
|
875
|
+
return this.substituteValue(field);
|
|
876
|
+
case AnonymizationStrategy.SYNTHETIC:
|
|
877
|
+
return this.generateFieldValue(field);
|
|
878
|
+
default:
|
|
879
|
+
return value;
|
|
880
|
+
}
|
|
881
|
+
}
|
|
882
|
+
/**
|
|
883
|
+
* Mask a value (show first and last char)
|
|
884
|
+
*/
|
|
885
|
+
maskValue(value, field) {
|
|
886
|
+
const str = String(value);
|
|
887
|
+
if (str.length <= 2) {
|
|
888
|
+
return '**';
|
|
889
|
+
}
|
|
890
|
+
return str[0] + '*'.repeat(str.length - 2) + str[str.length - 1];
|
|
891
|
+
}
|
|
892
|
+
/**
|
|
893
|
+
* Hash a value (deterministic)
|
|
894
|
+
*/
|
|
895
|
+
hashValue(value) {
|
|
896
|
+
// Simple hash function (in production, use crypto)
|
|
897
|
+
const str = String(value);
|
|
898
|
+
let hash = 0;
|
|
899
|
+
for (let i = 0; i < str.length; i++) {
|
|
900
|
+
const char = str.charCodeAt(i);
|
|
901
|
+
hash = ((hash << 5) - hash) + char;
|
|
902
|
+
hash = hash & hash; // Convert to 32bit integer
|
|
903
|
+
}
|
|
904
|
+
return Math.abs(hash).toString(36).substring(0, 16);
|
|
905
|
+
}
|
|
906
|
+
/**
|
|
907
|
+
* Tokenize a value (consistent replacement)
|
|
908
|
+
*/
|
|
909
|
+
tokenizeValue(value, field) {
|
|
910
|
+
const key = `${field.name}:${value}`;
|
|
911
|
+
if (!this.tokenMap.has(key)) {
|
|
912
|
+
this.tokenMap.set(key, this.generateFieldValue(field));
|
|
913
|
+
}
|
|
914
|
+
return this.tokenMap.get(key);
|
|
915
|
+
}
|
|
916
|
+
/**
|
|
917
|
+
* Generalize a value (reduce precision)
|
|
918
|
+
*/
|
|
919
|
+
generalizeValue(value, field) {
|
|
920
|
+
if (field.type === FieldType.INTEGER || field.type === FieldType.FLOAT) {
|
|
921
|
+
return Math.round(Number(value) / 10) * 10;
|
|
922
|
+
}
|
|
923
|
+
if (field.type === FieldType.DATE || field.type === FieldType.DATETIME) {
|
|
924
|
+
const date = new Date(value);
|
|
925
|
+
return new Date(date.getFullYear(), date.getMonth(), 1);
|
|
926
|
+
}
|
|
927
|
+
return value;
|
|
928
|
+
}
|
|
929
|
+
/**
|
|
930
|
+
* Substitute with random value
|
|
931
|
+
*/
|
|
932
|
+
substituteValue(field) {
|
|
933
|
+
return this.generateFieldValue(field);
|
|
934
|
+
}
|
|
935
|
+
// ============================================================================
|
|
936
|
+
// Validation Methods
|
|
937
|
+
// ============================================================================
|
|
938
|
+
/**
|
|
939
|
+
* Validate generated data
|
|
940
|
+
*/
|
|
941
|
+
async validateData(config) {
|
|
942
|
+
console.log('Validating generated data');
|
|
943
|
+
let schema;
|
|
944
|
+
if ('tables' in config.schema) {
|
|
945
|
+
schema = config.schema;
|
|
946
|
+
}
|
|
947
|
+
else {
|
|
948
|
+
schema = {
|
|
949
|
+
name: 'validation',
|
|
950
|
+
tables: [config.schema],
|
|
951
|
+
relationships: [],
|
|
952
|
+
indexes: [],
|
|
953
|
+
constraints: []
|
|
954
|
+
};
|
|
955
|
+
}
|
|
956
|
+
const dataset = {
|
|
957
|
+
tables: { [schema.tables[0].name]: config.data },
|
|
958
|
+
format: 'json',
|
|
959
|
+
size: config.data.length
|
|
960
|
+
};
|
|
961
|
+
return await this.validateGeneratedData(dataset, schema);
|
|
962
|
+
}
|
|
963
|
+
/**
|
|
964
|
+
* Validate generated dataset
|
|
965
|
+
*/
|
|
966
|
+
async validateGeneratedData(dataset, schema) {
|
|
967
|
+
const violations = [];
|
|
968
|
+
const warnings = [];
|
|
969
|
+
const integrityChecks = [];
|
|
970
|
+
if (!dataset.tables) {
|
|
971
|
+
return { valid: true, violations, warnings, integrityChecks };
|
|
972
|
+
}
|
|
973
|
+
for (const table of schema.tables) {
|
|
974
|
+
const records = dataset.tables[table.name] || [];
|
|
975
|
+
// Check NOT NULL constraints
|
|
976
|
+
for (const field of table.fields) {
|
|
977
|
+
const notNullConstraint = field.constraints.find(c => c.type === 'not_null');
|
|
978
|
+
if (notNullConstraint) {
|
|
979
|
+
for (const record of records) {
|
|
980
|
+
if (record[field.name] === null || record[field.name] === undefined) {
|
|
981
|
+
violations.push({
|
|
982
|
+
type: 'NOT_NULL',
|
|
983
|
+
field: field.name,
|
|
984
|
+
table: table.name,
|
|
985
|
+
value: record[field.name],
|
|
986
|
+
message: `Field ${field.name} cannot be null`,
|
|
987
|
+
severity: 'ERROR'
|
|
988
|
+
});
|
|
989
|
+
}
|
|
990
|
+
}
|
|
991
|
+
}
|
|
992
|
+
}
|
|
993
|
+
// Check UNIQUE constraints
|
|
994
|
+
for (const uniqueFields of table.uniqueConstraints) {
|
|
995
|
+
const values = new Set();
|
|
996
|
+
for (const record of records) {
|
|
997
|
+
const value = uniqueFields.map(f => record[f]).join('|');
|
|
998
|
+
if (values.has(value)) {
|
|
999
|
+
violations.push({
|
|
1000
|
+
type: 'UNIQUE',
|
|
1001
|
+
field: uniqueFields.join(', '),
|
|
1002
|
+
table: table.name,
|
|
1003
|
+
message: `Duplicate value for unique constraint: ${uniqueFields.join(', ')}`,
|
|
1004
|
+
severity: 'ERROR'
|
|
1005
|
+
});
|
|
1006
|
+
}
|
|
1007
|
+
values.add(value);
|
|
1008
|
+
}
|
|
1009
|
+
integrityChecks.push({
|
|
1010
|
+
type: 'UNIQUE',
|
|
1011
|
+
table: table.name,
|
|
1012
|
+
status: violations.length === 0 ? 'PASS' : 'FAIL'
|
|
1013
|
+
});
|
|
1014
|
+
}
|
|
1015
|
+
// Check FOREIGN KEY constraints
|
|
1016
|
+
for (const fk of table.foreignKeys) {
|
|
1017
|
+
const parentRecords = dataset.tables[fk.referencedTable] || [];
|
|
1018
|
+
const parentValues = new Set(parentRecords.map(r => r[fk.referencedColumn]));
|
|
1019
|
+
for (const record of records) {
|
|
1020
|
+
const fkValue = record[fk.column];
|
|
1021
|
+
if (fkValue !== null && !parentValues.has(fkValue)) {
|
|
1022
|
+
violations.push({
|
|
1023
|
+
type: 'FOREIGN_KEY',
|
|
1024
|
+
field: fk.column,
|
|
1025
|
+
table: table.name,
|
|
1026
|
+
value: fkValue,
|
|
1027
|
+
message: `Foreign key violation: ${fk.column} references non-existent ${fk.referencedTable}.${fk.referencedColumn}`,
|
|
1028
|
+
severity: 'ERROR'
|
|
1029
|
+
});
|
|
1030
|
+
}
|
|
1031
|
+
}
|
|
1032
|
+
integrityChecks.push({
|
|
1033
|
+
type: 'FOREIGN_KEY',
|
|
1034
|
+
table: table.name,
|
|
1035
|
+
status: violations.length === 0 ? 'PASS' : 'FAIL'
|
|
1036
|
+
});
|
|
1037
|
+
}
|
|
1038
|
+
// Check CHECK constraints
|
|
1039
|
+
for (const checkConstraint of table.checkConstraints) {
|
|
1040
|
+
for (const record of records) {
|
|
1041
|
+
if (!this.evaluateCheckConstraint(record, checkConstraint)) {
|
|
1042
|
+
violations.push({
|
|
1043
|
+
type: 'CHECK',
|
|
1044
|
+
field: checkConstraint.name,
|
|
1045
|
+
table: table.name,
|
|
1046
|
+
message: `Check constraint violated: ${checkConstraint.expression}`,
|
|
1047
|
+
severity: 'ERROR'
|
|
1048
|
+
});
|
|
1049
|
+
}
|
|
1050
|
+
}
|
|
1051
|
+
}
|
|
1052
|
+
}
|
|
1053
|
+
return {
|
|
1054
|
+
valid: violations.length === 0,
|
|
1055
|
+
violations,
|
|
1056
|
+
warnings,
|
|
1057
|
+
integrityChecks
|
|
1058
|
+
};
|
|
1059
|
+
}
|
|
1060
|
+
/**
|
|
1061
|
+
* Evaluate a check constraint
|
|
1062
|
+
*/
|
|
1063
|
+
evaluateCheckConstraint(record, constraint) {
|
|
1064
|
+
try {
|
|
1065
|
+
// Replace field names with values
|
|
1066
|
+
let expression = constraint.expression;
|
|
1067
|
+
for (const [field, value] of Object.entries(record)) {
|
|
1068
|
+
expression = expression.replace(new RegExp(`\\b${field}\\b`, 'g'), String(value));
|
|
1069
|
+
}
|
|
1070
|
+
// Simple evaluation (in production, use safe expression evaluator)
|
|
1071
|
+
return eval(expression);
|
|
1072
|
+
}
|
|
1073
|
+
catch (error) {
|
|
1074
|
+
console.error(`Error evaluating constraint: ${constraint.expression}`, error);
|
|
1075
|
+
return false;
|
|
1076
|
+
}
|
|
1077
|
+
}
|
|
1078
|
+
// ============================================================================
|
|
1079
|
+
// Production Pattern Analysis
|
|
1080
|
+
// ============================================================================
|
|
1081
|
+
/**
|
|
1082
|
+
* Analyze production data patterns
|
|
1083
|
+
*/
|
|
1084
|
+
async analyzeProductionPatterns(config) {
|
|
1085
|
+
console.log('Analyzing production data patterns');
|
|
1086
|
+
const patterns = {
|
|
1087
|
+
distributions: {},
|
|
1088
|
+
correlations: {},
|
|
1089
|
+
commonValues: {}
|
|
1090
|
+
};
|
|
1091
|
+
// Analyze distributions for numeric fields
|
|
1092
|
+
for (const field of config.schema.fields) {
|
|
1093
|
+
if (field.type === FieldType.INTEGER || field.type === FieldType.FLOAT || field.type === FieldType.DECIMAL) {
|
|
1094
|
+
const values = config.data.map(r => Number(r[field.name])).filter(v => !isNaN(v));
|
|
1095
|
+
patterns.distributions[field.name] = this.calculateDistribution(values);
|
|
1096
|
+
}
|
|
1097
|
+
}
|
|
1098
|
+
return patterns;
|
|
1099
|
+
}
|
|
1100
|
+
/**
|
|
1101
|
+
* Calculate distribution statistics
|
|
1102
|
+
*/
|
|
1103
|
+
calculateDistribution(values) {
|
|
1104
|
+
if (values.length === 0) {
|
|
1105
|
+
return { min: 0, max: 0, mean: 0, median: 0, stdDev: 0 };
|
|
1106
|
+
}
|
|
1107
|
+
const sorted = values.slice().sort((a, b) => a - b);
|
|
1108
|
+
const min = sorted[0];
|
|
1109
|
+
const max = sorted[sorted.length - 1];
|
|
1110
|
+
const sum = values.reduce((a, b) => a + b, 0);
|
|
1111
|
+
const mean = sum / values.length;
|
|
1112
|
+
const median = sorted[Math.floor(sorted.length / 2)];
|
|
1113
|
+
const variance = values.reduce((sum, val) => sum + Math.pow(val - mean, 2), 0) / values.length;
|
|
1114
|
+
const stdDev = Math.sqrt(variance);
|
|
1115
|
+
return { min, max, mean, median, stdDev };
|
|
1116
|
+
}
|
|
1117
|
+
// ============================================================================
|
|
1118
|
+
// Data Versioning Methods
|
|
1119
|
+
// ============================================================================
|
|
1120
|
+
/**
|
|
1121
|
+
* Create a data version
|
|
1122
|
+
*/
|
|
1123
|
+
async createDataVersion(config) {
|
|
1124
|
+
console.log(`Creating data version: ${config.version}`);
|
|
1125
|
+
const dataset = this.generatedDatasets.get(config.datasetId);
|
|
1126
|
+
if (!dataset) {
|
|
1127
|
+
throw new Error(`Dataset not found: ${config.datasetId}`);
|
|
1128
|
+
}
|
|
1129
|
+
const version = {
|
|
1130
|
+
id: this.generateVersionId(),
|
|
1131
|
+
datasetId: config.datasetId,
|
|
1132
|
+
version: config.version,
|
|
1133
|
+
description: config.description,
|
|
1134
|
+
tags: config.tags || [],
|
|
1135
|
+
timestamp: new Date(),
|
|
1136
|
+
checksum: this.calculateChecksum(dataset),
|
|
1137
|
+
size: dataset.size
|
|
1138
|
+
};
|
|
1139
|
+
// Store version
|
|
1140
|
+
await this.storeSharedMemory(`version:${version.id}`, version);
|
|
1141
|
+
return version;
|
|
1142
|
+
}
|
|
1143
|
+
/**
|
|
1144
|
+
* Calculate checksum for dataset
|
|
1145
|
+
*/
|
|
1146
|
+
calculateChecksum(dataset) {
|
|
1147
|
+
const data = JSON.stringify(dataset);
|
|
1148
|
+
return this.hashValue(data);
|
|
1149
|
+
}
|
|
1150
|
+
// ============================================================================
|
|
1151
|
+
// Database Seeding Methods
|
|
1152
|
+
// ============================================================================
|
|
1153
|
+
/**
|
|
1154
|
+
* Seed database with generated data
|
|
1155
|
+
*/
|
|
1156
|
+
async seedDatabase(config) {
|
|
1157
|
+
console.log(`Seeding ${config.database} database`);
|
|
1158
|
+
const dataset = this.generatedDatasets.get(config.datasetId);
|
|
1159
|
+
if (!dataset) {
|
|
1160
|
+
throw new Error(`Dataset not found: ${config.datasetId}`);
|
|
1161
|
+
}
|
|
1162
|
+
// Mock implementation - in production, would connect to actual database
|
|
1163
|
+
return {
|
|
1164
|
+
success: true,
|
|
1165
|
+
recordsInserted: dataset.size,
|
|
1166
|
+
duration: 1000
|
|
1167
|
+
};
|
|
1168
|
+
}
|
|
1169
|
+
// ============================================================================
|
|
1170
|
+
// Helper Methods
|
|
1171
|
+
// ============================================================================
|
|
1172
|
+
/**
|
|
1173
|
+
* Initialize Faker.js
|
|
1174
|
+
*/
|
|
1175
|
+
async initializeFaker() {
|
|
1176
|
+
// Mock Faker.js initialization
|
|
1177
|
+
this.faker = {
|
|
1178
|
+
locale: this.config.fakerLocale || 'en',
|
|
1179
|
+
seed: this.config.seedValue
|
|
1180
|
+
};
|
|
1181
|
+
}
|
|
1182
|
+
/**
|
|
1183
|
+
* Load schema templates
|
|
1184
|
+
*/
|
|
1185
|
+
async loadSchemaTemplates() {
|
|
1186
|
+
// Load common schema templates from memory
|
|
1187
|
+
console.log('Loading schema templates...');
|
|
1188
|
+
}
|
|
1189
|
+
/**
|
|
1190
|
+
* Create data generator function
|
|
1191
|
+
*/
|
|
1192
|
+
createGenerator(type, options) {
|
|
1193
|
+
return () => {
|
|
1194
|
+
switch (type) {
|
|
1195
|
+
case 'uuid':
|
|
1196
|
+
return this.generateUUID();
|
|
1197
|
+
case 'email':
|
|
1198
|
+
return this.generateEmail();
|
|
1199
|
+
case 'name':
|
|
1200
|
+
return this.generateName();
|
|
1201
|
+
case 'age':
|
|
1202
|
+
return this.generateAge(options?.min || 18, options?.max || 120);
|
|
1203
|
+
case 'timestamp':
|
|
1204
|
+
return new Date();
|
|
1205
|
+
case 'integer':
|
|
1206
|
+
return this.generateInteger(options?.min || 1, options?.max || 1000000);
|
|
1207
|
+
case 'price':
|
|
1208
|
+
return this.generatePrice();
|
|
1209
|
+
case 'enum':
|
|
1210
|
+
return this.selectRandom(options || []);
|
|
1211
|
+
default:
|
|
1212
|
+
return null;
|
|
1213
|
+
}
|
|
1214
|
+
};
|
|
1215
|
+
}
|
|
1216
|
+
/**
|
|
1217
|
+
* Generate field value
|
|
1218
|
+
*/
|
|
1219
|
+
generateFieldValue(field) {
|
|
1220
|
+
switch (field.type) {
|
|
1221
|
+
case FieldType.UUID:
|
|
1222
|
+
return this.generateUUID();
|
|
1223
|
+
case FieldType.STRING:
|
|
1224
|
+
case FieldType.TEXT:
|
|
1225
|
+
return this.generateString(field.maxLength || 255);
|
|
1226
|
+
case FieldType.INTEGER:
|
|
1227
|
+
const minConstraint = field.constraints.find(c => c.type === 'min');
|
|
1228
|
+
const maxConstraint = field.constraints.find(c => c.type === 'max');
|
|
1229
|
+
return this.generateInteger(minConstraint?.value || 0, maxConstraint?.value || 1000000);
|
|
1230
|
+
case FieldType.FLOAT:
|
|
1231
|
+
case FieldType.DECIMAL:
|
|
1232
|
+
return this.generateFloat();
|
|
1233
|
+
case FieldType.BOOLEAN:
|
|
1234
|
+
return Math.random() < 0.5;
|
|
1235
|
+
case FieldType.DATE:
|
|
1236
|
+
case FieldType.DATETIME:
|
|
1237
|
+
case FieldType.TIMESTAMP:
|
|
1238
|
+
return new Date();
|
|
1239
|
+
case FieldType.ENUM:
|
|
1240
|
+
const enumConstraint = field.constraints.find(c => c.type === 'enum');
|
|
1241
|
+
return enumConstraint ? this.selectRandom(enumConstraint.value) : null;
|
|
1242
|
+
default:
|
|
1243
|
+
return null;
|
|
1244
|
+
}
|
|
1245
|
+
}
|
|
1246
|
+
/**
|
|
1247
|
+
* Calculate statistics for dataset
|
|
1248
|
+
*/
|
|
1249
|
+
calculateStatistics(dataset) {
|
|
1250
|
+
const nullCount = {};
|
|
1251
|
+
const uniqueValues = {};
|
|
1252
|
+
const dataDistribution = {};
|
|
1253
|
+
// Calculate statistics (simplified)
|
|
1254
|
+
return {
|
|
1255
|
+
nullCount,
|
|
1256
|
+
uniqueValues,
|
|
1257
|
+
dataDistribution
|
|
1258
|
+
};
|
|
1259
|
+
}
|
|
1260
|
+
/**
|
|
1261
|
+
* Generate UUID
|
|
1262
|
+
*/
|
|
1263
|
+
generateUUID() {
|
|
1264
|
+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
|
|
1265
|
+
const r = Math.random() * 16 | 0;
|
|
1266
|
+
const v = c === 'x' ? r : (r & 0x3 | 0x8);
|
|
1267
|
+
return v.toString(16);
|
|
1268
|
+
});
|
|
1269
|
+
}
|
|
1270
|
+
/**
|
|
1271
|
+
* Generate email
|
|
1272
|
+
*/
|
|
1273
|
+
generateEmail() {
|
|
1274
|
+
const names = ['john', 'jane', 'alice', 'bob', 'charlie', 'david', 'emma', 'frank'];
|
|
1275
|
+
const domains = ['example.com', 'test.com', 'demo.com', 'mail.com'];
|
|
1276
|
+
return `${this.selectRandom(names)}.${this.selectRandom(names)}@${this.selectRandom(domains)}`;
|
|
1277
|
+
}
|
|
1278
|
+
/**
|
|
1279
|
+
* Generate name
|
|
1280
|
+
*/
|
|
1281
|
+
generateName() {
|
|
1282
|
+
const firstNames = ['John', 'Jane', 'Alice', 'Bob', 'Charlie', 'David', 'Emma', 'Frank'];
|
|
1283
|
+
const lastNames = ['Smith', 'Johnson', 'Williams', 'Brown', 'Jones', 'Garcia', 'Miller', 'Davis'];
|
|
1284
|
+
return `${this.selectRandom(firstNames)} ${this.selectRandom(lastNames)}`;
|
|
1285
|
+
}
|
|
1286
|
+
/**
|
|
1287
|
+
* Generate age
|
|
1288
|
+
*/
|
|
1289
|
+
generateAge(min = 18, max = 120) {
|
|
1290
|
+
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
1291
|
+
}
|
|
1292
|
+
/**
|
|
1293
|
+
* Generate integer
|
|
1294
|
+
*/
|
|
1295
|
+
generateInteger(min = 0, max = 1000000) {
|
|
1296
|
+
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
1297
|
+
}
|
|
1298
|
+
/**
|
|
1299
|
+
* Generate float
|
|
1300
|
+
*/
|
|
1301
|
+
generateFloat(min = 0, max = 1000) {
|
|
1302
|
+
return Math.random() * (max - min) + min;
|
|
1303
|
+
}
|
|
1304
|
+
/**
|
|
1305
|
+
* Generate price
|
|
1306
|
+
*/
|
|
1307
|
+
generatePrice() {
|
|
1308
|
+
return Math.round((Math.random() * 999 + 1) * 100) / 100;
|
|
1309
|
+
}
|
|
1310
|
+
/**
|
|
1311
|
+
* Generate string
|
|
1312
|
+
*/
|
|
1313
|
+
generateString(maxLength) {
|
|
1314
|
+
const length = Math.floor(Math.random() * maxLength) + 1;
|
|
1315
|
+
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
1316
|
+
let result = '';
|
|
1317
|
+
for (let i = 0; i < length; i++) {
|
|
1318
|
+
result += chars.charAt(Math.floor(Math.random() * chars.length));
|
|
1319
|
+
}
|
|
1320
|
+
return result;
|
|
1321
|
+
}
|
|
1322
|
+
/**
|
|
1323
|
+
* Select random element from array
|
|
1324
|
+
*/
|
|
1325
|
+
selectRandom(array) {
|
|
1326
|
+
return array[Math.floor(Math.random() * array.length)];
|
|
1327
|
+
}
|
|
1328
|
+
/**
|
|
1329
|
+
* Generate dataset ID
|
|
1330
|
+
*/
|
|
1331
|
+
generateDatasetId() {
|
|
1332
|
+
return `dataset-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
1333
|
+
}
|
|
1334
|
+
/**
|
|
1335
|
+
* Generate version ID
|
|
1336
|
+
*/
|
|
1337
|
+
generateVersionId() {
|
|
1338
|
+
return `version-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
1339
|
+
}
|
|
1340
|
+
}
|
|
1341
|
+
exports.TestDataArchitectAgent = TestDataArchitectAgent;
|
|
1342
|
+
// ============================================================================
|
|
1343
|
+
// Export
|
|
1344
|
+
// ============================================================================
|
|
1345
|
+
exports.default = TestDataArchitectAgent;
|
|
1346
|
+
//# sourceMappingURL=TestDataArchitectAgent.js.map
|