0xray 2.1.4 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/.opencode/codex.codex +1 -1
  2. package/.opencode/commands/dependency-audit.md +3 -3
  3. package/.opencode/enforcer-config.json +2 -2
  4. package/.opencode/init.sh +1 -1
  5. package/AGENTS.md +6 -6
  6. package/README.md +4 -4
  7. package/dist/AGENTS.md +6 -6
  8. package/dist/CHANGELOG.md +39 -0
  9. package/dist/README.md +4 -4
  10. package/dist/agents/code-reviewer.js +1 -1
  11. package/dist/analytics/routing-refiner.js +1 -1
  12. package/dist/cli/commands/govern.d.ts +29 -0
  13. package/dist/cli/commands/govern.js +152 -0
  14. package/dist/cli/index.js +29 -216
  15. package/dist/core/boot-orchestrator.js +2 -2
  16. package/dist/core/features-config.js +1 -1
  17. package/dist/core/framework-logger.d.ts +1 -0
  18. package/dist/core/framework-logger.js +57 -2
  19. package/dist/delegation/index.d.ts +1 -2
  20. package/dist/delegation/index.js +1 -2
  21. package/dist/enforcement/enforcer-tools.js +1 -1
  22. package/dist/execution/proposal-applier.d.ts +1 -9
  23. package/dist/execution/proposal-applier.js +18 -173
  24. package/dist/governance/codex-policy.service.d.ts +7 -25
  25. package/dist/governance/codex-policy.service.js +8 -26
  26. package/dist/governance/governance-core.d.ts +22 -28
  27. package/dist/governance/governance-core.js +31 -101
  28. package/dist/governance/governance-service.d.ts +1 -0
  29. package/dist/governance/governance-service.js +67 -4
  30. package/dist/governance/governance-types.d.ts +5 -2
  31. package/dist/inference/index.d.ts +3 -4
  32. package/dist/inference/inference-accumulator.js +1 -1
  33. package/dist/inference/inference-cycle.d.ts +12 -18
  34. package/dist/inference/inference-cycle.js +120 -335
  35. package/dist/integrations/base/index.d.ts +0 -1
  36. package/dist/integrations/base/index.js +0 -2
  37. package/dist/integrations/grok/hooks/pre-tool-use.js +4 -18
  38. package/dist/integrations/hermes-agent/bridge.mjs +9 -0
  39. package/dist/mcps/config/server-config-registry.js +1 -1
  40. package/dist/mcps/governance.server.js +4 -5
  41. package/dist/mcps/knowledge-skills/api-design.server.js +10 -0
  42. package/dist/mcps/knowledge-skills/architecture-patterns.server.js +10 -0
  43. package/dist/mcps/knowledge-skills/bug-triage-specialist.server.js +10 -0
  44. package/dist/mcps/knowledge-skills/code-analyzer.server.js +10 -0
  45. package/dist/mcps/knowledge-skills/code-review.server.js +10 -0
  46. package/dist/mcps/knowledge-skills/content-creator.server.js +10 -0
  47. package/dist/mcps/knowledge-skills/database-design.server.js +10 -0
  48. package/dist/mcps/knowledge-skills/devops-deployment.server.js +10 -0
  49. package/dist/mcps/knowledge-skills/git-workflow.server.js +10 -0
  50. package/dist/mcps/knowledge-skills/growth-strategist.server.js +10 -0
  51. package/dist/mcps/knowledge-skills/log-monitor.server.js +10 -0
  52. package/dist/mcps/knowledge-skills/mobile-development.server.js +10 -0
  53. package/dist/mcps/knowledge-skills/multimodal-looker.server.js +10 -0
  54. package/dist/mcps/knowledge-skills/performance-optimization.server.js +10 -0
  55. package/dist/mcps/knowledge-skills/project-analysis.server.js +10 -0
  56. package/dist/mcps/knowledge-skills/refactoring-strategies.server.js +10 -0
  57. package/dist/mcps/knowledge-skills/security-audit.server.js +10 -0
  58. package/dist/mcps/knowledge-skills/seo-consultant.server.js +10 -0
  59. package/dist/mcps/knowledge-skills/skill-invocation.server.d.ts +4 -0
  60. package/dist/mcps/knowledge-skills/skill-invocation.server.js +33 -14
  61. package/dist/mcps/knowledge-skills/strategist.server.js +10 -0
  62. package/dist/mcps/knowledge-skills/tech-writer.server.js +11 -1
  63. package/dist/mcps/knowledge-skills/testing-strategy.server.js +10 -0
  64. package/dist/mcps/knowledge-skills/ui-ux-design.server.js +10 -0
  65. package/dist/mcps/registry.json +1 -1
  66. package/dist/mcps/simulation/server-simulations.js +1 -1
  67. package/dist/metrics/agent-metrics.d.ts +2 -1
  68. package/dist/nucleus/govern-http.d.ts +59 -0
  69. package/dist/nucleus/govern-http.js +172 -0
  70. package/dist/nucleus/index.d.ts +14 -0
  71. package/dist/nucleus/index.js +9 -0
  72. package/dist/nucleus/kernel.d.ts +51 -0
  73. package/dist/nucleus/kernel.js +62 -0
  74. package/dist/nucleus/plugin-registry.d.ts +104 -0
  75. package/dist/nucleus/plugin-registry.js +147 -0
  76. package/dist/orchestrator/orchestrator.d.ts +0 -1
  77. package/dist/orchestrator/orchestrator.js +0 -21
  78. package/dist/postprocessor/PostProcessor.d.ts +13 -1
  79. package/dist/postprocessor/PostProcessor.js +41 -1
  80. package/dist/postprocessor/autofix/AutoFixEngine.d.ts +0 -8
  81. package/dist/postprocessor/autofix/AutoFixEngine.js +0 -54
  82. package/dist/postprocessor/metamorphosis/MetamorphosisEngine.d.ts +25 -0
  83. package/dist/postprocessor/metamorphosis/MetamorphosisEngine.js +10 -0
  84. package/dist/postprocessor/metamorphosis/SelfProposalEngine.d.ts +68 -0
  85. package/dist/postprocessor/metamorphosis/SelfProposalEngine.js +371 -0
  86. package/dist/skills/orchestrator/SKILL.md +1 -1
  87. package/dist/skills/registry.json +1 -1
  88. package/dist/state/index.d.ts +0 -2
  89. package/package.json +4 -3
  90. package/scripts/node/universal-version-manager.js +9 -9
  91. package/scripts/node/validate-mcp-connectivity.js +1 -1
  92. package/src/mcps/config/__tests__/server-config-registry.test.ts +6 -15
  93. package/src/mcps/config/server-config-registry.ts +1 -1
  94. package/src/mcps/governance.server.ts +4 -6
  95. package/src/mcps/knowledge-skills/api-design.server.ts +9 -0
  96. package/src/mcps/knowledge-skills/architecture-patterns.server.ts +9 -0
  97. package/src/mcps/knowledge-skills/bug-triage-specialist.server.ts +9 -0
  98. package/src/mcps/knowledge-skills/code-analyzer.server.ts +9 -0
  99. package/src/mcps/knowledge-skills/code-review.server.ts +9 -0
  100. package/src/mcps/knowledge-skills/content-creator.server.ts +9 -0
  101. package/src/mcps/knowledge-skills/database-design.server.ts +9 -0
  102. package/src/mcps/knowledge-skills/devops-deployment.server.ts +9 -0
  103. package/src/mcps/knowledge-skills/git-workflow.server.ts +9 -0
  104. package/src/mcps/knowledge-skills/growth-strategist.server.ts +9 -0
  105. package/src/mcps/knowledge-skills/log-monitor.server.ts +9 -0
  106. package/src/mcps/knowledge-skills/mobile-development.server.ts +9 -0
  107. package/src/mcps/knowledge-skills/multimodal-looker.server.ts +9 -0
  108. package/src/mcps/knowledge-skills/performance-optimization.server.ts +9 -0
  109. package/src/mcps/knowledge-skills/project-analysis.server.ts +9 -0
  110. package/src/mcps/knowledge-skills/refactoring-strategies.server.ts +9 -0
  111. package/src/mcps/knowledge-skills/security-audit.server.ts +9 -0
  112. package/src/mcps/knowledge-skills/seo-consultant.server.ts +9 -0
  113. package/src/mcps/knowledge-skills/session-management.server.ts +1 -0
  114. package/src/mcps/knowledge-skills/skill-invocation.server.ts +44 -29
  115. package/src/mcps/knowledge-skills/strategist.server.ts +9 -0
  116. package/src/mcps/knowledge-skills/tech-writer.server.ts +10 -1
  117. package/src/mcps/knowledge-skills/testing-strategy.server.ts +9 -0
  118. package/src/mcps/knowledge-skills/ui-ux-design.server.ts +9 -0
  119. package/src/mcps/registry.json +1 -1
  120. package/src/mcps/simulation/server-simulations.ts +1 -1
  121. package/src/opencode/codex.codex +1 -1
  122. package/src/opencode/commands/dependency-audit.md +3 -3
  123. package/src/opencode/enforcer-config.json +2 -2
  124. package/src/skills/orchestrator/SKILL.md +1 -1
  125. package/src/skills/registry.json +1 -1
  126. package/xray/codex.json +1 -1
  127. package/xray/config.json +1 -1
  128. package/xray/features.json +1 -1
  129. package/xray/integrations.json +3 -3
  130. package/.opencode/agents/testing-best-practices.yml +0 -12
  131. package/dist/analytics/consent-manager.d.ts +0 -93
  132. package/dist/analytics/consent-manager.js +0 -258
  133. package/dist/analytics/simple-pattern-analyzer.d.ts +0 -80
  134. package/dist/analytics/simple-pattern-analyzer.js +0 -297
  135. package/dist/cli/commands/analytics-disable.d.ts +0 -9
  136. package/dist/cli/commands/analytics-disable.js +0 -72
  137. package/dist/cli/commands/analytics-enable-action.d.ts +0 -8
  138. package/dist/cli/commands/analytics-enable-action.js +0 -82
  139. package/dist/cli/commands/analytics-preview.d.ts +0 -9
  140. package/dist/cli/commands/analytics-preview.js +0 -106
  141. package/dist/cli/commands/analytics-status.d.ts +0 -9
  142. package/dist/cli/commands/analytics-status.js +0 -68
  143. package/dist/cli/server.d.ts +0 -1
  144. package/dist/cli/server.js +0 -147
  145. package/dist/core/errors.d.ts +0 -3
  146. package/dist/core/errors.js +0 -10
  147. package/dist/core/logging-config.d.ts +0 -11
  148. package/dist/core/logging-config.js +0 -43
  149. package/dist/core/trace-context.d.ts +0 -12
  150. package/dist/core/trace-context.js +0 -33
  151. package/dist/delegation/voting-coordinator.d.ts +0 -49
  152. package/dist/delegation/voting-coordinator.js +0 -375
  153. package/dist/enforcement/test-auto-healing.d.ts +0 -83
  154. package/dist/enforcement/test-auto-healing.js +0 -325
  155. package/dist/integrations/base/ExampleIntegration.d.ts +0 -47
  156. package/dist/integrations/base/ExampleIntegration.js +0 -181
  157. package/dist/mcps/knowledge-skills/testing-best-practices.server.d.ts +0 -34
  158. package/dist/mcps/knowledge-skills/testing-best-practices.server.js +0 -831
  159. package/dist/mcps/orchestrator.server.d.ts +0 -10
  160. package/dist/mcps/orchestrator.server.js +0 -19
  161. package/dist/orchestrator/self-direction-activation.d.ts +0 -109
  162. package/dist/orchestrator/self-direction-activation.js +0 -245
  163. package/dist/orchestrator/universal-librarian-consultation.d.ts +0 -98
  164. package/dist/orchestrator/universal-librarian-consultation.js +0 -216
  165. package/dist/orchestrator/universal-registry-bridge.d.ts +0 -85
  166. package/dist/orchestrator/universal-registry-bridge.js +0 -247
  167. package/dist/performance/performance-budget-enforcer.d.ts +0 -158
  168. package/dist/performance/performance-budget-enforcer.js +0 -434
  169. package/dist/performance/performance-regression-tester.d.ts +0 -108
  170. package/dist/performance/performance-regression-tester.js +0 -342
  171. package/dist/skills/testing-best-practices/SKILL.md +0 -37
  172. package/dist/state/context-providers.d.ts +0 -4
  173. package/dist/state/context-providers.js +0 -1
  174. package/dist/state/state-types.d.ts +0 -5
  175. package/dist/state/state-types.js +0 -1
  176. package/dist/utils/batch-operations.d.ts +0 -25
  177. package/dist/utils/batch-operations.js +0 -292
  178. package/dist/utils/test-template-generator.d.ts +0 -25
  179. package/dist/utils/test-template-generator.js +0 -178
  180. package/dist/utils/token-manager.d.ts +0 -48
  181. package/dist/utils/token-manager.js +0 -163
  182. package/src/mcps/knowledge-skills/testing-best-practices.server.test.ts +0 -136
  183. package/src/mcps/knowledge-skills/testing-best-practices.server.ts +0 -1183
  184. package/src/mcps/orchestrator.server.ts +0 -34
  185. package/src/opencode/agents/testing-best-practices.yml +0 -12
  186. package/src/skills/testing-best-practices/SKILL.md +0 -37
