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
@@ -1,15 +1,15 @@
1
- import * as path from 'path';
2
- import { WordPressAPIError } from '../types/client.js';
1
+ import * as path from "path";
2
+ import { WordPressAPIError } from "../types/client.js";
3
3
  /**
4
4
  * Security-focused validation utilities for MCP WordPress
5
5
  */
6
6
  /**
7
7
  * Validates and sanitizes numeric IDs
8
8
  */
9
- export function validateId(id, fieldName = 'id') {
9
+ export function validateId(id, fieldName = "id") {
10
10
  const numId = parseInt(String(id), 10);
11
11
  if (isNaN(numId) || numId <= 0) {
12
- throw new WordPressAPIError(`Invalid ${fieldName}: must be a positive number`, 400, 'INVALID_PARAMETER');
12
+ throw new WordPressAPIError(`Invalid ${fieldName}: must be a positive number`, 400, "INVALID_PARAMETER");
13
13
  }
14
14
  return numId;
15
15
  }
@@ -17,12 +17,12 @@ export function validateId(id, fieldName = 'id') {
17
17
  * Validates string length within bounds
18
18
  */
19
19
  export function validateString(value, fieldName, minLength = 1, maxLength = 1000) {
20
- if (typeof value !== 'string') {
21
- throw new WordPressAPIError(`Invalid ${fieldName}: must be a string`, 400, 'INVALID_PARAMETER');
20
+ if (typeof value !== "string") {
21
+ throw new WordPressAPIError(`Invalid ${fieldName}: must be a string`, 400, "INVALID_PARAMETER");
22
22
  }
23
23
  const trimmed = value.trim();
24
24
  if (trimmed.length < minLength || trimmed.length > maxLength) {
25
- throw new WordPressAPIError(`Invalid ${fieldName}: length must be between ${minLength} and ${maxLength} characters`, 400, 'INVALID_PARAMETER');
25
+ throw new WordPressAPIError(`Invalid ${fieldName}: length must be between ${minLength} and ${maxLength} characters`, 400, "INVALID_PARAMETER");
26
26
  }
27
27
  return trimmed;
28
28
  }
@@ -35,7 +35,7 @@ export function validateFilePath(userPath, allowedBasePath) {
35
35
  const resolvedPath = path.resolve(allowedBasePath, normalizedPath);
36
36
  // Ensure the resolved path is within the allowed directory
37
37
  if (!resolvedPath.startsWith(path.resolve(allowedBasePath))) {
38
- throw new WordPressAPIError('Invalid file path: access denied', 403, 'PATH_TRAVERSAL_ATTEMPT');
38
+ throw new WordPressAPIError("Invalid file path: access denied", 403, "PATH_TRAVERSAL_ATTEMPT");
39
39
  }
40
40
  return resolvedPath;
41
41
  }
@@ -43,26 +43,34 @@ export function validateFilePath(userPath, allowedBasePath) {
43
43
  * Validates WordPress post status values
44
44
  */
45
45
  export function validatePostStatus(status) {
46
- const validStatuses = ['publish', 'draft', 'pending', 'private', 'future', 'auto-draft', 'trash'];
46
+ const validStatuses = [
47
+ "publish",
48
+ "draft",
49
+ "pending",
50
+ "private",
51
+ "future",
52
+ "auto-draft",
53
+ "trash",
54
+ ];
47
55
  if (!validStatuses.includes(status)) {
48
- throw new WordPressAPIError(`Invalid status: must be one of ${validStatuses.join(', ')}`, 400, 'INVALID_PARAMETER');
56
+ throw new WordPressAPIError(`Invalid status: must be one of ${validStatuses.join(", ")}`, 400, "INVALID_PARAMETER");
49
57
  }
50
58
  return status;
51
59
  }
52
60
  /**
53
61
  * Validates and sanitizes URLs
54
62
  */
55
- export function validateUrl(url, fieldName = 'url') {
63
+ export function validateUrl(url, fieldName = "url") {
56
64
  try {
57
65
  const urlObj = new URL(url);
58
66
  // Only allow http and https protocols
59
- if (!['http:', 'https:'].includes(urlObj.protocol)) {
60
- throw new Error('Invalid protocol');
67
+ if (!["http:", "https:"].includes(urlObj.protocol)) {
68
+ throw new Error("Invalid protocol");
61
69
  }
62
70
  return urlObj.toString();
63
71
  }
64
72
  catch {
65
- throw new WordPressAPIError(`Invalid ${fieldName}: must be a valid URL`, 400, 'INVALID_PARAMETER');
73
+ throw new WordPressAPIError(`Invalid ${fieldName}: must be a valid URL`, 400, "INVALID_PARAMETER");
66
74
  }
67
75
  }
68
76
  /**
@@ -71,7 +79,7 @@ export function validateUrl(url, fieldName = 'url') {
71
79
  export function validateFileSize(sizeInBytes, maxSizeInMB = 10) {
72
80
  const maxSizeInBytes = maxSizeInMB * 1024 * 1024;
73
81
  if (sizeInBytes > maxSizeInBytes) {
74
- throw new WordPressAPIError(`File size exceeds maximum allowed size of ${maxSizeInMB}MB`, 413, 'FILE_TOO_LARGE');
82
+ throw new WordPressAPIError(`File size exceeds maximum allowed size of ${maxSizeInMB}MB`, 413, "FILE_TOO_LARGE");
75
83
  }
76
84
  }
77
85
  /**
@@ -79,7 +87,7 @@ export function validateFileSize(sizeInBytes, maxSizeInMB = 10) {
79
87
  */
80
88
  export function validateMimeType(mimeType, allowedTypes) {
81
89
  if (!allowedTypes.includes(mimeType)) {
82
- throw new WordPressAPIError(`Invalid file type: ${mimeType}. Allowed types: ${allowedTypes.join(', ')}`, 415, 'UNSUPPORTED_MEDIA_TYPE');
90
+ throw new WordPressAPIError(`Invalid file type: ${mimeType}. Allowed types: ${allowedTypes.join(", ")}`, 415, "UNSUPPORTED_MEDIA_TYPE");
83
91
  }
84
92
  }
85
93
  /**
@@ -89,13 +97,13 @@ export function validateMimeType(mimeType, allowedTypes) {
89
97
  */
90
98
  export function sanitizeHtml(html) {
91
99
  // Remove script tags and their content
92
- let sanitized = html.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '');
100
+ let sanitized = html.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, "");
93
101
  // Remove event handlers
94
- sanitized = sanitized.replace(/\s*on\w+\s*=\s*["'][^"']*["']/gi, '');
102
+ sanitized = sanitized.replace(/\s*on\w+\s*=\s*["'][^"']*["']/gi, "");
95
103
  // Remove javascript: protocol
96
- sanitized = sanitized.replace(/javascript:/gi, '');
104
+ sanitized = sanitized.replace(/javascript:/gi, "");
97
105
  // Remove data: protocol (can be used for XSS)
98
- sanitized = sanitized.replace(/data:text\/html/gi, '');
106
+ sanitized = sanitized.replace(/data:text\/html/gi, "");
99
107
  return sanitized;
100
108
  }
101
109
  /**
@@ -103,10 +111,10 @@ export function sanitizeHtml(html) {
103
111
  */
104
112
  export function validateArray(value, fieldName, minItems = 0, maxItems = 100) {
105
113
  if (!Array.isArray(value)) {
106
- throw new WordPressAPIError(`Invalid ${fieldName}: must be an array`, 400, 'INVALID_PARAMETER');
114
+ throw new WordPressAPIError(`Invalid ${fieldName}: must be an array`, 400, "INVALID_PARAMETER");
107
115
  }
108
116
  if (value.length < minItems || value.length > maxItems) {
109
- throw new WordPressAPIError(`Invalid ${fieldName}: array must contain between ${minItems} and ${maxItems} items`, 400, 'INVALID_PARAMETER');
117
+ throw new WordPressAPIError(`Invalid ${fieldName}: array must contain between ${minItems} and ${maxItems} items`, 400, "INVALID_PARAMETER");
110
118
  }
111
119
  return value;
112
120
  }
@@ -116,7 +124,7 @@ export function validateArray(value, fieldName, minItems = 0, maxItems = 100) {
116
124
  export function validateEmail(email) {
117
125
  const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
118
126
  if (!emailRegex.test(email)) {
119
- throw new WordPressAPIError('Invalid email address format', 400, 'INVALID_PARAMETER');
127
+ throw new WordPressAPIError("Invalid email address format", 400, "INVALID_PARAMETER");
120
128
  }
121
129
  return email.toLowerCase();
122
130
  }
@@ -127,10 +135,10 @@ export function validateUsername(username) {
127
135
  // WordPress username rules: alphanumeric, space, underscore, hyphen, period, @ symbol
128
136
  const usernameRegex = /^[a-zA-Z0-9 _.\-@]+$/;
129
137
  if (!usernameRegex.test(username)) {
130
- throw new WordPressAPIError('Invalid username: can only contain letters, numbers, spaces, and _.-@ symbols', 400, 'INVALID_PARAMETER');
138
+ throw new WordPressAPIError("Invalid username: can only contain letters, numbers, spaces, and _.-@ symbols", 400, "INVALID_PARAMETER");
131
139
  }
132
140
  if (username.length < 3 || username.length > 60) {
133
- throw new WordPressAPIError('Invalid username: must be between 3 and 60 characters', 400, 'INVALID_PARAMETER');
141
+ throw new WordPressAPIError("Invalid username: must be between 3 and 60 characters", 400, "INVALID_PARAMETER");
134
142
  }
135
143
  return username;
136
144
  }
@@ -142,8 +150,7 @@ class RateLimiter {
142
150
  maxAttempts;
143
151
  windowMs;
144
152
  attempts = new Map();
145
- constructor(maxAttempts = 5, windowMs = 60000 // 1 minute
146
- ) {
153
+ constructor(maxAttempts = 5, windowMs = 60000) {
147
154
  this.maxAttempts = maxAttempts;
148
155
  this.windowMs = windowMs;
149
156
  }
@@ -151,12 +158,15 @@ class RateLimiter {
151
158
  const now = Date.now();
152
159
  const record = this.attempts.get(identifier);
153
160
  if (!record || record.resetTime < now) {
154
- this.attempts.set(identifier, { count: 1, resetTime: now + this.windowMs });
161
+ this.attempts.set(identifier, {
162
+ count: 1,
163
+ resetTime: now + this.windowMs,
164
+ });
155
165
  return;
156
166
  }
157
167
  if (record.count >= this.maxAttempts) {
158
168
  const waitTime = Math.ceil((record.resetTime - now) / 1000);
159
- throw new WordPressAPIError(`Rate limit exceeded. Please wait ${waitTime} seconds before trying again.`, 429, 'RATE_LIMIT_EXCEEDED');
169
+ throw new WordPressAPIError(`Rate limit exceeded. Please wait ${waitTime} seconds before trying again.`, 429, "RATE_LIMIT_EXCEEDED");
160
170
  }
161
171
  record.count++;
162
172
  }
@@ -177,9 +187,9 @@ export function validateSearchQuery(query) {
177
187
  sanitized = sanitized.substring(0, 200);
178
188
  }
179
189
  // Remove SQL-like patterns (basic protection)
180
- sanitized = sanitized.replace(/(\b(union|select|insert|update|delete|drop|create)\b)/gi, '');
190
+ sanitized = sanitized.replace(/(\b(union|select|insert|update|delete|drop|create)\b)/gi, "");
181
191
  // Remove special characters that might be used for injection
182
- sanitized = sanitized.replace(/[<>'"`;\\]/g, '');
192
+ sanitized = sanitized.replace(/[<>'"`;\\]/g, "");
183
193
  return sanitized;
184
194
  }
185
195
  //# sourceMappingURL=validation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;GAEG;AAEH;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,EAAO,EAAE,YAAoB,IAAI;IAC1D,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IACvC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,iBAAiB,CACzB,WAAW,SAAS,6BAA6B,EACjD,GAAG,EACH,mBAAmB,CACpB,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAU,EACV,SAAiB,EACjB,YAAoB,CAAC,EACrB,YAAoB,IAAI;IAExB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,iBAAiB,CACzB,WAAW,SAAS,oBAAoB,EACxC,GAAG,EACH,mBAAmB,CACpB,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;QAC7D,MAAM,IAAI,iBAAiB,CACzB,WAAW,SAAS,4BAA4B,SAAS,QAAQ,SAAS,aAAa,EACvF,GAAG,EACH,mBAAmB,CACpB,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAAgB,EAChB,eAAuB;IAEvB,gEAAgE;IAChE,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;IAEnE,2DAA2D;IAC3D,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,iBAAiB,CACzB,kCAAkC,EAClC,GAAG,EACH,wBAAwB,CACzB,CAAC;IACJ,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,MAAM,aAAa,GAAG;QACpB,SAAS;QACT,OAAO;QACP,SAAS;QACT,SAAS;QACT,QAAQ;QACR,YAAY;QACZ,OAAO;KACR,CAAC;IACF,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,iBAAiB,CACzB,kCAAkC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAC5D,GAAG,EACH,mBAAmB,CACpB,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,YAAoB,KAAK;IAChE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,sCAAsC;QACtC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,iBAAiB,CACzB,WAAW,SAAS,uBAAuB,EAC3C,GAAG,EACH,mBAAmB,CACpB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,WAAmB,EACnB,cAAsB,EAAE;IAExB,MAAM,cAAc,GAAG,WAAW,GAAG,IAAI,GAAG,IAAI,CAAC;IACjD,IAAI,WAAW,GAAG,cAAc,EAAE,CAAC;QACjC,MAAM,IAAI,iBAAiB,CACzB,6CAA6C,WAAW,IAAI,EAC5D,GAAG,EACH,gBAAgB,CACjB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAAgB,EAChB,YAAsB;IAEtB,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,iBAAiB,CACzB,sBAAsB,QAAQ,oBAAoB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAC3E,GAAG,EACH,wBAAwB,CACzB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,uCAAuC;IACvC,IAAI,SAAS,GAAG,IAAI,CAAC,OAAO,CAC1B,qDAAqD,EACrD,EAAE,CACH,CAAC;IAEF,wBAAwB;IACxB,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,iCAAiC,EAAE,EAAE,CAAC,CAAC;IAErE,8BAA8B;IAC9B,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IAEnD,8CAA8C;IAC9C,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;IAEvD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAU,EACV,SAAiB,EACjB,WAAmB,CAAC,EACpB,WAAmB,GAAG;IAEtB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,iBAAiB,CACzB,WAAW,SAAS,oBAAoB,EACxC,GAAG,EACH,mBAAmB,CACpB,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;QACvD,MAAM,IAAI,iBAAiB,CACzB,WAAW,SAAS,gCAAgC,QAAQ,QAAQ,QAAQ,QAAQ,EACpF,GAAG,EACH,mBAAmB,CACpB,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,MAAM,UAAU,GAAG,4BAA4B,CAAC;IAChD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,iBAAiB,CACzB,8BAA8B,EAC9B,GAAG,EACH,mBAAmB,CACpB,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,sFAAsF;IACtF,MAAM,aAAa,GAAG,sBAAsB,CAAC;IAC7C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,iBAAiB,CACzB,+EAA+E,EAC/E,GAAG,EACH,mBAAmB,CACpB,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QAChD,MAAM,IAAI,iBAAiB,CACzB,uDAAuD,EACvD,GAAG,EACH,mBAAmB,CACpB,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,WAAW;IAKL;IACA;IALF,QAAQ,GACd,IAAI,GAAG,EAAE,CAAC;IAEZ,YACU,cAAsB,CAAC,EACvB,WAAmB,KAAK;QADxB,gBAAW,GAAX,WAAW,CAAY;QACvB,aAAQ,GAAR,QAAQ,CAAgB;IAC/B,CAAC;IAEJ,KAAK,CAAC,UAAkB;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAE7C,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC;YACtC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE;gBAC5B,KAAK,EAAE,CAAC;gBACR,SAAS,EAAE,GAAG,GAAG,IAAI,CAAC,QAAQ;aAC/B,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;YAC5D,MAAM,IAAI,iBAAiB,CACzB,oCAAoC,QAAQ,+BAA+B,EAC3E,GAAG,EACH,qBAAqB,CACtB,CAAC;QACJ,CAAC;QAED,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,UAAkB;QACtB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACnC,CAAC;CACF;AAED,4DAA4D;AAC5D,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,2BAA2B;AAEtF;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,gFAAgF;IAChF,IAAI,SAAS,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAE7B,8BAA8B;IAC9B,IAAI,SAAS,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QAC3B,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1C,CAAC;IAED,8CAA8C;IAC9C,SAAS,GAAG,SAAS,CAAC,OAAO,CAC3B,yDAAyD,EACzD,EAAE,CACH,CAAC;IAEF,6DAA6D;IAC7D,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IAEjD,OAAO,SAAS,CAAC;AACnB,CAAC"}
package/docs/CACHING.md CHANGED
@@ -21,16 +21,19 @@ Request → Cache Check → API Call (if miss) → Cache Store → Response
21
21
  ```
22
22
 
23
23
  **Layer 1: HTTP Response Cache**
24
+
24
25
  - ETags support for efficient revalidation
25
26
  - Cache-Control headers based on data volatility
26
27
  - Conditional requests (If-None-Match)
27
28
 
28
29
  **Layer 2: In-Memory Application Cache**
30
+
29
31
  - TTL-based expiration by data type
30
32
  - LRU eviction for memory management
31
33
  - Site-specific cache keys for multi-site support
32
34
 
33
35
  **Layer 3: Intelligent Invalidation**
36
+
34
37
  - Event-based cache clearing on content changes
35
38
  - Pattern-based invalidation of related data
36
39
  - Cascading invalidation (e.g., post changes clear category counts)
@@ -38,21 +41,25 @@ Request → Cache Check → API Call (if miss) → Cache Store → Response
38
41
  ## 📊 **Cache Strategies by Data Type**
39
42
 
40
43
  ### **Static Data (4 hour TTL)**
44
+
41
45
  - Site settings, user roles, capabilities
42
46
  - Cache-Control: `public, max-age=14400`
43
47
  - **Why**: Changes very rarely, safe to cache long-term
44
48
 
45
49
  ### **Semi-Static Data (2 hour TTL)**
50
+
46
51
  - Categories, tags, user profiles
47
52
  - Cache-Control: `public, max-age=7200`
48
53
  - **Why**: Changes occasionally but stable for hours
49
54
 
50
55
  ### **Dynamic Data (15 minute TTL)**
56
+
51
57
  - Posts, pages, comments
52
58
  - Cache-Control: `public, max-age=900`
53
59
  - **Why**: Content changes frequently, shorter cache needed
54
60
 
55
61
  ### **Session Data (30 minute TTL)**
62
+
56
63
  - Authentication status, current user info
57
64
  - Cache-Control: `private, max-age=1800`
58
65
  - **Why**: User-specific data, moderate stability
@@ -62,6 +69,7 @@ Request → Cache Check → API Call (if miss) → Cache Store → Response
62
69
  The system includes dedicated cache management tools:
63
70
 
64
71
  ### **wp_cache_stats**
72
+
65
73
  Get detailed cache statistics for performance monitoring.
66
74
 
67
75
  ```bash
@@ -69,12 +77,14 @@ wp_cache_stats --site="site1"
69
77
  ```
70
78
 
71
79
  **Returns:**
80
+
72
81
  - Hit/miss rates
73
82
  - Total cache entries
74
83
  - Eviction statistics
75
84
  - Invalidation queue status
76
85
 
77
86
  ### **wp_cache_clear**
87
+
78
88
  Clear cache entries with optional pattern matching.
79
89
 
80
90
  ```bash
@@ -87,6 +97,7 @@ wp_cache_clear --site="site1" --pattern="categories"
87
97
  ```
88
98
 
89
99
  ### **wp_cache_warm**
100
+
90
101
  Pre-populate cache with essential WordPress data.
91
102
 
92
103
  ```bash
@@ -94,11 +105,13 @@ wp_cache_warm --site="site1"
94
105
  ```
95
106
 
96
107
  Warms cache with:
108
+
97
109
  - Current user information
98
110
  - Categories and tags
99
111
  - Site settings
100
112
 
101
113
  ### **wp_cache_info**
114
+
102
115
  Get detailed cache configuration and status.
103
116
 
104
117
  ```bash
@@ -115,7 +128,7 @@ Caching is **enabled by default**. To disable:
115
128
  export DISABLE_CACHE=true
116
129
  ```
117
130
 
118
- ### **Cache Settings**
131
+ ### **Cache Settings**
119
132
 
120
133
  Configure via `SecurityConfig.cache` in `src/security/SecurityConfig.ts`:
121
134
 
@@ -145,15 +158,18 @@ cache: {
145
158
  The system automatically invalidates related cache entries when content changes:
146
159
 
147
160
  **Post Operations:**
161
+
148
162
  - **Create Post** → Clears posts listings, categories, tags, search
149
163
  - **Update Post** → Clears specific post, posts listings, search
150
164
  - **Delete Post** → Clears posts listings, categories, tags, search
151
165
 
152
166
  **Category/Tag Operations:**
167
+
153
168
  - **Create/Update/Delete** → Clears taxonomies AND related posts
154
169
  - **Cascading Effect** → Post cache cleared when categories change
155
170
 
156
171
  **User Operations:**
172
+
157
173
  - **Update User** → Clears user cache, current user cache
158
174
  - **User Role Changes** → Clears capability-dependent caches
159
175
 
@@ -179,6 +195,7 @@ node scripts/test-caching.js
179
195
  ```
180
196
 
181
197
  **Tests Include:**
198
+
182
199
  - Cache infrastructure performance
183
200
  - Memory usage analysis
184
201
  - Hit/miss rate calculations
@@ -203,11 +220,13 @@ done
203
220
  ### **Expected Performance Gains**
204
221
 
205
222
  **Before Caching:**
223
+
206
224
  - Categories API call: ~200-500ms
207
225
  - Repeated user lookups: ~150-300ms each
208
226
  - Site settings: ~100-200ms each call
209
227
 
210
228
  **After Caching:**
229
+
211
230
  - Categories (cached): ~1-5ms
212
231
  - User lookups (cached): ~1-3ms
213
232
  - Site settings (cached): ~1-2ms
@@ -217,11 +236,13 @@ done
217
236
  Each WordPress site gets isolated cache:
218
237
 
219
238
  **Cache Key Format:**
239
+
220
240
  ```
221
241
  {siteId}:{endpoint}:{params_hash}
222
242
  ```
223
243
 
224
244
  **Examples:**
245
+
225
246
  ```
226
247
  site1:posts:abc123 # Site 1 posts listing
227
248
  site2:posts:abc123 # Site 2 posts listing (separate)
@@ -229,6 +250,7 @@ site1:categories:def456 # Site 1 categories
229
250
  ```
230
251
 
231
252
  **Site-Specific Operations:**
253
+
232
254
  ```bash
233
255
  wp_cache_clear --site="site1" # Clear only site1 cache
234
256
  wp_cache_clear --site="site2" --pattern="posts" # Clear site2 posts only
@@ -239,19 +261,23 @@ wp_cache_clear --site="site2" --pattern="posts" # Clear site2 posts only
239
261
  ### **Cache Not Working**
240
262
 
241
263
  1. **Check if caching is enabled:**
264
+
242
265
  ```bash
243
266
  wp_cache_info --site="your-site"
244
267
  ```
245
268
 
246
269
  2. **Verify no DISABLE_CACHE environment variable:**
270
+
247
271
  ```bash
248
272
  echo $DISABLE_CACHE # Should be empty or 'false'
249
273
  ```
250
274
 
251
275
  3. **Check cache statistics:**
276
+
252
277
  ```bash
253
278
  wp_cache_stats --site="your-site"
254
279
  ```
280
+
255
281
  - Hit rate should increase over time
256
282
  - Total entries should grow with usage
257
283
 
@@ -272,13 +298,16 @@ wp_cache_clear --site="site2" --pattern="posts" # Clear site2 posts only
272
298
  ### **Stale Data Issues**
273
299
 
274
300
  1. **Check invalidation:**
301
+
275
302
  ```bash
276
303
  wp_cache_info --site="your-site"
277
304
  ```
305
+
278
306
  - Verify invalidation rules are active
279
307
  - Check queue processing status
280
308
 
281
309
  2. **Manual cache clear:**
310
+
282
311
  ```bash
283
312
  wp_cache_clear --site="your-site" --pattern="problematic_endpoint"
284
313
  ```
@@ -292,11 +321,13 @@ wp_cache_clear --site="site2" --pattern="posts" # Clear site2 posts only
292
321
  ### **For High-Traffic Sites**
293
322
 
294
323
  1. **Increase cache size:**
324
+
295
325
  ```typescript
296
326
  maxSize: 2000 // From default 1000
297
327
  ```
298
328
 
299
329
  2. **Tune TTL values:**
330
+
300
331
  ```typescript
301
332
  ttlPresets: {
302
333
  static: 8 * 60 * 60 * 1000, // 8 hours for very stable data
@@ -306,6 +337,7 @@ wp_cache_clear --site="site2" --pattern="posts" # Clear site2 posts only
306
337
  ```
307
338
 
308
339
  3. **Pre-warm cache on deployment:**
340
+
309
341
  ```bash
310
342
  wp_cache_warm --site="production-site"
311
343
  ```
@@ -313,6 +345,7 @@ wp_cache_clear --site="site2" --pattern="posts" # Clear site2 posts only
313
345
  ### **For Development**
314
346
 
315
347
  1. **Shorter TTL for faster iteration:**
348
+
316
349
  ```typescript
317
350
  ttlPresets: {
318
351
  dynamic: 30 * 1000, // 30 seconds for development
@@ -320,6 +353,7 @@ wp_cache_clear --site="site2" --pattern="posts" # Clear site2 posts only
320
353
  ```
321
354
 
322
355
  2. **Easy cache clearing:**
356
+
323
357
  ```bash
324
358
  # Add to development scripts
325
359
  wp_cache_clear # Clear all during development
@@ -337,4 +371,4 @@ Planned improvements:
337
371
 
338
372
  ---
339
373
 
340
- The intelligent caching system provides significant performance improvements while maintaining data freshness appropriate for each content type. It's designed to work transparently with existing WordPress operations while providing tools for monitoring and management.
374
+ The intelligent caching system provides significant performance improvements while maintaining data freshness appropriate for each content type. It's designed to work transparently with existing WordPress operations while providing tools for monitoring and management.
package/docs/DOCKER.md CHANGED
@@ -1,31 +1,35 @@
1
- # Docker Deployment Guide
1
+ # Docker Deployment Guide (Legacy)
2
2
 
3
3
  ![Docker](https://img.shields.io/badge/Docker-ready-blue)
4
4
  ![Version](https://img.shields.io/badge/version-1.2.0-green)
5
5
  ![Security](https://img.shields.io/badge/security-hardened-brightgreen)
6
6
 
7
- This guide covers deploying the MCP WordPress Server using Docker for production and development environments.
7
+ > **📖 New Users**: For Claude Desktop MCP integration, see the **[Docker Setup Guide](user-guides/DOCKER_SETUP.md)** instead.
8
+
9
+ This guide covers advanced Docker deployment scenarios for production and development environments.
8
10
 
9
11
  ## 🚀 Quick Start
10
12
 
11
13
  ### Option 1: Docker Hub (Recommended)
12
14
 
13
15
  ```bash
14
- # Pull and run the latest image
16
+ # Production deployment (NOT for Claude Desktop MCP)
15
17
  docker run -d \
16
18
  --name mcp-wordpress \
17
19
  --restart unless-stopped \
18
20
  -e WORDPRESS_SITE_URL=https://your-site.com \
19
21
  -e WORDPRESS_USERNAME=your-username \
20
22
  -e WORDPRESS_APP_PASSWORD=your-app-password \
21
- aiondadotcom/mcp-wordpress:latest
23
+ docdyhr/mcp-wordpress:latest
22
24
  ```
23
25
 
26
+ **⚠️ Claude Desktop Users**: Do NOT use `-d` flag with Claude Desktop. See [Docker Setup Guide](user-guides/DOCKER_SETUP.md) for MCP integration.
27
+
24
28
  ### Option 2: Docker Compose
25
29
 
26
30
  ```bash
27
31
  # Download the compose file
28
- curl -O https://raw.githubusercontent.com/AiondaDotCom/mcp-wordpress/main/docker-compose.yml
32
+ curl -O https://raw.githubusercontent.com/docdyhr/mcp-wordpress/main/docker-compose.yml
29
33
 
30
34
  # Configure environment variables (see below)
31
35
  # Start the service
@@ -36,7 +40,7 @@ docker-compose up -d
36
40
 
37
41
  ```bash
38
42
  # Clone the repository
39
- git clone https://github.com/AiondaDotCom/mcp-wordpress.git
43
+ git clone https://github.com/docdyhr/mcp-wordpress.git
40
44
  cd mcp-wordpress
41
45
 
42
46
  # Build the image
@@ -67,10 +71,12 @@ For multi-site setups, mount a configuration file:
67
71
  ```bash
68
72
  docker run -d \
69
73
  --name mcp-wordpress \
70
- -v ./mcp-wordpress.config.json:/app/config/mcp-wordpress.config.json:ro \
71
- aiondadotcom/mcp-wordpress:latest
74
+ -v ./mcp-wordpress.config.json:/app/mcp-wordpress.config.json:ro \
75
+ docdyhr/mcp-wordpress:latest
72
76
  ```
73
77
 
78
+ **⚠️ Mount Path**: Use `/app/mcp-wordpress.config.json` (not `/app/config/`).
79
+
74
80
  **Example `mcp-wordpress.config.json`:**
75
81
  ```json
76
82
  {
@@ -107,7 +113,7 @@ version: '3.8'
107
113
 
108
114
  services:
109
115
  mcp-wordpress:
110
- image: aiondadotcom/mcp-wordpress:latest
116
+ image: docdyhr/mcp-wordpress:latest
111
117
  container_name: mcp-wordpress
112
118
  restart: unless-stopped
113
119
  environment:
@@ -117,7 +123,7 @@ services:
117
123
  - NODE_ENV=production
118
124
  volumes:
119
125
  # Optional: Mount config for multi-site
120
- - ./mcp-wordpress.config.json:/app/config/mcp-wordpress.config.json:ro
126
+ - ./mcp-wordpress.config.json:/app/mcp-wordpress.config.json:ro
121
127
  # Optional: Persist logs
122
128
  - ./logs:/app/logs
123
129
  # Optional: Persist cache
@@ -153,7 +159,7 @@ version: '3.8'
153
159
 
154
160
  services:
155
161
  mcp-wordpress:
156
- image: aiondadotcom/mcp-wordpress:latest
162
+ image: docdyhr/mcp-wordpress:latest
157
163
  deploy:
158
164
  replicas: 2
159
165
  restart_policy:
@@ -201,7 +207,7 @@ spec:
201
207
  spec:
202
208
  containers:
203
209
  - name: mcp-wordpress
204
- image: aiondadotcom/mcp-wordpress:latest
210
+ image: docdyhr/mcp-wordpress:latest
205
211
  ports:
206
212
  - containerPort: 3000
207
213
  env:
@@ -262,7 +268,7 @@ docker inspect --format='{{.State.Health.Status}}' mcp-wordpress
262
268
  docker exec -it mcp-wordpress /bin/sh
263
269
 
264
270
  # Update to latest version
265
- docker pull aiondadotcom/mcp-wordpress:latest
271
+ docker pull docdyhr/mcp-wordpress:latest
266
272
  docker stop mcp-wordpress
267
273
  docker rm mcp-wordpress
268
274
  # Run with new image...
@@ -354,7 +360,7 @@ echo \"your-app-password\" | docker secret create wordpress_password -
354
360
  version: '3.8'
355
361
  services:
356
362
  mcp-wordpress:
357
- image: aiondadotcom/mcp-wordpress:latest
363
+ image: docdyhr/mcp-wordpress:latest
358
364
  secrets:
359
365
  - wordpress_url
360
366
  - wordpress_user
@@ -424,7 +430,7 @@ docker exec mcp-wordpress node -e \"
424
430
 
425
431
  ```bash
426
432
  # Run with debug logging
427
- docker run -e DEBUG=true aiondadotcom/mcp-wordpress:latest
433
+ docker run -e DEBUG=true docdyhr/mcp-wordpress:latest
428
434
 
429
435
  # Or with compose
430
436
  environment:
@@ -442,9 +448,9 @@ environment:
442
448
 
443
449
  ## 🤝 Support
444
450
 
445
- - **GitHub Issues**: [Report problems](https://github.com/AiondaDotCom/mcp-wordpress/issues)
446
- - **Discussions**: [Ask questions](https://github.com/AiondaDotCom/mcp-wordpress/discussions)
447
- - **Documentation**: [Browse guides](https://github.com/AiondaDotCom/mcp-wordpress/tree/main/docs)
451
+ - **GitHub Issues**: [Report problems](https://github.com/docdyhr/mcp-wordpress/issues)
452
+ - **Discussions**: [Ask questions](https://github.com/docdyhr/mcp-wordpress/discussions)
453
+ - **Documentation**: [Browse guides](https://github.com/docdyhr/mcp-wordpress/tree/main/docs)
448
454
 
449
455
  ---
450
456