localwp-mcp 0.1.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 (102) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +229 -0
  3. package/dist/backup.d.ts +72 -0
  4. package/dist/backup.js +351 -0
  5. package/dist/backup.js.map +1 -0
  6. package/dist/config.d.ts +24 -0
  7. package/dist/config.js +58 -0
  8. package/dist/config.js.map +1 -0
  9. package/dist/environment-check.d.ts +187 -0
  10. package/dist/environment-check.js +174 -0
  11. package/dist/environment-check.js.map +1 -0
  12. package/dist/index.d.ts +2 -0
  13. package/dist/index.js +14 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/local-doctor.d.ts +42 -0
  16. package/dist/local-doctor.js +224 -0
  17. package/dist/local-doctor.js.map +1 -0
  18. package/dist/local-sites.d.ts +103 -0
  19. package/dist/local-sites.js +234 -0
  20. package/dist/local-sites.js.map +1 -0
  21. package/dist/local-tooling.d.ts +2 -0
  22. package/dist/local-tooling.js +23 -0
  23. package/dist/local-tooling.js.map +1 -0
  24. package/dist/logs.d.ts +144 -0
  25. package/dist/logs.js +208 -0
  26. package/dist/logs.js.map +1 -0
  27. package/dist/mysql.d.ts +17 -0
  28. package/dist/mysql.js +229 -0
  29. package/dist/mysql.js.map +1 -0
  30. package/dist/permissions.d.ts +4 -0
  31. package/dist/permissions.js +129 -0
  32. package/dist/permissions.js.map +1 -0
  33. package/dist/platform-paths.d.ts +10 -0
  34. package/dist/platform-paths.js +95 -0
  35. package/dist/platform-paths.js.map +1 -0
  36. package/dist/process-utils.d.ts +13 -0
  37. package/dist/process-utils.js +128 -0
  38. package/dist/process-utils.js.map +1 -0
  39. package/dist/prompts.d.ts +2 -0
  40. package/dist/prompts.js +64 -0
  41. package/dist/prompts.js.map +1 -0
  42. package/dist/resources.d.ts +2 -0
  43. package/dist/resources.js +110 -0
  44. package/dist/resources.js.map +1 -0
  45. package/dist/results.d.ts +15 -0
  46. package/dist/results.js +26 -0
  47. package/dist/results.js.map +1 -0
  48. package/dist/server.d.ts +2 -0
  49. package/dist/server.js +23 -0
  50. package/dist/server.js.map +1 -0
  51. package/dist/tool-schemas.d.ts +14 -0
  52. package/dist/tool-schemas.js +20 -0
  53. package/dist/tool-schemas.js.map +1 -0
  54. package/dist/tools/backup-site.d.ts +2 -0
  55. package/dist/tools/backup-site.js +42 -0
  56. package/dist/tools/backup-site.js.map +1 -0
  57. package/dist/tools/db-export.d.ts +2 -0
  58. package/dist/tools/db-export.js +40 -0
  59. package/dist/tools/db-export.js.map +1 -0
  60. package/dist/tools/db-import.d.ts +2 -0
  61. package/dist/tools/db-import.js +42 -0
  62. package/dist/tools/db-import.js.map +1 -0
  63. package/dist/tools/execute-wp-cli.d.ts +2 -0
  64. package/dist/tools/execute-wp-cli.js +34 -0
  65. package/dist/tools/execute-wp-cli.js.map +1 -0
  66. package/dist/tools/index.d.ts +2 -0
  67. package/dist/tools/index.js +29 -0
  68. package/dist/tools/index.js.map +1 -0
  69. package/dist/tools/list-local-sites.d.ts +2 -0
  70. package/dist/tools/list-local-sites.js +32 -0
  71. package/dist/tools/list-local-sites.js.map +1 -0
  72. package/dist/tools/local-doctor.d.ts +2 -0
  73. package/dist/tools/local-doctor.js +23 -0
  74. package/dist/tools/local-doctor.js.map +1 -0
  75. package/dist/tools/local-environment-check.d.ts +2 -0
  76. package/dist/tools/local-environment-check.js +32 -0
  77. package/dist/tools/local-environment-check.js.map +1 -0
  78. package/dist/tools/local-logs.d.ts +2 -0
  79. package/dist/tools/local-logs.js +31 -0
  80. package/dist/tools/local-logs.js.map +1 -0
  81. package/dist/tools/local-site-info.d.ts +2 -0
  82. package/dist/tools/local-site-info.js +46 -0
  83. package/dist/tools/local-site-info.js.map +1 -0
  84. package/dist/tools/mysql-execute.d.ts +2 -0
  85. package/dist/tools/mysql-execute.js +46 -0
  86. package/dist/tools/mysql-execute.js.map +1 -0
  87. package/dist/tools/mysql-query.d.ts +2 -0
  88. package/dist/tools/mysql-query.js +43 -0
  89. package/dist/tools/mysql-query.js.map +1 -0
  90. package/dist/tools/mysql-schema.d.ts +2 -0
  91. package/dist/tools/mysql-schema.js +50 -0
  92. package/dist/tools/mysql-schema.js.map +1 -0
  93. package/dist/tools/restore-backup.d.ts +2 -0
  94. package/dist/tools/restore-backup.js +52 -0
  95. package/dist/tools/restore-backup.js.map +1 -0
  96. package/dist/types.d.ts +84 -0
  97. package/dist/types.js +2 -0
  98. package/dist/types.js.map +1 -0
  99. package/dist/wp-cli.d.ts +14 -0
  100. package/dist/wp-cli.js +140 -0
  101. package/dist/wp-cli.js.map +1 -0
  102. package/package.json +61 -0
