mcp-wordpress 1.2.2 → 1.3.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 (251) hide show
  1. package/README.md +210 -182
  2. package/dist/cache/CacheInvalidation.d.ts +3 -3
  3. package/dist/cache/CacheInvalidation.d.ts.map +1 -1
  4. package/dist/cache/CacheInvalidation.js +119 -119
  5. package/dist/cache/CacheInvalidation.js.map +1 -1
  6. package/dist/cache/CacheManager.d.ts +5 -0
  7. package/dist/cache/CacheManager.d.ts.map +1 -1
  8. package/dist/cache/CacheManager.js +26 -16
  9. package/dist/cache/CacheManager.js.map +1 -1
  10. package/dist/cache/HttpCacheWrapper.d.ts +1 -1
  11. package/dist/cache/HttpCacheWrapper.d.ts.map +1 -1
  12. package/dist/cache/HttpCacheWrapper.js +29 -29
  13. package/dist/cache/HttpCacheWrapper.js.map +1 -1
  14. package/dist/cache/__tests__/CacheInvalidation.test.js +96 -94
  15. package/dist/cache/__tests__/CacheInvalidation.test.js.map +1 -1
  16. package/dist/cache/__tests__/CacheManager.test.js +113 -113
  17. package/dist/cache/__tests__/CacheManager.test.js.map +1 -1
  18. package/dist/cache/__tests__/CachedWordPressClient.test.js +102 -99
  19. package/dist/cache/__tests__/CachedWordPressClient.test.js.map +1 -1
  20. package/dist/cache/__tests__/HttpCacheWrapper.test.js +98 -95
  21. package/dist/cache/__tests__/HttpCacheWrapper.test.js.map +1 -1
  22. package/dist/cache/index.d.ts +7 -7
  23. package/dist/cache/index.d.ts.map +1 -1
  24. package/dist/cache/index.js +4 -4
  25. package/dist/cache/index.js.map +1 -1
  26. package/dist/client/CachedWordPressClient.d.ts +4 -4
  27. package/dist/client/CachedWordPressClient.d.ts.map +1 -1
  28. package/dist/client/CachedWordPressClient.js +55 -51
  29. package/dist/client/CachedWordPressClient.js.map +1 -1
  30. package/dist/client/api.d.ts +10 -10
  31. package/dist/client/api.js +158 -158
  32. package/dist/client/api.js.map +1 -1
  33. package/dist/client/auth.d.ts +2 -2
  34. package/dist/client/auth.js +72 -72
  35. package/dist/client/managers/AuthenticationManager.d.ts +2 -2
  36. package/dist/client/managers/AuthenticationManager.js +46 -46
  37. package/dist/client/managers/BaseManager.d.ts +1 -1
  38. package/dist/client/managers/BaseManager.js +9 -9
  39. package/dist/client/managers/RequestManager.d.ts +5 -3
  40. package/dist/client/managers/RequestManager.d.ts.map +1 -1
  41. package/dist/client/managers/RequestManager.js +39 -19
  42. package/dist/client/managers/RequestManager.js.map +1 -1
  43. package/dist/client/managers/index.d.ts +3 -3
  44. package/dist/client/managers/index.js +3 -3
  45. package/dist/config/ConfigurationSchema.d.ts +2 -2
  46. package/dist/config/ConfigurationSchema.d.ts.map +1 -1
  47. package/dist/config/ConfigurationSchema.js +40 -40
  48. package/dist/config/ConfigurationSchema.js.map +1 -1
  49. package/dist/config/ServerConfiguration.d.ts +2 -2
  50. package/dist/config/ServerConfiguration.js +35 -35
  51. package/dist/config/ServerConfiguration.js.map +1 -1
  52. package/dist/docs/DocumentationGenerator.d.ts.map +1 -1
  53. package/dist/docs/DocumentationGenerator.js +296 -255
  54. package/dist/docs/DocumentationGenerator.js.map +1 -1
  55. package/dist/docs/MarkdownFormatter.d.ts +1 -1
  56. package/dist/docs/MarkdownFormatter.d.ts.map +1 -1
  57. package/dist/docs/MarkdownFormatter.js +60 -51
  58. package/dist/docs/MarkdownFormatter.js.map +1 -1
  59. package/dist/docs/index.d.ts +3 -3
  60. package/dist/docs/index.d.ts.map +1 -1
  61. package/dist/docs/index.js +2 -2
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +16 -16
  64. package/dist/index.js.map +1 -1
  65. package/dist/mcp-wordpress-1.3.0.tgz +0 -0
  66. package/dist/performance/MetricsCollector.d.ts +3 -3
  67. package/dist/performance/MetricsCollector.d.ts.map +1 -1
  68. package/dist/performance/MetricsCollector.js +33 -27
  69. package/dist/performance/MetricsCollector.js.map +1 -1
  70. package/dist/performance/PerformanceAnalytics.d.ts +12 -12
  71. package/dist/performance/PerformanceAnalytics.d.ts.map +1 -1
  72. package/dist/performance/PerformanceAnalytics.js +200 -154
  73. package/dist/performance/PerformanceAnalytics.js.map +1 -1
  74. package/dist/performance/PerformanceMonitor.d.ts +5 -5
  75. package/dist/performance/PerformanceMonitor.d.ts.map +1 -1
  76. package/dist/performance/PerformanceMonitor.js +53 -52
  77. package/dist/performance/PerformanceMonitor.js.map +1 -1
  78. package/dist/performance/index.d.ts +6 -6
  79. package/dist/performance/index.d.ts.map +1 -1
  80. package/dist/performance/index.js +3 -3
  81. package/dist/security/InputValidator.d.ts +1 -1
  82. package/dist/security/InputValidator.d.ts.map +1 -1
  83. package/dist/security/InputValidator.js +111 -88
  84. package/dist/security/InputValidator.js.map +1 -1
  85. package/dist/security/SecurityConfig.d.ts +5 -5
  86. package/dist/security/SecurityConfig.js +92 -92
  87. package/dist/security/SecurityConfig.js.map +1 -1
  88. package/dist/server/ConnectionTester.d.ts +1 -1
  89. package/dist/server/ConnectionTester.d.ts.map +1 -1
  90. package/dist/server/ConnectionTester.js +4 -4
  91. package/dist/server/ConnectionTester.js.map +1 -1
  92. package/dist/server/ToolRegistry.d.ts +2 -2
  93. package/dist/server/ToolRegistry.d.ts.map +1 -1
  94. package/dist/server/ToolRegistry.js +35 -32
  95. package/dist/server/ToolRegistry.js.map +1 -1
  96. package/dist/server.d.ts +2 -2
  97. package/dist/server.js +2 -2
  98. package/dist/tools/BaseToolManager.js +5 -5
  99. package/dist/tools/auth.d.ts +2 -2
  100. package/dist/tools/auth.d.ts.map +1 -1
  101. package/dist/tools/auth.js +32 -31
  102. package/dist/tools/auth.js.map +1 -1
  103. package/dist/tools/cache.d.ts +1 -1
  104. package/dist/tools/cache.d.ts.map +1 -1
  105. package/dist/tools/cache.js +71 -71
  106. package/dist/tools/cache.js.map +1 -1
  107. package/dist/tools/comments.d.ts +2 -2
  108. package/dist/tools/comments.d.ts.map +1 -1
  109. package/dist/tools/comments.js +79 -79
  110. package/dist/tools/comments.js.map +1 -1
  111. package/dist/tools/index.d.ts +10 -10
  112. package/dist/tools/index.js +10 -10
  113. package/dist/tools/media.d.ts +2 -2
  114. package/dist/tools/media.js +80 -80
  115. package/dist/tools/pages.d.ts +2 -2
  116. package/dist/tools/pages.d.ts.map +1 -1
  117. package/dist/tools/pages.js +75 -75
  118. package/dist/tools/pages.js.map +1 -1
  119. package/dist/tools/performance.d.ts +1 -1
  120. package/dist/tools/performance.d.ts.map +1 -1
  121. package/dist/tools/performance.js +311 -287
  122. package/dist/tools/performance.js.map +1 -1
  123. package/dist/tools/posts.d.ts +2 -2
  124. package/dist/tools/posts.d.ts.map +1 -1
  125. package/dist/tools/posts.js +94 -94
  126. package/dist/tools/posts.js.map +1 -1
  127. package/dist/tools/site.d.ts +2 -2
  128. package/dist/tools/site.d.ts.map +1 -1
  129. package/dist/tools/site.js +60 -60
  130. package/dist/tools/site.js.map +1 -1
  131. package/dist/tools/taxonomies.d.ts +2 -2
  132. package/dist/tools/taxonomies.js +89 -89
  133. package/dist/tools/users.d.ts +2 -2
  134. package/dist/tools/users.js +68 -68
  135. package/dist/tools/users.js.map +1 -1
  136. package/dist/types/client.d.ts +13 -13
  137. package/dist/types/client.d.ts.map +1 -1
  138. package/dist/types/client.js +12 -12
  139. package/dist/types/client.js.map +1 -1
  140. package/dist/types/index.d.ts +19 -19
  141. package/dist/types/index.d.ts.map +1 -1
  142. package/dist/types/index.js +3 -3
  143. package/dist/types/mcp.d.ts +7 -7
  144. package/dist/types/wordpress.d.ts +21 -21
  145. package/dist/types/wordpress.d.ts.map +1 -1
  146. package/dist/utils/debug.d.ts +2 -2
  147. package/dist/utils/debug.js +28 -28
  148. package/dist/utils/error.d.ts.map +1 -1
  149. package/dist/utils/error.js +13 -13
  150. package/dist/utils/error.js.map +1 -1
  151. package/dist/utils/toolWrapper.d.ts.map +1 -1
  152. package/dist/utils/toolWrapper.js +5 -5
  153. package/dist/utils/toolWrapper.js.map +1 -1
  154. package/dist/utils/validation.d.ts.map +1 -1
  155. package/dist/utils/validation.js +41 -31
  156. package/dist/utils/validation.js.map +1 -1
  157. package/docs/CACHING.md +36 -2
  158. package/docs/DOCKER.md +24 -18
  159. package/docs/PERFORMANCE_MONITORING.md +49 -1
  160. package/docs/SECURITY_TESTING.md +30 -1
  161. package/docs/api/README.md +9 -1
  162. package/docs/api/summary.json +1 -1
  163. package/docs/contract-testing.md +24 -3
  164. package/docs/developer/GITHUB_ACTIONS_SETUP.md +8 -2
  165. package/docs/developer/MAINTENANCE.md +29 -3
  166. package/docs/developer/MIGRATION_GUIDE.md +13 -1
  167. package/docs/developer/NPM_AUTH_SETUP.md +13 -2
  168. package/docs/developer/REFACTORING.md +31 -1
  169. package/docs/releases/COMMUNITY_ANNOUNCEMENT_v1.1.2.md +18 -7
  170. package/docs/releases/RELEASE_NOTES_v1.1.2.md +31 -5
  171. package/docs/user-guides/DOCKER_SETUP.md +264 -0
  172. package/docs/user-guides/DTX_SETUP.md +327 -0
  173. package/docs/user-guides/NPM_SETUP.md +109 -0
  174. package/docs/user-guides/NPX_SETUP.md +281 -0
  175. package/docs/wordpress-rest-api-authentication-troubleshooting.md +13 -2
  176. package/package.json +27 -8
  177. package/src/cache/CacheInvalidation.ts +140 -132
  178. package/src/cache/CacheManager.ts +40 -29
  179. package/src/cache/HttpCacheWrapper.ts +105 -68
  180. package/src/cache/__tests__/CacheInvalidation.test.ts +123 -118
  181. package/src/cache/__tests__/CacheManager.test.ts +156 -152
  182. package/src/cache/__tests__/CachedWordPressClient.test.ts +131 -116
  183. package/src/cache/__tests__/HttpCacheWrapper.test.ts +118 -115
  184. package/src/cache/index.ts +13 -13
  185. package/src/client/CachedWordPressClient.ts +90 -80
  186. package/src/client/api.ts +205 -205
  187. package/src/client/auth.ts +80 -80
  188. package/src/client/managers/AuthenticationManager.ts +61 -61
  189. package/src/client/managers/BaseManager.ts +11 -11
  190. package/src/client/managers/RequestManager.ts +79 -47
  191. package/src/client/managers/index.ts +3 -3
  192. package/src/config/ConfigurationSchema.ts +44 -44
  193. package/src/config/ServerConfiguration.ts +39 -39
  194. package/src/docs/DocumentationGenerator.ts +402 -295
  195. package/src/docs/MarkdownFormatter.ts +94 -69
  196. package/src/docs/index.ts +4 -4
  197. package/src/index.ts +24 -21
  198. package/src/performance/MetricsCollector.ts +90 -58
  199. package/src/performance/PerformanceAnalytics.ts +386 -262
  200. package/src/performance/PerformanceMonitor.ts +152 -118
  201. package/src/performance/index.ts +9 -9
  202. package/src/security/InputValidator.ts +148 -91
  203. package/src/security/SecurityConfig.ts +94 -94
  204. package/src/server/ConnectionTester.ts +21 -15
  205. package/src/server/ToolRegistry.ts +64 -51
  206. package/src/server.ts +2 -2
  207. package/src/tools/BaseToolManager.ts +6 -6
  208. package/src/tools/auth.ts +42 -37
  209. package/src/tools/cache.ts +85 -81
  210. package/src/tools/comments.ts +93 -91
  211. package/src/tools/index.ts +10 -10
  212. package/src/tools/media.ts +89 -89
  213. package/src/tools/pages.ts +89 -87
  214. package/src/tools/performance.ts +443 -352
  215. package/src/tools/posts.ts +109 -107
  216. package/src/tools/site.ts +86 -77
  217. package/src/tools/taxonomies.ts +102 -102
  218. package/src/tools/users.ts +77 -77
  219. package/src/types/client.ts +157 -60
  220. package/src/types/index.ts +49 -27
  221. package/src/types/mcp.ts +15 -15
  222. package/src/types/wordpress.ts +57 -29
  223. package/src/utils/debug.ts +37 -37
  224. package/src/utils/error.ts +47 -25
  225. package/src/utils/toolWrapper.ts +12 -8
  226. package/src/utils/validation.ts +116 -65
  227. package/dist/client/WordPressClient.d.ts +0 -81
  228. package/dist/client/WordPressClient.d.ts.map +0 -1
  229. package/dist/client/WordPressClient.js +0 -354
  230. package/dist/client/WordPressClient.js.map +0 -1
  231. package/dist/performance/AnomalyDetector.d.ts +0 -63
  232. package/dist/performance/AnomalyDetector.d.ts.map +0 -1
  233. package/dist/performance/AnomalyDetector.js +0 -222
  234. package/dist/performance/AnomalyDetector.js.map +0 -1
  235. package/dist/performance/BenchmarkAnalyzer.d.ts +0 -67
  236. package/dist/performance/BenchmarkAnalyzer.d.ts.map +0 -1
  237. package/dist/performance/BenchmarkAnalyzer.js +0 -301
  238. package/dist/performance/BenchmarkAnalyzer.js.map +0 -1
  239. package/dist/performance/TrendAnalyzer.d.ts +0 -69
  240. package/dist/performance/TrendAnalyzer.d.ts.map +0 -1
  241. package/dist/performance/TrendAnalyzer.js +0 -203
  242. package/dist/performance/TrendAnalyzer.js.map +0 -1
  243. package/dist/tools/BaseToolClass.d.ts +0 -76
  244. package/dist/tools/BaseToolClass.d.ts.map +0 -1
  245. package/dist/tools/BaseToolClass.js +0 -104
  246. package/dist/tools/BaseToolClass.js.map +0 -1
  247. package/dist/tools/base.d.ts +0 -37
  248. package/dist/tools/base.d.ts.map +0 -1
  249. package/dist/tools/base.js +0 -60
  250. package/dist/tools/base.js.map +0 -1
  251. package/docs/user-guides/CLAUDE_DESKTOP_SETUP.md +0 -187
