agentic-qe 1.9.3 → 2.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/qe-api-contract-validator.md +95 -1336
- package/.claude/agents/qe-chaos-engineer.md +152 -1211
- package/.claude/agents/qe-code-complexity.md +144 -707
- package/.claude/agents/qe-coverage-analyzer.md +147 -743
- package/.claude/agents/qe-deployment-readiness.md +143 -1496
- package/.claude/agents/qe-flaky-test-hunter.md +132 -1529
- package/.claude/agents/qe-fleet-commander.md +12 -12
- package/.claude/agents/qe-performance-tester.md +150 -886
- package/.claude/agents/qe-production-intelligence.md +155 -1396
- package/.claude/agents/qe-quality-analyzer.md +6 -6
- package/.claude/agents/qe-quality-gate.md +151 -648
- package/.claude/agents/qe-regression-risk-analyzer.md +132 -1150
- package/.claude/agents/qe-requirements-validator.md +149 -932
- package/.claude/agents/qe-security-scanner.md +157 -797
- package/.claude/agents/qe-test-data-architect.md +96 -1365
- package/.claude/agents/qe-test-executor.md +8 -8
- package/.claude/agents/qe-test-generator.md +145 -1540
- package/.claude/agents/qe-visual-tester.md +153 -1257
- package/.claude/agents/qx-partner.md +235 -0
- package/.claude/agents/subagents/qe-code-reviewer.md +40 -136
- package/.claude/agents/subagents/qe-coverage-gap-analyzer.md +40 -480
- package/.claude/agents/subagents/qe-data-generator.md +41 -125
- package/.claude/agents/subagents/qe-flaky-investigator.md +55 -411
- package/.claude/agents/subagents/qe-integration-tester.md +53 -141
- package/.claude/agents/subagents/qe-performance-validator.md +54 -130
- package/.claude/agents/subagents/qe-security-auditor.md +56 -114
- package/.claude/agents/subagents/qe-test-data-architect-sub.md +57 -548
- package/.claude/agents/subagents/qe-test-implementer.md +58 -551
- package/.claude/agents/subagents/qe-test-refactorer.md +65 -722
- package/.claude/agents/subagents/qe-test-writer.md +63 -726
- package/.claude/skills/skills-manifest.json +632 -0
- package/.claude/skills/testability-scoring/README.md +71 -0
- package/.claude/skills/testability-scoring/SKILL.md +611 -0
- package/.claude/skills/testability-scoring/resources/templates/config.template.js +84 -0
- package/.claude/skills/testability-scoring/resources/templates/testability-scoring.spec.template.js +532 -0
- package/.claude/skills/testability-scoring/scripts/generate-html-report.js +1007 -0
- package/.claude/skills/testability-scoring/scripts/run-assessment.sh +70 -0
- package/CHANGELOG.md +116 -0
- package/README.md +59 -7
- package/config/.env.otel.example +25 -0
- package/config/OTEL-QUICK-REFERENCE.md +137 -0
- package/config/README-OTEL.md +222 -0
- package/config/alerting-rules.yml +518 -0
- package/config/docker-compose.otel.yml +187 -0
- package/config/grafana/dashboards/agentic-qe-overview.json +286 -0
- package/config/grafana/provisioning/dashboards/dashboards.yml +19 -0
- package/config/grafana/provisioning/datasources/datasources.yml +53 -0
- package/config/otel-collector-config.yaml.example +145 -0
- package/config/prometheus.yml.example +106 -0
- package/dist/agents/QXPartnerAgent.d.ts +139 -0
- package/dist/agents/QXPartnerAgent.d.ts.map +1 -0
- package/dist/agents/QXPartnerAgent.js +769 -0
- package/dist/agents/QXPartnerAgent.js.map +1 -0
- package/dist/agents/index.d.ts +1 -0
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +82 -2
- package/dist/agents/index.js.map +1 -1
- package/dist/alerting/AlertManager.d.ts +120 -0
- package/dist/alerting/AlertManager.d.ts.map +1 -0
- package/dist/alerting/AlertManager.js +345 -0
- package/dist/alerting/AlertManager.js.map +1 -0
- package/dist/alerting/FeedbackRouter.d.ts +98 -0
- package/dist/alerting/FeedbackRouter.d.ts.map +1 -0
- package/dist/alerting/FeedbackRouter.js +331 -0
- package/dist/alerting/FeedbackRouter.js.map +1 -0
- package/dist/alerting/StrategyApplicator.d.ts +120 -0
- package/dist/alerting/StrategyApplicator.d.ts.map +1 -0
- package/dist/alerting/StrategyApplicator.js +299 -0
- package/dist/alerting/StrategyApplicator.js.map +1 -0
- package/dist/alerting/index.d.ts +68 -0
- package/dist/alerting/index.d.ts.map +1 -0
- package/dist/alerting/index.js +112 -0
- package/dist/alerting/index.js.map +1 -0
- package/dist/alerting/types.d.ts +118 -0
- package/dist/alerting/types.d.ts.map +1 -0
- package/dist/alerting/types.js +11 -0
- package/dist/alerting/types.js.map +1 -0
- package/dist/cli/commands/debug/agent.d.ts.map +1 -1
- package/dist/cli/commands/debug/agent.js +19 -6
- package/dist/cli/commands/debug/agent.js.map +1 -1
- package/dist/cli/commands/debug/health-check.js +20 -7
- package/dist/cli/commands/debug/health-check.js.map +1 -1
- package/dist/cli/commands/init-claude-md-template.d.ts +1 -0
- package/dist/cli/commands/init-claude-md-template.d.ts.map +1 -1
- package/dist/cli/commands/init-claude-md-template.js +4 -3
- package/dist/cli/commands/init-claude-md-template.js.map +1 -1
- package/dist/cli/commands/workflow/cancel.d.ts.map +1 -1
- package/dist/cli/commands/workflow/cancel.js +4 -3
- package/dist/cli/commands/workflow/cancel.js.map +1 -1
- package/dist/cli/commands/workflow/list.d.ts.map +1 -1
- package/dist/cli/commands/workflow/list.js +4 -3
- package/dist/cli/commands/workflow/list.js.map +1 -1
- package/dist/cli/commands/workflow/pause.d.ts.map +1 -1
- package/dist/cli/commands/workflow/pause.js +4 -3
- package/dist/cli/commands/workflow/pause.js.map +1 -1
- package/dist/cli/init/claude-config.d.ts.map +1 -1
- package/dist/cli/init/claude-config.js +13 -13
- package/dist/cli/init/claude-config.js.map +1 -1
- package/dist/cli/init/claude-md.d.ts.map +1 -1
- package/dist/cli/init/claude-md.js +44 -2
- package/dist/cli/init/claude-md.js.map +1 -1
- package/dist/cli/init/database-init.js +1 -1
- package/dist/cli/init/index.d.ts.map +1 -1
- package/dist/cli/init/index.js +13 -6
- package/dist/cli/init/index.js.map +1 -1
- package/dist/cli/init/skills.d.ts.map +1 -1
- package/dist/cli/init/skills.js +2 -1
- package/dist/cli/init/skills.js.map +1 -1
- package/dist/core/memory/AgentDBIntegration.d.ts +24 -6
- package/dist/core/memory/AgentDBIntegration.d.ts.map +1 -1
- package/dist/core/memory/AgentDBIntegration.js +66 -10
- package/dist/core/memory/AgentDBIntegration.js.map +1 -1
- package/dist/core/memory/IPatternStore.d.ts +209 -0
- package/dist/core/memory/IPatternStore.d.ts.map +1 -0
- package/dist/core/memory/IPatternStore.js +15 -0
- package/dist/core/memory/IPatternStore.js.map +1 -0
- package/dist/core/memory/MigrationTools.d.ts +192 -0
- package/dist/core/memory/MigrationTools.d.ts.map +1 -0
- package/dist/core/memory/MigrationTools.js +615 -0
- package/dist/core/memory/MigrationTools.js.map +1 -0
- package/dist/core/memory/NeuralEnhancement.d.ts +154 -0
- package/dist/core/memory/NeuralEnhancement.d.ts.map +1 -0
- package/dist/core/memory/NeuralEnhancement.js +598 -0
- package/dist/core/memory/NeuralEnhancement.js.map +1 -0
- package/dist/core/memory/PatternStoreFactory.d.ts +143 -0
- package/dist/core/memory/PatternStoreFactory.d.ts.map +1 -0
- package/dist/core/memory/PatternStoreFactory.js +370 -0
- package/dist/core/memory/PatternStoreFactory.js.map +1 -0
- package/dist/core/memory/RealAgentDBAdapter.d.ts +1 -0
- package/dist/core/memory/RealAgentDBAdapter.d.ts.map +1 -1
- package/dist/core/memory/RealAgentDBAdapter.js +28 -20
- package/dist/core/memory/RealAgentDBAdapter.js.map +1 -1
- package/dist/core/memory/RuVectorPatternStore.d.ts +198 -0
- package/dist/core/memory/RuVectorPatternStore.d.ts.map +1 -0
- package/dist/core/memory/RuVectorPatternStore.js +605 -0
- package/dist/core/memory/RuVectorPatternStore.js.map +1 -0
- package/dist/core/memory/SelfHealingMonitor.d.ts +186 -0
- package/dist/core/memory/SelfHealingMonitor.d.ts.map +1 -0
- package/dist/core/memory/SelfHealingMonitor.js +451 -0
- package/dist/core/memory/SelfHealingMonitor.js.map +1 -0
- package/dist/core/memory/SwarmMemoryManager.d.ts +62 -0
- package/dist/core/memory/SwarmMemoryManager.d.ts.map +1 -1
- package/dist/core/memory/SwarmMemoryManager.js +97 -0
- package/dist/core/memory/SwarmMemoryManager.js.map +1 -1
- package/dist/core/memory/UnifiedMemoryCoordinator.d.ts +341 -0
- package/dist/core/memory/UnifiedMemoryCoordinator.d.ts.map +1 -0
- package/dist/core/memory/UnifiedMemoryCoordinator.js +986 -0
- package/dist/core/memory/UnifiedMemoryCoordinator.js.map +1 -0
- package/dist/core/memory/index.d.ts +16 -0
- package/dist/core/memory/index.d.ts.map +1 -1
- package/dist/core/memory/index.js +58 -1
- package/dist/core/memory/index.js.map +1 -1
- package/dist/core/optimization/SwarmOptimizer.d.ts +185 -0
- package/dist/core/optimization/SwarmOptimizer.d.ts.map +1 -0
- package/dist/core/optimization/SwarmOptimizer.js +631 -0
- package/dist/core/optimization/SwarmOptimizer.js.map +1 -0
- package/dist/core/optimization/index.d.ts +9 -0
- package/dist/core/optimization/index.d.ts.map +1 -0
- package/dist/core/optimization/index.js +25 -0
- package/dist/core/optimization/index.js.map +1 -0
- package/dist/core/optimization/types.d.ts +53 -0
- package/dist/core/optimization/types.d.ts.map +1 -0
- package/dist/core/optimization/types.js +6 -0
- package/dist/core/optimization/types.js.map +1 -0
- package/dist/core/orchestration/PriorityQueue.d.ts +54 -0
- package/dist/core/orchestration/PriorityQueue.d.ts.map +1 -0
- package/dist/core/orchestration/PriorityQueue.js +122 -0
- package/dist/core/orchestration/PriorityQueue.js.map +1 -0
- package/dist/core/orchestration/WorkflowOrchestrator.d.ts +176 -0
- package/dist/core/orchestration/WorkflowOrchestrator.d.ts.map +1 -0
- package/dist/core/orchestration/WorkflowOrchestrator.js +813 -0
- package/dist/core/orchestration/WorkflowOrchestrator.js.map +1 -0
- package/dist/core/orchestration/index.d.ts +7 -0
- package/dist/core/orchestration/index.d.ts.map +1 -0
- package/dist/core/orchestration/index.js +11 -0
- package/dist/core/orchestration/index.js.map +1 -0
- package/dist/core/orchestration/types.d.ts +96 -0
- package/dist/core/orchestration/types.d.ts.map +1 -0
- package/dist/core/orchestration/types.js +6 -0
- package/dist/core/orchestration/types.js.map +1 -0
- package/dist/core/skills/DynamicSkillLoader.d.ts +96 -0
- package/dist/core/skills/DynamicSkillLoader.d.ts.map +1 -0
- package/dist/core/skills/DynamicSkillLoader.js +353 -0
- package/dist/core/skills/DynamicSkillLoader.js.map +1 -0
- package/dist/core/skills/types.d.ts +118 -0
- package/dist/core/skills/types.d.ts.map +1 -0
- package/dist/core/skills/types.js +7 -0
- package/dist/core/skills/types.js.map +1 -0
- package/dist/core/transport/QUICTransport.d.ts +320 -0
- package/dist/core/transport/QUICTransport.d.ts.map +1 -0
- package/dist/core/transport/QUICTransport.js +711 -0
- package/dist/core/transport/QUICTransport.js.map +1 -0
- package/dist/core/transport/index.d.ts +40 -0
- package/dist/core/transport/index.d.ts.map +1 -0
- package/dist/core/transport/index.js +46 -0
- package/dist/core/transport/index.js.map +1 -0
- package/dist/core/transport/quic-loader.d.ts +123 -0
- package/dist/core/transport/quic-loader.d.ts.map +1 -0
- package/dist/core/transport/quic-loader.js +293 -0
- package/dist/core/transport/quic-loader.js.map +1 -0
- package/dist/core/transport/quic.d.ts +154 -0
- package/dist/core/transport/quic.d.ts.map +1 -0
- package/dist/core/transport/quic.js +214 -0
- package/dist/core/transport/quic.js.map +1 -0
- package/dist/mcp/services/AgentRegistry.d.ts.map +1 -1
- package/dist/mcp/services/AgentRegistry.js +4 -1
- package/dist/mcp/services/AgentRegistry.js.map +1 -1
- package/dist/reasoning/RuVectorReasoningAdapter.d.ts +232 -0
- package/dist/reasoning/RuVectorReasoningAdapter.d.ts.map +1 -0
- package/dist/reasoning/RuVectorReasoningAdapter.js +585 -0
- package/dist/reasoning/RuVectorReasoningAdapter.js.map +1 -0
- package/dist/reasoning/index.d.ts +2 -0
- package/dist/reasoning/index.d.ts.map +1 -1
- package/dist/reasoning/index.js +6 -1
- package/dist/reasoning/index.js.map +1 -1
- package/dist/reporting/ResultAggregator.d.ts +107 -0
- package/dist/reporting/ResultAggregator.d.ts.map +1 -0
- package/dist/reporting/ResultAggregator.js +435 -0
- package/dist/reporting/ResultAggregator.js.map +1 -0
- package/dist/reporting/index.d.ts +48 -0
- package/dist/reporting/index.d.ts.map +1 -0
- package/dist/reporting/index.js +154 -0
- package/dist/reporting/index.js.map +1 -0
- package/dist/reporting/reporters/ControlLoopReporter.d.ts +128 -0
- package/dist/reporting/reporters/ControlLoopReporter.d.ts.map +1 -0
- package/dist/reporting/reporters/ControlLoopReporter.js +417 -0
- package/dist/reporting/reporters/ControlLoopReporter.js.map +1 -0
- package/dist/reporting/reporters/HumanReadableReporter.d.ts +140 -0
- package/dist/reporting/reporters/HumanReadableReporter.d.ts.map +1 -0
- package/dist/reporting/reporters/HumanReadableReporter.js +524 -0
- package/dist/reporting/reporters/HumanReadableReporter.js.map +1 -0
- package/dist/reporting/reporters/JSONReporter.d.ts +193 -0
- package/dist/reporting/reporters/JSONReporter.d.ts.map +1 -0
- package/dist/reporting/reporters/JSONReporter.js +324 -0
- package/dist/reporting/reporters/JSONReporter.js.map +1 -0
- package/dist/reporting/reporters/index.d.ts +14 -0
- package/dist/reporting/reporters/index.d.ts.map +1 -0
- package/dist/reporting/reporters/index.js +19 -0
- package/dist/reporting/reporters/index.js.map +1 -0
- package/dist/reporting/types.d.ts +427 -0
- package/dist/reporting/types.d.ts.map +1 -0
- package/dist/reporting/types.js +12 -0
- package/dist/reporting/types.js.map +1 -0
- package/dist/types/index.d.ts +2 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/qx.d.ts +397 -0
- package/dist/types/qx.d.ts.map +1 -0
- package/dist/types/qx.js +71 -0
- package/dist/types/qx.js.map +1 -0
- package/dist/visualization/api/RestEndpoints.js +1 -1
- package/dist/visualization/api/RestEndpoints.js.map +1 -1
- package/dist/visualization/api/WebSocketServer.d.ts +44 -0
- package/dist/visualization/api/WebSocketServer.d.ts.map +1 -1
- package/dist/visualization/api/WebSocketServer.js +144 -23
- package/dist/visualization/api/WebSocketServer.js.map +1 -1
- package/dist/visualization/core/DataTransformer.d.ts +10 -0
- package/dist/visualization/core/DataTransformer.d.ts.map +1 -1
- package/dist/visualization/core/DataTransformer.js +60 -5
- package/dist/visualization/core/DataTransformer.js.map +1 -1
- package/dist/visualization/emit-event.d.ts +75 -0
- package/dist/visualization/emit-event.d.ts.map +1 -0
- package/dist/visualization/emit-event.js +213 -0
- package/dist/visualization/emit-event.js.map +1 -0
- package/dist/visualization/index.d.ts +1 -0
- package/dist/visualization/index.d.ts.map +1 -1
- package/dist/visualization/index.js +7 -1
- package/dist/visualization/index.js.map +1 -1
- package/docs/reference/skills.md +63 -1
- package/package.json +12 -4
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Control Loop Reporter
|
|
4
|
+
*
|
|
5
|
+
* Generates machine-readable feedback for automated control systems,
|
|
6
|
+
* CI/CD pipelines, and decision-making engines. Provides actionable
|
|
7
|
+
* signals, threshold violations, and recommended actions.
|
|
8
|
+
*
|
|
9
|
+
* @module reporting/reporters/ControlLoopReporter
|
|
10
|
+
* @version 1.0.0
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.ControlLoopReporter = void 0;
|
|
14
|
+
/**
|
|
15
|
+
* Control Loop Reporter
|
|
16
|
+
*
|
|
17
|
+
* Designed for automated systems to consume test results and make
|
|
18
|
+
* deployment decisions based on quality gates and thresholds.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const reporter = new ControlLoopReporter({
|
|
23
|
+
* minPassRate: 0.95,
|
|
24
|
+
* minCoverage: 80,
|
|
25
|
+
* maxCriticalVulnerabilities: 0
|
|
26
|
+
* });
|
|
27
|
+
*
|
|
28
|
+
* const output = reporter.report(aggregatedResults);
|
|
29
|
+
* const feedback = JSON.parse(output.content) as ControlLoopFeedback;
|
|
30
|
+
*
|
|
31
|
+
* if (!feedback.signals.canDeploy) {
|
|
32
|
+
* // Block deployment
|
|
33
|
+
* process.exit(1);
|
|
34
|
+
* }
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
class ControlLoopReporter {
|
|
38
|
+
constructor(config = {}) {
|
|
39
|
+
this.config = {
|
|
40
|
+
format: 'control-loop',
|
|
41
|
+
detailLevel: config.detailLevel || 'detailed',
|
|
42
|
+
prettyPrint: config.prettyPrint !== undefined ? config.prettyPrint : false,
|
|
43
|
+
includeTimestamps: config.includeTimestamps !== undefined ? config.includeTimestamps : true,
|
|
44
|
+
includeMetadata: config.includeMetadata !== undefined ? config.includeMetadata : true
|
|
45
|
+
};
|
|
46
|
+
// Set default thresholds
|
|
47
|
+
this.thresholds = {
|
|
48
|
+
minPassRate: config.minPassRate ?? 0.95,
|
|
49
|
+
minCoverage: config.minCoverage ?? 80,
|
|
50
|
+
minQualityScore: config.minQualityScore ?? 70,
|
|
51
|
+
minSecurityScore: config.minSecurityScore ?? 80,
|
|
52
|
+
maxCriticalVulnerabilities: config.maxCriticalVulnerabilities ?? 0,
|
|
53
|
+
maxHighVulnerabilities: config.maxHighVulnerabilities ?? 2,
|
|
54
|
+
maxP95ResponseTime: config.maxP95ResponseTime ?? 1000,
|
|
55
|
+
maxErrorRate: config.maxErrorRate ?? 0.01,
|
|
56
|
+
maxFlakyTests: config.maxFlakyTests ?? 5
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Generate control loop feedback
|
|
61
|
+
*/
|
|
62
|
+
report(results) {
|
|
63
|
+
const startTime = Date.now();
|
|
64
|
+
// Build control loop feedback
|
|
65
|
+
const feedback = this.buildFeedback(results);
|
|
66
|
+
// Serialize to JSON
|
|
67
|
+
const content = this.config.prettyPrint
|
|
68
|
+
? JSON.stringify(feedback, null, 2)
|
|
69
|
+
: JSON.stringify(feedback);
|
|
70
|
+
const generationDuration = Date.now() - startTime;
|
|
71
|
+
return {
|
|
72
|
+
format: 'control-loop',
|
|
73
|
+
content,
|
|
74
|
+
timestamp: new Date().toISOString(),
|
|
75
|
+
size: Buffer.byteLength(content, 'utf8'),
|
|
76
|
+
generationDuration
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Build control loop feedback structure
|
|
81
|
+
*/
|
|
82
|
+
buildFeedback(results) {
|
|
83
|
+
// Calculate metrics
|
|
84
|
+
const metrics = this.calculateMetrics(results);
|
|
85
|
+
// Detect signals
|
|
86
|
+
const signals = this.detectSignals(results, metrics);
|
|
87
|
+
// Generate actions
|
|
88
|
+
const actions = this.generateActions(results, signals);
|
|
89
|
+
// Detect violations
|
|
90
|
+
const violations = this.detectViolations(results, metrics);
|
|
91
|
+
// Generate next steps
|
|
92
|
+
const nextSteps = this.generateNextSteps(signals, violations);
|
|
93
|
+
return {
|
|
94
|
+
executionId: results.executionId,
|
|
95
|
+
timestamp: results.timestamp,
|
|
96
|
+
status: results.status,
|
|
97
|
+
success: results.status === 'success',
|
|
98
|
+
qualityScore: results.qualityMetrics?.score || 0,
|
|
99
|
+
metrics,
|
|
100
|
+
signals,
|
|
101
|
+
actions,
|
|
102
|
+
violations,
|
|
103
|
+
nextSteps
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Calculate key metrics for decision making
|
|
108
|
+
*/
|
|
109
|
+
calculateMetrics(results) {
|
|
110
|
+
return {
|
|
111
|
+
testPassRate: results.testResults.passRate,
|
|
112
|
+
coveragePercentage: results.coverage?.overall || 0,
|
|
113
|
+
securityScore: results.security?.score || 100,
|
|
114
|
+
performanceScore: this.calculatePerformanceScore(results.performance),
|
|
115
|
+
qualityGatesPassed: results.qualityMetrics?.gatesPassed || 0,
|
|
116
|
+
qualityGatesFailed: results.qualityMetrics?.gatesFailed || 0
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Calculate performance score (0-100)
|
|
121
|
+
*/
|
|
122
|
+
calculatePerformanceScore(performance) {
|
|
123
|
+
if (!performance)
|
|
124
|
+
return 100;
|
|
125
|
+
let score = 100;
|
|
126
|
+
// Penalize high P95 response time
|
|
127
|
+
if (performance.responseTime.p95 > this.thresholds.maxP95ResponseTime) {
|
|
128
|
+
const excess = performance.responseTime.p95 - this.thresholds.maxP95ResponseTime;
|
|
129
|
+
score -= Math.min(50, (excess / this.thresholds.maxP95ResponseTime) * 50);
|
|
130
|
+
}
|
|
131
|
+
// Penalize high error rate
|
|
132
|
+
if (performance.errorRate > this.thresholds.maxErrorRate) {
|
|
133
|
+
const excess = performance.errorRate - this.thresholds.maxErrorRate;
|
|
134
|
+
score -= Math.min(30, (excess / this.thresholds.maxErrorRate) * 30);
|
|
135
|
+
}
|
|
136
|
+
return Math.max(0, Math.round(score));
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Detect actionable signals
|
|
140
|
+
*/
|
|
141
|
+
detectSignals(results, metrics) {
|
|
142
|
+
const { testResults, coverage, security, qualityMetrics, performance } = results;
|
|
143
|
+
// Can deploy
|
|
144
|
+
const canDeploy = metrics.testPassRate >= this.thresholds.minPassRate &&
|
|
145
|
+
metrics.coveragePercentage >= this.thresholds.minCoverage &&
|
|
146
|
+
(!security || security.summary.critical <= this.thresholds.maxCriticalVulnerabilities) &&
|
|
147
|
+
(!security || security.summary.high <= this.thresholds.maxHighVulnerabilities) &&
|
|
148
|
+
(!qualityMetrics || qualityMetrics.score >= this.thresholds.minQualityScore) &&
|
|
149
|
+
testResults.failed === 0;
|
|
150
|
+
// Critical issues found
|
|
151
|
+
const criticalIssuesFound = testResults.failed > 0 ||
|
|
152
|
+
(security?.summary.critical || 0) > 0 ||
|
|
153
|
+
(qualityMetrics?.score || 100) < this.thresholds.minQualityScore;
|
|
154
|
+
// Coverage decreased (comparing against threshold)
|
|
155
|
+
const coverageDecreased = (coverage?.overall || 0) < this.thresholds.minCoverage;
|
|
156
|
+
// Performance degraded
|
|
157
|
+
const performanceDegraded = performance?.responseTime.p95 && performance.responseTime.p95 > this.thresholds.maxP95ResponseTime ||
|
|
158
|
+
performance?.errorRate && performance.errorRate > this.thresholds.maxErrorRate;
|
|
159
|
+
// Security risks
|
|
160
|
+
const securityRisks = (security?.summary.critical || 0) > this.thresholds.maxCriticalVulnerabilities ||
|
|
161
|
+
(security?.summary.high || 0) > this.thresholds.maxHighVulnerabilities;
|
|
162
|
+
// Tests unstable (flaky or inconsistent)
|
|
163
|
+
const testsUnstable = (testResults.flaky || 0) > this.thresholds.maxFlakyTests;
|
|
164
|
+
return {
|
|
165
|
+
canDeploy,
|
|
166
|
+
criticalIssuesFound,
|
|
167
|
+
coverageDecreased,
|
|
168
|
+
performanceDegraded: performanceDegraded || false,
|
|
169
|
+
securityRisks,
|
|
170
|
+
testsUnstable
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Generate recommended actions
|
|
175
|
+
*/
|
|
176
|
+
generateActions(results, signals) {
|
|
177
|
+
const actions = [];
|
|
178
|
+
// Block deployment if critical issues
|
|
179
|
+
if (!signals.canDeploy) {
|
|
180
|
+
actions.push({
|
|
181
|
+
type: 'block_deployment',
|
|
182
|
+
priority: 'critical',
|
|
183
|
+
reason: 'Quality gates not met - deployment blocked',
|
|
184
|
+
resolution: 'Fix failing tests, address security vulnerabilities, and improve coverage'
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
// Require review for security risks
|
|
188
|
+
if (signals.securityRisks) {
|
|
189
|
+
actions.push({
|
|
190
|
+
type: 'require_review',
|
|
191
|
+
priority: 'critical',
|
|
192
|
+
reason: `Critical or high severity vulnerabilities detected: ${results.security?.summary.critical || 0} critical, ${results.security?.summary.high || 0} high`,
|
|
193
|
+
resolution: 'Security team review required before deployment'
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
// Alert on performance degradation
|
|
197
|
+
if (signals.performanceDegraded) {
|
|
198
|
+
actions.push({
|
|
199
|
+
type: 'alert',
|
|
200
|
+
priority: 'high',
|
|
201
|
+
reason: 'Performance metrics degraded beyond acceptable thresholds',
|
|
202
|
+
resolution: 'Investigate performance issues and optimize before deployment'
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
// Alert on coverage decrease
|
|
206
|
+
if (signals.coverageDecreased) {
|
|
207
|
+
actions.push({
|
|
208
|
+
type: 'alert',
|
|
209
|
+
priority: 'medium',
|
|
210
|
+
reason: `Code coverage below threshold: ${results.coverage?.overall.toFixed(1)}% < ${this.thresholds.minCoverage}%`,
|
|
211
|
+
resolution: 'Add tests to increase coverage'
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
// Retry for flaky tests
|
|
215
|
+
if (signals.testsUnstable) {
|
|
216
|
+
actions.push({
|
|
217
|
+
type: 'retry',
|
|
218
|
+
priority: 'medium',
|
|
219
|
+
reason: `Flaky tests detected: ${results.testResults.flaky || 0} tests`,
|
|
220
|
+
resolution: 'Retry test execution or investigate test stability'
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
// Approve if all checks passed
|
|
224
|
+
if (signals.canDeploy && !signals.criticalIssuesFound) {
|
|
225
|
+
actions.push({
|
|
226
|
+
type: 'approve',
|
|
227
|
+
priority: 'low',
|
|
228
|
+
reason: 'All quality gates passed',
|
|
229
|
+
resolution: 'Ready for deployment'
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
return actions;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Detect threshold violations
|
|
236
|
+
*/
|
|
237
|
+
detectViolations(results, metrics) {
|
|
238
|
+
const violations = [];
|
|
239
|
+
// Test pass rate violation
|
|
240
|
+
if (metrics.testPassRate < this.thresholds.minPassRate) {
|
|
241
|
+
violations.push({
|
|
242
|
+
metric: 'testPassRate',
|
|
243
|
+
threshold: this.thresholds.minPassRate,
|
|
244
|
+
actualValue: metrics.testPassRate,
|
|
245
|
+
operator: 'gte',
|
|
246
|
+
severity: 'critical',
|
|
247
|
+
impact: 'Deployment blocked due to test failures'
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
// Coverage violation
|
|
251
|
+
if (metrics.coveragePercentage < this.thresholds.minCoverage) {
|
|
252
|
+
violations.push({
|
|
253
|
+
metric: 'coverage',
|
|
254
|
+
threshold: this.thresholds.minCoverage,
|
|
255
|
+
actualValue: metrics.coveragePercentage,
|
|
256
|
+
operator: 'gte',
|
|
257
|
+
severity: 'high',
|
|
258
|
+
impact: 'Insufficient test coverage may lead to undetected bugs'
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
// Quality score violation
|
|
262
|
+
if (metrics.qualityScore < this.thresholds.minQualityScore) {
|
|
263
|
+
violations.push({
|
|
264
|
+
metric: 'qualityScore',
|
|
265
|
+
threshold: this.thresholds.minQualityScore,
|
|
266
|
+
actualValue: metrics.qualityScore,
|
|
267
|
+
operator: 'gte',
|
|
268
|
+
severity: 'high',
|
|
269
|
+
impact: 'Code quality below acceptable standards'
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
// Security score violation
|
|
273
|
+
if (metrics.securityScore < this.thresholds.minSecurityScore) {
|
|
274
|
+
violations.push({
|
|
275
|
+
metric: 'securityScore',
|
|
276
|
+
threshold: this.thresholds.minSecurityScore,
|
|
277
|
+
actualValue: metrics.securityScore,
|
|
278
|
+
operator: 'gte',
|
|
279
|
+
severity: 'critical',
|
|
280
|
+
impact: 'Security vulnerabilities pose risk to production'
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
// Critical vulnerabilities violation
|
|
284
|
+
const criticalVulns = results.security?.summary.critical || 0;
|
|
285
|
+
if (criticalVulns > this.thresholds.maxCriticalVulnerabilities) {
|
|
286
|
+
violations.push({
|
|
287
|
+
metric: 'criticalVulnerabilities',
|
|
288
|
+
threshold: this.thresholds.maxCriticalVulnerabilities,
|
|
289
|
+
actualValue: criticalVulns,
|
|
290
|
+
operator: 'lte',
|
|
291
|
+
severity: 'critical',
|
|
292
|
+
impact: 'Critical security vulnerabilities must be addressed immediately'
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
// Performance violation (P95)
|
|
296
|
+
if (results.performance?.responseTime.p95 &&
|
|
297
|
+
results.performance.responseTime.p95 > this.thresholds.maxP95ResponseTime) {
|
|
298
|
+
violations.push({
|
|
299
|
+
metric: 'p95ResponseTime',
|
|
300
|
+
threshold: this.thresholds.maxP95ResponseTime,
|
|
301
|
+
actualValue: results.performance.responseTime.p95,
|
|
302
|
+
operator: 'lte',
|
|
303
|
+
severity: 'medium',
|
|
304
|
+
impact: 'Performance degradation may affect user experience'
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
// Error rate violation
|
|
308
|
+
if (results.performance?.errorRate &&
|
|
309
|
+
results.performance.errorRate > this.thresholds.maxErrorRate) {
|
|
310
|
+
violations.push({
|
|
311
|
+
metric: 'errorRate',
|
|
312
|
+
threshold: this.thresholds.maxErrorRate,
|
|
313
|
+
actualValue: results.performance.errorRate,
|
|
314
|
+
operator: 'lte',
|
|
315
|
+
severity: 'high',
|
|
316
|
+
impact: 'High error rate indicates system instability'
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
return violations;
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Generate next steps based on signals and violations
|
|
323
|
+
*/
|
|
324
|
+
generateNextSteps(signals, violations) {
|
|
325
|
+
const steps = [];
|
|
326
|
+
// Deployment decision
|
|
327
|
+
if (signals.canDeploy) {
|
|
328
|
+
steps.push('✓ Quality gates passed - proceed with deployment');
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
steps.push('✗ Quality gates failed - deployment blocked');
|
|
332
|
+
}
|
|
333
|
+
// Critical violations
|
|
334
|
+
const criticalViolations = violations.filter(v => v.severity === 'critical');
|
|
335
|
+
if (criticalViolations.length > 0) {
|
|
336
|
+
steps.push(`→ Address ${criticalViolations.length} critical violation(s) immediately`);
|
|
337
|
+
criticalViolations.forEach(v => {
|
|
338
|
+
steps.push(` - Fix ${v.metric}: ${v.actualValue} (threshold: ${v.threshold})`);
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
// High priority violations
|
|
342
|
+
const highViolations = violations.filter(v => v.severity === 'high');
|
|
343
|
+
if (highViolations.length > 0) {
|
|
344
|
+
steps.push(`→ Resolve ${highViolations.length} high priority violation(s) before deployment`);
|
|
345
|
+
}
|
|
346
|
+
// Security issues
|
|
347
|
+
if (signals.securityRisks) {
|
|
348
|
+
steps.push('→ Security review required - vulnerabilities detected');
|
|
349
|
+
}
|
|
350
|
+
// Performance issues
|
|
351
|
+
if (signals.performanceDegraded) {
|
|
352
|
+
steps.push('→ Performance optimization recommended');
|
|
353
|
+
}
|
|
354
|
+
// Coverage issues
|
|
355
|
+
if (signals.coverageDecreased) {
|
|
356
|
+
steps.push('→ Increase test coverage to meet threshold');
|
|
357
|
+
}
|
|
358
|
+
// Test stability
|
|
359
|
+
if (signals.testsUnstable) {
|
|
360
|
+
steps.push('→ Investigate and fix flaky tests');
|
|
361
|
+
}
|
|
362
|
+
// Final step
|
|
363
|
+
if (signals.canDeploy && violations.length === 0) {
|
|
364
|
+
steps.push('→ All checks passed - ready for automated deployment');
|
|
365
|
+
}
|
|
366
|
+
else if (!signals.canDeploy) {
|
|
367
|
+
steps.push('→ Fix violations and re-run quality checks');
|
|
368
|
+
}
|
|
369
|
+
return steps;
|
|
370
|
+
}
|
|
371
|
+
getFormat() {
|
|
372
|
+
return 'control-loop';
|
|
373
|
+
}
|
|
374
|
+
validateConfig(config) {
|
|
375
|
+
return config.format === 'control-loop';
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Get current thresholds
|
|
379
|
+
*/
|
|
380
|
+
getThresholds() {
|
|
381
|
+
return { ...this.thresholds };
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Update thresholds
|
|
385
|
+
*/
|
|
386
|
+
updateThresholds(thresholds) {
|
|
387
|
+
this.thresholds = {
|
|
388
|
+
...this.thresholds,
|
|
389
|
+
...thresholds
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Check if results pass all gates
|
|
394
|
+
*/
|
|
395
|
+
static passesGates(results, config = {}) {
|
|
396
|
+
const reporter = new ControlLoopReporter(config);
|
|
397
|
+
const output = reporter.report(results);
|
|
398
|
+
const feedback = JSON.parse(output.content);
|
|
399
|
+
return feedback.signals.canDeploy;
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Get deployment decision
|
|
403
|
+
*/
|
|
404
|
+
static getDeploymentDecision(results, config = {}) {
|
|
405
|
+
const reporter = new ControlLoopReporter(config);
|
|
406
|
+
const output = reporter.report(results);
|
|
407
|
+
const feedback = JSON.parse(output.content);
|
|
408
|
+
return {
|
|
409
|
+
canDeploy: feedback.signals.canDeploy,
|
|
410
|
+
reason: feedback.actions.find(a => a.priority === 'critical')?.reason || 'All checks passed',
|
|
411
|
+
actions: feedback.actions,
|
|
412
|
+
violations: feedback.violations
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
exports.ControlLoopReporter = ControlLoopReporter;
|
|
417
|
+
//# sourceMappingURL=ControlLoopReporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ControlLoopReporter.js","sourceRoot":"","sources":["../../../src/reporting/reporters/ControlLoopReporter.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;AA6CH;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAa,mBAAmB;IAc9B,YAAY,SAA4B,EAAE;QACxC,IAAI,CAAC,MAAM,GAAG;YACZ,MAAM,EAAE,cAAc;YACtB,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,UAAU;YAC7C,WAAW,EAAE,MAAM,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK;YAC1E,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI;YAC3F,eAAe,EAAE,MAAM,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI;SACtF,CAAC;QAEF,yBAAyB;QACzB,IAAI,CAAC,UAAU,GAAG;YAChB,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,IAAI;YACvC,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE;YACrC,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,EAAE;YAC7C,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,IAAI,EAAE;YAC/C,0BAA0B,EAAE,MAAM,CAAC,0BAA0B,IAAI,CAAC;YAClE,sBAAsB,EAAE,MAAM,CAAC,sBAAsB,IAAI,CAAC;YAC1D,kBAAkB,EAAE,MAAM,CAAC,kBAAkB,IAAI,IAAI;YACrD,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,IAAI;YACzC,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,CAAC;SACzC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,OAA0B;QAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,8BAA8B;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAE7C,oBAAoB;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW;YACrC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YACnC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAE7B,MAAM,kBAAkB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAElD,OAAO;YACL,MAAM,EAAE,cAAc;YACtB,OAAO;YACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC;YACxC,kBAAkB;SACnB,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,OAA0B;QAC9C,oBAAoB;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAE/C,iBAAiB;QACjB,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAErD,mBAAmB;QACnB,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAEvD,oBAAoB;QACpB,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAE3D,sBAAsB;QACtB,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAE9D,OAAO;YACL,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,OAAO,EAAE,OAAO,CAAC,MAAM,KAAK,SAAS;YACrC,YAAY,EAAE,OAAO,CAAC,cAAc,EAAE,KAAK,IAAI,CAAC;YAChD,OAAO;YACP,OAAO;YACP,OAAO;YACP,UAAU;YACV,SAAS;SACV,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,OAA0B;QACjD,OAAO;YACL,YAAY,EAAE,OAAO,CAAC,WAAW,CAAC,QAAQ;YAC1C,kBAAkB,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,IAAI,CAAC;YAClD,aAAa,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK,IAAI,GAAG;YAC7C,gBAAgB,EAAE,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,WAAW,CAAC;YACrE,kBAAkB,EAAE,OAAO,CAAC,cAAc,EAAE,WAAW,IAAI,CAAC;YAC5D,kBAAkB,EAAE,OAAO,CAAC,cAAc,EAAE,WAAW,IAAI,CAAC;SAC7D,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,yBAAyB,CAAC,WAAiB;QACjD,IAAI,CAAC,WAAW;YAAE,OAAO,GAAG,CAAC;QAE7B,IAAI,KAAK,GAAG,GAAG,CAAC;QAEhB,kCAAkC;QAClC,IAAI,WAAW,CAAC,YAAY,CAAC,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC;YACtE,MAAM,MAAM,GAAG,WAAW,CAAC,YAAY,CAAC,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC;YACjF,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,2BAA2B;QAC3B,IAAI,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;YACzD,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;YACpE,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,OAA0B,EAAE,OAAY;QAC5D,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;QAEjF,aAAa;QACb,MAAM,SAAS,GACb,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW;YACnD,OAAO,CAAC,kBAAkB,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW;YACzD,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,0BAA0B,CAAC;YACtF,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC;YAC9E,CAAC,CAAC,cAAc,IAAI,cAAc,CAAC,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;YAC5E,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC;QAE3B,wBAAwB;QACxB,MAAM,mBAAmB,GACvB,WAAW,CAAC,MAAM,GAAG,CAAC;YACtB,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC;YACrC,CAAC,cAAc,EAAE,KAAK,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;QAEnE,mDAAmD;QACnD,MAAM,iBAAiB,GAAG,CAAC,QAAQ,EAAE,OAAO,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAEjF,uBAAuB;QACvB,MAAM,mBAAmB,GACvB,WAAW,EAAE,YAAY,CAAC,GAAG,IAAI,WAAW,CAAC,YAAY,CAAC,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,kBAAkB;YAClG,WAAW,EAAE,SAAS,IAAI,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAEjF,iBAAiB;QACjB,MAAM,aAAa,GACjB,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,0BAA0B;YAC9E,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC;QAEzE,yCAAyC;QACzC,MAAM,aAAa,GACjB,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAE3D,OAAO;YACL,SAAS;YACT,mBAAmB;YACnB,iBAAiB;YACjB,mBAAmB,EAAE,mBAAmB,IAAI,KAAK;YACjD,aAAa;YACb,aAAa;SACd,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,eAAe,CACrB,OAA0B,EAC1B,OAAY;QAEZ,MAAM,OAAO,GAAwB,EAAE,CAAC;QAExC,sCAAsC;QACtC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,kBAAkB;gBACxB,QAAQ,EAAE,UAAU;gBACpB,MAAM,EAAE,4CAA4C;gBACpD,UAAU,EAAE,2EAA2E;aACxF,CAAC,CAAC;QACL,CAAC;QAED,oCAAoC;QACpC,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,gBAAgB;gBACtB,QAAQ,EAAE,UAAU;gBACpB,MAAM,EAAE,uDAAuD,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,CAAC,cAAc,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO;gBAC9J,UAAU,EAAE,iDAAiD;aAC9D,CAAC,CAAC;QACL,CAAC;QAED,mCAAmC;QACnC,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,MAAM;gBAChB,MAAM,EAAE,2DAA2D;gBACnE,UAAU,EAAE,+DAA+D;aAC5E,CAAC,CAAC;QACL,CAAC;QAED,6BAA6B;QAC7B,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,QAAQ;gBAClB,MAAM,EAAE,kCAAkC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,GAAG;gBACnH,UAAU,EAAE,gCAAgC;aAC7C,CAAC,CAAC;QACL,CAAC;QAED,wBAAwB;QACxB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,QAAQ;gBAClB,MAAM,EAAE,yBAAyB,OAAO,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,QAAQ;gBACvE,UAAU,EAAE,oDAAoD;aACjE,CAAC,CAAC;QACL,CAAC;QAED,+BAA+B;QAC/B,IAAI,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,KAAK;gBACf,MAAM,EAAE,0BAA0B;gBAClC,UAAU,EAAE,sBAAsB;aACnC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACK,gBAAgB,CACtB,OAA0B,EAC1B,OAAY;QAEZ,MAAM,UAAU,GAAyB,EAAE,CAAC;QAE5C,2BAA2B;QAC3B,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;YACvD,UAAU,CAAC,IAAI,CAAC;gBACd,MAAM,EAAE,cAAc;gBACtB,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,WAAW;gBACtC,WAAW,EAAE,OAAO,CAAC,YAAY;gBACjC,QAAQ,EAAE,KAAK;gBACf,QAAQ,EAAE,UAAU;gBACpB,MAAM,EAAE,yCAAyC;aAClD,CAAC,CAAC;QACL,CAAC;QAED,qBAAqB;QACrB,IAAI,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;YAC7D,UAAU,CAAC,IAAI,CAAC;gBACd,MAAM,EAAE,UAAU;gBAClB,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,WAAW;gBACtC,WAAW,EAAE,OAAO,CAAC,kBAAkB;gBACvC,QAAQ,EAAE,KAAK;gBACf,QAAQ,EAAE,MAAM;gBAChB,MAAM,EAAE,wDAAwD;aACjE,CAAC,CAAC;QACL,CAAC;QAED,0BAA0B;QAC1B,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC;YAC3D,UAAU,CAAC,IAAI,CAAC;gBACd,MAAM,EAAE,cAAc;gBACtB,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,eAAe;gBAC1C,WAAW,EAAE,OAAO,CAAC,YAAY;gBACjC,QAAQ,EAAE,KAAK;gBACf,QAAQ,EAAE,MAAM;gBAChB,MAAM,EAAE,yCAAyC;aAClD,CAAC,CAAC;QACL,CAAC;QAED,2BAA2B;QAC3B,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC;YAC7D,UAAU,CAAC,IAAI,CAAC;gBACd,MAAM,EAAE,eAAe;gBACvB,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,gBAAgB;gBAC3C,WAAW,EAAE,OAAO,CAAC,aAAa;gBAClC,QAAQ,EAAE,KAAK;gBACf,QAAQ,EAAE,UAAU;gBACpB,MAAM,EAAE,kDAAkD;aAC3D,CAAC,CAAC;QACL,CAAC;QAED,qCAAqC;QACrC,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;QAC9D,IAAI,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,0BAA0B,EAAE,CAAC;YAC/D,UAAU,CAAC,IAAI,CAAC;gBACd,MAAM,EAAE,yBAAyB;gBACjC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,0BAA0B;gBACrD,WAAW,EAAE,aAAa;gBAC1B,QAAQ,EAAE,KAAK;gBACf,QAAQ,EAAE,UAAU;gBACpB,MAAM,EAAE,iEAAiE;aAC1E,CAAC,CAAC;QACL,CAAC;QAED,8BAA8B;QAC9B,IAAI,OAAO,CAAC,WAAW,EAAE,YAAY,CAAC,GAAG;YACrC,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC;YAC9E,UAAU,CAAC,IAAI,CAAC;gBACd,MAAM,EAAE,iBAAiB;gBACzB,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,kBAAkB;gBAC7C,WAAW,EAAE,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG;gBACjD,QAAQ,EAAE,KAAK;gBACf,QAAQ,EAAE,QAAQ;gBAClB,MAAM,EAAE,oDAAoD;aAC7D,CAAC,CAAC;QACL,CAAC;QAED,uBAAuB;QACvB,IAAI,OAAO,CAAC,WAAW,EAAE,SAAS;YAC9B,OAAO,CAAC,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;YACjE,UAAU,CAAC,IAAI,CAAC;gBACd,MAAM,EAAE,WAAW;gBACnB,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,YAAY;gBACvC,WAAW,EAAE,OAAO,CAAC,WAAW,CAAC,SAAS;gBAC1C,QAAQ,EAAE,KAAK;gBACf,QAAQ,EAAE,MAAM;gBAChB,MAAM,EAAE,8CAA8C;aACvD,CAAC,CAAC;QACL,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,OAAY,EAAE,UAAgC;QACtE,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,sBAAsB;QACtB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;QACjE,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC5D,CAAC;QAED,sBAAsB;QACtB,MAAM,kBAAkB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC;QAC7E,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,aAAa,kBAAkB,CAAC,MAAM,oCAAoC,CAAC,CAAC;YACvF,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBAC7B,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,WAAW,gBAAgB,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC;YAClF,CAAC,CAAC,CAAC;QACL,CAAC;QAED,2BAA2B;QAC3B,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC;QACrE,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,aAAa,cAAc,CAAC,MAAM,+CAA+C,CAAC,CAAC;QAChG,CAAC;QAED,kBAAkB;QAClB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QACtE,CAAC;QAED,qBAAqB;QACrB,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QACvD,CAAC;QAED,kBAAkB;QAClB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QAC3D,CAAC;QAED,iBAAiB;QACjB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QAClD,CAAC;QAED,aAAa;QACb,IAAI,OAAO,CAAC,SAAS,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjD,KAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;QACrE,CAAC;aAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QAC3D,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,SAAS;QACP,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,cAAc,CAAC,MAAsB;QACnC,OAAO,MAAM,CAAC,MAAM,KAAK,cAAc,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,UAA2C;QAC1D,IAAI,CAAC,UAAU,GAAG;YAChB,GAAG,IAAI,CAAC,UAAU;YAClB,GAAG,UAAU;SACd,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,WAAW,CAChB,OAA0B,EAC1B,SAA4B,EAAE;QAE9B,MAAM,QAAQ,GAAG,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAwB,CAAC;QACnE,OAAO,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,qBAAqB,CAC1B,OAA0B,EAC1B,SAA4B,EAAE;QAO9B,MAAM,QAAQ,GAAG,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAwB,CAAC;QAEnE,OAAO;YACL,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,SAAS;YACrC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,EAAE,MAAM,IAAI,mBAAmB;YAC5F,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,UAAU,EAAE,QAAQ,CAAC,UAAU;SAChC,CAAC;IACJ,CAAC;CACF;AAtdD,kDAsdC"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Human-Readable Reporter
|
|
3
|
+
*
|
|
4
|
+
* Generates human-friendly console output with colors, formatting,
|
|
5
|
+
* and clear visual hierarchy for quality check results.
|
|
6
|
+
*
|
|
7
|
+
* @module reporting/reporters/HumanReadableReporter
|
|
8
|
+
* @version 1.0.0
|
|
9
|
+
*/
|
|
10
|
+
import { Reporter, ReporterConfig, ReportFormat, ReporterOutput, AggregatedResults } from '../types';
|
|
11
|
+
/**
|
|
12
|
+
* Human-Readable Reporter
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* const reporter = new HumanReadableReporter({ useColors: true });
|
|
17
|
+
* const output = reporter.report(aggregatedResults);
|
|
18
|
+
* console.log(output.content);
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export declare class HumanReadableReporter implements Reporter {
|
|
22
|
+
private config;
|
|
23
|
+
private useColors;
|
|
24
|
+
constructor(config?: Partial<ReporterConfig>);
|
|
25
|
+
/**
|
|
26
|
+
* Generate human-readable report
|
|
27
|
+
*/
|
|
28
|
+
report(results: AggregatedResults): ReporterOutput;
|
|
29
|
+
/**
|
|
30
|
+
* Generate header
|
|
31
|
+
*/
|
|
32
|
+
private generateHeader;
|
|
33
|
+
/**
|
|
34
|
+
* Generate summary section
|
|
35
|
+
*/
|
|
36
|
+
private generateSummary;
|
|
37
|
+
/**
|
|
38
|
+
* Generate test results section
|
|
39
|
+
*/
|
|
40
|
+
private generateTestResults;
|
|
41
|
+
/**
|
|
42
|
+
* Generate coverage section
|
|
43
|
+
*/
|
|
44
|
+
private generateCoverage;
|
|
45
|
+
/**
|
|
46
|
+
* Generate quality metrics section
|
|
47
|
+
*/
|
|
48
|
+
private generateQualityMetrics;
|
|
49
|
+
/**
|
|
50
|
+
* Generate security section
|
|
51
|
+
*/
|
|
52
|
+
private generateSecurity;
|
|
53
|
+
/**
|
|
54
|
+
* Generate performance section
|
|
55
|
+
*/
|
|
56
|
+
private generatePerformance;
|
|
57
|
+
/**
|
|
58
|
+
* Generate recommendations section
|
|
59
|
+
*/
|
|
60
|
+
private generateRecommendations;
|
|
61
|
+
/**
|
|
62
|
+
* Generate footer
|
|
63
|
+
*/
|
|
64
|
+
private generateFooter;
|
|
65
|
+
getFormat(): ReportFormat;
|
|
66
|
+
validateConfig(config: ReporterConfig): boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Horizontal rule
|
|
69
|
+
*/
|
|
70
|
+
private hr;
|
|
71
|
+
/**
|
|
72
|
+
* Center text
|
|
73
|
+
*/
|
|
74
|
+
private center;
|
|
75
|
+
/**
|
|
76
|
+
* Section title
|
|
77
|
+
*/
|
|
78
|
+
private sectionTitle;
|
|
79
|
+
/**
|
|
80
|
+
* Format key-value pairs
|
|
81
|
+
*/
|
|
82
|
+
private formatKeyValue;
|
|
83
|
+
/**
|
|
84
|
+
* Progress bar
|
|
85
|
+
*/
|
|
86
|
+
private progressBar;
|
|
87
|
+
/**
|
|
88
|
+
* Coverage bar
|
|
89
|
+
*/
|
|
90
|
+
private getCoverageBar;
|
|
91
|
+
/**
|
|
92
|
+
* Truncate text
|
|
93
|
+
*/
|
|
94
|
+
private truncate;
|
|
95
|
+
/**
|
|
96
|
+
* Colorize text
|
|
97
|
+
*/
|
|
98
|
+
private colorize;
|
|
99
|
+
/**
|
|
100
|
+
* Bold text
|
|
101
|
+
*/
|
|
102
|
+
private bold;
|
|
103
|
+
/**
|
|
104
|
+
* Dim text
|
|
105
|
+
*/
|
|
106
|
+
private dim;
|
|
107
|
+
/**
|
|
108
|
+
* Get status icon
|
|
109
|
+
*/
|
|
110
|
+
private getStatusIcon;
|
|
111
|
+
/**
|
|
112
|
+
* Get status color
|
|
113
|
+
*/
|
|
114
|
+
private getStatusColor;
|
|
115
|
+
/**
|
|
116
|
+
* Get test status color
|
|
117
|
+
*/
|
|
118
|
+
private getTestStatusColor;
|
|
119
|
+
/**
|
|
120
|
+
* Get coverage color
|
|
121
|
+
*/
|
|
122
|
+
private getCoverageColor;
|
|
123
|
+
/**
|
|
124
|
+
* Get quality color
|
|
125
|
+
*/
|
|
126
|
+
private getQualityColor;
|
|
127
|
+
/**
|
|
128
|
+
* Get security color
|
|
129
|
+
*/
|
|
130
|
+
private getSecurityColor;
|
|
131
|
+
/**
|
|
132
|
+
* Get progress color
|
|
133
|
+
*/
|
|
134
|
+
private getProgressColor;
|
|
135
|
+
/**
|
|
136
|
+
* Check if terminal supports color
|
|
137
|
+
*/
|
|
138
|
+
private supportsColor;
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=HumanReadableReporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HumanReadableReporter.d.ts","sourceRoot":"","sources":["../../../src/reporting/reporters/HumanReadableReporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EACL,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,cAAc,EACd,iBAAiB,EAElB,MAAM,UAAU,CAAC;AAiBlB;;;;;;;;;GASG;AACH,qBAAa,qBAAsB,YAAW,QAAQ;IACpD,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,SAAS,CAAU;gBAEf,MAAM,GAAE,OAAO,CAAC,cAAc,CAAM;IAWhD;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,cAAc;IA6DlD;;OAEG;IACH,OAAO,CAAC,cAAc;IAoBtB;;OAEG;IACH,OAAO,CAAC,eAAe;IA8CvB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAqD3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAmCxB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAsC9B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA2CxB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA2B3B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAa/B;;OAEG;IACH,OAAO,CAAC,cAAc;IAmBtB,SAAS,IAAI,YAAY;IAIzB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO;IAI/C;;OAEG;IACH,OAAO,CAAC,EAAE;IAIV;;OAEG;IACH,OAAO,CAAC,MAAM;IAOd;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;OAEG;IACH,OAAO,CAAC,WAAW;IASnB;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAKhB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAOhB;;OAEG;IACH,OAAO,CAAC,IAAI;IAKZ;;OAEG;IACH,OAAO,CAAC,GAAG;IAKX;;OAEG;IACH,OAAO,CAAC,aAAa;IAUrB;;OAEG;IACH,OAAO,CAAC,cAAc;IAUtB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAM1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IACH,OAAO,CAAC,eAAe;IAMvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IACH,OAAO,CAAC,aAAa;CAQtB"}
|