@@ -0,0 +1,224 @@
1
+ import { config } from "./config.js";
2
+ import { runEnvironmentCheck } from "./environment-check.js";
3
+ import { summarizeLogAvailability } from "./logs.js";
4
+ export async function runLocalDoctor(selection) {
5
+ const diagnostics = await runEnvironmentCheck(selection, {
6
+ probeWpCli: true,
7
+ probeMysql: true,
8
+ });
9
+ const logAvailability = await summarizeLogAvailability(selection);
10
+ const checks = [];
11
+ const siteCatalogCount = Number(diagnostics.sites.ok && "count" in diagnostics.sites
12
+ ? diagnostics.sites.count
13
+ : 0);
14
+ const siteContext = diagnostics.siteContext.ok && "site" in diagnostics.siteContext
15
+ ? diagnostics.siteContext
16
+ : null;
17
+ checks.push({
18
+ id: "local_metadata",
19
+ status: diagnostics.corePaths.localAppSupportDir.readable &&
20
+ diagnostics.corePaths.localSitesJson.readable &&
21
+ diagnostics.corePaths.localSiteStatusesJson.readable
22
+ ? "ok"
23
+ : "error",
24
+ title: "Local metadata",
25
+ message: diagnostics.corePaths.localAppSupportDir.readable &&
26
+ diagnostics.corePaths.localSitesJson.readable &&
27
+ diagnostics.corePaths.localSiteStatusesJson.readable
28
+ ? "Local metadata files are readable."
29
+ : "Local metadata files are missing or unreadable. Check LOCAL_APP_SUPPORT_DIR or open Local once on this machine.",
30
+ });
31
+ checks.push({
32
+ id: "local_tooling",
33
+ status: diagnostics.tooling.ok ? "ok" : "error",
34
+ title: "Local tooling",
35
+ message: diagnostics.tooling.ok
36
+ ? "Local's WP-CLI and helper binaries were resolved."
37
+ : "Local tooling could not be resolved. Check the Local install path or LOCAL_EXTRA_RESOURCES_DIRS.",
38
+ });
39
+ checks.push({
40
+ id: "site_catalog",
41
+ status: diagnostics.sites.ok && siteCatalogCount > 0 ? "ok" : "error",
42
+ title: "Site catalog",
43
+ message: diagnostics.sites.ok && siteCatalogCount > 0
44
+ ? `Found ${siteCatalogCount} Local site(s).`
45
+ : "No Local sites were found. Create, import, or start a Local site first.",
46
+ });
47
+ if (!siteContext) {
48
+ checks.push({
49
+ id: "site_resolution",
50
+ status: "error",
51
+ title: "Site resolution",
52
+ message: "error" in diagnostics.siteContext
53
+ ? diagnostics.siteContext.error
54
+ : "The Local site could not be resolved.",
55
+ });
56
+ }
57
+ else {
58
+ const site = siteContext.site;
59
+ checks.push({
60
+ id: "site_status",
61
+ status: site.status === "running" ? "ok" : "warning",
62
+ title: "Site status",
63
+ message: site.status === "running"
64
+ ? `The selected site '${site.name}' is running.`
65
+ : `The selected site '${site.name}' is '${site.status}'. Start it in Local before using WP-CLI, MySQL, or backup tools.`,
66
+ });
67
+ checks.push({
68
+ id: "wp_root",
69
+ status: siteContext.wpRoot.readable ? "ok" : "error",
70
+ title: "WordPress root",
71
+ message: siteContext.wpRoot.readable
72
+ ? "The WordPress root is readable."
73
+ : "The WordPress root is not readable.",
74
+ });
75
+ checks.push({
76
+ id: "php_runtime",
77
+ status: siteContext.phpBinary.readable &&
78
+ siteContext.phpBinary.executable
79
+ ? "ok"
80
+ : "error",
81
+ title: "PHP runtime",
82
+ message: siteContext.phpBinary.readable &&
83
+ siteContext.phpBinary.executable
84
+ ? "The Local PHP runtime is available."
85
+ : "The Local PHP runtime is missing or not executable.",
86
+ });
87
+ checks.push({
88
+ id: "mysql_runtime",
89
+ status: siteContext.mysqlBinary.readable &&
90
+ siteContext.mysqlBinary.executable
91
+ ? "ok"
92
+ : "error",
93
+ title: "MySQL runtime",
94
+ message: siteContext.mysqlBinary.readable &&
95
+ siteContext.mysqlBinary.executable
96
+ ? "The Local MySQL runtime is available."
97
+ : "The Local MySQL runtime is missing or not executable.",
98
+ });
99
+ const mysqlConnectionOk = siteContext.mysqlConnection.mode === "socket"
100
+ ? Boolean(siteContext.mysqlConnection.socket?.readable)
101
+ : Boolean(siteContext.mysqlConnection.port);
102
+ checks.push({
103
+ id: "mysql_connection",
104
+ status: mysqlConnectionOk ? "ok" : "warning",
105
+ title: "MySQL connection",
106
+ message: mysqlConnectionOk
107
+ ? "MySQL connection details were resolved."
108
+ : "MySQL connection details are incomplete. Start the site in Local and check the runtime configuration.",
109
+ });
110
+ if (siteContext.wpCliProbe) {
111
+ checks.push({
112
+ id: "wp_cli_probe",
113
+ status: siteContext.wpCliProbe.ok ? "ok" : "error",
114
+ title: "WP-CLI probe",
115
+ message: siteContext.wpCliProbe.ok
116
+ ? "WP-CLI responded successfully."
117
+ : `WP-CLI probe failed: ${siteContext.wpCliProbe.error}`,
118
+ });
119
+ }
120
+ if (siteContext.mysqlProbe) {
121
+ checks.push({
122
+ id: "mysql_probe",
123
+ status: siteContext.mysqlProbe.ok ? "ok" : "error",
124
+ title: "MySQL probe",
125
+ message: siteContext.mysqlProbe.ok
126
+ ? "MySQL responded successfully."
127
+ : `MySQL probe failed: ${siteContext.mysqlProbe.error}`,
128
+ });
129
+ }
130
+ }
131
+ const readableSiteLogs = logAvailability.siteLogs.filter((log) => log.readable);
132
+ const readableGlobalLogs = logAvailability.globalLogs.filter((log) => log.readable);
133
+ checks.push({
134
+ id: "site_logs",
135
+ status: logAvailability.site && readableSiteLogs.length > 0 ? "ok" : "warning",
136
+ title: "Site logs",
137
+ message: logAvailability.site && readableSiteLogs.length > 0
138
+ ? `Found ${readableSiteLogs.length} readable site log file(s).`
139
+ : "No readable site logs were found for the selected site yet.",
140
+ });
141
+ checks.push({
142
+ id: "global_logs",
143
+ status: readableGlobalLogs.length > 0 ? "ok" : "warning",
144
+ title: "Local app logs",
145
+ message: readableGlobalLogs.length > 0
146
+ ? `Found ${readableGlobalLogs.length} readable Local app log file(s).`
147
+ : "No readable Local app logs were found.",
148
+ });
149
+ const overallStatus = summarizeDoctorStatus(checks);
150
+ return {
151
+ overallStatus,
152
+ summary: buildDoctorSummary(overallStatus),
153
+ accessProfile: config.profile,
154
+ requestedSiteId: selection.siteId || null,
155
+ requestedSiteName: selection.siteName || null,
156
+ site: siteContext ? siteContext.site : null,
157
+ checks,
158
+ nextSteps: buildNextSteps(checks),
159
+ logSummary: {
160
+ siteLogs: readableSiteLogs.map((log) => ({
161
+ label: log.label,
162
+ path: log.path,
163
+ })),
164
+ globalLogs: readableGlobalLogs.map((log) => ({
165
+ label: log.label,
166
+ path: log.path,
167
+ })),
168
+ },
169
+ };
170
+ }
171
+ export function summarizeDoctorStatus(checks) {
172
+ if (checks.some((check) => check.status === "error")) {
173
+ return "error";
174
+ }
175
+ if (checks.some((check) => check.status === "warning")) {
176
+ return "warning";
177
+ }
178
+ return "ok";
179
+ }
180
+ function buildDoctorSummary(status) {
181
+ if (status === "ok") {
182
+ return "LocalWP MCP looks healthy for this machine and site.";
183
+ }
184
+ if (status === "warning") {
185
+ return "LocalWP MCP is mostly working, but a few things need attention.";
186
+ }
187
+ return "LocalWP MCP found blocking problems that should be fixed before relying on the site tools.";
188
+ }
189
+ function buildNextSteps(checks) {
190
+ const steps = new Set();
191
+ for (const check of checks) {
192
+ if (check.status === "ok") {
193
+ continue;
194
+ }
195
+ switch (check.id) {
196
+ case "local_metadata":
197
+ steps.add("Open Local once and confirm the Local metadata directory is readable, or set LOCAL_APP_SUPPORT_DIR explicitly in the MCP config.");
198
+ break;
199
+ case "local_tooling":
200
+ steps.add("Confirm Local is installed correctly and, if needed, set LOCAL_EXTRA_RESOURCES_DIRS or LOCAL_WP_CLI_PHAR in the MCP config.");
201
+ break;
202
+ case "site_catalog":
203
+ case "site_resolution":
204
+ steps.add("Pass siteName or siteId in the tool call, or set LOCAL_SITE_NAME / LOCAL_SITE_ID in the MCP config.");
205
+ break;
206
+ case "site_status":
207
+ case "mysql_connection":
208
+ case "mysql_probe":
209
+ steps.add("Start the site in Local and rerun local_doctor or local_environment_check.");
210
+ break;
211
+ case "wp_cli_probe":
212
+ steps.add("Run local_logs next and check the PHP, nginx, and Local app logs for startup or bootstrap errors.");
213
+ break;
214
+ case "site_logs":
215
+ case "global_logs":
216
+ steps.add("Use local_logs to inspect available logs and confirm Local has written fresh entries on this machine.");
217
+ break;
218
+ default:
219
+ break;
220
+ }
221
+ }
222
+ return [...steps];
223
+ }
224
+ //# sourceMappingURL=local-doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-doctor.js","sourceRoot":"","sources":["../src/local-doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ import type { LocalSite, SiteSelection } from "./types.js";
2
+ export declare function loadLocalSites(): Promise<{
3
+ absolutePath: string;
4
+ wpRoot: string;
5
+ runtimeDir: string;
6
+ status: string;
7
+ id: string;
8
+ name: string;
9
+ path: string;
10
+ domain?: string;
11
+ localVersion?: string;
12
+ mysql?: {
13
+ database?: string;
14
+ user?: string;
15
+ password?: string;
16
+ };
17
+ services?: import("./types.js").LocalSiteServices;
18
+ }[]>;
19
+ export declare function buildSiteContext(selection: SiteSelection): Promise<{
20
+ site: {
21
+ selectionMethod: string;
22
+ absolutePath: string;
23
+ wpRoot: string;
24
+ runtimeDir: string;
25
+ status: import("./types.js").LocalSiteStatus;
26
+ id: string;
27
+ name: string;
28
+ path: string;
29
+ domain?: string;
30
+ localVersion?: string;
31
+ mysql?: {
32
+ database?: string;
33
+ user?: string;
34
+ password?: string;
35
+ };
36
+ services?: import("./types.js").LocalSiteServices;
37
+ };
38
+ selectionMethod: string;
39
+ runtimeDir: string;
40
+ wpRoot: string;
41
+ database: string;
42
+ phpConfigDir: string;
43
+ mysqlDefaultsFile: string;
44
+ mysqlSocket: string | null;
45
+ mysqlPort: number | null;
46
+ mysqlHost: string | null;
47
+ php: {
48
+ packageDir: string;
49
+ platformDirName: string;
50
+ binaryPath: string;
51
+ layout: "lightning-services";
52
+ } | {
53
+ packageDir: string;
54
+ platformDirName: null;
55
+ binaryPath: string;
56
+ layout: "site-binaries";
57
+ };
58
+ mysql: {
59
+ packageDir: string;
60
+ platformDirName: string;
61
+ binaryPath: string;
62
+ layout: "lightning-services";
63
+ } | {
64
+ packageDir: string;
65
+ platformDirName: null;
66
+ binaryPath: string;
67
+ layout: "site-binaries";
68
+ };
69
+ magickCoderModulePath: string;
70
+ }>;
71
+ export declare function resolveSite(selection?: SiteSelection): Promise<{
72
+ selectionMethod: string;
73
+ absolutePath: string;
74
+ wpRoot: string;
75
+ runtimeDir: string;
76
+ status: import("./types.js").LocalSiteStatus;
77
+ id: string;
78
+ name: string;
79
+ path: string;
80
+ domain?: string;
81
+ localVersion?: string;
82
+ mysql?: {
83
+ database?: string;
84
+ user?: string;
85
+ password?: string;
86
+ };
87
+ services?: import("./types.js").LocalSiteServices;
88
+ }>;
89
+ export declare function summarizeSite(site: LocalSite): {
90
+ id: string;
91
+ name: string;
92
+ status: string;
93
+ domain: string | undefined;
94
+ path: string;
95
+ wpRoot: string;
96
+ localVersion: string | undefined;
97
+ phpVersion: string | null;
98
+ mysqlVersion: string | null;
99
+ httpPort: number | null;
100
+ mysqlPort: number | null;
101
+ };
102
+ export declare function readJsonFile<T>(filePath: string, fallbackValue?: T): Promise<T>;
103
+ export declare function expandHome(inputPath: string): string;
@@ -0,0 +1,234 @@
1
+ import { readFile, readdir } from "fs/promises";
2
+ import path from "path";
3
+ import { config } from "./config.js";
4
+ import { getExecutableCandidates, getLegacySiteBinariesDirs, getPlatformBinDirCandidates, } from "./platform-paths.js";
5
+ import { assertReadable, ensureReadableDirectory, isExecutablePath, isReadablePath, } from "./process-utils.js";
6
+ export async function loadLocalSites() {
7
+ const [sitesPayload, statusesPayload] = await Promise.all([
8
+ readJsonFile(config.localSitesJson),
9
+ readJsonFile(config.localSiteStatusesJson, {}),
10
+ ]);
11
+ return Object.values(sitesPayload)
12
+ .map((site) => ({
13
+ ...site,
14
+ absolutePath: expandHome(site.path),
15
+ wpRoot: path.join(expandHome(site.path), "app", "public"),
16
+ runtimeDir: path.join(config.localRunDir, site.id),
17
+ status: statusesPayload[site.id] || "unknown",
18
+ }))
19
+ .sort((left, right) => left.name.localeCompare(right.name));
20
+ }
21
+ export async function buildSiteContext(selection) {
22
+ const site = await resolveSite(selection);
23
+ const runtimeDir = path.join(config.localRunDir, site.id);
24
+ const php = await resolveServiceBinary("php", site.services?.php?.version, "php");
25
+ const mysql = await resolveServiceBinary("mysql", site.services?.mysql?.version, "mysql");
26
+ const phpConfigDir = path.join(runtimeDir, "conf", "php");
27
+ const mysqlDefaultsFile = path.join(runtimeDir, "conf", "mysql", "my.cnf");
28
+ const mysqlSocket = config.platform === "win32"
29
+ ? null
30
+ : path.join(runtimeDir, "mysql", "mysqld.sock");
31
+ const mysqlPort = site.services?.mysql?.ports?.MYSQL?.[0] || null;
32
+ const wpRoot = site.wpRoot;
33
+ await Promise.all([
34
+ ensureReadableDirectory(site.absolutePath, "Local site path is not readable"),
35
+ ensureReadableDirectory(wpRoot, "WordPress root is not readable"),
36
+ ensureReadableDirectory(phpConfigDir, "Local PHP config directory is not readable"),
37
+ assertReadable(mysqlDefaultsFile, "Local MySQL config file is not readable"),
38
+ ]);
39
+ return {
40
+ site,
41
+ selectionMethod: site.selectionMethod,
42
+ runtimeDir,
43
+ wpRoot,
44
+ database: site.mysql?.database || "local",
45
+ phpConfigDir,
46
+ mysqlDefaultsFile,
47
+ mysqlSocket,
48
+ mysqlPort,
49
+ mysqlHost: config.platform === "win32" ? config.defaultMysqlHost : null,
50
+ php,
51
+ mysql,
52
+ magickCoderModulePath: php.platformDirName
53
+ ? path.join(php.packageDir, "bin", php.platformDirName, "ImageMagick", "modules-Q16", "coders")
54
+ : "",
55
+ };
56
+ }
57
+ export async function resolveSite(selection = {}) {
58
+ const sites = await loadLocalSites();
59
+ if (sites.length === 0) {
60
+ throw new Error(`No LocalWP sites were found in ${config.localSitesJson}. Start by opening Local and creating or importing a site.`);
61
+ }
62
+ const explicitSite = resolveExplicitSiteSelection(sites, selection);
63
+ if (explicitSite) {
64
+ return explicitSite;
65
+ }
66
+ const envSelection = resolveExplicitSiteSelection(sites, {
67
+ siteId: process.env.LOCAL_SITE_ID,
68
+ siteName: process.env.LOCAL_SITE_NAME,
69
+ });
70
+ if (envSelection) {
71
+ return envSelection;
72
+ }
73
+ const cwdSelection = resolveCwdSiteSelection(sites);
74
+ if (cwdSelection) {
75
+ return cwdSelection;
76
+ }
77
+ const runningSites = sites.filter((site) => site.status === "running");
78
+ if (runningSites.length === 1) {
79
+ return { ...runningSites[0], selectionMethod: "single_running_site" };
80
+ }
81
+ if (sites.length === 1) {
82
+ return { ...sites[0], selectionMethod: "single_site" };
83
+ }
84
+ throw new Error("Could not safely choose a Local site. Pass 'siteName' or 'siteId' in the tool call, or set LOCAL_SITE_NAME / LOCAL_SITE_ID in the MCP config.");
85
+ }
86
+ export function summarizeSite(site) {
87
+ return {
88
+ id: site.id,
89
+ name: site.name,
90
+ status: site.status,
91
+ domain: site.domain,
92
+ path: site.absolutePath,
93
+ wpRoot: site.wpRoot,
94
+ localVersion: site.localVersion,
95
+ phpVersion: site.services?.php?.version || null,
96
+ mysqlVersion: site.services?.mysql?.version || null,
97
+ httpPort: site.services?.nginx?.ports?.HTTP?.[0] || null,
98
+ mysqlPort: site.services?.mysql?.ports?.MYSQL?.[0] || null,
99
+ };
100
+ }
101
+ export async function readJsonFile(filePath, fallbackValue) {
102
+ try {
103
+ const raw = await readFile(filePath, "utf8");
104
+ return JSON.parse(raw);
105
+ }
106
+ catch (error) {
107
+ if (fallbackValue !== undefined) {
108
+ return fallbackValue;
109
+ }
110
+ const message = error instanceof Error ? error.message : String(error);
111
+ throw new Error(`Failed to read JSON file '${filePath}': ${message}`);
112
+ }
113
+ }
114
+ export function expandHome(inputPath) {
115
+ if (inputPath === "~") {
116
+ return config.homeDir;
117
+ }
118
+ if (inputPath.startsWith("~/")) {
119
+ return path.join(config.homeDir, inputPath.slice(2));
120
+ }
121
+ return inputPath;
122
+ }
123
+ async function resolveServiceBinary(serviceName, serviceVersion, binaryName) {
124
+ if (!serviceVersion) {
125
+ throw new Error(`Missing ${serviceName} version in Local site metadata.`);
126
+ }
127
+ const executableCandidates = getExecutableCandidates(binaryName, config.platform);
128
+ const servicePackage = await resolveServicePackageDir(serviceName, serviceVersion);
129
+ if (servicePackage.layout === "lightning-services") {
130
+ const binRoot = path.join(servicePackage.packageDir, "bin");
131
+ const entries = await readdir(binRoot, { withFileTypes: true });
132
+ const platformDirs = entries
133
+ .filter((entry) => entry.isDirectory())
134
+ .map((entry) => entry.name);
135
+ const preferredPlatformDirs = getPlatformBinDirCandidates(config.platform, config.arch).filter((directory) => platformDirs.includes(directory));
136
+ const candidatePlatformDirs = [
137
+ ...preferredPlatformDirs,
138
+ ...platformDirs.filter((directory) => !preferredPlatformDirs.includes(directory)),
139
+ ];
140
+ for (const platformDirName of candidatePlatformDirs) {
141
+ for (const executableName of executableCandidates) {
142
+ const binaryPath = path.join(binRoot, platformDirName, "bin", executableName);
143
+ if (await isExecutablePath(binaryPath)) {
144
+ return {
145
+ packageDir: servicePackage.packageDir,
146
+ platformDirName,
147
+ binaryPath,
148
+ layout: "lightning-services",
149
+ };
150
+ }
151
+ }
152
+ }
153
+ throw new Error(`Could not find executable '${binaryName}' for ${serviceName} in package '${servicePackage.packageDir}'.`);
154
+ }
155
+ for (const executableName of executableCandidates) {
156
+ const binaryPath = path.join(servicePackage.packageDir, "bin", executableName);
157
+ if (await isExecutablePath(binaryPath)) {
158
+ return {
159
+ packageDir: servicePackage.packageDir,
160
+ platformDirName: null,
161
+ binaryPath,
162
+ layout: "site-binaries",
163
+ };
164
+ }
165
+ }
166
+ throw new Error(`Could not find executable '${binaryName}' for ${serviceName} in package '${servicePackage.packageDir}'.`);
167
+ }
168
+ async function resolveServicePackageDir(serviceName, serviceVersion) {
169
+ const currentLayoutMatches = await collectMatchingDirectories(config.localLightningServicesDirs, `${serviceName}-${serviceVersion}+`);
170
+ if (currentLayoutMatches.length > 0) {
171
+ return {
172
+ packageDir: currentLayoutMatches[0],
173
+ layout: "lightning-services",
174
+ };
175
+ }
176
+ const legacyLayoutMatches = await collectMatchingDirectories(getLegacySiteBinariesDirs(config.platform, config.localExtraResourcesDirs), `${serviceName}-${serviceVersion}`);
177
+ if (legacyLayoutMatches.length > 0) {
178
+ return {
179
+ packageDir: legacyLayoutMatches[0],
180
+ layout: "site-binaries",
181
+ };
182
+ }
183
+ throw new Error([
184
+ `Could not find Local ${serviceName} service package for version ${serviceVersion}.`,
185
+ `Checked lightning-services dirs: ${config.localLightningServicesDirs.join(", ")}`,
186
+ `Checked legacy site-binaries dirs: ${getLegacySiteBinariesDirs(config.platform, config.localExtraResourcesDirs).join(", ")}`,
187
+ ].join("\n"));
188
+ }
189
+ function resolveExplicitSiteSelection(sites, selection) {
190
+ const { siteId, siteName } = selection;
191
+ if (siteId) {
192
+ const match = sites.find((site) => site.id === siteId);
193
+ if (!match) {
194
+ throw new Error(`No Local site found for siteId '${siteId}'.`);
195
+ }
196
+ return { ...match, selectionMethod: "site_id" };
197
+ }
198
+ if (siteName) {
199
+ const normalizedName = siteName.trim().toLowerCase();
200
+ const matches = sites.filter((site) => site.name.trim().toLowerCase() === normalizedName);
201
+ if (matches.length === 0) {
202
+ throw new Error(`No Local site found for siteName '${siteName}'.`);
203
+ }
204
+ if (matches.length > 1) {
205
+ throw new Error(`Multiple Local sites matched siteName '${siteName}'. Use siteId instead.`);
206
+ }
207
+ return { ...matches[0], selectionMethod: "site_name" };
208
+ }
209
+ return null;
210
+ }
211
+ function resolveCwdSiteSelection(sites) {
212
+ const cwd = process.cwd();
213
+ const matchingSite = sites.find((site) => {
214
+ const sitePath = site.absolutePath;
215
+ return cwd === sitePath || cwd.startsWith(`${sitePath}${path.sep}`);
216
+ });
217
+ return matchingSite
218
+ ? { ...matchingSite, selectionMethod: "cwd_match" }
219
+ : null;
220
+ }
221
+ async function collectMatchingDirectories(directories, prefix) {
222
+ const matches = [];
223
+ for (const directory of directories) {
224
+ if (!(await isReadablePath(directory))) {
225
+ continue;
226
+ }
227
+ const entries = await readdir(directory, { withFileTypes: true });
228
+ matches.push(...entries
229
+ .filter((entry) => entry.isDirectory() && entry.name.startsWith(prefix))
230
+ .map((entry) => path.join(directory, entry.name)));
231
+ }
232
+ return matches.sort().reverse();
233
+ }
234
+ //# sourceMappingURL=local-sites.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-sites.js","sourceRoot":"","sources":["../src/local-sites.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ResolvedLocalTooling } from "./types.js";
2
+ export declare function resolveLocalTooling(): Promise<ResolvedLocalTooling>;
@@ -0,0 +1,23 @@
1
+ import { config } from "./config.js";
2
+ import { filterReadableDirectories, findFirstReadablePath } from "./process-utils.js";
3
+ let toolingPromise = null;
4
+ export function resolveLocalTooling() {
5
+ if (!toolingPromise) {
6
+ toolingPromise = loadLocalTooling();
7
+ }
8
+ return toolingPromise;
9
+ }
10
+ async function loadLocalTooling() {
11
+ const wpCliPhar = await findFirstReadablePath(config.localWpCliPharCandidates);
12
+ if (!wpCliPhar) {
13
+ throw new Error(`Could not find wp-cli.phar. Checked: ${config.localWpCliPharCandidates.join(", ")}`);
14
+ }
15
+ const wpCliConfig = await findFirstReadablePath(config.localWpCliConfigCandidates);
16
+ const helperBinDirs = await filterReadableDirectories(config.localHelperBinDirCandidates);
17
+ return {
18
+ wpCliPhar,
19
+ wpCliConfig,
20
+ helperBinDirs,
21
+ };
22
+ }
23
+ //# sourceMappingURL=local-tooling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-tooling.js","sourceRoot":"","sources":["../src/local-tooling.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAGtF,IAAI,cAAc,GAAyC,IAAI,CAAC;AAEhE,MAAM,UAAU,mBAAmB;IACjC,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,cAAc,GAAG,gBAAgB,EAAE,CAAC;IACtC,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,KAAK,UAAU,gBAAgB;IAC7B,MAAM,SAAS,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC;IAE/E,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,wCAAwC,MAAM,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACrF,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC;IACnF,MAAM,aAAa,GAAG,MAAM,yBAAyB,CACnD,MAAM,CAAC,2BAA2B,CACnC,CAAC;IAEF,OAAO;QACL,SAAS;QACT,WAAW;QACX,aAAa;KACiB,CAAC;AACnC,CAAC"}