@@ -3,9 +3,12 @@
3
3
  * Integrates with existing client and cache systems
4
4
  */
5
5
 
6
- import { PerformanceMonitor, PerformanceMetrics } from './PerformanceMonitor.js';
7
- import type { CacheStats } from '../cache/CacheManager.js';
8
- import type { ClientStats } from '../types/client.js';
6
+ import {
7
+ PerformanceMonitor,
8
+ PerformanceMetrics,
9
+ } from "./PerformanceMonitor.js";
10
+ import type { CacheStats } from "../cache/CacheManager.js";
11
+ import type { ClientStats } from "../types/client.js";
9
12
 
10
13
  export interface CollectorConfig {
11
14
  enableRealTime: boolean;
@@ -45,7 +48,7 @@ export class MetricsCollector {
45
48
 
46
49
  constructor(
47
50
  monitor: PerformanceMonitor,
48
- config: Partial<CollectorConfig> = {}
51
+ config: Partial<CollectorConfig> = {},
49
52
  ) {
50
53
  this.monitor = monitor;
51
54
  this.config = {
@@ -55,7 +58,7 @@ export class MetricsCollector {
55
58
  enableRequestInterception: true,
56
59
  enableCacheIntegration: true,
57
60
  enableSystemMetrics: true,
58
- ...config
61
+ ...config,
59
62
  };
60
63
 
61
64
  if (this.config.enableRealTime) {
@@ -68,7 +71,7 @@ export class MetricsCollector {
68
71
  */
69
72
  registerClient(siteId: string, client: any): void {
70
73
  this.clientInstances.set(siteId, client);
71
-
74
+
72
75
  if (this.config.enableRequestInterception) {
73
76
  this.interceptClientRequests(siteId, client);
74
77
  }
@@ -84,14 +87,18 @@ export class MetricsCollector {
84
87
  /**
85
88
  * Start tracking a tool execution
86
89
  */
87
- startToolExecution(toolName: string, parameters: any, siteId?: string): string {
90
+ startToolExecution(
91
+ toolName: string,
92
+ parameters: any,
93
+ siteId?: string,
94
+ ): string {
88
95
  const executionId = `${toolName}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
89
-
96
+
90
97
  this.activeTools.set(executionId, {
91
98
  toolName,
92
99
  parameters,
93
100
  startTime: Date.now(),
94
- siteId
101
+ siteId,
95
102
  });
96
103
 
97
104
  return executionId;
@@ -105,10 +112,10 @@ export class MetricsCollector {
105
112
  if (!context) return;
106
113
 
107
114
  const responseTime = Date.now() - context.startTime;
108
-
115
+
109
116
  // Record in performance monitor
110
117
  this.monitor.recordRequest(responseTime, success, context.toolName);
111
-
118
+
112
119
  this.activeTools.delete(executionId);
113
120
  }
114
121
 
@@ -116,10 +123,10 @@ export class MetricsCollector {
116
123
  * Record a raw request (bypass tool tracking)
117
124
  */
118
125
  recordRawRequest(
119
- responseTime: number,
120
- success: boolean,
126
+ responseTime: number,
127
+ success: boolean,
121
128
  endpoint: string,
122
- fromCache: boolean = false
129
+ fromCache: boolean = false,
123
130
  ): void {
124
131
  this.monitor.recordRequest(responseTime, success);
125
132
  }
@@ -130,10 +137,10 @@ export class MetricsCollector {
130
137
  collectCurrentMetrics(): PerformanceMetrics {
131
138
  // Update cache metrics from all registered cache managers
132
139
  this.updateCacheMetrics();
133
-
140
+
134
141
  // Update client metrics from all registered clients
135
142
  this.updateClientMetrics();
136
-
143
+
137
144
  // Get current metrics from monitor
138
145
  return this.monitor.getMetrics();
139
146
  }
@@ -147,11 +154,11 @@ export class MetricsCollector {
147
154
  misses: 0,
148
155
  evictions: 0,
149
156
  totalSize: 0,
150
- hitRate: 0
157
+ hitRate: 0,
151
158
  };
152
159
 
153
160
  for (const [_siteId, cacheManager] of this.cacheManagers) {
154
- if (cacheManager && typeof cacheManager.getStats === 'function') {
161
+ if (cacheManager && typeof cacheManager.getStats === "function") {
155
162
  const stats = cacheManager.getStats();
156
163
  aggregated.hits += stats.hits || 0;
157
164
  aggregated.misses += stats.misses || 0;
@@ -177,20 +184,20 @@ export class MetricsCollector {
177
184
  failedRequests: 0,
178
185
  averageResponseTime: 0,
179
186
  rateLimitHits: 0,
180
- authFailures: 0
187
+ authFailures: 0,
181
188
  };
182
189
 
183
190
  const responseTimes: number[] = [];
184
191
 
185
192
  for (const [_siteId, client] of this.clientInstances) {
186
- if (client && typeof client.getStats === 'function') {
193
+ if (client && typeof client.getStats === "function") {
187
194
  const stats = client.getStats();
188
195
  aggregated.totalRequests += stats.totalRequests || 0;
189
196
  aggregated.successfulRequests += stats.successfulRequests || 0;
190
197
  aggregated.failedRequests += stats.failedRequests || 0;
191
198
  aggregated.rateLimitHits += stats.rateLimitHits || 0;
192
199
  aggregated.authFailures += stats.authFailures || 0;
193
-
200
+
194
201
  if (stats.averageResponseTime) {
195
202
  responseTimes.push(stats.averageResponseTime);
196
203
  }
@@ -199,7 +206,9 @@ export class MetricsCollector {
199
206
 
200
207
  // Calculate overall average response time
201
208
  if (responseTimes.length > 0) {
202
- aggregated.averageResponseTime = responseTimes.reduce((sum, time) => sum + time, 0) / responseTimes.length;
209
+ aggregated.averageResponseTime =
210
+ responseTimes.reduce((sum, time) => sum + time, 0) /
211
+ responseTimes.length;
203
212
  }
204
213
 
205
214
  return aggregated;
@@ -216,13 +225,13 @@ export class MetricsCollector {
216
225
  const result: any = { isActive: false };
217
226
 
218
227
  const cacheManager = this.cacheManagers.get(siteId);
219
- if (cacheManager && typeof cacheManager.getStats === 'function') {
228
+ if (cacheManager && typeof cacheManager.getStats === "function") {
220
229
  result.cache = cacheManager.getStats();
221
230
  result.isActive = true;
222
231
  }
223
232
 
224
233
  const client = this.clientInstances.get(siteId);
225
- if (client && typeof client.getStats === 'function') {
234
+ if (client && typeof client.getStats === "function") {
226
235
  result.client = client.getStats();
227
236
  result.isActive = true;
228
237
  }
@@ -235,13 +244,16 @@ export class MetricsCollector {
235
244
  */
236
245
  compareSitePerformance(): {
237
246
  sites: string[];
238
- comparison: Record<string, {
239
- responseTime: number;
240
- cacheHitRate: number;
241
- errorRate: number;
242
- requestCount: number;
243
- ranking: number;
244
- }>;
247
+ comparison: Record<
248
+ string,
249
+ {
250
+ responseTime: number;
251
+ cacheHitRate: number;
252
+ errorRate: number;
253
+ requestCount: number;
254
+ ranking: number;
255
+ }
256
+ >;
245
257
  bestPerforming: string;
246
258
  worstPerforming: string;
247
259
  } {
@@ -251,23 +263,28 @@ export class MetricsCollector {
251
263
 
252
264
  for (const siteId of sites) {
253
265
  const metrics = this.getSiteMetrics(siteId);
254
-
266
+
255
267
  const responseTime = metrics.client?.averageResponseTime || 0;
256
268
  const cacheHitRate = metrics.cache?.hitRate || 0;
257
- const errorRate = metrics.client
258
- ? (metrics.client.failedRequests / Math.max(metrics.client.totalRequests, 1))
269
+ const errorRate = metrics.client
270
+ ? metrics.client.failedRequests /
271
+ Math.max(metrics.client.totalRequests, 1)
259
272
  : 0;
260
273
  const requestCount = metrics.client?.totalRequests || 0;
261
274
 
262
275
  // Calculate performance score (lower is better for response time and error rate)
263
- const score = (responseTime / 1000) + (errorRate * 100) - (cacheHitRate * 50) + (requestCount * 0.001);
276
+ const score =
277
+ responseTime / 1000 +
278
+ errorRate * 100 -
279
+ cacheHitRate * 50 +
280
+ requestCount * 0.001;
264
281
 
265
282
  comparison[siteId] = {
266
283
  responseTime,
267
284
  cacheHitRate,
268
285
  errorRate,
269
286
  requestCount,
270
- ranking: 0 // Will be set after sorting
287
+ ranking: 0, // Will be set after sorting
271
288
  };
272
289
 
273
290
  rankings.push({ site: siteId, score });
@@ -284,8 +301,8 @@ export class MetricsCollector {
284
301
  return {
285
302
  sites,
286
303
  comparison,
287
- bestPerforming: rankings[0]?.site || '',
288
- worstPerforming: rankings[rankings.length - 1]?.site || ''
304
+ bestPerforming: rankings[0]?.site || "",
305
+ worstPerforming: rankings[rankings.length - 1]?.site || "",
289
306
  };
290
307
  }
291
308
 
@@ -304,34 +321,49 @@ export class MetricsCollector {
304
321
 
305
322
  // Critical issues
306
323
  if (metrics.requests.averageResponseTime > 5000) {
307
- critical.push('Response times are critically high (>5s). Enable caching immediately.');
324
+ critical.push(
325
+ "Response times are critically high (>5s). Enable caching immediately.",
326
+ );
308
327
  }
309
328
 
310
- const errorRate = metrics.requests.failed / Math.max(metrics.requests.total, 1);
329
+ const errorRate =
330
+ metrics.requests.failed / Math.max(metrics.requests.total, 1);
311
331
  if (errorRate > 0.1) {
312
- critical.push('Error rate is critically high (>10%). Check WordPress connectivity.');
332
+ critical.push(
333
+ "Error rate is critically high (>10%). Check WordPress connectivity.",
334
+ );
313
335
  }
314
336
 
315
337
  // Recommended optimizations
316
338
  if (metrics.cache.hitRate < 0.8) {
317
- recommended.push('Cache hit rate is below 80%. Consider cache warming or TTL adjustment.');
339
+ recommended.push(
340
+ "Cache hit rate is below 80%. Consider cache warming or TTL adjustment.",
341
+ );
318
342
  }
319
343
 
320
344
  if (metrics.requests.averageResponseTime > 2000) {
321
- recommended.push('Response times could be improved. Consider enabling more aggressive caching.');
345
+ recommended.push(
346
+ "Response times could be improved. Consider enabling more aggressive caching.",
347
+ );
322
348
  }
323
349
 
324
350
  if (metrics.system.memoryUsage > 80) {
325
- recommended.push('Memory usage is high. Consider increasing cache size limits or server resources.');
351
+ recommended.push(
352
+ "Memory usage is high. Consider increasing cache size limits or server resources.",
353
+ );
326
354
  }
327
355
 
328
356
  // Optional optimizations
329
357
  if (metrics.cache.totalSize < 100) {
330
- optional.push('Cache utilization is low. Consider pre-warming with frequently accessed data.');
358
+ optional.push(
359
+ "Cache utilization is low. Consider pre-warming with frequently accessed data.",
360
+ );
331
361
  }
332
362
 
333
363
  if (Object.keys(metrics.tools.toolUsageCount).length > 10) {
334
- optional.push('Many tools are being used. Consider creating custom workflows for common operations.');
364
+ optional.push(
365
+ "Many tools are being used. Consider creating custom workflows for common operations.",
366
+ );
335
367
  }
336
368
 
337
369
  return { critical, recommended, optional };
@@ -357,10 +389,10 @@ export class MetricsCollector {
357
389
  siteComparison: this.compareSitePerformance(),
358
390
  aggregatedStats: {
359
391
  cache: this.getAggregatedCacheStats(),
360
- client: this.getAggregatedClientStats()
392
+ client: this.getAggregatedClientStats(),
361
393
  },
362
394
  optimizations: this.generateOptimizationSuggestions(),
363
- alerts: this.monitor.getAlerts()
395
+ alerts: this.monitor.getAlerts(),
364
396
  };
365
397
  }
366
398
 
@@ -394,23 +426,23 @@ export class MetricsCollector {
394
426
  * Intercept client requests for automatic tracking
395
427
  */
396
428
  private interceptClientRequests(siteId: string, client: any): void {
397
- if (!client.request || typeof client.request !== 'function') {
429
+ if (!client.request || typeof client.request !== "function") {
398
430
  return;
399
431
  }
400
432
 
401
433
  const originalRequest = client.request.bind(client);
402
-
434
+
403
435
  client.request = async (...args: any[]) => {
404
436
  const startTime = Date.now();
405
437
  const requestId = `${siteId}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
406
-
438
+
407
439
  // Extract metadata
408
440
  const metadata: RequestMetadata = {
409
441
  siteId,
410
- endpoint: args[0] || 'unknown',
411
- method: args[1] || 'GET',
442
+ endpoint: args[0] || "unknown",
443
+ method: args[1] || "GET",
412
444
  startTime,
413
- fromCache: false
445
+ fromCache: false,
414
446
  };
415
447
 
416
448
  this.activeRequests.set(requestId, metadata);
@@ -418,19 +450,19 @@ export class MetricsCollector {
418
450
  try {
419
451
  const result = await originalRequest(...args);
420
452
  const responseTime = Date.now() - startTime;
421
-
453
+
422
454
  // Check if response came from cache
423
455
  const _fromCache = result.cached || false;
424
-
456
+
425
457
  this.monitor.recordRequest(responseTime, true);
426
458
  this.activeRequests.delete(requestId);
427
-
459
+
428
460
  return result;
429
461
  } catch (error) {
430
462
  const responseTime = Date.now() - startTime;
431
463
  this.monitor.recordRequest(responseTime, false);
432
464
  this.activeRequests.delete(requestId);
433
-
465
+
434
466
  throw error;
435
467
  }
436
468
  };