0xray 2.1.3 → 2.2.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.
Files changed (178) 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/README.md +3 -3
  5. package/dist/CHANGELOG.md +43 -0
  6. package/dist/README.md +3 -3
  7. package/dist/analytics/routing-refiner.js +1 -1
  8. package/dist/cli/commands/govern.d.ts +29 -0
  9. package/dist/cli/commands/govern.js +152 -0
  10. package/dist/cli/index.js +29 -216
  11. package/dist/core/boot-orchestrator.js +1 -1
  12. package/dist/core/features-config.js +1 -1
  13. package/dist/core/framework-logger.js +30 -1
  14. package/dist/delegation/index.d.ts +1 -2
  15. package/dist/delegation/index.js +1 -2
  16. package/dist/enforcement/enforcer-tools.js +1 -1
  17. package/dist/execution/proposal-applier.d.ts +1 -9
  18. package/dist/execution/proposal-applier.js +18 -173
  19. package/dist/governance/codex-policy.service.d.ts +7 -25
  20. package/dist/governance/codex-policy.service.js +8 -26
  21. package/dist/governance/governance-core.d.ts +22 -28
  22. package/dist/governance/governance-core.js +31 -101
  23. package/dist/governance/governance-service.d.ts +1 -0
  24. package/dist/governance/governance-service.js +67 -4
  25. package/dist/governance/governance-types.d.ts +5 -2
  26. package/dist/inference/index.d.ts +3 -4
  27. package/dist/inference/inference-accumulator.js +1 -1
  28. package/dist/inference/inference-cycle.d.ts +12 -18
  29. package/dist/inference/inference-cycle.js +120 -335
  30. package/dist/integrations/base/index.d.ts +0 -1
  31. package/dist/integrations/base/index.js +0 -2
  32. package/dist/integrations/grok/hooks/pre-tool-use.js +4 -18
  33. package/dist/integrations/hermes-agent/bridge.mjs +10 -1
  34. package/dist/mcps/config/server-config-registry.js +1 -1
  35. package/dist/mcps/governance.server.js +4 -5
  36. package/dist/mcps/knowledge-skills/api-design.server.js +10 -0
  37. package/dist/mcps/knowledge-skills/architecture-patterns.server.js +10 -0
  38. package/dist/mcps/knowledge-skills/bug-triage-specialist.server.js +10 -0
  39. package/dist/mcps/knowledge-skills/code-analyzer.server.js +10 -0
  40. package/dist/mcps/knowledge-skills/code-review.server.js +10 -0
  41. package/dist/mcps/knowledge-skills/content-creator.server.js +10 -0
  42. package/dist/mcps/knowledge-skills/database-design.server.js +10 -0
  43. package/dist/mcps/knowledge-skills/devops-deployment.server.js +10 -0
  44. package/dist/mcps/knowledge-skills/git-workflow.server.js +10 -0
  45. package/dist/mcps/knowledge-skills/growth-strategist.server.js +10 -0
  46. package/dist/mcps/knowledge-skills/log-monitor.server.js +10 -0
  47. package/dist/mcps/knowledge-skills/mobile-development.server.js +10 -0
  48. package/dist/mcps/knowledge-skills/multimodal-looker.server.js +10 -0
  49. package/dist/mcps/knowledge-skills/performance-optimization.server.js +10 -0
  50. package/dist/mcps/knowledge-skills/project-analysis.server.js +10 -0
  51. package/dist/mcps/knowledge-skills/refactoring-strategies.server.js +10 -0
  52. package/dist/mcps/knowledge-skills/security-audit.server.js +10 -0
  53. package/dist/mcps/knowledge-skills/seo-consultant.server.js +10 -0
  54. package/dist/mcps/knowledge-skills/skill-invocation.server.d.ts +4 -0
  55. package/dist/mcps/knowledge-skills/skill-invocation.server.js +33 -14
  56. package/dist/mcps/knowledge-skills/strategist.server.js +10 -0
  57. package/dist/mcps/knowledge-skills/tech-writer.server.js +11 -1
  58. package/dist/mcps/knowledge-skills/testing-strategy.server.js +10 -0
  59. package/dist/mcps/knowledge-skills/ui-ux-design.server.js +10 -0
  60. package/dist/mcps/registry.json +1 -1
  61. package/dist/metrics/agent-metrics.d.ts +2 -1
  62. package/dist/nucleus/govern-http.d.ts +59 -0
  63. package/dist/nucleus/govern-http.js +172 -0
  64. package/dist/nucleus/index.d.ts +14 -0
  65. package/dist/nucleus/index.js +9 -0
  66. package/dist/nucleus/kernel.d.ts +51 -0
  67. package/dist/nucleus/kernel.js +62 -0
  68. package/dist/nucleus/plugin-registry.d.ts +104 -0
  69. package/dist/nucleus/plugin-registry.js +147 -0
  70. package/dist/orchestrator/orchestrator.d.ts +0 -1
  71. package/dist/orchestrator/orchestrator.js +0 -21
  72. package/dist/postprocessor/PostProcessor.d.ts +13 -1
  73. package/dist/postprocessor/PostProcessor.js +41 -1
  74. package/dist/postprocessor/autofix/AutoFixEngine.d.ts +0 -8
  75. package/dist/postprocessor/autofix/AutoFixEngine.js +0 -54
  76. package/dist/postprocessor/metamorphosis/MetamorphosisEngine.d.ts +25 -0
  77. package/dist/postprocessor/metamorphosis/MetamorphosisEngine.js +10 -0
  78. package/dist/postprocessor/metamorphosis/SelfProposalEngine.d.ts +68 -0
  79. package/dist/postprocessor/metamorphosis/SelfProposalEngine.js +371 -0
  80. package/dist/skills/orchestrator/SKILL.md +1 -1
  81. package/dist/skills/registry.json +1 -1
  82. package/dist/state/index.d.ts +0 -2
  83. package/package.json +4 -3
  84. package/scripts/node/universal-version-manager.js +3 -3
  85. package/src/mcps/config/__tests__/server-config-registry.test.ts +6 -15
  86. package/src/mcps/config/server-config-registry.ts +1 -1
  87. package/src/mcps/governance.server.ts +4 -6
  88. package/src/mcps/knowledge-skills/api-design.server.ts +9 -0
  89. package/src/mcps/knowledge-skills/architecture-patterns.server.ts +9 -0
  90. package/src/mcps/knowledge-skills/bug-triage-specialist.server.ts +9 -0
  91. package/src/mcps/knowledge-skills/code-analyzer.server.ts +9 -0
  92. package/src/mcps/knowledge-skills/code-review.server.ts +9 -0
  93. package/src/mcps/knowledge-skills/content-creator.server.ts +9 -0
  94. package/src/mcps/knowledge-skills/database-design.server.ts +9 -0
  95. package/src/mcps/knowledge-skills/devops-deployment.server.ts +9 -0
  96. package/src/mcps/knowledge-skills/git-workflow.server.ts +9 -0
  97. package/src/mcps/knowledge-skills/growth-strategist.server.ts +9 -0
  98. package/src/mcps/knowledge-skills/log-monitor.server.ts +9 -0
  99. package/src/mcps/knowledge-skills/mobile-development.server.ts +9 -0
  100. package/src/mcps/knowledge-skills/multimodal-looker.server.ts +9 -0
  101. package/src/mcps/knowledge-skills/performance-optimization.server.ts +9 -0
  102. package/src/mcps/knowledge-skills/project-analysis.server.ts +9 -0
  103. package/src/mcps/knowledge-skills/refactoring-strategies.server.ts +9 -0
  104. package/src/mcps/knowledge-skills/security-audit.server.ts +9 -0
  105. package/src/mcps/knowledge-skills/seo-consultant.server.ts +9 -0
  106. package/src/mcps/knowledge-skills/session-management.server.ts +1 -0
  107. package/src/mcps/knowledge-skills/skill-invocation.server.ts +44 -29
  108. package/src/mcps/knowledge-skills/strategist.server.ts +9 -0
  109. package/src/mcps/knowledge-skills/tech-writer.server.ts +10 -1
  110. package/src/mcps/knowledge-skills/testing-strategy.server.ts +9 -0
  111. package/src/mcps/knowledge-skills/ui-ux-design.server.ts +9 -0
  112. package/src/mcps/registry.json +1 -1
  113. package/src/opencode/codex.codex +1 -1
  114. package/src/opencode/commands/dependency-audit.md +3 -3
  115. package/src/opencode/enforcer-config.json +2 -2
  116. package/src/skills/orchestrator/SKILL.md +1 -1
  117. package/src/skills/registry.json +1 -1
  118. package/xray/codex.json +1 -1
  119. package/xray/config.json +1 -1
  120. package/xray/features.json +1 -1
  121. package/xray/integrations.json +3 -3
  122. package/.opencode/agents/testing-best-practices.yml +0 -12
  123. package/dist/analytics/consent-manager.d.ts +0 -93
  124. package/dist/analytics/consent-manager.js +0 -258
  125. package/dist/analytics/simple-pattern-analyzer.d.ts +0 -80
  126. package/dist/analytics/simple-pattern-analyzer.js +0 -297
  127. package/dist/cli/commands/analytics-disable.d.ts +0 -9
  128. package/dist/cli/commands/analytics-disable.js +0 -72
  129. package/dist/cli/commands/analytics-enable-action.d.ts +0 -8
  130. package/dist/cli/commands/analytics-enable-action.js +0 -82
  131. package/dist/cli/commands/analytics-preview.d.ts +0 -9
  132. package/dist/cli/commands/analytics-preview.js +0 -106
  133. package/dist/cli/commands/analytics-status.d.ts +0 -9
  134. package/dist/cli/commands/analytics-status.js +0 -68
  135. package/dist/cli/server.d.ts +0 -1
  136. package/dist/cli/server.js +0 -147
  137. package/dist/core/errors.d.ts +0 -3
  138. package/dist/core/errors.js +0 -10
  139. package/dist/core/logging-config.d.ts +0 -11
  140. package/dist/core/logging-config.js +0 -43
  141. package/dist/core/trace-context.d.ts +0 -12
  142. package/dist/core/trace-context.js +0 -33
  143. package/dist/delegation/voting-coordinator.d.ts +0 -49
  144. package/dist/delegation/voting-coordinator.js +0 -375
  145. package/dist/enforcement/test-auto-healing.d.ts +0 -83
  146. package/dist/enforcement/test-auto-healing.js +0 -325
  147. package/dist/integrations/base/ExampleIntegration.d.ts +0 -47
  148. package/dist/integrations/base/ExampleIntegration.js +0 -181
  149. package/dist/mcps/knowledge-skills/testing-best-practices.server.d.ts +0 -34
  150. package/dist/mcps/knowledge-skills/testing-best-practices.server.js +0 -831
  151. package/dist/mcps/orchestrator.server.d.ts +0 -10
  152. package/dist/mcps/orchestrator.server.js +0 -19
  153. package/dist/orchestrator/self-direction-activation.d.ts +0 -109
  154. package/dist/orchestrator/self-direction-activation.js +0 -245
  155. package/dist/orchestrator/universal-librarian-consultation.d.ts +0 -98
  156. package/dist/orchestrator/universal-librarian-consultation.js +0 -216
  157. package/dist/orchestrator/universal-registry-bridge.d.ts +0 -85
  158. package/dist/orchestrator/universal-registry-bridge.js +0 -247
  159. package/dist/performance/performance-budget-enforcer.d.ts +0 -158
  160. package/dist/performance/performance-budget-enforcer.js +0 -434
  161. package/dist/performance/performance-regression-tester.d.ts +0 -108
  162. package/dist/performance/performance-regression-tester.js +0 -342
  163. package/dist/skills/testing-best-practices/SKILL.md +0 -37
  164. package/dist/state/context-providers.d.ts +0 -4
  165. package/dist/state/context-providers.js +0 -1
  166. package/dist/state/state-types.d.ts +0 -5
  167. package/dist/state/state-types.js +0 -1
  168. package/dist/utils/batch-operations.d.ts +0 -25
  169. package/dist/utils/batch-operations.js +0 -292
  170. package/dist/utils/test-template-generator.d.ts +0 -25
  171. package/dist/utils/test-template-generator.js +0 -178
  172. package/dist/utils/token-manager.d.ts +0 -48
  173. package/dist/utils/token-manager.js +0 -163
  174. package/src/mcps/knowledge-skills/testing-best-practices.server.test.ts +0 -136
  175. package/src/mcps/knowledge-skills/testing-best-practices.server.ts +0 -1183
  176. package/src/mcps/orchestrator.server.ts +0 -34
  177. package/src/opencode/agents/testing-best-practices.yml +0 -12
  178. 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;