mcp-wordpress 2.6.4 → 2.7.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 (332) hide show
  1. package/README.md +1 -1
  2. package/dist/cache/CacheInvalidation.d.ts +25 -6
  3. package/dist/cache/CacheInvalidation.d.ts.map +1 -1
  4. package/dist/cache/CacheInvalidation.js +168 -16
  5. package/dist/cache/CacheInvalidation.js.map +1 -1
  6. package/dist/cache/HttpCacheWrapper.d.ts.map +1 -1
  7. package/dist/cache/HttpCacheWrapper.js +3 -4
  8. package/dist/cache/HttpCacheWrapper.js.map +1 -1
  9. package/dist/cache/SEOCacheManager.d.ts +150 -0
  10. package/dist/cache/SEOCacheManager.d.ts.map +1 -0
  11. package/dist/cache/SEOCacheManager.js +275 -0
  12. package/dist/cache/SEOCacheManager.js.map +1 -0
  13. package/dist/client/SEOWordPressClient.d.ts +164 -0
  14. package/dist/client/SEOWordPressClient.d.ts.map +1 -0
  15. package/dist/client/SEOWordPressClient.js +674 -0
  16. package/dist/client/SEOWordPressClient.js.map +1 -0
  17. package/dist/client/api.d.ts.map +1 -1
  18. package/dist/client/api.js +50 -20
  19. package/dist/client/api.js.map +1 -1
  20. package/dist/client/auth.js +19 -19
  21. package/dist/client/auth.js.map +1 -1
  22. package/dist/client/index.d.ts +11 -0
  23. package/dist/client/index.d.ts.map +1 -0
  24. package/dist/client/index.js +14 -0
  25. package/dist/client/index.js.map +1 -0
  26. package/dist/client/managers/AuthManager.d.ts +39 -0
  27. package/dist/client/managers/AuthManager.d.ts.map +1 -0
  28. package/dist/client/managers/AuthManager.js +142 -0
  29. package/dist/client/managers/AuthManager.js.map +1 -0
  30. package/dist/client/managers/AuthenticationManager.d.ts.map +1 -1
  31. package/dist/client/managers/AuthenticationManager.js +10 -9
  32. package/dist/client/managers/AuthenticationManager.js.map +1 -1
  33. package/dist/client/managers/BaseManager.d.ts.map +1 -1
  34. package/dist/client/managers/BaseManager.js +12 -0
  35. package/dist/client/managers/BaseManager.js.map +1 -1
  36. package/dist/client/managers/ComposedAuthenticationManager.d.ts +94 -0
  37. package/dist/client/managers/ComposedAuthenticationManager.d.ts.map +1 -0
  38. package/dist/client/managers/ComposedAuthenticationManager.js +340 -0
  39. package/dist/client/managers/ComposedAuthenticationManager.js.map +1 -0
  40. package/dist/client/managers/ComposedManagerFactory.d.ts +104 -0
  41. package/dist/client/managers/ComposedManagerFactory.d.ts.map +1 -0
  42. package/dist/client/managers/ComposedManagerFactory.js +180 -0
  43. package/dist/client/managers/ComposedManagerFactory.js.map +1 -0
  44. package/dist/client/managers/ComposedRequestManager.d.ts +82 -0
  45. package/dist/client/managers/ComposedRequestManager.d.ts.map +1 -0
  46. package/dist/client/managers/ComposedRequestManager.js +260 -0
  47. package/dist/client/managers/ComposedRequestManager.js.map +1 -0
  48. package/dist/client/managers/JWTAuthImplementation.d.ts +86 -0
  49. package/dist/client/managers/JWTAuthImplementation.d.ts.map +1 -0
  50. package/dist/client/managers/JWTAuthImplementation.js +240 -0
  51. package/dist/client/managers/JWTAuthImplementation.js.map +1 -0
  52. package/dist/client/managers/ManagersIndex.d.ts +6 -0
  53. package/dist/client/managers/ManagersIndex.d.ts.map +1 -0
  54. package/dist/client/managers/ManagersIndex.js +6 -0
  55. package/dist/client/managers/ManagersIndex.js.map +1 -0
  56. package/dist/client/managers/RequestManager.d.ts.map +1 -1
  57. package/dist/client/managers/RequestManager.js +5 -3
  58. package/dist/client/managers/RequestManager.js.map +1 -1
  59. package/dist/client/managers/composed/MigrationAdapter.d.ts +80 -0
  60. package/dist/client/managers/composed/MigrationAdapter.d.ts.map +1 -0
  61. package/dist/client/managers/composed/MigrationAdapter.js +214 -0
  62. package/dist/client/managers/composed/MigrationAdapter.js.map +1 -0
  63. package/dist/client/managers/composed/index.d.ts +23 -0
  64. package/dist/client/managers/composed/index.d.ts.map +1 -0
  65. package/dist/client/managers/composed/index.js +26 -0
  66. package/dist/client/managers/composed/index.js.map +1 -0
  67. package/dist/client/managers/implementations/ConfigurationProviderImpl.d.ts +27 -0
  68. package/dist/client/managers/implementations/ConfigurationProviderImpl.d.ts.map +1 -0
  69. package/dist/client/managers/implementations/ConfigurationProviderImpl.js +41 -0
  70. package/dist/client/managers/implementations/ConfigurationProviderImpl.js.map +1 -0
  71. package/dist/client/managers/implementations/ErrorHandlerImpl.d.ts +31 -0
  72. package/dist/client/managers/implementations/ErrorHandlerImpl.d.ts.map +1 -0
  73. package/dist/client/managers/implementations/ErrorHandlerImpl.js +73 -0
  74. package/dist/client/managers/implementations/ErrorHandlerImpl.js.map +1 -0
  75. package/dist/client/managers/implementations/ParameterValidatorImpl.d.ts +47 -0
  76. package/dist/client/managers/implementations/ParameterValidatorImpl.d.ts.map +1 -0
  77. package/dist/client/managers/implementations/ParameterValidatorImpl.js +141 -0
  78. package/dist/client/managers/implementations/ParameterValidatorImpl.js.map +1 -0
  79. package/dist/client/managers/interfaces/ManagerInterfaces.d.ts +147 -0
  80. package/dist/client/managers/interfaces/ManagerInterfaces.d.ts.map +1 -0
  81. package/dist/client/managers/interfaces/ManagerInterfaces.js +6 -0
  82. package/dist/client/managers/interfaces/ManagerInterfaces.js.map +1 -0
  83. package/dist/config/Config.d.ts +30 -0
  84. package/dist/config/Config.d.ts.map +1 -1
  85. package/dist/config/Config.js +30 -0
  86. package/dist/config/Config.js.map +1 -1
  87. package/dist/config/ConfigurationSchema.d.ts +75 -198
  88. package/dist/config/ConfigurationSchema.d.ts.map +1 -1
  89. package/dist/config/ConfigurationSchema.js +17 -17
  90. package/dist/config/ConfigurationSchema.js.map +1 -1
  91. package/dist/config/ServerConfiguration.d.ts +2 -2
  92. package/dist/config/ServerConfiguration.d.ts.map +1 -1
  93. package/dist/config/ServerConfiguration.js +15 -13
  94. package/dist/config/ServerConfiguration.js.map +1 -1
  95. package/dist/config/index.d.ts +8 -0
  96. package/dist/config/index.d.ts.map +1 -0
  97. package/dist/config/index.js +11 -0
  98. package/dist/config/index.js.map +1 -0
  99. package/dist/docs/DocumentationGenerator.js +2 -2
  100. package/dist/docs/DocumentationGenerator.js.map +1 -1
  101. package/dist/dxt-entry.js +3 -3
  102. package/dist/dxt-entry.js.map +1 -1
  103. package/dist/index.d.ts +1 -0
  104. package/dist/index.d.ts.map +1 -1
  105. package/dist/index.js +38 -37
  106. package/dist/index.js.map +1 -1
  107. package/dist/performance/MetricsCollector.d.ts.map +1 -1
  108. package/dist/performance/MetricsCollector.js +5 -4
  109. package/dist/performance/MetricsCollector.js.map +1 -1
  110. package/dist/security/AISecurityScanner.js +7 -7
  111. package/dist/security/AISecurityScanner.js.map +1 -1
  112. package/dist/security/AutomatedRemediation.d.ts.map +1 -1
  113. package/dist/security/AutomatedRemediation.js +11 -11
  114. package/dist/security/AutomatedRemediation.js.map +1 -1
  115. package/dist/security/InputValidator.d.ts +50 -126
  116. package/dist/security/InputValidator.d.ts.map +1 -1
  117. package/dist/security/InputValidator.js +9 -9
  118. package/dist/security/InputValidator.js.map +1 -1
  119. package/dist/security/SecurityCIPipeline.d.ts +47 -5
  120. package/dist/security/SecurityCIPipeline.d.ts.map +1 -1
  121. package/dist/security/SecurityCIPipeline.js +390 -49
  122. package/dist/security/SecurityCIPipeline.js.map +1 -1
  123. package/dist/security/SecurityConfigManager.js +10 -10
  124. package/dist/security/SecurityConfigManager.js.map +1 -1
  125. package/dist/security/SecurityMonitoring.js +4 -4
  126. package/dist/security/SecurityMonitoring.js.map +1 -1
  127. package/dist/security/SecurityReviewer.d.ts.map +1 -1
  128. package/dist/security/SecurityReviewer.js +13 -6
  129. package/dist/security/SecurityReviewer.js.map +1 -1
  130. package/dist/security/index.js +3 -3
  131. package/dist/security/index.js.map +1 -1
  132. package/dist/server/ConnectionTester.js +5 -5
  133. package/dist/server/ConnectionTester.js.map +1 -1
  134. package/dist/server/ToolRegistry.d.ts +2 -2
  135. package/dist/server/ToolRegistry.d.ts.map +1 -1
  136. package/dist/server/ToolRegistry.js +7 -6
  137. package/dist/server/ToolRegistry.js.map +1 -1
  138. package/dist/server/index.d.ts +7 -0
  139. package/dist/server/index.d.ts.map +1 -0
  140. package/dist/server/index.js +9 -0
  141. package/dist/server/index.js.map +1 -0
  142. package/dist/tools/BaseToolManager.d.ts.map +1 -1
  143. package/dist/tools/BaseToolManager.js +11 -11
  144. package/dist/tools/BaseToolManager.js.map +1 -1
  145. package/dist/tools/auth.d.ts.map +1 -1
  146. package/dist/tools/auth.js +7 -7
  147. package/dist/tools/auth.js.map +1 -1
  148. package/dist/tools/comments.d.ts.map +1 -1
  149. package/dist/tools/comments.js +14 -14
  150. package/dist/tools/comments.js.map +1 -1
  151. package/dist/tools/index.d.ts +1 -0
  152. package/dist/tools/index.d.ts.map +1 -1
  153. package/dist/tools/index.js +1 -0
  154. package/dist/tools/index.js.map +1 -1
  155. package/dist/tools/media.d.ts.map +1 -1
  156. package/dist/tools/media.js +14 -11
  157. package/dist/tools/media.js.map +1 -1
  158. package/dist/tools/pages.d.ts.map +1 -1
  159. package/dist/tools/pages.js +12 -12
  160. package/dist/tools/pages.js.map +1 -1
  161. package/dist/tools/performance.d.ts.map +1 -1
  162. package/dist/tools/performance.js +13 -11
  163. package/dist/tools/performance.js.map +1 -1
  164. package/dist/tools/posts/PostHandlers.d.ts.map +1 -1
  165. package/dist/tools/posts/PostHandlers.js +16 -16
  166. package/dist/tools/posts/PostHandlers.js.map +1 -1
  167. package/dist/tools/posts/PostToolDefinitions.d.ts.map +1 -1
  168. package/dist/tools/posts/index.d.ts.map +1 -1
  169. package/dist/tools/seo/BulkOperations.d.ts +113 -0
  170. package/dist/tools/seo/BulkOperations.d.ts.map +1 -0
  171. package/dist/tools/seo/BulkOperations.js +398 -0
  172. package/dist/tools/seo/BulkOperations.js.map +1 -0
  173. package/dist/tools/seo/SEOHandlers.d.ts +55 -0
  174. package/dist/tools/seo/SEOHandlers.d.ts.map +1 -0
  175. package/dist/tools/seo/SEOHandlers.js +255 -0
  176. package/dist/tools/seo/SEOHandlers.js.map +1 -0
  177. package/dist/tools/seo/SEOToolDefinitions.d.ts +59 -0
  178. package/dist/tools/seo/SEOToolDefinitions.d.ts.map +1 -0
  179. package/dist/tools/seo/SEOToolDefinitions.js +385 -0
  180. package/dist/tools/seo/SEOToolDefinitions.js.map +1 -0
  181. package/dist/tools/seo/SEOTools.d.ts +203 -0
  182. package/dist/tools/seo/SEOTools.d.ts.map +1 -0
  183. package/dist/tools/seo/SEOTools.js +708 -0
  184. package/dist/tools/seo/SEOTools.js.map +1 -0
  185. package/dist/tools/seo/analyzers/ContentAnalyzer.d.ts +94 -0
  186. package/dist/tools/seo/analyzers/ContentAnalyzer.d.ts.map +1 -0
  187. package/dist/tools/seo/analyzers/ContentAnalyzer.js +402 -0
  188. package/dist/tools/seo/analyzers/ContentAnalyzer.js.map +1 -0
  189. package/dist/tools/seo/auditors/SiteAuditor.d.ts +121 -0
  190. package/dist/tools/seo/auditors/SiteAuditor.d.ts.map +1 -0
  191. package/dist/tools/seo/auditors/SiteAuditor.js +600 -0
  192. package/dist/tools/seo/auditors/SiteAuditor.js.map +1 -0
  193. package/dist/tools/seo/generators/MetaGenerator.d.ts +128 -0
  194. package/dist/tools/seo/generators/MetaGenerator.d.ts.map +1 -0
  195. package/dist/tools/seo/generators/MetaGenerator.js +547 -0
  196. package/dist/tools/seo/generators/MetaGenerator.js.map +1 -0
  197. package/dist/tools/seo/generators/SchemaGenerator.d.ts +204 -0
  198. package/dist/tools/seo/generators/SchemaGenerator.d.ts.map +1 -0
  199. package/dist/tools/seo/generators/SchemaGenerator.js +670 -0
  200. package/dist/tools/seo/generators/SchemaGenerator.js.map +1 -0
  201. package/dist/tools/seo/index.d.ts +17 -0
  202. package/dist/tools/seo/index.d.ts.map +1 -0
  203. package/dist/tools/seo/index.js +18 -0
  204. package/dist/tools/seo/index.js.map +1 -0
  205. package/dist/tools/seo/optimizers/InternalLinkingSuggester.d.ts +186 -0
  206. package/dist/tools/seo/optimizers/InternalLinkingSuggester.d.ts.map +1 -0
  207. package/dist/tools/seo/optimizers/InternalLinkingSuggester.js +683 -0
  208. package/dist/tools/seo/optimizers/InternalLinkingSuggester.js.map +1 -0
  209. package/dist/tools/site.d.ts.map +1 -1
  210. package/dist/tools/site.js +12 -12
  211. package/dist/tools/site.js.map +1 -1
  212. package/dist/tools/taxonomies.d.ts.map +1 -1
  213. package/dist/tools/taxonomies.js +20 -20
  214. package/dist/tools/taxonomies.js.map +1 -1
  215. package/dist/tools/users.d.ts.map +1 -1
  216. package/dist/tools/users.js +12 -12
  217. package/dist/tools/users.js.map +1 -1
  218. package/dist/types/client.d.ts +8 -6
  219. package/dist/types/client.d.ts.map +1 -1
  220. package/dist/types/client.js.map +1 -1
  221. package/dist/types/seo.d.ts +473 -0
  222. package/dist/types/seo.d.ts.map +1 -0
  223. package/dist/types/seo.js +94 -0
  224. package/dist/types/seo.js.map +1 -0
  225. package/dist/utils/enhancedError.js +1 -1
  226. package/dist/utils/enhancedError.js.map +1 -1
  227. package/dist/utils/error.d.ts.map +1 -1
  228. package/dist/utils/error.js +0 -1
  229. package/dist/utils/error.js.map +1 -1
  230. package/dist/utils/index.d.ts +12 -0
  231. package/dist/utils/index.d.ts.map +1 -0
  232. package/dist/utils/index.js +18 -0
  233. package/dist/utils/index.js.map +1 -0
  234. package/dist/utils/logger.js +3 -3
  235. package/dist/utils/logger.js.map +1 -1
  236. package/dist/utils/toolWrapper.d.ts +2 -2
  237. package/dist/utils/toolWrapper.js +8 -8
  238. package/dist/utils/toolWrapper.js.map +1 -1
  239. package/dist/utils/validation/core.d.ts.map +1 -1
  240. package/dist/utils/validation/core.js.map +1 -1
  241. package/dist/utils/validation/index.d.ts.map +1 -1
  242. package/dist/utils/validation/index.js.map +1 -1
  243. package/dist/utils/validation/network.js +3 -3
  244. package/dist/utils/validation/network.js.map +1 -1
  245. package/dist/utils/validation/rateLimit.js.map +1 -1
  246. package/dist/utils/validation/security.js.map +1 -1
  247. package/dist/utils/validation/wordpress.js.map +1 -1
  248. package/dist/utils/version.d.ts +144 -0
  249. package/dist/utils/version.d.ts.map +1 -0
  250. package/dist/utils/version.js +318 -0
  251. package/dist/utils/version.js.map +1 -0
  252. package/package.json +21 -55
  253. package/src/cache/CacheInvalidation.ts +183 -20
  254. package/src/cache/HttpCacheWrapper.ts +8 -5
  255. package/src/cache/SEOCacheManager.ts +330 -0
  256. package/src/cache/__tests__/CacheInvalidation.test.ts +6 -11
  257. package/src/cache/__tests__/CachedWordPressClient.test.ts +37 -62
  258. package/src/client/SEOWordPressClient.ts +876 -0
  259. package/src/client/api.ts +50 -21
  260. package/src/client/auth.ts +19 -19
  261. package/src/client/index.ts +16 -0
  262. package/src/client/managers/AuthManager.ts +175 -0
  263. package/src/client/managers/AuthenticationManager.ts +16 -14
  264. package/src/client/managers/BaseManager.ts +24 -5
  265. package/src/client/managers/ComposedAuthenticationManager.ts +409 -0
  266. package/src/client/managers/ComposedManagerFactory.ts +231 -0
  267. package/src/client/managers/ComposedRequestManager.ts +336 -0
  268. package/src/client/managers/JWTAuthImplementation.ts +326 -0
  269. package/src/client/managers/ManagersIndex.ts +6 -0
  270. package/src/client/managers/RequestManager.ts +9 -7
  271. package/src/client/managers/composed/MigrationAdapter.ts +263 -0
  272. package/src/client/managers/composed/index.ts +47 -0
  273. package/src/client/managers/implementations/ConfigurationProviderImpl.ts +52 -0
  274. package/src/client/managers/implementations/ErrorHandlerImpl.ts +102 -0
  275. package/src/client/managers/implementations/ParameterValidatorImpl.ts +221 -0
  276. package/src/client/managers/interfaces/ManagerInterfaces.ts +171 -0
  277. package/src/config/Config.ts +63 -0
  278. package/src/config/ConfigurationSchema.ts +17 -17
  279. package/src/config/ServerConfiguration.ts +18 -16
  280. package/src/config/index.ts +13 -0
  281. package/src/docs/DocumentationGenerator.ts +2 -2
  282. package/src/dxt-entry.ts +3 -3
  283. package/src/index.ts +43 -43
  284. package/src/performance/MetricsCollector.ts +15 -11
  285. package/src/security/AISecurityScanner.ts +7 -7
  286. package/src/security/AutomatedRemediation.ts +13 -11
  287. package/src/security/InputValidator.ts +10 -9
  288. package/src/security/SecurityCIPipeline.ts +494 -56
  289. package/src/security/SecurityConfigManager.ts +10 -10
  290. package/src/security/SecurityMonitoring.ts +5 -5
  291. package/src/security/SecurityReviewer.ts +13 -6
  292. package/src/security/index.ts +3 -3
  293. package/src/server/ConnectionTester.ts +5 -5
  294. package/src/server/ToolRegistry.ts +9 -8
  295. package/src/server/index.ts +10 -0
  296. package/src/tools/BaseToolManager.ts +55 -83
  297. package/src/tools/auth.ts +21 -12
  298. package/src/tools/comments.ts +23 -19
  299. package/src/tools/index.ts +1 -0
  300. package/src/tools/media.ts +23 -20
  301. package/src/tools/pages.ts +20 -13
  302. package/src/tools/performance.ts +101 -32
  303. package/src/tools/posts/PostHandlers.ts +23 -23
  304. package/src/tools/posts/PostToolDefinitions.ts +1 -1
  305. package/src/tools/posts/index.ts +2 -2
  306. package/src/tools/seo/BulkOperations.ts +557 -0
  307. package/src/tools/seo/SEOHandlers.ts +296 -0
  308. package/src/tools/seo/SEOToolDefinitions.ts +402 -0
  309. package/src/tools/seo/SEOTools.ts +871 -0
  310. package/src/tools/seo/analyzers/ContentAnalyzer.ts +493 -0
  311. package/src/tools/seo/auditors/SiteAuditor.ts +787 -0
  312. package/src/tools/seo/generators/MetaGenerator.ts +694 -0
  313. package/src/tools/seo/generators/SchemaGenerator.ts +955 -0
  314. package/src/tools/seo/index.ts +47 -0
  315. package/src/tools/seo/optimizers/InternalLinkingSuggester.ts +934 -0
  316. package/src/tools/site.ts +27 -26
  317. package/src/tools/taxonomies.ts +29 -25
  318. package/src/tools/users.ts +20 -13
  319. package/src/types/client.ts +8 -6
  320. package/src/types/seo.ts +546 -0
  321. package/src/utils/enhancedError.ts +1 -1
  322. package/src/utils/error.ts +1 -2
  323. package/src/utils/index.ts +23 -0
  324. package/src/utils/logger.ts +3 -3
  325. package/src/utils/toolWrapper.ts +10 -10
  326. package/src/utils/validation/core.ts +2 -2
  327. package/src/utils/validation/index.ts +2 -2
  328. package/src/utils/validation/network.ts +5 -5
  329. package/src/utils/validation/rateLimit.ts +1 -1
  330. package/src/utils/validation/security.ts +1 -1
  331. package/src/utils/validation/wordpress.ts +1 -1
  332. package/src/utils/version.ts +402 -0
