@local-labs-jpollock/local-cli 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/addon-dist/bin/mcp-stdio.js +2808 -0
  2. package/addon-dist/lib/common/constants.d.ts +22 -0
  3. package/addon-dist/lib/common/constants.js +26 -0
  4. package/addon-dist/lib/common/theme.d.ts +68 -0
  5. package/addon-dist/lib/common/theme.js +126 -0
  6. package/addon-dist/lib/common/types.d.ts +298 -0
  7. package/addon-dist/lib/common/types.js +6 -0
  8. package/addon-dist/lib/main/config/ConnectionInfo.d.ts +25 -0
  9. package/addon-dist/lib/main/config/ConnectionInfo.js +82 -0
  10. package/addon-dist/lib/main/index.d.ts +12 -0
  11. package/addon-dist/lib/main/index.js +3322 -0
  12. package/addon-dist/lib/main/mcp/McpAuth.d.ts +37 -0
  13. package/addon-dist/lib/main/mcp/McpAuth.js +87 -0
  14. package/addon-dist/lib/main/mcp/McpServer.d.ts +67 -0
  15. package/addon-dist/lib/main/mcp/McpServer.js +343 -0
  16. package/addon-dist/lib/main/mcp/tools/changePhpVersion.d.ts +7 -0
  17. package/addon-dist/lib/main/mcp/tools/changePhpVersion.js +81 -0
  18. package/addon-dist/lib/main/mcp/tools/cloneSite.d.ts +7 -0
  19. package/addon-dist/lib/main/mcp/tools/cloneSite.js +66 -0
  20. package/addon-dist/lib/main/mcp/tools/createSite.d.ts +7 -0
  21. package/addon-dist/lib/main/mcp/tools/createSite.js +137 -0
  22. package/addon-dist/lib/main/mcp/tools/deleteSite.d.ts +7 -0
  23. package/addon-dist/lib/main/mcp/tools/deleteSite.js +72 -0
  24. package/addon-dist/lib/main/mcp/tools/exportDatabase.d.ts +7 -0
  25. package/addon-dist/lib/main/mcp/tools/exportDatabase.js +72 -0
  26. package/addon-dist/lib/main/mcp/tools/exportSite.d.ts +7 -0
  27. package/addon-dist/lib/main/mcp/tools/exportSite.js +103 -0
  28. package/addon-dist/lib/main/mcp/tools/getLocalInfo.d.ts +7 -0
  29. package/addon-dist/lib/main/mcp/tools/getLocalInfo.js +72 -0
  30. package/addon-dist/lib/main/mcp/tools/getSite.d.ts +7 -0
  31. package/addon-dist/lib/main/mcp/tools/getSite.js +68 -0
  32. package/addon-dist/lib/main/mcp/tools/getSiteLogs.d.ts +7 -0
  33. package/addon-dist/lib/main/mcp/tools/getSiteLogs.js +149 -0
  34. package/addon-dist/lib/main/mcp/tools/helpers.d.ts +59 -0
  35. package/addon-dist/lib/main/mcp/tools/helpers.js +179 -0
  36. package/addon-dist/lib/main/mcp/tools/importDatabase.d.ts +7 -0
  37. package/addon-dist/lib/main/mcp/tools/importDatabase.js +109 -0
  38. package/addon-dist/lib/main/mcp/tools/importSite.d.ts +7 -0
  39. package/addon-dist/lib/main/mcp/tools/importSite.js +149 -0
  40. package/addon-dist/lib/main/mcp/tools/index.d.ts +26 -0
  41. package/addon-dist/lib/main/mcp/tools/index.js +117 -0
  42. package/addon-dist/lib/main/mcp/tools/listBlueprints.d.ts +7 -0
  43. package/addon-dist/lib/main/mcp/tools/listBlueprints.js +54 -0
  44. package/addon-dist/lib/main/mcp/tools/listServices.d.ts +7 -0
  45. package/addon-dist/lib/main/mcp/tools/listServices.js +112 -0
  46. package/addon-dist/lib/main/mcp/tools/listSites.d.ts +7 -0
  47. package/addon-dist/lib/main/mcp/tools/listSites.js +62 -0
  48. package/addon-dist/lib/main/mcp/tools/openAdminer.d.ts +7 -0
  49. package/addon-dist/lib/main/mcp/tools/openAdminer.js +59 -0
  50. package/addon-dist/lib/main/mcp/tools/openSite.d.ts +7 -0
  51. package/addon-dist/lib/main/mcp/tools/openSite.js +62 -0
  52. package/addon-dist/lib/main/mcp/tools/renameSite.d.ts +7 -0
  53. package/addon-dist/lib/main/mcp/tools/renameSite.js +70 -0
  54. package/addon-dist/lib/main/mcp/tools/restartSite.d.ts +7 -0
  55. package/addon-dist/lib/main/mcp/tools/restartSite.js +56 -0
  56. package/addon-dist/lib/main/mcp/tools/saveBlueprint.d.ts +7 -0
  57. package/addon-dist/lib/main/mcp/tools/saveBlueprint.js +89 -0
  58. package/addon-dist/lib/main/mcp/tools/startSite.d.ts +7 -0
  59. package/addon-dist/lib/main/mcp/tools/startSite.js +54 -0
  60. package/addon-dist/lib/main/mcp/tools/stopSite.d.ts +7 -0
  61. package/addon-dist/lib/main/mcp/tools/stopSite.js +54 -0
  62. package/addon-dist/lib/main/mcp/tools/toggleXdebug.d.ts +7 -0
  63. package/addon-dist/lib/main/mcp/tools/toggleXdebug.js +69 -0
  64. package/addon-dist/lib/main/mcp/tools/trustSsl.d.ts +7 -0
  65. package/addon-dist/lib/main/mcp/tools/trustSsl.js +59 -0
  66. package/addon-dist/lib/main/mcp/tools/wpCli.d.ts +7 -0
  67. package/addon-dist/lib/main/mcp/tools/wpCli.js +110 -0
  68. package/addon-dist/lib/main.d.ts +1 -0
  69. package/addon-dist/lib/main.js +10 -0
  70. package/addon-dist/lib/renderer/index.d.ts +7 -0
  71. package/addon-dist/lib/renderer/index.js +479 -0
  72. package/addon-dist/package.json +73 -0
  73. package/bin/lwp.js +10 -0
  74. package/lib/bootstrap/index.d.ts +98 -0
  75. package/lib/bootstrap/index.js +493 -0
  76. package/lib/bootstrap/paths.d.ts +28 -0
  77. package/lib/bootstrap/paths.js +96 -0
  78. package/lib/client/GraphQLClient.d.ts +38 -0
  79. package/lib/client/GraphQLClient.js +71 -0
  80. package/lib/client/index.d.ts +4 -0
  81. package/lib/client/index.js +10 -0
  82. package/lib/formatters/index.d.ts +75 -0
  83. package/lib/formatters/index.js +139 -0
  84. package/lib/index.d.ts +8 -0
  85. package/lib/index.js +1173 -0
  86. package/package.json +72 -0
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ /**
3
+ * change_php_version Tool
4
+ * Change PHP version for a site
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.changePhpVersionDefinition = void 0;
8
+ exports.changePhpVersion = changePhpVersion;
9
+ const helpers_1 = require("./helpers");
10
+ exports.changePhpVersionDefinition = {
11
+ name: 'change_php_version',
12
+ description: 'Change the PHP version for a site',
13
+ inputSchema: {
14
+ type: 'object',
15
+ properties: {
16
+ site: {
17
+ type: 'string',
18
+ description: 'Site name or ID',
19
+ },
20
+ phpVersion: {
21
+ type: 'string',
22
+ description: 'Target PHP version (e.g., "8.2.10", "8.1.27", "7.4.33")',
23
+ },
24
+ },
25
+ required: ['site', 'phpVersion'],
26
+ },
27
+ };
28
+ async function changePhpVersion(args, services) {
29
+ const { site: siteQuery, phpVersion } = args;
30
+ const siteError = (0, helpers_1.validateRequiredParam)(siteQuery, 'site');
31
+ if (siteError)
32
+ return siteError;
33
+ const phpError = (0, helpers_1.validateRequiredParam)(phpVersion, 'phpVersion');
34
+ if (phpError)
35
+ return phpError;
36
+ const siteResult = (0, helpers_1.findSiteOrError)(siteQuery, services.siteData);
37
+ if ('error' in siteResult)
38
+ return siteResult.error;
39
+ const { site } = siteResult;
40
+ try {
41
+ // Check if siteProvisioner service exists
42
+ if (!services.siteProvisioner) {
43
+ return {
44
+ content: [{ type: 'text', text: 'Site provisioner service not available' }],
45
+ isError: true,
46
+ };
47
+ }
48
+ // Get current PHP version for messaging
49
+ const currentPhp = typeof site.phpVersion === 'object' ? site.phpVersion?.version : site.phpVersion;
50
+ // Change PHP version using siteProvisioner.swapService
51
+ // The service name is 'php' and role is 'php'
52
+ await services.siteProvisioner.swapService(site, 'php', 'php', phpVersion, true);
53
+ return {
54
+ content: [
55
+ {
56
+ type: 'text',
57
+ text: `Successfully changed PHP version for "${site.name}" from ${currentPhp || 'unknown'} to ${phpVersion}. Site services have been restarted.`,
58
+ },
59
+ ],
60
+ };
61
+ }
62
+ catch (error) {
63
+ // Provide helpful error message for version not found
64
+ if (error.message?.includes('not found') || error.message?.includes('not available')) {
65
+ return {
66
+ content: [
67
+ {
68
+ type: 'text',
69
+ text: `PHP version "${phpVersion}" not available. Use get_local_info to see available versions, or check Local preferences for installed PHP versions.`,
70
+ },
71
+ ],
72
+ isError: true,
73
+ };
74
+ }
75
+ return {
76
+ content: [{ type: 'text', text: `Failed to change PHP version: ${error.message}` }],
77
+ isError: true,
78
+ };
79
+ }
80
+ }
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbmdlUGhwVmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9tYWluL21jcC90b29scy9jaGFuZ2VQaHBWZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7OztBQTZCSCw0Q0EyREM7QUFyRkQsdUNBQW1FO0FBRXRELFFBQUEsMEJBQTBCLEdBQXNCO0lBQzNELElBQUksRUFBRSxvQkFBb0I7SUFDMUIsV0FBVyxFQUFFLG1DQUFtQztJQUNoRCxXQUFXLEVBQUU7UUFDWCxJQUFJLEVBQUUsUUFBUTtRQUNkLFVBQVUsRUFBRTtZQUNWLElBQUksRUFBRTtnQkFDSixJQUFJLEVBQUUsUUFBUTtnQkFDZCxXQUFXLEVBQUUsaUJBQWlCO2FBQy9CO1lBQ0QsVUFBVSxFQUFFO2dCQUNWLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSx5REFBeUQ7YUFDdkU7U0FDRjtRQUNELFFBQVEsRUFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUM7S0FDakM7Q0FDRixDQUFDO0FBT0ssS0FBSyxVQUFVLGdCQUFnQixDQUNwQyxJQUE2QixFQUM3QixRQUF1QjtJQUV2QixNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUF1QyxDQUFDO0lBRWhGLE1BQU0sU0FBUyxHQUFHLElBQUEsK0JBQXFCLEVBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzNELElBQUksU0FBUztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBRWhDLE1BQU0sUUFBUSxHQUFHLElBQUEsK0JBQXFCLEVBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ2pFLElBQUksUUFBUTtRQUFFLE9BQU8sUUFBUSxDQUFDO0lBRTlCLE1BQU0sVUFBVSxHQUFHLElBQUEseUJBQWUsRUFBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pFLElBQUksT0FBTyxJQUFJLFVBQVU7UUFBRSxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUM7SUFDbkQsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLFVBQVUsQ0FBQztJQUU1QixJQUFJLENBQUM7UUFDSCwwQ0FBMEM7UUFDMUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUM5QixPQUFPO2dCQUNMLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsd0NBQXdDLEVBQUUsQ0FBQztnQkFDM0UsT0FBTyxFQUFFLElBQUk7YUFDZCxDQUFDO1FBQ0osQ0FBQztRQUVELHdDQUF3QztRQUN4QyxNQUFNLFVBQVUsR0FDZCxPQUFPLElBQUksQ0FBQyxVQUFVLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUVuRix1REFBdUQ7UUFDdkQsOENBQThDO1FBQzlDLE1BQU0sUUFBUSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRWpGLE9BQU87WUFDTCxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLHlDQUF5QyxJQUFJLENBQUMsSUFBSSxVQUFVLFVBQVUsSUFBSSxTQUFTLE9BQU8sVUFBVSxzQ0FBc0M7aUJBQ2pKO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7UUFDcEIsc0RBQXNEO1FBQ3RELElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztZQUNyRixPQUFPO2dCQUNMLE9BQU8sRUFBRTtvQkFDUDt3QkFDRSxJQUFJLEVBQUUsTUFBTTt3QkFDWixJQUFJLEVBQUUsZ0JBQWdCLFVBQVUsdUhBQXVIO3FCQUN4SjtpQkFDRjtnQkFDRCxPQUFPLEVBQUUsSUFBSTthQUNkLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTztZQUNMLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsaUNBQWlDLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ25GLE9BQU8sRUFBRSxJQUFJO1NBQ2QsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBjaGFuZ2VfcGhwX3ZlcnNpb24gVG9vbFxuICogQ2hhbmdlIFBIUCB2ZXJzaW9uIGZvciBhIHNpdGVcbiAqL1xuXG5pbXBvcnQgeyBNY3BUb29sRGVmaW5pdGlvbiwgTWNwVG9vbFJlc3VsdCwgTG9jYWxTZXJ2aWNlcyB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZVJlcXVpcmVkUGFyYW0sIGZpbmRTaXRlT3JFcnJvciB9IGZyb20gJy4vaGVscGVycyc7XG5cbmV4cG9ydCBjb25zdCBjaGFuZ2VQaHBWZXJzaW9uRGVmaW5pdGlvbjogTWNwVG9vbERlZmluaXRpb24gPSB7XG4gIG5hbWU6ICdjaGFuZ2VfcGhwX3ZlcnNpb24nLFxuICBkZXNjcmlwdGlvbjogJ0NoYW5nZSB0aGUgUEhQIHZlcnNpb24gZm9yIGEgc2l0ZScsXG4gIGlucHV0U2NoZW1hOiB7XG4gICAgdHlwZTogJ29iamVjdCcsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgc2l0ZToge1xuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdTaXRlIG5hbWUgb3IgSUQnLFxuICAgICAgfSxcbiAgICAgIHBocFZlcnNpb246IHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVGFyZ2V0IFBIUCB2ZXJzaW9uIChlLmcuLCBcIjguMi4xMFwiLCBcIjguMS4yN1wiLCBcIjcuNC4zM1wiKScsXG4gICAgICB9LFxuICAgIH0sXG4gICAgcmVxdWlyZWQ6IFsnc2l0ZScsICdwaHBWZXJzaW9uJ10sXG4gIH0sXG59O1xuXG5pbnRlcmZhY2UgQ2hhbmdlUGhwVmVyc2lvbkFyZ3Mge1xuICBzaXRlOiBzdHJpbmc7XG4gIHBocFZlcnNpb246IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoYW5nZVBocFZlcnNpb24oXG4gIGFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBzZXJ2aWNlczogTG9jYWxTZXJ2aWNlc1xuKTogUHJvbWlzZTxNY3BUb29sUmVzdWx0PiB7XG4gIGNvbnN0IHsgc2l0ZTogc2l0ZVF1ZXJ5LCBwaHBWZXJzaW9uIH0gPSBhcmdzIGFzIHVua25vd24gYXMgQ2hhbmdlUGhwVmVyc2lvbkFyZ3M7XG5cbiAgY29uc3Qgc2l0ZUVycm9yID0gdmFsaWRhdGVSZXF1aXJlZFBhcmFtKHNpdGVRdWVyeSwgJ3NpdGUnKTtcbiAgaWYgKHNpdGVFcnJvcikgcmV0dXJuIHNpdGVFcnJvcjtcblxuICBjb25zdCBwaHBFcnJvciA9IHZhbGlkYXRlUmVxdWlyZWRQYXJhbShwaHBWZXJzaW9uLCAncGhwVmVyc2lvbicpO1xuICBpZiAocGhwRXJyb3IpIHJldHVybiBwaHBFcnJvcjtcblxuICBjb25zdCBzaXRlUmVzdWx0ID0gZmluZFNpdGVPckVycm9yKHNpdGVRdWVyeSwgc2VydmljZXMuc2l0ZURhdGEpO1xuICBpZiAoJ2Vycm9yJyBpbiBzaXRlUmVzdWx0KSByZXR1cm4gc2l0ZVJlc3VsdC5lcnJvcjtcbiAgY29uc3QgeyBzaXRlIH0gPSBzaXRlUmVzdWx0O1xuXG4gIHRyeSB7XG4gICAgLy8gQ2hlY2sgaWYgc2l0ZVByb3Zpc2lvbmVyIHNlcnZpY2UgZXhpc3RzXG4gICAgaWYgKCFzZXJ2aWNlcy5zaXRlUHJvdmlzaW9uZXIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6ICd0ZXh0JywgdGV4dDogJ1NpdGUgcHJvdmlzaW9uZXIgc2VydmljZSBub3QgYXZhaWxhYmxlJyB9XSxcbiAgICAgICAgaXNFcnJvcjogdHJ1ZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gR2V0IGN1cnJlbnQgUEhQIHZlcnNpb24gZm9yIG1lc3NhZ2luZ1xuICAgIGNvbnN0IGN1cnJlbnRQaHAgPVxuICAgICAgdHlwZW9mIHNpdGUucGhwVmVyc2lvbiA9PT0gJ29iamVjdCcgPyBzaXRlLnBocFZlcnNpb24/LnZlcnNpb24gOiBzaXRlLnBocFZlcnNpb247XG5cbiAgICAvLyBDaGFuZ2UgUEhQIHZlcnNpb24gdXNpbmcgc2l0ZVByb3Zpc2lvbmVyLnN3YXBTZXJ2aWNlXG4gICAgLy8gVGhlIHNlcnZpY2UgbmFtZSBpcyAncGhwJyBhbmQgcm9sZSBpcyAncGhwJ1xuICAgIGF3YWl0IHNlcnZpY2VzLnNpdGVQcm92aXNpb25lci5zd2FwU2VydmljZShzaXRlLCAncGhwJywgJ3BocCcsIHBocFZlcnNpb24sIHRydWUpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICB0ZXh0OiBgU3VjY2Vzc2Z1bGx5IGNoYW5nZWQgUEhQIHZlcnNpb24gZm9yIFwiJHtzaXRlLm5hbWV9XCIgZnJvbSAke2N1cnJlbnRQaHAgfHwgJ3Vua25vd24nfSB0byAke3BocFZlcnNpb259LiBTaXRlIHNlcnZpY2VzIGhhdmUgYmVlbiByZXN0YXJ0ZWQuYCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgIC8vIFByb3ZpZGUgaGVscGZ1bCBlcnJvciBtZXNzYWdlIGZvciB2ZXJzaW9uIG5vdCBmb3VuZFxuICAgIGlmIChlcnJvci5tZXNzYWdlPy5pbmNsdWRlcygnbm90IGZvdW5kJykgfHwgZXJyb3IubWVzc2FnZT8uaW5jbHVkZXMoJ25vdCBhdmFpbGFibGUnKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgIHRleHQ6IGBQSFAgdmVyc2lvbiBcIiR7cGhwVmVyc2lvbn1cIiBub3QgYXZhaWxhYmxlLiBVc2UgZ2V0X2xvY2FsX2luZm8gdG8gc2VlIGF2YWlsYWJsZSB2ZXJzaW9ucywgb3IgY2hlY2sgTG9jYWwgcHJlZmVyZW5jZXMgZm9yIGluc3RhbGxlZCBQSFAgdmVyc2lvbnMuYCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBpc0Vycm9yOiB0cnVlLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6ICd0ZXh0JywgdGV4dDogYEZhaWxlZCB0byBjaGFuZ2UgUEhQIHZlcnNpb246ICR7ZXJyb3IubWVzc2FnZX1gIH1dLFxuICAgICAgaXNFcnJvcjogdHJ1ZSxcbiAgICB9O1xuICB9XG59XG4iXX0=
@@ -0,0 +1,7 @@
1
+ /**
2
+ * clone_site Tool
3
+ * Clone an existing WordPress site
4
+ */
5
+ import { McpToolDefinition, McpToolResult, LocalServices } from '../../../common/types';
6
+ export declare const cloneSiteDefinition: McpToolDefinition;
7
+ export declare function cloneSite(args: Record<string, unknown>, services: LocalServices): Promise<McpToolResult>;
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ /**
3
+ * clone_site Tool
4
+ * Clone an existing WordPress site
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.cloneSiteDefinition = void 0;
8
+ exports.cloneSite = cloneSite;
9
+ const helpers_1 = require("./helpers");
10
+ exports.cloneSiteDefinition = {
11
+ name: 'clone_site',
12
+ description: 'Clone an existing WordPress site to create a copy with a new name',
13
+ inputSchema: {
14
+ type: 'object',
15
+ properties: {
16
+ site: {
17
+ type: 'string',
18
+ description: 'Site name or ID to clone',
19
+ },
20
+ new_name: {
21
+ type: 'string',
22
+ description: 'Name for the cloned site',
23
+ },
24
+ },
25
+ required: ['site', 'new_name'],
26
+ },
27
+ };
28
+ async function cloneSite(args, services) {
29
+ const { site: siteQuery, new_name: newName } = args;
30
+ const siteError = (0, helpers_1.validateRequiredParam)(siteQuery, 'site');
31
+ if (siteError)
32
+ return siteError;
33
+ const nameError = (0, helpers_1.validateRequiredParam)(newName, 'new_name');
34
+ if (nameError)
35
+ return nameError;
36
+ const siteResult = (0, helpers_1.findSiteOrError)(siteQuery, services.siteData);
37
+ if ('error' in siteResult)
38
+ return siteResult.error;
39
+ const { site } = siteResult;
40
+ try {
41
+ // Check if cloneSite service exists
42
+ if (!services.cloneSite) {
43
+ return {
44
+ content: [{ type: 'text', text: 'Clone site service not available' }],
45
+ isError: true,
46
+ };
47
+ }
48
+ // Clone the site
49
+ const clonedSite = await services.cloneSite(site, newName);
50
+ return {
51
+ content: [
52
+ {
53
+ type: 'text',
54
+ text: `Successfully cloned "${site.name}" to "${clonedSite.name}" (ID: ${clonedSite.id})`,
55
+ },
56
+ ],
57
+ };
58
+ }
59
+ catch (error) {
60
+ return {
61
+ content: [{ type: 'text', text: `Failed to clone site: ${error.message}` }],
62
+ isError: true,
63
+ };
64
+ }
65
+ }
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvbmVTaXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL21haW4vbWNwL3Rvb2xzL2Nsb25lU2l0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHOzs7QUE2QkgsOEJBMENDO0FBcEVELHVDQUFtRTtBQUV0RCxRQUFBLG1CQUFtQixHQUFzQjtJQUNwRCxJQUFJLEVBQUUsWUFBWTtJQUNsQixXQUFXLEVBQUUsbUVBQW1FO0lBQ2hGLFdBQVcsRUFBRTtRQUNYLElBQUksRUFBRSxRQUFRO1FBQ2QsVUFBVSxFQUFFO1lBQ1YsSUFBSSxFQUFFO2dCQUNKLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSwwQkFBMEI7YUFDeEM7WUFDRCxRQUFRLEVBQUU7Z0JBQ1IsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsV0FBVyxFQUFFLDBCQUEwQjthQUN4QztTQUNGO1FBQ0QsUUFBUSxFQUFFLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQztLQUMvQjtDQUNGLENBQUM7QUFPSyxLQUFLLFVBQVUsU0FBUyxDQUM3QixJQUE2QixFQUM3QixRQUF1QjtJQUV2QixNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBZ0MsQ0FBQztJQUVoRixNQUFNLFNBQVMsR0FBRyxJQUFBLCtCQUFxQixFQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMzRCxJQUFJLFNBQVM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUVoQyxNQUFNLFNBQVMsR0FBRyxJQUFBLCtCQUFxQixFQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUM3RCxJQUFJLFNBQVM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUVoQyxNQUFNLFVBQVUsR0FBRyxJQUFBLHlCQUFlLEVBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNqRSxJQUFJLE9BQU8sSUFBSSxVQUFVO1FBQUUsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDO0lBQ25ELE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxVQUFVLENBQUM7SUFFNUIsSUFBSSxDQUFDO1FBQ0gsb0NBQW9DO1FBQ3BDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDeEIsT0FBTztnQkFDTCxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLGtDQUFrQyxFQUFFLENBQUM7Z0JBQ3JFLE9BQU8sRUFBRSxJQUFJO2FBQ2QsQ0FBQztRQUNKLENBQUM7UUFFRCxpQkFBaUI7UUFDakIsTUFBTSxVQUFVLEdBQUcsTUFBTSxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUUzRCxPQUFPO1lBQ0wsT0FBTyxFQUFFO2dCQUNQO29CQUNFLElBQUksRUFBRSxNQUFNO29CQUNaLElBQUksRUFBRSx3QkFBd0IsSUFBSSxDQUFDLElBQUksU0FBUyxVQUFVLENBQUMsSUFBSSxVQUFVLFVBQVUsQ0FBQyxFQUFFLEdBQUc7aUJBQzFGO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7UUFDcEIsT0FBTztZQUNMLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUseUJBQXlCLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQzNFLE9BQU8sRUFBRSxJQUFJO1NBQ2QsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBjbG9uZV9zaXRlIFRvb2xcbiAqIENsb25lIGFuIGV4aXN0aW5nIFdvcmRQcmVzcyBzaXRlXG4gKi9cblxuaW1wb3J0IHsgTWNwVG9vbERlZmluaXRpb24sIE1jcFRvb2xSZXN1bHQsIExvY2FsU2VydmljZXMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgdmFsaWRhdGVSZXF1aXJlZFBhcmFtLCBmaW5kU2l0ZU9yRXJyb3IgfSBmcm9tICcuL2hlbHBlcnMnO1xuXG5leHBvcnQgY29uc3QgY2xvbmVTaXRlRGVmaW5pdGlvbjogTWNwVG9vbERlZmluaXRpb24gPSB7XG4gIG5hbWU6ICdjbG9uZV9zaXRlJyxcbiAgZGVzY3JpcHRpb246ICdDbG9uZSBhbiBleGlzdGluZyBXb3JkUHJlc3Mgc2l0ZSB0byBjcmVhdGUgYSBjb3B5IHdpdGggYSBuZXcgbmFtZScsXG4gIGlucHV0U2NoZW1hOiB7XG4gICAgdHlwZTogJ29iamVjdCcsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgc2l0ZToge1xuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdTaXRlIG5hbWUgb3IgSUQgdG8gY2xvbmUnLFxuICAgICAgfSxcbiAgICAgIG5ld19uYW1lOiB7XG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ05hbWUgZm9yIHRoZSBjbG9uZWQgc2l0ZScsXG4gICAgICB9LFxuICAgIH0sXG4gICAgcmVxdWlyZWQ6IFsnc2l0ZScsICduZXdfbmFtZSddLFxuICB9LFxufTtcblxuaW50ZXJmYWNlIENsb25lU2l0ZUFyZ3Mge1xuICBzaXRlOiBzdHJpbmc7XG4gIG5ld19uYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbG9uZVNpdGUoXG4gIGFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBzZXJ2aWNlczogTG9jYWxTZXJ2aWNlc1xuKTogUHJvbWlzZTxNY3BUb29sUmVzdWx0PiB7XG4gIGNvbnN0IHsgc2l0ZTogc2l0ZVF1ZXJ5LCBuZXdfbmFtZTogbmV3TmFtZSB9ID0gYXJncyBhcyB1bmtub3duIGFzIENsb25lU2l0ZUFyZ3M7XG5cbiAgY29uc3Qgc2l0ZUVycm9yID0gdmFsaWRhdGVSZXF1aXJlZFBhcmFtKHNpdGVRdWVyeSwgJ3NpdGUnKTtcbiAgaWYgKHNpdGVFcnJvcikgcmV0dXJuIHNpdGVFcnJvcjtcblxuICBjb25zdCBuYW1lRXJyb3IgPSB2YWxpZGF0ZVJlcXVpcmVkUGFyYW0obmV3TmFtZSwgJ25ld19uYW1lJyk7XG4gIGlmIChuYW1lRXJyb3IpIHJldHVybiBuYW1lRXJyb3I7XG5cbiAgY29uc3Qgc2l0ZVJlc3VsdCA9IGZpbmRTaXRlT3JFcnJvcihzaXRlUXVlcnksIHNlcnZpY2VzLnNpdGVEYXRhKTtcbiAgaWYgKCdlcnJvcicgaW4gc2l0ZVJlc3VsdCkgcmV0dXJuIHNpdGVSZXN1bHQuZXJyb3I7XG4gIGNvbnN0IHsgc2l0ZSB9ID0gc2l0ZVJlc3VsdDtcblxuICB0cnkge1xuICAgIC8vIENoZWNrIGlmIGNsb25lU2l0ZSBzZXJ2aWNlIGV4aXN0c1xuICAgIGlmICghc2VydmljZXMuY2xvbmVTaXRlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbeyB0eXBlOiAndGV4dCcsIHRleHQ6ICdDbG9uZSBzaXRlIHNlcnZpY2Ugbm90IGF2YWlsYWJsZScgfV0sXG4gICAgICAgIGlzRXJyb3I6IHRydWUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIENsb25lIHRoZSBzaXRlXG4gICAgY29uc3QgY2xvbmVkU2l0ZSA9IGF3YWl0IHNlcnZpY2VzLmNsb25lU2l0ZShzaXRlLCBuZXdOYW1lKTtcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgdGV4dDogYFN1Y2Nlc3NmdWxseSBjbG9uZWQgXCIke3NpdGUubmFtZX1cIiB0byBcIiR7Y2xvbmVkU2l0ZS5uYW1lfVwiIChJRDogJHtjbG9uZWRTaXRlLmlkfSlgLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6ICd0ZXh0JywgdGV4dDogYEZhaWxlZCB0byBjbG9uZSBzaXRlOiAke2Vycm9yLm1lc3NhZ2V9YCB9XSxcbiAgICAgIGlzRXJyb3I6IHRydWUsXG4gICAgfTtcbiAgfVxufVxuIl19
@@ -0,0 +1,7 @@
1
+ /**
2
+ * create_site Tool
3
+ * Create a new WordPress site
4
+ */
5
+ import { McpToolDefinition, McpToolResult, LocalServices } from '../../../common/types';
6
+ export declare const createSiteDefinition: McpToolDefinition;
7
+ export declare function createSite(args: Record<string, unknown>, services: LocalServices): Promise<McpToolResult>;
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ /**
3
+ * create_site Tool
4
+ * Create a new WordPress site
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.createSiteDefinition = void 0;
11
+ exports.createSite = createSite;
12
+ const os_1 = __importDefault(require("os"));
13
+ const path_1 = __importDefault(require("path"));
14
+ exports.createSiteDefinition = {
15
+ name: 'create_site',
16
+ description: 'Create a new WordPress site in Local',
17
+ inputSchema: {
18
+ type: 'object',
19
+ properties: {
20
+ name: {
21
+ type: 'string',
22
+ description: 'Site name (required)',
23
+ },
24
+ domain: {
25
+ type: 'string',
26
+ description: 'Site domain (default: name.local)',
27
+ },
28
+ phpVersion: {
29
+ type: 'string',
30
+ description: 'PHP version (e.g., "8.2.10")',
31
+ },
32
+ webServer: {
33
+ type: 'string',
34
+ enum: ['nginx', 'apache'],
35
+ description: 'Web server type (default: nginx)',
36
+ },
37
+ database: {
38
+ type: 'string',
39
+ enum: ['mysql', 'mariadb'],
40
+ description: 'Database type (default: mysql)',
41
+ },
42
+ wpAdmin: {
43
+ type: 'object',
44
+ properties: {
45
+ username: {
46
+ type: 'string',
47
+ description: 'WordPress admin username (default: admin)',
48
+ },
49
+ password: {
50
+ type: 'string',
51
+ description: 'WordPress admin password (default: password)',
52
+ },
53
+ email: {
54
+ type: 'string',
55
+ description: 'WordPress admin email (default: admin@local.test)',
56
+ },
57
+ },
58
+ description: 'WordPress admin credentials',
59
+ },
60
+ },
61
+ required: ['name'],
62
+ },
63
+ };
64
+ async function createSite(args, services) {
65
+ const { name, domain, phpVersion, webServer = 'nginx', database = 'mysql', wpAdmin = {}, } = args;
66
+ if (!name) {
67
+ return {
68
+ content: [{ type: 'text', text: 'Error: name parameter is required' }],
69
+ isError: true,
70
+ };
71
+ }
72
+ // Check if site with this name already exists
73
+ const sitesMap = services.siteData.getSites();
74
+ const existingSites = Object.values(sitesMap);
75
+ const existingSite = existingSites.find((s) => s.name.toLowerCase() === name.toLowerCase());
76
+ if (existingSite) {
77
+ return {
78
+ content: [{ type: 'text', text: `Error: A site named "${name}" already exists` }],
79
+ isError: true,
80
+ };
81
+ }
82
+ try {
83
+ // Build site slug (used for domain and path)
84
+ const siteSlug = name
85
+ .toLowerCase()
86
+ .replace(/[^a-z0-9]+/g, '-')
87
+ .replace(/^-|-$/g, '');
88
+ // Build site domain
89
+ const siteDomain = domain || `${siteSlug}.local`;
90
+ // Build site path - Local stores sites in ~/Local Sites/<site-slug>
91
+ const sitePath = path_1.default.join(os_1.default.homedir(), 'Local Sites', siteSlug);
92
+ // Build the site creation options
93
+ const newSiteInfo = {
94
+ siteName: name,
95
+ siteDomain: siteDomain,
96
+ sitePath: sitePath,
97
+ webServer: webServer,
98
+ database: database,
99
+ };
100
+ // Add PHP version if specified
101
+ if (phpVersion) {
102
+ newSiteInfo.phpVersion = phpVersion;
103
+ }
104
+ // Create the site using addSite service
105
+ const newSite = await services.addSite.addSite({
106
+ newSiteInfo,
107
+ wpCredentials: {
108
+ adminUsername: wpAdmin.username || 'admin',
109
+ adminPassword: wpAdmin.password || 'password',
110
+ adminEmail: wpAdmin.email || 'admin@local.test',
111
+ },
112
+ goToSite: false,
113
+ });
114
+ const result = {
115
+ success: true,
116
+ site: {
117
+ id: newSite.id,
118
+ name: newSite.name,
119
+ domain: newSite.domain,
120
+ path: newSite.path,
121
+ url: `https://${newSite.domain}`,
122
+ adminUrl: `https://${newSite.domain}/wp-admin`,
123
+ },
124
+ message: `Site "${name}" created successfully`,
125
+ };
126
+ return {
127
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
128
+ };
129
+ }
130
+ catch (error) {
131
+ return {
132
+ content: [{ type: 'text', text: `Failed to create site: ${error.message}` }],
133
+ isError: true,
134
+ };
135
+ }
136
+ }
137
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlU2l0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9tYWluL21jcC90b29scy9jcmVhdGVTaXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7Ozs7OztBQXNFSCxnQ0EyRkM7QUEvSkQsNENBQW9CO0FBQ3BCLGdEQUF3QjtBQUdYLFFBQUEsb0JBQW9CLEdBQXNCO0lBQ3JELElBQUksRUFBRSxhQUFhO0lBQ25CLFdBQVcsRUFBRSxzQ0FBc0M7SUFDbkQsV0FBVyxFQUFFO1FBQ1gsSUFBSSxFQUFFLFFBQVE7UUFDZCxVQUFVLEVBQUU7WUFDVixJQUFJLEVBQUU7Z0JBQ0osSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsV0FBVyxFQUFFLHNCQUFzQjthQUNwQztZQUNELE1BQU0sRUFBRTtnQkFDTixJQUFJLEVBQUUsUUFBUTtnQkFDZCxXQUFXLEVBQUUsbUNBQW1DO2FBQ2pEO1lBQ0QsVUFBVSxFQUFFO2dCQUNWLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSw4QkFBOEI7YUFDNUM7WUFDRCxTQUFTLEVBQUU7Z0JBQ1QsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQztnQkFDekIsV0FBVyxFQUFFLGtDQUFrQzthQUNoRDtZQUNELFFBQVEsRUFBRTtnQkFDUixJQUFJLEVBQUUsUUFBUTtnQkFDZCxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDO2dCQUMxQixXQUFXLEVBQUUsZ0NBQWdDO2FBQzlDO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLElBQUksRUFBRSxRQUFRO2dCQUNkLFVBQVUsRUFBRTtvQkFDVixRQUFRLEVBQUU7d0JBQ1IsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsV0FBVyxFQUFFLDJDQUEyQztxQkFDekQ7b0JBQ0QsUUFBUSxFQUFFO3dCQUNSLElBQUksRUFBRSxRQUFRO3dCQUNkLFdBQVcsRUFBRSw4Q0FBOEM7cUJBQzVEO29CQUNELEtBQUssRUFBRTt3QkFDTCxJQUFJLEVBQUUsUUFBUTt3QkFDZCxXQUFXLEVBQUUsbURBQW1EO3FCQUNqRTtpQkFDRjtnQkFDRCxXQUFXLEVBQUUsNkJBQTZCO2FBQzNDO1NBQ0Y7UUFDRCxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUM7S0FDbkI7Q0FDRixDQUFDO0FBZUssS0FBSyxVQUFVLFVBQVUsQ0FDOUIsSUFBNkIsRUFDN0IsUUFBdUI7SUFFdkIsTUFBTSxFQUNKLElBQUksRUFDSixNQUFNLEVBQ04sVUFBVSxFQUNWLFNBQVMsR0FBRyxPQUFPLEVBQ25CLFFBQVEsR0FBRyxPQUFPLEVBQ2xCLE9BQU8sR0FBRyxFQUFFLEdBQ2IsR0FBRyxJQUFpQyxDQUFDO0lBRXRDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNWLE9BQU87WUFDTCxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLG1DQUFtQyxFQUFFLENBQUM7WUFDdEUsT0FBTyxFQUFFLElBQUk7U0FDZCxDQUFDO0lBQ0osQ0FBQztJQUVELDhDQUE4QztJQUM5QyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzlDLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFVLENBQUM7SUFDdkQsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUNqRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2pCLE9BQU87WUFDTCxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLHdCQUF3QixJQUFJLGtCQUFrQixFQUFFLENBQUM7WUFDakYsT0FBTyxFQUFFLElBQUk7U0FDZCxDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksQ0FBQztRQUNILDZDQUE2QztRQUM3QyxNQUFNLFFBQVEsR0FBRyxJQUFJO2FBQ2xCLFdBQVcsRUFBRTthQUNiLE9BQU8sQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDO2FBQzNCLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFekIsb0JBQW9CO1FBQ3BCLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxHQUFHLFFBQVEsUUFBUSxDQUFDO1FBRWpELG9FQUFvRTtRQUNwRSxNQUFNLFFBQVEsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLFlBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFbEUsa0NBQWtDO1FBQ2xDLE1BQU0sV0FBVyxHQUFRO1lBQ3ZCLFFBQVEsRUFBRSxJQUFJO1lBQ2QsVUFBVSxFQUFFLFVBQVU7WUFDdEIsUUFBUSxFQUFFLFFBQVE7WUFDbEIsU0FBUyxFQUFFLFNBQVM7WUFDcEIsUUFBUSxFQUFFLFFBQVE7U0FDbkIsQ0FBQztRQUVGLCtCQUErQjtRQUMvQixJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2YsV0FBVyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDdEMsQ0FBQztRQUVELHdDQUF3QztRQUN4QyxNQUFNLE9BQU8sR0FBRyxNQUFNLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQzdDLFdBQVc7WUFDWCxhQUFhLEVBQUU7Z0JBQ2IsYUFBYSxFQUFFLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTztnQkFDMUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxRQUFRLElBQUksVUFBVTtnQkFDN0MsVUFBVSxFQUFFLE9BQU8sQ0FBQyxLQUFLLElBQUksa0JBQWtCO2FBQ2hEO1lBQ0QsUUFBUSxFQUFFLEtBQUs7U0FDaEIsQ0FBQyxDQUFDO1FBRUgsTUFBTSxNQUFNLEdBQUc7WUFDYixPQUFPLEVBQUUsSUFBSTtZQUNiLElBQUksRUFBRTtnQkFDSixFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUU7Z0JBQ2QsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO2dCQUNsQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07Z0JBQ3RCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtnQkFDbEIsR0FBRyxFQUFFLFdBQVcsT0FBTyxDQUFDLE1BQU0sRUFBRTtnQkFDaEMsUUFBUSxFQUFFLFdBQVcsT0FBTyxDQUFDLE1BQU0sV0FBVzthQUMvQztZQUNELE9BQU8sRUFBRSxTQUFTLElBQUksd0JBQXdCO1NBQy9DLENBQUM7UUFFRixPQUFPO1lBQ0wsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNuRSxDQUFDO0lBQ0osQ0FBQztJQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7UUFDcEIsT0FBTztZQUNMLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsMEJBQTBCLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQzVFLE9BQU8sRUFBRSxJQUFJO1NBQ2QsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBjcmVhdGVfc2l0ZSBUb29sXG4gKiBDcmVhdGUgYSBuZXcgV29yZFByZXNzIHNpdGVcbiAqL1xuXG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBNY3BUb29sRGVmaW5pdGlvbiwgTWNwVG9vbFJlc3VsdCwgTG9jYWxTZXJ2aWNlcyB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVTaXRlRGVmaW5pdGlvbjogTWNwVG9vbERlZmluaXRpb24gPSB7XG4gIG5hbWU6ICdjcmVhdGVfc2l0ZScsXG4gIGRlc2NyaXB0aW9uOiAnQ3JlYXRlIGEgbmV3IFdvcmRQcmVzcyBzaXRlIGluIExvY2FsJyxcbiAgaW5wdXRTY2hlbWE6IHtcbiAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICBuYW1lOiB7XG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1NpdGUgbmFtZSAocmVxdWlyZWQpJyxcbiAgICAgIH0sXG4gICAgICBkb21haW46IHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnU2l0ZSBkb21haW4gKGRlZmF1bHQ6IG5hbWUubG9jYWwpJyxcbiAgICAgIH0sXG4gICAgICBwaHBWZXJzaW9uOiB7XG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1BIUCB2ZXJzaW9uIChlLmcuLCBcIjguMi4xMFwiKScsXG4gICAgICB9LFxuICAgICAgd2ViU2VydmVyOiB7XG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBlbnVtOiBbJ25naW54JywgJ2FwYWNoZSddLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1dlYiBzZXJ2ZXIgdHlwZSAoZGVmYXVsdDogbmdpbngpJyxcbiAgICAgIH0sXG4gICAgICBkYXRhYmFzZToge1xuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZW51bTogWydteXNxbCcsICdtYXJpYWRiJ10sXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnRGF0YWJhc2UgdHlwZSAoZGVmYXVsdDogbXlzcWwpJyxcbiAgICAgIH0sXG4gICAgICB3cEFkbWluOiB7XG4gICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgdXNlcm5hbWU6IHtcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdXb3JkUHJlc3MgYWRtaW4gdXNlcm5hbWUgKGRlZmF1bHQ6IGFkbWluKScsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwYXNzd29yZDoge1xuICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1dvcmRQcmVzcyBhZG1pbiBwYXNzd29yZCAoZGVmYXVsdDogcGFzc3dvcmQpJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVtYWlsOiB7XG4gICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnV29yZFByZXNzIGFkbWluIGVtYWlsIChkZWZhdWx0OiBhZG1pbkBsb2NhbC50ZXN0KScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgZGVzY3JpcHRpb246ICdXb3JkUHJlc3MgYWRtaW4gY3JlZGVudGlhbHMnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHJlcXVpcmVkOiBbJ25hbWUnXSxcbiAgfSxcbn07XG5cbmludGVyZmFjZSBDcmVhdGVTaXRlQXJncyB7XG4gIG5hbWU6IHN0cmluZztcbiAgZG9tYWluPzogc3RyaW5nO1xuICBwaHBWZXJzaW9uPzogc3RyaW5nO1xuICB3ZWJTZXJ2ZXI/OiAnbmdpbngnIHwgJ2FwYWNoZSc7XG4gIGRhdGFiYXNlPzogJ215c3FsJyB8ICdtYXJpYWRiJztcbiAgd3BBZG1pbj86IHtcbiAgICB1c2VybmFtZT86IHN0cmluZztcbiAgICBwYXNzd29yZD86IHN0cmluZztcbiAgICBlbWFpbD86IHN0cmluZztcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNpdGUoXG4gIGFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBzZXJ2aWNlczogTG9jYWxTZXJ2aWNlc1xuKTogUHJvbWlzZTxNY3BUb29sUmVzdWx0PiB7XG4gIGNvbnN0IHtcbiAgICBuYW1lLFxuICAgIGRvbWFpbixcbiAgICBwaHBWZXJzaW9uLFxuICAgIHdlYlNlcnZlciA9ICduZ2lueCcsXG4gICAgZGF0YWJhc2UgPSAnbXlzcWwnLFxuICAgIHdwQWRtaW4gPSB7fSxcbiAgfSA9IGFyZ3MgYXMgdW5rbm93biBhcyBDcmVhdGVTaXRlQXJncztcblxuICBpZiAoIW5hbWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW3sgdHlwZTogJ3RleHQnLCB0ZXh0OiAnRXJyb3I6IG5hbWUgcGFyYW1ldGVyIGlzIHJlcXVpcmVkJyB9XSxcbiAgICAgIGlzRXJyb3I6IHRydWUsXG4gICAgfTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIHNpdGUgd2l0aCB0aGlzIG5hbWUgYWxyZWFkeSBleGlzdHNcbiAgY29uc3Qgc2l0ZXNNYXAgPSBzZXJ2aWNlcy5zaXRlRGF0YS5nZXRTaXRlcygpO1xuICBjb25zdCBleGlzdGluZ1NpdGVzID0gT2JqZWN0LnZhbHVlcyhzaXRlc01hcCkgYXMgYW55W107XG4gIGNvbnN0IGV4aXN0aW5nU2l0ZSA9IGV4aXN0aW5nU2l0ZXMuZmluZCgoczogYW55KSA9PiBzLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgaWYgKGV4aXN0aW5nU2l0ZSkge1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbeyB0eXBlOiAndGV4dCcsIHRleHQ6IGBFcnJvcjogQSBzaXRlIG5hbWVkIFwiJHtuYW1lfVwiIGFscmVhZHkgZXhpc3RzYCB9XSxcbiAgICAgIGlzRXJyb3I6IHRydWUsXG4gICAgfTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gQnVpbGQgc2l0ZSBzbHVnICh1c2VkIGZvciBkb21haW4gYW5kIHBhdGgpXG4gICAgY29uc3Qgc2l0ZVNsdWcgPSBuYW1lXG4gICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgLnJlcGxhY2UoL1teYS16MC05XSsvZywgJy0nKVxuICAgICAgLnJlcGxhY2UoL14tfC0kL2csICcnKTtcblxuICAgIC8vIEJ1aWxkIHNpdGUgZG9tYWluXG4gICAgY29uc3Qgc2l0ZURvbWFpbiA9IGRvbWFpbiB8fCBgJHtzaXRlU2x1Z30ubG9jYWxgO1xuXG4gICAgLy8gQnVpbGQgc2l0ZSBwYXRoIC0gTG9jYWwgc3RvcmVzIHNpdGVzIGluIH4vTG9jYWwgU2l0ZXMvPHNpdGUtc2x1Zz5cbiAgICBjb25zdCBzaXRlUGF0aCA9IHBhdGguam9pbihvcy5ob21lZGlyKCksICdMb2NhbCBTaXRlcycsIHNpdGVTbHVnKTtcblxuICAgIC8vIEJ1aWxkIHRoZSBzaXRlIGNyZWF0aW9uIG9wdGlvbnNcbiAgICBjb25zdCBuZXdTaXRlSW5mbzogYW55ID0ge1xuICAgICAgc2l0ZU5hbWU6IG5hbWUsXG4gICAgICBzaXRlRG9tYWluOiBzaXRlRG9tYWluLFxuICAgICAgc2l0ZVBhdGg6IHNpdGVQYXRoLFxuICAgICAgd2ViU2VydmVyOiB3ZWJTZXJ2ZXIsXG4gICAgICBkYXRhYmFzZTogZGF0YWJhc2UsXG4gICAgfTtcblxuICAgIC8vIEFkZCBQSFAgdmVyc2lvbiBpZiBzcGVjaWZpZWRcbiAgICBpZiAocGhwVmVyc2lvbikge1xuICAgICAgbmV3U2l0ZUluZm8ucGhwVmVyc2lvbiA9IHBocFZlcnNpb247XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBzaXRlIHVzaW5nIGFkZFNpdGUgc2VydmljZVxuICAgIGNvbnN0IG5ld1NpdGUgPSBhd2FpdCBzZXJ2aWNlcy5hZGRTaXRlLmFkZFNpdGUoe1xuICAgICAgbmV3U2l0ZUluZm8sXG4gICAgICB3cENyZWRlbnRpYWxzOiB7XG4gICAgICAgIGFkbWluVXNlcm5hbWU6IHdwQWRtaW4udXNlcm5hbWUgfHwgJ2FkbWluJyxcbiAgICAgICAgYWRtaW5QYXNzd29yZDogd3BBZG1pbi5wYXNzd29yZCB8fCAncGFzc3dvcmQnLFxuICAgICAgICBhZG1pbkVtYWlsOiB3cEFkbWluLmVtYWlsIHx8ICdhZG1pbkBsb2NhbC50ZXN0JyxcbiAgICAgIH0sXG4gICAgICBnb1RvU2l0ZTogZmFsc2UsXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgc2l0ZToge1xuICAgICAgICBpZDogbmV3U2l0ZS5pZCxcbiAgICAgICAgbmFtZTogbmV3U2l0ZS5uYW1lLFxuICAgICAgICBkb21haW46IG5ld1NpdGUuZG9tYWluLFxuICAgICAgICBwYXRoOiBuZXdTaXRlLnBhdGgsXG4gICAgICAgIHVybDogYGh0dHBzOi8vJHtuZXdTaXRlLmRvbWFpbn1gLFxuICAgICAgICBhZG1pblVybDogYGh0dHBzOi8vJHtuZXdTaXRlLmRvbWFpbn0vd3AtYWRtaW5gLFxuICAgICAgfSxcbiAgICAgIG1lc3NhZ2U6IGBTaXRlIFwiJHtuYW1lfVwiIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5YCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6ICd0ZXh0JywgdGV4dDogSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKSB9XSxcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6ICd0ZXh0JywgdGV4dDogYEZhaWxlZCB0byBjcmVhdGUgc2l0ZTogJHtlcnJvci5tZXNzYWdlfWAgfV0sXG4gICAgICBpc0Vycm9yOiB0cnVlLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,7 @@
1
+ /**
2
+ * delete_site Tool
3
+ * Delete a WordPress site (requires confirmation)
4
+ */
5
+ import { McpToolDefinition, McpToolResult, LocalServices } from '../../../common/types';
6
+ export declare const deleteSiteDefinition: McpToolDefinition;
7
+ export declare function deleteSite(args: Record<string, unknown>, services: LocalServices): Promise<McpToolResult>;
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ /**
3
+ * delete_site Tool
4
+ * Delete a WordPress site (requires confirmation)
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.deleteSiteDefinition = void 0;
8
+ exports.deleteSite = deleteSite;
9
+ const helpers_1 = require("./helpers");
10
+ exports.deleteSiteDefinition = {
11
+ name: 'delete_site',
12
+ description: 'Delete a WordPress site. Requires confirm=true to prevent accidental deletion.',
13
+ inputSchema: {
14
+ type: 'object',
15
+ properties: {
16
+ site: {
17
+ type: 'string',
18
+ description: 'Site name or ID (partial names work)',
19
+ },
20
+ confirm: {
21
+ type: 'boolean',
22
+ description: 'Must be true to confirm deletion. This is a safety measure.',
23
+ },
24
+ trashFiles: {
25
+ type: 'boolean',
26
+ description: 'Move site files to trash instead of permanent deletion (default: true)',
27
+ },
28
+ },
29
+ required: ['site', 'confirm'],
30
+ },
31
+ };
32
+ async function deleteSite(args, services) {
33
+ const { site: siteQuery, confirm, trashFiles = true } = args;
34
+ const paramError = (0, helpers_1.validateRequiredParam)(siteQuery, 'site');
35
+ if (paramError)
36
+ return paramError;
37
+ if (confirm !== true) {
38
+ return (0, helpers_1.createErrorResult)('Error: Deletion not confirmed. You must set confirm=true to delete a site. This is a safety measure to prevent accidental deletion.');
39
+ }
40
+ const siteResult = (0, helpers_1.findSiteOrError)(siteQuery, services.siteData);
41
+ if ('error' in siteResult)
42
+ return siteResult.error;
43
+ const { site } = siteResult;
44
+ try {
45
+ // Stop the site if it's running
46
+ const currentStatus = await services.siteProcessManager.getSiteStatus(site);
47
+ if (currentStatus === 'running') {
48
+ await services.siteProcessManager.stop(site);
49
+ }
50
+ // Delete the site
51
+ await services.deleteSite.deleteSite({
52
+ site,
53
+ trashFiles,
54
+ updateHosts: true,
55
+ });
56
+ const result = {
57
+ success: true,
58
+ message: `Site "${site.name}" deleted successfully`,
59
+ trashFiles,
60
+ };
61
+ return {
62
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
63
+ };
64
+ }
65
+ catch (error) {
66
+ return {
67
+ content: [{ type: 'text', text: `Failed to delete site: ${error.message}` }],
68
+ isError: true,
69
+ };
70
+ }
71
+ }
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZXRlU2l0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9tYWluL21jcC90b29scy9kZWxldGVTaXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7OztBQWtDSCxnQ0FnREM7QUEvRUQsdUNBQXNGO0FBRXpFLFFBQUEsb0JBQW9CLEdBQXNCO0lBQ3JELElBQUksRUFBRSxhQUFhO0lBQ25CLFdBQVcsRUFBRSxnRkFBZ0Y7SUFDN0YsV0FBVyxFQUFFO1FBQ1gsSUFBSSxFQUFFLFFBQVE7UUFDZCxVQUFVLEVBQUU7WUFDVixJQUFJLEVBQUU7Z0JBQ0osSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsV0FBVyxFQUFFLHNDQUFzQzthQUNwRDtZQUNELE9BQU8sRUFBRTtnQkFDUCxJQUFJLEVBQUUsU0FBUztnQkFDZixXQUFXLEVBQUUsNkRBQTZEO2FBQzNFO1lBQ0QsVUFBVSxFQUFFO2dCQUNWLElBQUksRUFBRSxTQUFTO2dCQUNmLFdBQVcsRUFBRSx3RUFBd0U7YUFDdEY7U0FDRjtRQUNELFFBQVEsRUFBRSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUM7S0FDOUI7Q0FDRixDQUFDO0FBUUssS0FBSyxVQUFVLFVBQVUsQ0FDOUIsSUFBNkIsRUFDN0IsUUFBdUI7SUFFdkIsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFVBQVUsR0FBRyxJQUFJLEVBQUUsR0FBRyxJQUFpQyxDQUFDO0lBRTFGLE1BQU0sVUFBVSxHQUFHLElBQUEsK0JBQXFCLEVBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzVELElBQUksVUFBVTtRQUFFLE9BQU8sVUFBVSxDQUFDO0lBRWxDLElBQUksT0FBTyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3JCLE9BQU8sSUFBQSwyQkFBaUIsRUFDdEIscUlBQXFJLENBQ3RJLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUcsSUFBQSx5QkFBZSxFQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakUsSUFBSSxPQUFPLElBQUksVUFBVTtRQUFFLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQztJQUNuRCxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsVUFBVSxDQUFDO0lBRTVCLElBQUksQ0FBQztRQUNILGdDQUFnQztRQUNoQyxNQUFNLGFBQWEsR0FBRyxNQUFNLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUUsSUFBSSxhQUFhLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDaEMsTUFBTSxRQUFRLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFFRCxrQkFBa0I7UUFDbEIsTUFBTSxRQUFRLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQztZQUNuQyxJQUFJO1lBQ0osVUFBVTtZQUNWLFdBQVcsRUFBRSxJQUFJO1NBQ2xCLENBQUMsQ0FBQztRQUVILE1BQU0sTUFBTSxHQUFHO1lBQ2IsT0FBTyxFQUFFLElBQUk7WUFDYixPQUFPLEVBQUUsU0FBUyxJQUFJLENBQUMsSUFBSSx3QkFBd0I7WUFDbkQsVUFBVTtTQUNYLENBQUM7UUFFRixPQUFPO1lBQ0wsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNuRSxDQUFDO0lBQ0osQ0FBQztJQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7UUFDcEIsT0FBTztZQUNMLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsMEJBQTBCLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQzVFLE9BQU8sRUFBRSxJQUFJO1NBQ2QsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBkZWxldGVfc2l0ZSBUb29sXG4gKiBEZWxldGUgYSBXb3JkUHJlc3Mgc2l0ZSAocmVxdWlyZXMgY29uZmlybWF0aW9uKVxuICovXG5cbmltcG9ydCB7IE1jcFRvb2xEZWZpbml0aW9uLCBNY3BUb29sUmVzdWx0LCBMb2NhbFNlcnZpY2VzIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IHZhbGlkYXRlUmVxdWlyZWRQYXJhbSwgZmluZFNpdGVPckVycm9yLCBjcmVhdGVFcnJvclJlc3VsdCB9IGZyb20gJy4vaGVscGVycyc7XG5cbmV4cG9ydCBjb25zdCBkZWxldGVTaXRlRGVmaW5pdGlvbjogTWNwVG9vbERlZmluaXRpb24gPSB7XG4gIG5hbWU6ICdkZWxldGVfc2l0ZScsXG4gIGRlc2NyaXB0aW9uOiAnRGVsZXRlIGEgV29yZFByZXNzIHNpdGUuIFJlcXVpcmVzIGNvbmZpcm09dHJ1ZSB0byBwcmV2ZW50IGFjY2lkZW50YWwgZGVsZXRpb24uJyxcbiAgaW5wdXRTY2hlbWE6IHtcbiAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICBzaXRlOiB7XG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1NpdGUgbmFtZSBvciBJRCAocGFydGlhbCBuYW1lcyB3b3JrKScsXG4gICAgICB9LFxuICAgICAgY29uZmlybToge1xuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnTXVzdCBiZSB0cnVlIHRvIGNvbmZpcm0gZGVsZXRpb24uIFRoaXMgaXMgYSBzYWZldHkgbWVhc3VyZS4nLFxuICAgICAgfSxcbiAgICAgIHRyYXNoRmlsZXM6IHtcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ01vdmUgc2l0ZSBmaWxlcyB0byB0cmFzaCBpbnN0ZWFkIG9mIHBlcm1hbmVudCBkZWxldGlvbiAoZGVmYXVsdDogdHJ1ZSknLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHJlcXVpcmVkOiBbJ3NpdGUnLCAnY29uZmlybSddLFxuICB9LFxufTtcblxuaW50ZXJmYWNlIERlbGV0ZVNpdGVBcmdzIHtcbiAgc2l0ZTogc3RyaW5nO1xuICBjb25maXJtOiBib29sZWFuO1xuICB0cmFzaEZpbGVzPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVNpdGUoXG4gIGFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBzZXJ2aWNlczogTG9jYWxTZXJ2aWNlc1xuKTogUHJvbWlzZTxNY3BUb29sUmVzdWx0PiB7XG4gIGNvbnN0IHsgc2l0ZTogc2l0ZVF1ZXJ5LCBjb25maXJtLCB0cmFzaEZpbGVzID0gdHJ1ZSB9ID0gYXJncyBhcyB1bmtub3duIGFzIERlbGV0ZVNpdGVBcmdzO1xuXG4gIGNvbnN0IHBhcmFtRXJyb3IgPSB2YWxpZGF0ZVJlcXVpcmVkUGFyYW0oc2l0ZVF1ZXJ5LCAnc2l0ZScpO1xuICBpZiAocGFyYW1FcnJvcikgcmV0dXJuIHBhcmFtRXJyb3I7XG5cbiAgaWYgKGNvbmZpcm0gIT09IHRydWUpIHtcbiAgICByZXR1cm4gY3JlYXRlRXJyb3JSZXN1bHQoXG4gICAgICAnRXJyb3I6IERlbGV0aW9uIG5vdCBjb25maXJtZWQuIFlvdSBtdXN0IHNldCBjb25maXJtPXRydWUgdG8gZGVsZXRlIGEgc2l0ZS4gVGhpcyBpcyBhIHNhZmV0eSBtZWFzdXJlIHRvIHByZXZlbnQgYWNjaWRlbnRhbCBkZWxldGlvbi4nXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHNpdGVSZXN1bHQgPSBmaW5kU2l0ZU9yRXJyb3Ioc2l0ZVF1ZXJ5LCBzZXJ2aWNlcy5zaXRlRGF0YSk7XG4gIGlmICgnZXJyb3InIGluIHNpdGVSZXN1bHQpIHJldHVybiBzaXRlUmVzdWx0LmVycm9yO1xuICBjb25zdCB7IHNpdGUgfSA9IHNpdGVSZXN1bHQ7XG5cbiAgdHJ5IHtcbiAgICAvLyBTdG9wIHRoZSBzaXRlIGlmIGl0J3MgcnVubmluZ1xuICAgIGNvbnN0IGN1cnJlbnRTdGF0dXMgPSBhd2FpdCBzZXJ2aWNlcy5zaXRlUHJvY2Vzc01hbmFnZXIuZ2V0U2l0ZVN0YXR1cyhzaXRlKTtcbiAgICBpZiAoY3VycmVudFN0YXR1cyA9PT0gJ3J1bm5pbmcnKSB7XG4gICAgICBhd2FpdCBzZXJ2aWNlcy5zaXRlUHJvY2Vzc01hbmFnZXIuc3RvcChzaXRlKTtcbiAgICB9XG5cbiAgICAvLyBEZWxldGUgdGhlIHNpdGVcbiAgICBhd2FpdCBzZXJ2aWNlcy5kZWxldGVTaXRlLmRlbGV0ZVNpdGUoe1xuICAgICAgc2l0ZSxcbiAgICAgIHRyYXNoRmlsZXMsXG4gICAgICB1cGRhdGVIb3N0czogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBtZXNzYWdlOiBgU2l0ZSBcIiR7c2l0ZS5uYW1lfVwiIGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5YCxcbiAgICAgIHRyYXNoRmlsZXMsXG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbeyB0eXBlOiAndGV4dCcsIHRleHQ6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMikgfV0sXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbeyB0eXBlOiAndGV4dCcsIHRleHQ6IGBGYWlsZWQgdG8gZGVsZXRlIHNpdGU6ICR7ZXJyb3IubWVzc2FnZX1gIH1dLFxuICAgICAgaXNFcnJvcjogdHJ1ZSxcbiAgICB9O1xuICB9XG59XG4iXX0=
@@ -0,0 +1,7 @@
1
+ /**
2
+ * export_database Tool
3
+ * Export site database to SQL file using WP-CLI
4
+ */
5
+ import { McpToolDefinition, McpToolResult, LocalServices } from '../../../common/types';
6
+ export declare const exportDatabaseDefinition: McpToolDefinition;
7
+ export declare function exportDatabase(args: Record<string, unknown>, services: LocalServices): Promise<McpToolResult>;
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ /**
3
+ * export_database Tool
4
+ * Export site database to SQL file using WP-CLI
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.exportDatabaseDefinition = void 0;
8
+ exports.exportDatabase = exportDatabase;
9
+ const helpers_1 = require("./helpers");
10
+ exports.exportDatabaseDefinition = {
11
+ name: 'export_database',
12
+ description: 'Export a site database to a SQL file',
13
+ inputSchema: {
14
+ type: 'object',
15
+ properties: {
16
+ site: {
17
+ type: 'string',
18
+ description: 'Site name or ID',
19
+ },
20
+ outputPath: {
21
+ type: 'string',
22
+ description: 'Output file path (optional, defaults to ~/Downloads/<site-name>.sql)',
23
+ },
24
+ },
25
+ required: ['site'],
26
+ },
27
+ };
28
+ async function exportDatabase(args, services) {
29
+ const { site: siteQuery, outputPath } = args;
30
+ // Validate required parameter
31
+ const siteError = (0, helpers_1.validateRequiredParam)(siteQuery, 'site');
32
+ if (siteError)
33
+ return siteError;
34
+ // Find site or return error
35
+ const siteResult = (0, helpers_1.findSiteOrError)(siteQuery, services.siteData);
36
+ if ('error' in siteResult)
37
+ return siteResult.error;
38
+ const { site } = siteResult;
39
+ try {
40
+ // Determine output path
41
+ const homeDir = process.env.HOME || process.env.USERPROFILE || '';
42
+ const defaultPath = `${homeDir}/Downloads/${site.name.replace(/[^a-zA-Z0-9-_]/g, '-')}.sql`;
43
+ const finalPath = outputPath || defaultPath;
44
+ // Security: Validate output path is safe (no path traversal attacks)
45
+ if (!(0, helpers_1.isValidFilePath)(finalPath)) {
46
+ return (0, helpers_1.createErrorResult)('Error: Invalid output path. Path must be within allowed directories (home, tmp).');
47
+ }
48
+ // Run WP-CLI db export
49
+ const result = await services.wpCli.run(site, ['db', 'export', finalPath]);
50
+ if (result === null) {
51
+ return {
52
+ content: [{ type: 'text', text: `Failed to export database for "${site.name}"` }],
53
+ isError: true,
54
+ };
55
+ }
56
+ return {
57
+ content: [
58
+ {
59
+ type: 'text',
60
+ text: `Successfully exported database for "${site.name}" to: ${finalPath}`,
61
+ },
62
+ ],
63
+ };
64
+ }
65
+ catch (error) {
66
+ return {
67
+ content: [{ type: 'text', text: `Failed to export database: ${error.message}` }],
68
+ isError: true,
69
+ };
70
+ }
71
+ }
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0RGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbWFpbi9tY3AvdG9vbHMvZXhwb3J0RGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7R0FHRzs7O0FBNkJILHdDQW9EQztBQTlFRCx1Q0FBdUc7QUFFMUYsUUFBQSx3QkFBd0IsR0FBc0I7SUFDekQsSUFBSSxFQUFFLGlCQUFpQjtJQUN2QixXQUFXLEVBQUUsc0NBQXNDO0lBQ25ELFdBQVcsRUFBRTtRQUNYLElBQUksRUFBRSxRQUFRO1FBQ2QsVUFBVSxFQUFFO1lBQ1YsSUFBSSxFQUFFO2dCQUNKLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSxpQkFBaUI7YUFDL0I7WUFDRCxVQUFVLEVBQUU7Z0JBQ1YsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsV0FBVyxFQUFFLHNFQUFzRTthQUNwRjtTQUNGO1FBQ0QsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDO0tBQ25CO0NBQ0YsQ0FBQztBQU9LLEtBQUssVUFBVSxjQUFjLENBQ2xDLElBQTZCLEVBQzdCLFFBQXVCO0lBRXZCLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxHQUFHLElBQXFDLENBQUM7SUFFOUUsOEJBQThCO0lBQzlCLE1BQU0sU0FBUyxHQUFHLElBQUEsK0JBQXFCLEVBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzNELElBQUksU0FBUztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBRWhDLDRCQUE0QjtJQUM1QixNQUFNLFVBQVUsR0FBRyxJQUFBLHlCQUFlLEVBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNqRSxJQUFJLE9BQU8sSUFBSSxVQUFVO1FBQUUsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDO0lBQ25ELE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxVQUFVLENBQUM7SUFFNUIsSUFBSSxDQUFDO1FBQ0gsd0JBQXdCO1FBQ3hCLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQztRQUNsRSxNQUFNLFdBQVcsR0FBRyxHQUFHLE9BQU8sY0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDO1FBQzVGLE1BQU0sU0FBUyxHQUFHLFVBQVUsSUFBSSxXQUFXLENBQUM7UUFFNUMscUVBQXFFO1FBQ3JFLElBQUksQ0FBQyxJQUFBLHlCQUFlLEVBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUNoQyxPQUFPLElBQUEsMkJBQWlCLEVBQ3RCLGtGQUFrRixDQUNuRixDQUFDO1FBQ0osQ0FBQztRQUVELHVCQUF1QjtRQUN2QixNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUUzRSxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNwQixPQUFPO2dCQUNMLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsa0NBQWtDLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNqRixPQUFPLEVBQUUsSUFBSTthQUNkLENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTztZQUNMLE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixJQUFJLEVBQUUsdUNBQXVDLElBQUksQ0FBQyxJQUFJLFNBQVMsU0FBUyxFQUFFO2lCQUMzRTthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFBQyxPQUFPLEtBQVUsRUFBRSxDQUFDO1FBQ3BCLE9BQU87WUFDTCxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLDhCQUE4QixLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUNoRixPQUFPLEVBQUUsSUFBSTtTQUNkLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogZXhwb3J0X2RhdGFiYXNlIFRvb2xcbiAqIEV4cG9ydCBzaXRlIGRhdGFiYXNlIHRvIFNRTCBmaWxlIHVzaW5nIFdQLUNMSVxuICovXG5cbmltcG9ydCB7IE1jcFRvb2xEZWZpbml0aW9uLCBNY3BUb29sUmVzdWx0LCBMb2NhbFNlcnZpY2VzIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IHZhbGlkYXRlUmVxdWlyZWRQYXJhbSwgZmluZFNpdGVPckVycm9yLCBpc1ZhbGlkRmlsZVBhdGgsIGNyZWF0ZUVycm9yUmVzdWx0IH0gZnJvbSAnLi9oZWxwZXJzJztcblxuZXhwb3J0IGNvbnN0IGV4cG9ydERhdGFiYXNlRGVmaW5pdGlvbjogTWNwVG9vbERlZmluaXRpb24gPSB7XG4gIG5hbWU6ICdleHBvcnRfZGF0YWJhc2UnLFxuICBkZXNjcmlwdGlvbjogJ0V4cG9ydCBhIHNpdGUgZGF0YWJhc2UgdG8gYSBTUUwgZmlsZScsXG4gIGlucHV0U2NoZW1hOiB7XG4gICAgdHlwZTogJ29iamVjdCcsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgc2l0ZToge1xuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdTaXRlIG5hbWUgb3IgSUQnLFxuICAgICAgfSxcbiAgICAgIG91dHB1dFBhdGg6IHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IGZpbGUgcGF0aCAob3B0aW9uYWwsIGRlZmF1bHRzIHRvIH4vRG93bmxvYWRzLzxzaXRlLW5hbWU+LnNxbCknLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHJlcXVpcmVkOiBbJ3NpdGUnXSxcbiAgfSxcbn07XG5cbmludGVyZmFjZSBFeHBvcnREYXRhYmFzZUFyZ3Mge1xuICBzaXRlOiBzdHJpbmc7XG4gIG91dHB1dFBhdGg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHBvcnREYXRhYmFzZShcbiAgYXJnczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHNlcnZpY2VzOiBMb2NhbFNlcnZpY2VzXG4pOiBQcm9taXNlPE1jcFRvb2xSZXN1bHQ+IHtcbiAgY29uc3QgeyBzaXRlOiBzaXRlUXVlcnksIG91dHB1dFBhdGggfSA9IGFyZ3MgYXMgdW5rbm93biBhcyBFeHBvcnREYXRhYmFzZUFyZ3M7XG5cbiAgLy8gVmFsaWRhdGUgcmVxdWlyZWQgcGFyYW1ldGVyXG4gIGNvbnN0IHNpdGVFcnJvciA9IHZhbGlkYXRlUmVxdWlyZWRQYXJhbShzaXRlUXVlcnksICdzaXRlJyk7XG4gIGlmIChzaXRlRXJyb3IpIHJldHVybiBzaXRlRXJyb3I7XG5cbiAgLy8gRmluZCBzaXRlIG9yIHJldHVybiBlcnJvclxuICBjb25zdCBzaXRlUmVzdWx0ID0gZmluZFNpdGVPckVycm9yKHNpdGVRdWVyeSwgc2VydmljZXMuc2l0ZURhdGEpO1xuICBpZiAoJ2Vycm9yJyBpbiBzaXRlUmVzdWx0KSByZXR1cm4gc2l0ZVJlc3VsdC5lcnJvcjtcbiAgY29uc3QgeyBzaXRlIH0gPSBzaXRlUmVzdWx0O1xuXG4gIHRyeSB7XG4gICAgLy8gRGV0ZXJtaW5lIG91dHB1dCBwYXRoXG4gICAgY29uc3QgaG9tZURpciA9IHByb2Nlc3MuZW52LkhPTUUgfHwgcHJvY2Vzcy5lbnYuVVNFUlBST0ZJTEUgfHwgJyc7XG4gICAgY29uc3QgZGVmYXVsdFBhdGggPSBgJHtob21lRGlyfS9Eb3dubG9hZHMvJHtzaXRlLm5hbWUucmVwbGFjZSgvW15hLXpBLVowLTktX10vZywgJy0nKX0uc3FsYDtcbiAgICBjb25zdCBmaW5hbFBhdGggPSBvdXRwdXRQYXRoIHx8IGRlZmF1bHRQYXRoO1xuXG4gICAgLy8gU2VjdXJpdHk6IFZhbGlkYXRlIG91dHB1dCBwYXRoIGlzIHNhZmUgKG5vIHBhdGggdHJhdmVyc2FsIGF0dGFja3MpXG4gICAgaWYgKCFpc1ZhbGlkRmlsZVBhdGgoZmluYWxQYXRoKSkge1xuICAgICAgcmV0dXJuIGNyZWF0ZUVycm9yUmVzdWx0KFxuICAgICAgICAnRXJyb3I6IEludmFsaWQgb3V0cHV0IHBhdGguIFBhdGggbXVzdCBiZSB3aXRoaW4gYWxsb3dlZCBkaXJlY3RvcmllcyAoaG9tZSwgdG1wKS4nXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFJ1biBXUC1DTEkgZGIgZXhwb3J0XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2VydmljZXMud3BDbGkucnVuKHNpdGUsIFsnZGInLCAnZXhwb3J0JywgZmluYWxQYXRoXSk7XG5cbiAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbeyB0eXBlOiAndGV4dCcsIHRleHQ6IGBGYWlsZWQgdG8gZXhwb3J0IGRhdGFiYXNlIGZvciBcIiR7c2l0ZS5uYW1lfVwiYCB9XSxcbiAgICAgICAgaXNFcnJvcjogdHJ1ZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICB0ZXh0OiBgU3VjY2Vzc2Z1bGx5IGV4cG9ydGVkIGRhdGFiYXNlIGZvciBcIiR7c2l0ZS5uYW1lfVwiIHRvOiAke2ZpbmFsUGF0aH1gLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6ICd0ZXh0JywgdGV4dDogYEZhaWxlZCB0byBleHBvcnQgZGF0YWJhc2U6ICR7ZXJyb3IubWVzc2FnZX1gIH1dLFxuICAgICAgaXNFcnJvcjogdHJ1ZSxcbiAgICB9O1xuICB9XG59XG4iXX0=
@@ -0,0 +1,7 @@
1
+ /**
2
+ * export_site Tool
3
+ * Export a WordPress site to a zip file
4
+ */
5
+ import { McpToolDefinition, McpToolResult, LocalServices } from '../../../common/types';
6
+ export declare const exportSiteDefinition: McpToolDefinition;
7
+ export declare function exportSite(args: Record<string, unknown>, services: LocalServices): Promise<McpToolResult>;
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ /**
3
+ * export_site Tool
4
+ * Export a WordPress site to a zip file
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.exportSiteDefinition = void 0;
41
+ exports.exportSite = exportSite;
42
+ const helpers_1 = require("./helpers");
43
+ const os = __importStar(require("os"));
44
+ const path = __importStar(require("path"));
45
+ exports.exportSiteDefinition = {
46
+ name: 'export_site',
47
+ description: 'Export a WordPress site to a zip file',
48
+ inputSchema: {
49
+ type: 'object',
50
+ properties: {
51
+ site: {
52
+ type: 'string',
53
+ description: 'Site name or ID to export',
54
+ },
55
+ output_path: {
56
+ type: 'string',
57
+ description: 'Output directory path (default: ~/Downloads)',
58
+ },
59
+ },
60
+ required: ['site'],
61
+ },
62
+ };
63
+ async function exportSite(args, services) {
64
+ const { site: siteQuery, output_path } = args;
65
+ const paramError = (0, helpers_1.validateRequiredParam)(siteQuery, 'site');
66
+ if (paramError)
67
+ return paramError;
68
+ const siteResult = (0, helpers_1.findSiteOrError)(siteQuery, services.siteData);
69
+ if ('error' in siteResult)
70
+ return siteResult.error;
71
+ const { site } = siteResult;
72
+ try {
73
+ // Check if exportSite service exists
74
+ if (!services.exportSite) {
75
+ return {
76
+ content: [{ type: 'text', text: 'Export site service not available' }],
77
+ isError: true,
78
+ };
79
+ }
80
+ // Default output path to Downloads folder
81
+ const outputDir = output_path || path.join(os.homedir(), 'Downloads');
82
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
83
+ const filename = `${site.name}-${timestamp}.zip`;
84
+ const outputPath = path.join(outputDir, filename);
85
+ // Export the site
86
+ await services.exportSite(site, outputPath);
87
+ return {
88
+ content: [
89
+ {
90
+ type: 'text',
91
+ text: `Successfully exported "${site.name}" to ${outputPath}`,
92
+ },
93
+ ],
94
+ };
95
+ }
96
+ catch (error) {
97
+ return {
98
+ content: [{ type: 'text', text: `Failed to export site: ${error.message}` }],
99
+ isError: true,
100
+ };
101
+ }
102
+ }
103
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0U2l0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9tYWluL21jcC90b29scy9leHBvcnRTaXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQStCSCxnQ0E2Q0M7QUF6RUQsdUNBQW1FO0FBQ25FLHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFFaEIsUUFBQSxvQkFBb0IsR0FBc0I7SUFDckQsSUFBSSxFQUFFLGFBQWE7SUFDbkIsV0FBVyxFQUFFLHVDQUF1QztJQUNwRCxXQUFXLEVBQUU7UUFDWCxJQUFJLEVBQUUsUUFBUTtRQUNkLFVBQVUsRUFBRTtZQUNWLElBQUksRUFBRTtnQkFDSixJQUFJLEVBQUUsUUFBUTtnQkFDZCxXQUFXLEVBQUUsMkJBQTJCO2FBQ3pDO1lBQ0QsV0FBVyxFQUFFO2dCQUNYLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSw4Q0FBOEM7YUFDNUQ7U0FDRjtRQUNELFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQztLQUNuQjtDQUNGLENBQUM7QUFPSyxLQUFLLFVBQVUsVUFBVSxDQUM5QixJQUE2QixFQUM3QixRQUF1QjtJQUV2QixNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFpQyxDQUFDO0lBRTNFLE1BQU0sVUFBVSxHQUFHLElBQUEsK0JBQXFCLEVBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzVELElBQUksVUFBVTtRQUFFLE9BQU8sVUFBVSxDQUFDO0lBRWxDLE1BQU0sVUFBVSxHQUFHLElBQUEseUJBQWUsRUFBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pFLElBQUksT0FBTyxJQUFJLFVBQVU7UUFBRSxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUM7SUFDbkQsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLFVBQVUsQ0FBQztJQUU1QixJQUFJLENBQUM7UUFDSCxxQ0FBcUM7UUFDckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN6QixPQUFPO2dCQUNMLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsbUNBQW1DLEVBQUUsQ0FBQztnQkFDdEUsT0FBTyxFQUFFLElBQUk7YUFDZCxDQUFDO1FBQ0osQ0FBQztRQUVELDBDQUEwQztRQUMxQyxNQUFNLFNBQVMsR0FBRyxXQUFXLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDdEUsTUFBTSxTQUFTLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDOUUsTUFBTSxRQUFRLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLFNBQVMsTUFBTSxDQUFDO1FBQ2pELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRWxELGtCQUFrQjtRQUNsQixNQUFNLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRTVDLE9BQU87WUFDTCxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLDBCQUEwQixJQUFJLENBQUMsSUFBSSxRQUFRLFVBQVUsRUFBRTtpQkFDOUQ7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBQUMsT0FBTyxLQUFVLEVBQUUsQ0FBQztRQUNwQixPQUFPO1lBQ0wsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSwwQkFBMEIsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDNUUsT0FBTyxFQUFFLElBQUk7U0FDZCxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGV4cG9ydF9zaXRlIFRvb2xcbiAqIEV4cG9ydCBhIFdvcmRQcmVzcyBzaXRlIHRvIGEgemlwIGZpbGVcbiAqL1xuXG5pbXBvcnQgeyBNY3BUb29sRGVmaW5pdGlvbiwgTWNwVG9vbFJlc3VsdCwgTG9jYWxTZXJ2aWNlcyB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZVJlcXVpcmVkUGFyYW0sIGZpbmRTaXRlT3JFcnJvciB9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5leHBvcnQgY29uc3QgZXhwb3J0U2l0ZURlZmluaXRpb246IE1jcFRvb2xEZWZpbml0aW9uID0ge1xuICBuYW1lOiAnZXhwb3J0X3NpdGUnLFxuICBkZXNjcmlwdGlvbjogJ0V4cG9ydCBhIFdvcmRQcmVzcyBzaXRlIHRvIGEgemlwIGZpbGUnLFxuICBpbnB1dFNjaGVtYToge1xuICAgIHR5cGU6ICdvYmplY3QnLFxuICAgIHByb3BlcnRpZXM6IHtcbiAgICAgIHNpdGU6IHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnU2l0ZSBuYW1lIG9yIElEIHRvIGV4cG9ydCcsXG4gICAgICB9LFxuICAgICAgb3V0cHV0X3BhdGg6IHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IGRpcmVjdG9yeSBwYXRoIChkZWZhdWx0OiB+L0Rvd25sb2FkcyknLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHJlcXVpcmVkOiBbJ3NpdGUnXSxcbiAgfSxcbn07XG5cbmludGVyZmFjZSBFeHBvcnRTaXRlQXJncyB7XG4gIHNpdGU6IHN0cmluZztcbiAgb3V0cHV0X3BhdGg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHBvcnRTaXRlKFxuICBhcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgc2VydmljZXM6IExvY2FsU2VydmljZXNcbik6IFByb21pc2U8TWNwVG9vbFJlc3VsdD4ge1xuICBjb25zdCB7IHNpdGU6IHNpdGVRdWVyeSwgb3V0cHV0X3BhdGggfSA9IGFyZ3MgYXMgdW5rbm93biBhcyBFeHBvcnRTaXRlQXJncztcblxuICBjb25zdCBwYXJhbUVycm9yID0gdmFsaWRhdGVSZXF1aXJlZFBhcmFtKHNpdGVRdWVyeSwgJ3NpdGUnKTtcbiAgaWYgKHBhcmFtRXJyb3IpIHJldHVybiBwYXJhbUVycm9yO1xuXG4gIGNvbnN0IHNpdGVSZXN1bHQgPSBmaW5kU2l0ZU9yRXJyb3Ioc2l0ZVF1ZXJ5LCBzZXJ2aWNlcy5zaXRlRGF0YSk7XG4gIGlmICgnZXJyb3InIGluIHNpdGVSZXN1bHQpIHJldHVybiBzaXRlUmVzdWx0LmVycm9yO1xuICBjb25zdCB7IHNpdGUgfSA9IHNpdGVSZXN1bHQ7XG5cbiAgdHJ5IHtcbiAgICAvLyBDaGVjayBpZiBleHBvcnRTaXRlIHNlcnZpY2UgZXhpc3RzXG4gICAgaWYgKCFzZXJ2aWNlcy5leHBvcnRTaXRlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbeyB0eXBlOiAndGV4dCcsIHRleHQ6ICdFeHBvcnQgc2l0ZSBzZXJ2aWNlIG5vdCBhdmFpbGFibGUnIH1dLFxuICAgICAgICBpc0Vycm9yOiB0cnVlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IG91dHB1dCBwYXRoIHRvIERvd25sb2FkcyBmb2xkZXJcbiAgICBjb25zdCBvdXRwdXREaXIgPSBvdXRwdXRfcGF0aCB8fCBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnRG93bmxvYWRzJyk7XG4gICAgY29uc3QgdGltZXN0YW1wID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnJlcGxhY2UoL1s6Ll0vZywgJy0nKS5zbGljZSgwLCAxOSk7XG4gICAgY29uc3QgZmlsZW5hbWUgPSBgJHtzaXRlLm5hbWV9LSR7dGltZXN0YW1wfS56aXBgO1xuICAgIGNvbnN0IG91dHB1dFBhdGggPSBwYXRoLmpvaW4ob3V0cHV0RGlyLCBmaWxlbmFtZSk7XG5cbiAgICAvLyBFeHBvcnQgdGhlIHNpdGVcbiAgICBhd2FpdCBzZXJ2aWNlcy5leHBvcnRTaXRlKHNpdGUsIG91dHB1dFBhdGgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICB0ZXh0OiBgU3VjY2Vzc2Z1bGx5IGV4cG9ydGVkIFwiJHtzaXRlLm5hbWV9XCIgdG8gJHtvdXRwdXRQYXRofWAsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW3sgdHlwZTogJ3RleHQnLCB0ZXh0OiBgRmFpbGVkIHRvIGV4cG9ydCBzaXRlOiAke2Vycm9yLm1lc3NhZ2V9YCB9XSxcbiAgICAgIGlzRXJyb3I6IHRydWUsXG4gICAgfTtcbiAgfVxufVxuIl19