@@ -1,434 +0,0 @@
1
- /**
2
- * Performance Budget Enforcement System
3
- *
4
- * Comprehensive performance testing and monitoring system that enforces
5
- * Universal Development Codex performance budget requirements.
6
- *
7
- * Performance Budget Requirements:
8
- * - Bundle size <2MB (gzipped <700KB)
9
- * - First Contentful Paint <2s
10
- * - Time to Interactive <5s
11
- *
12
- * @version 1.0.0
13
- * @since 2026-01-08
14
- */
15
- import { EventEmitter } from "events";
16
- import * as fs from "fs";
17
- import * as path from "path";
18
- import { execSync } from "child_process";
19
- import { performance } from "perf_hooks";
20
- import { frameworkLogger } from "../core/framework-logger.js";
21
- // Performance budget constants from Universal Development Codex
22
- export const PERFORMANCE_BUDGET = {
23
- bundleSize: {
24
- uncompressed: 2 * 1024 * 1024, // 2MB
25
- gzipped: 700 * 1024, // 700KB
26
- },
27
- webVitals: {
28
- firstContentfulPaint: 2000, // 2s
29
- timeToInteractive: 5000, // 5s
30
- largestContentfulPaint: 2500, // 2.5s
31
- cumulativeLayoutShift: 0.1, // 0.1
32
- firstInputDelay: 100, // 100ms
33
- },
34
- runtime: {
35
- memoryUsage: 50 * 1024 * 1024, // 50MB heap usage
36
- startupTime: 100, // 100ms
37
- testExecutionTime: 5000, // 5s
38
- },
39
- };
40
- /**
41
- * Comprehensive performance budget enforcement system
42
- */
43
- export class PerformanceBudgetEnforcer extends EventEmitter {
44
- reports = [];
45
- monitoringActive = false;
46
- alertThresholds = {
47
- warning: 0.9,
48
- error: 1.0,
49
- critical: 1.1,
50
- };
51
- started = false;
52
- boundViolation;
53
- boundBudgetExceeded;
54
- constructor() {
55
- super();
56
- }
57
- start() {
58
- if (this.started)
59
- return;
60
- this.started = true;
61
- this.setupEventHandlers();
62
- }
63
- setupEventHandlers() {
64
- this.boundViolation = this.handleViolation.bind(this);
65
- this.boundBudgetExceeded = this.handleBudgetExceeded.bind(this);
66
- this.on("violation", this.boundViolation);
67
- this.on("budget-exceeded", this.boundBudgetExceeded);
68
- }
69
- destroy() {
70
- this.off("violation", this.boundViolation);
71
- this.off("budget-exceeded", this.boundBudgetExceeded);
72
- this.removeAllListeners();
73
- }
74
- /**
75
- * Analyze bundle size against performance budget
76
- */
77
- async analyzeBundleSize(distPath = "./dist") {
78
- const metrics = {
79
- totalSize: 0,
80
- gzippedSize: 0,
81
- fileCount: 0,
82
- largestFile: { name: "", size: 0, gzippedSize: 0 },
83
- breakdown: [],
84
- };
85
- if (!fs.existsSync(distPath)) {
86
- throw new Error(`Distribution directory not found: ${distPath}`);
87
- }
88
- const files = fs.readdirSync(distPath);
89
- const jsFiles = files.filter((file) => file.endsWith(".js") || file.endsWith(".mjs"));
90
- for (const file of jsFiles) {
91
- const filePath = path.join(distPath, file);
92
- const stats = fs.statSync(filePath);
93
- const size = stats.size;
94
- // Calculate gzipped size
95
- let gzippedSize = 0;
96
- try {
97
- const gzipped = execSync(`gzip -c "${filePath}" | wc -c`, {
98
- encoding: "utf8",
99
- });
100
- gzippedSize = parseInt(gzipped.trim());
101
- }
102
- catch (error) {
103
- frameworkLogger.log("performance-budget-enforcer", "gzip-failed", "warning", { file, error });
104
- gzippedSize = size; // Fallback to uncompressed size
105
- }
106
- metrics.totalSize += size;
107
- metrics.gzippedSize += gzippedSize;
108
- metrics.fileCount++;
109
- // Track largest file
110
- if (size > metrics.largestFile.size) {
111
- metrics.largestFile = { name: file, size, gzippedSize };
112
- }
113
- // Add to breakdown
114
- metrics.breakdown.push({
115
- name: file,
116
- size,
117
- gzippedSize,
118
- percentage: 0, // Will be calculated after all files are processed
119
- });
120
- }
121
- // Calculate percentages
122
- metrics.breakdown.forEach((file) => {
123
- file.percentage = (file.size / (metrics.totalSize || 1)) * 100;
124
- });
125
- // Sort breakdown by size descending
126
- metrics.breakdown.sort((a, b) => b.size - a.size);
127
- return metrics;
128
- }
129
- /**
130
- * Measure web vitals (simulated for server-side framework)
131
- * In a real web application, this would use the Web Vitals library
132
- */
133
- async measureWebVitals() {
134
- // For server-side framework, we'll simulate measurements
135
- // In a real implementation, this would collect from actual page loads
136
- const metrics = {
137
- firstContentfulPaint: Math.random() * 1000 + 500, // 500-1500ms
138
- timeToInteractive: Math.random() * 2000 + 2000, // 2000-4000ms
139
- largestContentfulPaint: Math.random() * 1000 + 1500, // 1500-2500ms
140
- cumulativeLayoutShift: Math.random() * 0.1, // 0-0.1
141
- firstInputDelay: Math.random() * 50 + 25, // 25-75ms
142
- timestamp: Date.now(),
143
- };
144
- return metrics;
145
- }
146
- /**
147
- * Measure runtime performance metrics
148
- */
149
- measureRuntimePerformance() {
150
- const memUsage = process.memoryUsage();
151
- const cpuUsage = process.cpuUsage();
152
- return {
153
- memoryUsage: {
154
- rss: memUsage.rss,
155
- heapUsed: memUsage.heapUsed,
156
- heapTotal: memUsage.heapTotal,
157
- external: memUsage.external,
158
- },
159
- startupTime: performance.now(), // This would be measured from app start
160
- cpuUsage: (cpuUsage.user + cpuUsage.system) / 1000, // Convert to milliseconds
161
- timestamp: Date.now(),
162
- };
163
- }
164
- /**
165
- * Check performance budget compliance
166
- */
167
- checkBudgetCompliance(bundleSize, webVitals, runtime) {
168
- const violations = [];
169
- // Bundle size checks
170
- if (bundleSize.totalSize > PERFORMANCE_BUDGET.bundleSize.uncompressed) {
171
- violations.push({
172
- metric: "bundle-size-uncompressed",
173
- actual: bundleSize.totalSize,
174
- budget: PERFORMANCE_BUDGET.bundleSize.uncompressed,
175
- percentage: (bundleSize.totalSize / PERFORMANCE_BUDGET.bundleSize.uncompressed) *
176
- 100,
177
- severity: bundleSize.totalSize >
178
- PERFORMANCE_BUDGET.bundleSize.uncompressed * 1.1
179
- ? "critical"
180
- : "error",
181
- recommendation: "Reduce bundle size by code splitting, tree shaking, or removing unused dependencies",
182
- });
183
- }
184
- if (bundleSize.gzippedSize > PERFORMANCE_BUDGET.bundleSize.gzipped) {
185
- violations.push({
186
- metric: "bundle-size-gzipped",
187
- actual: bundleSize.gzippedSize,
188
- budget: PERFORMANCE_BUDGET.bundleSize.gzipped,
189
- percentage: (bundleSize.gzippedSize / PERFORMANCE_BUDGET.bundleSize.gzipped) *
190
- 100,
191
- severity: bundleSize.gzippedSize > PERFORMANCE_BUDGET.bundleSize.gzipped * 1.1
192
- ? "critical"
193
- : "error",
194
- recommendation: "Optimize gzipped bundle size through minification and compression improvements",
195
- });
196
- }
197
- // Web vitals checks (if available)
198
- if (webVitals) {
199
- if (webVitals.firstContentfulPaint >
200
- PERFORMANCE_BUDGET.webVitals.firstContentfulPaint) {
201
- violations.push({
202
- metric: "first-contentful-paint",
203
- actual: webVitals.firstContentfulPaint,
204
- budget: PERFORMANCE_BUDGET.webVitals.firstContentfulPaint,
205
- percentage: (webVitals.firstContentfulPaint /
206
- PERFORMANCE_BUDGET.webVitals.firstContentfulPaint) *
207
- 100,
208
- severity: webVitals.firstContentfulPaint >
209
- PERFORMANCE_BUDGET.webVitals.firstContentfulPaint * 1.1
210
- ? "critical"
211
- : "error",
212
- recommendation: "Optimize critical rendering path, reduce render-blocking resources",
213
- });
214
- }
215
- if (webVitals.timeToInteractive >
216
- PERFORMANCE_BUDGET.webVitals.timeToInteractive) {
217
- violations.push({
218
- metric: "time-to-interactive",
219
- actual: webVitals.timeToInteractive,
220
- budget: PERFORMANCE_BUDGET.webVitals.timeToInteractive,
221
- percentage: (webVitals.timeToInteractive /
222
- PERFORMANCE_BUDGET.webVitals.timeToInteractive) *
223
- 100,
224
- severity: webVitals.timeToInteractive >
225
- PERFORMANCE_BUDGET.webVitals.timeToInteractive * 1.1
226
- ? "critical"
227
- : "error",
228
- recommendation: "Reduce JavaScript execution time, optimize main thread work",
229
- });
230
- }
231
- }
232
- // Runtime checks
233
- if (runtime.memoryUsage.heapUsed > PERFORMANCE_BUDGET.runtime.memoryUsage) {
234
- violations.push({
235
- metric: "memory-usage",
236
- actual: runtime.memoryUsage.heapUsed,
237
- budget: PERFORMANCE_BUDGET.runtime.memoryUsage,
238
- percentage: (runtime.memoryUsage.heapUsed /
239
- PERFORMANCE_BUDGET.runtime.memoryUsage) *
240
- 100,
241
- severity: runtime.memoryUsage.heapUsed >
242
- PERFORMANCE_BUDGET.runtime.memoryUsage * 1.1
243
- ? "critical"
244
- : "warning",
245
- recommendation: "Optimize memory usage through garbage collection improvements or memory leak fixes",
246
- });
247
- }
248
- return violations;
249
- }
250
- /**
251
- * Generate comprehensive performance report
252
- */
253
- async generatePerformanceReport() {
254
- const bundleSize = await this.analyzeBundleSize();
255
- const webVitals = await this.measureWebVitals();
256
- const runtime = this.measureRuntimePerformance();
257
- const violations = this.checkBudgetCompliance(bundleSize, webVitals, runtime);
258
- // Generate recommendations based on violations
259
- const recommendations = this.generateRecommendations(violations, bundleSize, webVitals, runtime);
260
- // Determine overall status
261
- const hasCritical = violations.some((v) => v.severity === "critical");
262
- const hasError = violations.some((v) => v.severity === "error");
263
- const hasWarning = violations.some((v) => v.severity === "warning");
264
- let overallStatus = "pass";
265
- if (hasCritical || hasError) {
266
- overallStatus = "fail";
267
- }
268
- else if (hasWarning) {
269
- overallStatus = "warning";
270
- }
271
- const report = {
272
- timestamp: Date.now(),
273
- bundleSize,
274
- webVitals,
275
- runtime,
276
- violations,
277
- recommendations,
278
- overallStatus,
279
- };
280
- this.reports.push(report);
281
- // Emit events for violations
282
- violations.forEach((violation) => {
283
- this.emit("violation", violation);
284
- if (violation.percentage > 100) {
285
- this.emit("budget-exceeded", violation);
286
- }
287
- });
288
- return report;
289
- }
290
- /**
291
- * Generate performance optimization recommendations
292
- */
293
- generateRecommendations(violations, bundleSize, webVitals, runtime) {
294
- const recommendations = [];
295
- // Bundle size recommendations
296
- if (bundleSize.totalSize >
297
- PERFORMANCE_BUDGET.bundleSize.uncompressed * 0.8) {
298
- recommendations.push("Consider implementing code splitting to reduce initial bundle size");
299
- }
300
- if (bundleSize.largestFile.size > bundleSize.totalSize * 0.5) {
301
- recommendations.push(`Largest file (${bundleSize.largestFile.name}) is ${((bundleSize.largestFile.size / bundleSize.totalSize) * 100).toFixed(1)}% of bundle - consider splitting or optimizing`);
302
- }
303
- // Web vitals recommendations
304
- if (webVitals && webVitals.firstContentfulPaint > 1500) {
305
- recommendations.push("Optimize First Contentful Paint by prioritizing critical CSS and above-the-fold content");
306
- }
307
- if (webVitals && webVitals.timeToInteractive > 3000) {
308
- recommendations.push("Reduce Time to Interactive by minimizing main thread blocking JavaScript");
309
- }
310
- // Runtime recommendations
311
- if (runtime.memoryUsage.heapUsed >
312
- PERFORMANCE_BUDGET.runtime.memoryUsage * 0.8) {
313
- recommendations.push("Monitor for memory leaks and consider implementing memory optimization strategies");
314
- }
315
- // Add specific recommendations from violations
316
- violations.forEach((violation) => {
317
- if (!recommendations.includes(violation.recommendation)) {
318
- recommendations.push(violation.recommendation);
319
- }
320
- });
321
- return recommendations;
322
- }
323
- /**
324
- * Handle performance violations
325
- */
326
- handleViolation(violation) {
327
- const severity = violation.severity.toUpperCase();
328
- frameworkLogger.log("performance-budget-enforcer", "budget-violation", "warning", {
329
- severity,
330
- metric: violation.metric,
331
- actual: violation.actual.toLocaleString(),
332
- budget: violation.budget.toLocaleString(),
333
- percentage: violation.percentage.toFixed(1) + "%",
334
- recommendation: violation.recommendation,
335
- });
336
- }
337
- /**
338
- * Handle budget exceeded events
339
- */
340
- handleBudgetExceeded(violation) {
341
- frameworkLogger.log("performance-budget-enforcer", "budget-exceeded", "error", {
342
- metric: violation.metric,
343
- percentage: violation.percentage.toFixed(1) + "% of budget",
344
- });
345
- if (violation.severity === "critical") {
346
- frameworkLogger.log("performance-budget-enforcer", "critical-violation", "error", {
347
- message: "CRITICAL: This violation requires immediate attention before deployment",
348
- });
349
- }
350
- }
351
- /**
352
- * Start continuous performance monitoring
353
- */
354
- startMonitoring(intervalMs = 30000) {
355
- if (this.monitoringActive) {
356
- return;
357
- }
358
- this.monitoringActive = true;
359
- const monitor = async () => {
360
- if (!this.monitoringActive) {
361
- return;
362
- }
363
- try {
364
- await this.generatePerformanceReport();
365
- }
366
- catch (error) {
367
- frameworkLogger.log("performance-budget-enforcer", "monitoring-error", "error", { error });
368
- }
369
- setTimeout(monitor, intervalMs);
370
- };
371
- // Initial report
372
- monitor();
373
- }
374
- /**
375
- * Stop performance monitoring
376
- */
377
- stopMonitoring() {
378
- this.monitoringActive = false;
379
- }
380
- /**
381
- * Get historical performance reports
382
- */
383
- getReports(limit = 10) {
384
- return this.reports.slice(-limit);
385
- }
386
- /**
387
- * Export performance data for analysis
388
- */
389
- exportPerformanceData() {
390
- const summary = {
391
- totalReports: this.reports.length,
392
- averageViolations: this.reports.length > 0
393
- ? this.reports.reduce((sum, r) => sum + r.violations.length, 0) /
394
- this.reports.length
395
- : 0,
396
- mostCommonViolation: "",
397
- trend: "stable",
398
- };
399
- // Calculate most common violation
400
- const violationCounts = {};
401
- this.reports.forEach((report) => {
402
- report.violations.forEach((violation) => {
403
- violationCounts[violation.metric] =
404
- (violationCounts[violation.metric] || 0) + 1;
405
- });
406
- });
407
- const mostCommon = Object.entries(violationCounts).sort(([, a], [, b]) => b - a)[0];
408
- summary.mostCommonViolation = mostCommon ? mostCommon[0] : "none";
409
- // Calculate trend (simple implementation)
410
- if (this.reports.length >= 3) {
411
- const recent = this.reports.slice(-3);
412
- const violationTrend = recent.map((r) => r.violations.length);
413
- if (violationTrend.length >= 3 &&
414
- violationTrend[0] !== undefined &&
415
- violationTrend[1] !== undefined &&
416
- violationTrend[2] !== undefined) {
417
- const avgFirst = (violationTrend[0] + violationTrend[1]) / 2;
418
- const avgLast = (violationTrend[1] + violationTrend[2]) / 2;
419
- if (avgLast < avgFirst) {
420
- summary.trend = "improving";
421
- }
422
- else if (avgLast > avgFirst) {
423
- summary.trend = "degrading";
424
- }
425
- }
426
- }
427
- return {
428
- reports: this.reports,
429
- summary,
430
- };
431
- }
432
- }
433
- // Export singleton instance
434
- export const performanceBudgetEnforcer = new PerformanceBudgetEnforcer();
@@ -1,108 +0,0 @@
1
- /**
2
- * Performance Regression Testing
3
- *
4
- * Automated testing system that detects performance regressions and
5
- * enforces performance budget compliance in CI/CD pipelines.
6
- *
7
- * @version 1.0.0
8
- * @since 2026-01-08
9
- */
10
- import { PerformanceBudgetEnforcer, PerformanceReport } from "./performance-budget-enforcer.js";
11
- export interface PerformanceRegressionTest {
12
- name: string;
13
- description: string;
14
- testFunction: () => Promise<void> | void;
15
- timeout: number;
16
- expectedDuration?: number;
17
- tolerance: number;
18
- }
19
- export interface RegressionTestResult {
20
- testName: string;
21
- duration: number;
22
- expectedDuration?: number;
23
- deviation: number;
24
- status: "pass" | "warning" | "fail";
25
- error?: string;
26
- timestamp: number;
27
- }
28
- export interface PerformanceBaseline {
29
- testName: string;
30
- averageDuration: number;
31
- standardDeviation: number;
32
- sampleCount: number;
33
- lastUpdated: number;
34
- tolerance: number;
35
- }
36
- export interface RegressionTestSuite {
37
- name: string;
38
- description: string;
39
- tests: PerformanceRegressionTest[];
40
- baselineFile: string;
41
- failOnRegression: boolean;
42
- warningThreshold: number;
43
- failureThreshold: number;
44
- }
45
- /**
46
- * Performance regression testing system
47
- */
48
- export declare class PerformanceRegressionTester {
49
- private baselines;
50
- private results;
51
- private budgetEnforcer;
52
- constructor(budgetEnforcer?: PerformanceBudgetEnforcer);
53
- /**
54
- * Load performance baselines from file
55
- */
56
- loadBaselines(baselineFile: string): void;
57
- /**
58
- * Save performance baselines to file
59
- */
60
- saveBaselines(baselineFile: string): void;
61
- /**
62
- * Run a single performance regression test
63
- */
64
- runRegressionTest(test: PerformanceRegressionTest): Promise<RegressionTestResult>;
65
- /**
66
- * Run a complete regression test suite
67
- */
68
- runTestSuite(suite: RegressionTestSuite): Promise<{
69
- results: RegressionTestResult[];
70
- summary: {
71
- totalTests: number;
72
- passed: number;
73
- warnings: number;
74
- failed: number;
75
- averageDeviation: number;
76
- maxDeviation: number;
77
- duration: number;
78
- };
79
- budgetReport?: PerformanceReport;
80
- success: boolean;
81
- }>;
82
- /**
83
- * Update baselines with new test results
84
- */
85
- private updateBaselines;
86
- /**
87
- * Generate test suite summary
88
- */
89
- private generateSummary;
90
- /**
91
- * Create default performance regression test suite
92
- */
93
- createDefaultTestSuite(): RegressionTestSuite;
94
- /**
95
- * Export test results for analysis
96
- */
97
- exportResults(): {
98
- results: RegressionTestResult[];
99
- baselines: Record<string, PerformanceBaseline>;
100
- summary: {
101
- totalTests: number;
102
- passRate: number;
103
- averageDeviation: number;
104
- regressionDetected: boolean;
105
- };
106
- };
107
- }
108
- export declare const performanceRegressionTester: PerformanceRegressionTester;