@@ -5,7 +5,7 @@
5
5
  * For production, consider using Redis or similar distributed cache.
6
6
  */
7
7
 
8
- import { WordPressAPIError } from "../../types/client.js";
8
+ import { WordPressAPIError } from "@/types/client.js";
9
9
 
10
10
  /**
11
11
  * Rate limiting tracker (simple in-memory implementation)
@@ -6,7 +6,7 @@
6
6
  */
7
7
 
8
8
  import * as path from "path";
9
- import { WordPressAPIError } from "../../types/client.js";
9
+ import { WordPressAPIError } from "@/types/client.js";
10
10
 
11
11
  /**
12
12
  * Validates and sanitizes file paths to prevent directory traversal
@@ -5,7 +5,7 @@
5
5
  * pagination, search queries, and status validation.
6
6
  */
7
7
 
8
- import { WordPressAPIError } from "../../types/client.js";
8
+ import { WordPressAPIError } from "@/types/client.js";
9
9
  import { validateId } from "./core.js";
10
10
  import { validateString, validateArray } from "./core.js";
11
11
  import { sanitizeHtml } from "./security.js";
@@ -0,0 +1,402 @@
1
+ /**
2
+ * Version Management Utility
3
+ *
4
+ * Provides centralized version management following best practices:
5
+ * - Single source of truth (package.json)
6
+ * - Semantic versioning support
7
+ * - Build metadata integration
8
+ * - Version comparison utilities
9
+ */
10
+
11
+ import { readFile } from "fs/promises";
12
+ import { join } from "path";
13
+ import { fileURLToPath } from "url";
14
+ import { dirname } from "path";
15
+
16
+ /**
17
+ * Version information interface
18
+ */
19
+ export interface VersionInfo {
20
+ /** Full version string (e.g., "2.7.0") */
21
+ version: string;
22
+ /** Major version number */
23
+ major: number;
24
+ /** Minor version number */
25
+ minor: number;
26
+ /** Patch version number */
27
+ patch: number;
28
+ /** Pre-release identifier (e.g., "beta.1") */
29
+ prerelease?: string;
30
+ /** Build metadata (e.g., git commit hash) */
31
+ build?: string;
32
+ /** Human-readable version string with metadata */
33
+ full: string;
34
+ }
35
+
36
+ /**
37
+ * Package.json structure for version reading
38
+ */
39
+ interface PackageJson {
40
+ name: string;
41
+ version: string;
42
+ description?: string;
43
+ }
44
+
45
+ /**
46
+ * Version Manager Class
47
+ * Singleton pattern for consistent version management
48
+ */
49
+ export class VersionManager {
50
+ private static instance: VersionManager;
51
+ private versionInfo: VersionInfo | null = null;
52
+ private packageJson: PackageJson | null = null;
53
+ private isInitialized: boolean = false;
54
+
55
+ private constructor() {}
56
+
57
+ /**
58
+ * Get singleton instance
59
+ */
60
+ static getInstance(): VersionManager {
61
+ if (!VersionManager.instance) {
62
+ VersionManager.instance = new VersionManager();
63
+ }
64
+ return VersionManager.instance;
65
+ }
66
+
67
+ /**
68
+ * Initialize version manager with async file loading
69
+ * Call this early in application startup for optimal performance
70
+ */
71
+ async initialize(): Promise<void> {
72
+ if (this.isInitialized) {
73
+ return;
74
+ }
75
+
76
+ try {
77
+ this.packageJson = await this.loadPackageJson();
78
+ this.versionInfo = this.loadVersionFromPackage(this.packageJson);
79
+ this.isInitialized = true;
80
+ } catch (_error) {
81
+ // Fall back to sync loading if async fails
82
+ this.packageJson = await this.loadPackageJson(); // This will use fallback
83
+ this.versionInfo = this.loadVersionFromPackage(this.packageJson);
84
+ this.isInitialized = true;
85
+ }
86
+ }
87
+
88
+ /**
89
+ * Get version information
90
+ * Uses cached version if available, loads synchronously with fallback if needed
91
+ */
92
+ getVersion(): VersionInfo {
93
+ if (!this.versionInfo) {
94
+ // If not initialized, load synchronously with fallback
95
+ this.versionInfo = this.loadVersionSync();
96
+ }
97
+ return this.versionInfo;
98
+ }
99
+
100
+ /**
101
+ * Get package information
102
+ * Uses cached package if available, loads synchronously with fallback if needed
103
+ */
104
+ getPackageInfo(): PackageJson {
105
+ if (!this.packageJson) {
106
+ // Return fallback package info if not loaded
107
+ this.packageJson = {
108
+ name: "mcp-wordpress",
109
+ version: "2.7.0", // Fallback version
110
+ description: "MCP WordPress Server",
111
+ };
112
+ }
113
+ return this.packageJson;
114
+ }
115
+
116
+ /**
117
+ * Load version synchronously (with fallback)
118
+ * @deprecated Use initialize() followed by getVersion() for better performance
119
+ */
120
+ private loadVersionSync(): VersionInfo {
121
+ const pkg = this.getPackageInfo(); // Uses fallback if needed
122
+ return this.loadVersionFromPackage(pkg);
123
+ }
124
+
125
+ /**
126
+ * Load version from package data
127
+ */
128
+ private loadVersionFromPackage(pkg: PackageJson): VersionInfo {
129
+ const parsed = this.parseSemanticVersion(pkg.version);
130
+
131
+ // Add build metadata if available
132
+ const buildMetadata = this.getBuildMetadata();
133
+
134
+ const result: VersionInfo = {
135
+ ...parsed,
136
+ full: this.formatFullVersion(parsed, buildMetadata),
137
+ };
138
+
139
+ if (buildMetadata !== undefined) {
140
+ result.build = buildMetadata;
141
+ }
142
+
143
+ return result;
144
+ }
145
+
146
+ /**
147
+ * Load package.json
148
+ */
149
+ private async loadPackageJson(): Promise<PackageJson> {
150
+ try {
151
+ // Get the project root directory
152
+ const __filename = fileURLToPath(import.meta.url);
153
+ const __dirname = dirname(__filename);
154
+ const projectRoot = join(__dirname, "..", "..");
155
+ const packagePath = join(projectRoot, "package.json");
156
+
157
+ const packageContent = await readFile(packagePath, "utf-8");
158
+ return JSON.parse(packageContent) as PackageJson;
159
+ } catch (_error) {
160
+ // Fallback for runtime environments where package.json might not be available
161
+ // Note: Using fallback version - should match package.json
162
+ return {
163
+ name: "mcp-wordpress",
164
+ version: "2.7.0", // Fallback version - should match package.json
165
+ description: "MCP WordPress Server",
166
+ };
167
+ }
168
+ }
169
+
170
+ /**
171
+ * Parse semantic version string
172
+ * Supports format: major.minor.patch[-prerelease][+build]
173
+ */
174
+ private parseSemanticVersion(version: string): Omit<VersionInfo, "build" | "full"> {
175
+ // Regular expression for semantic versioning
176
+ const semverRegex = /^(\d+)\.(\d+)\.(\d+)(?:-([a-zA-Z0-9.-]+))?(?:\+([a-zA-Z0-9.-]+))?$/;
177
+ const match = version.match(semverRegex);
178
+
179
+ if (!match) {
180
+ // Fallback for non-standard versions
181
+ return {
182
+ version,
183
+ major: 0,
184
+ minor: 0,
185
+ patch: 0,
186
+ };
187
+ }
188
+
189
+ const result: Omit<VersionInfo, "build" | "full"> = {
190
+ version: `${match[1]}.${match[2]}.${match[3]}`,
191
+ major: parseInt(match[1], 10),
192
+ minor: parseInt(match[2], 10),
193
+ patch: parseInt(match[3], 10),
194
+ };
195
+
196
+ if (match[4]) {
197
+ result.prerelease = match[4];
198
+ }
199
+
200
+ return result;
201
+ }
202
+
203
+ /**
204
+ * Get build metadata (git commit hash, timestamp, etc.)
205
+ */
206
+ private getBuildMetadata(): string | undefined {
207
+ // In production, this could be injected during build process
208
+ // For now, we'll use environment variables if available
209
+ if (process.env.BUILD_NUMBER) {
210
+ return process.env.BUILD_NUMBER;
211
+ }
212
+
213
+ if (process.env.GIT_COMMIT) {
214
+ return process.env.GIT_COMMIT.substring(0, 7); // Short hash
215
+ }
216
+
217
+ // For development, optionally include timestamp
218
+ if (process.env.NODE_ENV === "development") {
219
+ return `dev.${Date.now()}`;
220
+ }
221
+
222
+ return undefined;
223
+ }
224
+
225
+ /**
226
+ * Format full version string with metadata
227
+ */
228
+ private formatFullVersion(version: Omit<VersionInfo, "build" | "full">, build?: string): string {
229
+ let full = version.version;
230
+
231
+ if (version.prerelease) {
232
+ full += `-${version.prerelease}`;
233
+ }
234
+
235
+ if (build) {
236
+ full += `+${build}`;
237
+ }
238
+
239
+ return full;
240
+ }
241
+
242
+ /**
243
+ * Compare two version strings
244
+ * Returns: -1 if v1 < v2, 0 if v1 = v2, 1 if v1 > v2
245
+ */
246
+ compareVersions(v1: string, v2: string): number {
247
+ const version1 = this.parseSemanticVersion(v1);
248
+ const version2 = this.parseSemanticVersion(v2);
249
+
250
+ // Compare major
251
+ if (version1.major !== version2.major) {
252
+ return version1.major > version2.major ? 1 : -1;
253
+ }
254
+
255
+ // Compare minor
256
+ if (version1.minor !== version2.minor) {
257
+ return version1.minor > version2.minor ? 1 : -1;
258
+ }
259
+
260
+ // Compare patch
261
+ if (version1.patch !== version2.patch) {
262
+ return version1.patch > version2.patch ? 1 : -1;
263
+ }
264
+
265
+ // Compare prerelease (absence of prerelease is greater than presence)
266
+ if (version1.prerelease && !version2.prerelease) return -1;
267
+ if (!version1.prerelease && version2.prerelease) return 1;
268
+ if (version1.prerelease && version2.prerelease) {
269
+ return version1.prerelease.localeCompare(version2.prerelease);
270
+ }
271
+
272
+ return 0;
273
+ }
274
+
275
+ /**
276
+ * Check if version satisfies a requirement
277
+ */
278
+ satisfiesVersion(version: string, requirement: string): boolean {
279
+ // Simple implementation - can be extended with full semver range support
280
+ if (requirement === "*") return true;
281
+
282
+ if (requirement.startsWith("^")) {
283
+ // Caret range: compatible with version
284
+ const reqVersion = this.parseSemanticVersion(requirement.substring(1));
285
+ const curVersion = this.parseSemanticVersion(version);
286
+
287
+ return (
288
+ curVersion.major === reqVersion.major &&
289
+ (curVersion.minor > reqVersion.minor ||
290
+ (curVersion.minor === reqVersion.minor && curVersion.patch >= reqVersion.patch))
291
+ );
292
+ }
293
+
294
+ if (requirement.startsWith("~")) {
295
+ // Tilde range: patch-level changes
296
+ const reqVersion = this.parseSemanticVersion(requirement.substring(1));
297
+ const curVersion = this.parseSemanticVersion(version);
298
+
299
+ return (
300
+ curVersion.major === reqVersion.major &&
301
+ curVersion.minor === reqVersion.minor &&
302
+ curVersion.patch >= reqVersion.patch
303
+ );
304
+ }
305
+
306
+ // Exact match
307
+ return this.compareVersions(version, requirement) === 0;
308
+ }
309
+
310
+ /**
311
+ * Get user agent string for HTTP requests
312
+ */
313
+ getUserAgent(): string {
314
+ const info = this.getVersion();
315
+ const pkg = this.getPackageInfo();
316
+ return `${pkg.name}/${info.full}`;
317
+ }
318
+
319
+ /**
320
+ * Get version for display/logging
321
+ */
322
+ getDisplayVersion(): string {
323
+ const info = this.getVersion();
324
+ const pkg = this.getPackageInfo();
325
+
326
+ if (process.env.NODE_ENV === "development") {
327
+ return `${pkg.name} v${info.full} (development)`;
328
+ }
329
+
330
+ return `${pkg.name} v${info.version}`;
331
+ }
332
+
333
+ /**
334
+ * Check if running in development mode
335
+ */
336
+ isDevelopment(): boolean {
337
+ return process.env.NODE_ENV === "development";
338
+ }
339
+
340
+ /**
341
+ * Check if running a prerelease version
342
+ */
343
+ isPrerelease(): boolean {
344
+ const info = this.getVersion();
345
+ return !!info.prerelease;
346
+ }
347
+
348
+ /**
349
+ * Get version badge URL for documentation
350
+ */
351
+ getVersionBadgeUrl(): string {
352
+ const info = this.getVersion();
353
+ const color = info.prerelease ? "orange" : "blue";
354
+ return `https://img.shields.io/badge/version-${info.version}-${color}`;
355
+ }
356
+ }
357
+
358
+ /**
359
+ * Singleton instance export for convenience
360
+ */
361
+ export const versionManager = VersionManager.getInstance();
362
+
363
+ /**
364
+ * Quick access functions
365
+ */
366
+ export function getVersion(): string {
367
+ return versionManager.getVersion().version;
368
+ }
369
+
370
+ export function getFullVersion(): string {
371
+ return versionManager.getVersion().full;
372
+ }
373
+
374
+ export function getUserAgent(): string {
375
+ return versionManager.getUserAgent();
376
+ }
377
+
378
+ export function getDisplayVersion(): string {
379
+ return versionManager.getDisplayVersion();
380
+ }
381
+
382
+ /**
383
+ * Semantic version comparison
384
+ */
385
+ export function isVersionGreaterThan(v1: string, v2: string): boolean {
386
+ return versionManager.compareVersions(v1, v2) > 0;
387
+ }
388
+
389
+ export function isVersionLessThan(v1: string, v2: string): boolean {
390
+ return versionManager.compareVersions(v1, v2) < 0;
391
+ }
392
+
393
+ export function isVersionEqual(v1: string, v2: string): boolean {
394
+ return versionManager.compareVersions(v1, v2) === 0;
395
+ }
396
+
397
+ /**
398
+ * Version requirement checking
399
+ */
400
+ export function satisfiesVersion(version: string, requirement: string): boolean {
401
+ return versionManager.satisfiesVersion(version, requirement);
402
+ }