@tmhs/mobile-mcp 0.4.0 → 0.6.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.
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/tools/buildForStore.d.ts +3 -0
- package/dist/tools/buildForStore.d.ts.map +1 -0
- package/dist/tools/buildForStore.js +99 -0
- package/dist/tools/buildForStore.js.map +1 -0
- package/dist/tools/submitToAppStore.d.ts +3 -0
- package/dist/tools/submitToAppStore.d.ts.map +1 -0
- package/dist/tools/submitToAppStore.js +93 -0
- package/dist/tools/submitToAppStore.js.map +1 -0
- package/dist/tools/validateStoreMetadata.d.ts +3 -0
- package/dist/tools/validateStoreMetadata.d.ts.map +1 -0
- package/dist/tools/validateStoreMetadata.js +152 -0
- package/dist/tools/validateStoreMetadata.js.map +1 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -13,9 +13,12 @@ import { register as registerCheckBuildHealth } from "./tools/checkBuildHealth.j
|
|
|
13
13
|
import { register as registerAddPushNotifications } from "./tools/addPushNotifications.js";
|
|
14
14
|
import { register as registerConfigureDeepLinks } from "./tools/configureDeepLinks.js";
|
|
15
15
|
import { register as registerResetDevEnvironment } from "./tools/resetDevEnvironment.js";
|
|
16
|
+
import { register as registerBuildForStore } from "./tools/buildForStore.js";
|
|
17
|
+
import { register as registerValidateStoreMetadata } from "./tools/validateStoreMetadata.js";
|
|
18
|
+
import { register as registerSubmitToAppStore } from "./tools/submitToAppStore.js";
|
|
16
19
|
const server = new McpServer({
|
|
17
20
|
name: "mobile-mcp",
|
|
18
|
-
version: "0.
|
|
21
|
+
version: "0.6.0",
|
|
19
22
|
});
|
|
20
23
|
registerCheckDevEnvironment(server);
|
|
21
24
|
registerScaffoldProject(server);
|
|
@@ -29,6 +32,9 @@ registerCheckBuildHealth(server);
|
|
|
29
32
|
registerAddPushNotifications(server);
|
|
30
33
|
registerConfigureDeepLinks(server);
|
|
31
34
|
registerResetDevEnvironment(server);
|
|
35
|
+
registerBuildForStore(server);
|
|
36
|
+
registerValidateStoreMetadata(server);
|
|
37
|
+
registerSubmitToAppStore(server);
|
|
32
38
|
async function main() {
|
|
33
39
|
const transport = new StdioServerTransport();
|
|
34
40
|
await server.connect(transport);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,QAAQ,IAAI,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AACzF,OAAO,EAAE,QAAQ,IAAI,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACjF,OAAO,EAAE,QAAQ,IAAI,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,QAAQ,IAAI,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAAE,QAAQ,IAAI,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACrF,OAAO,EAAE,QAAQ,IAAI,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACrF,OAAO,EAAE,QAAQ,IAAI,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,QAAQ,IAAI,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,QAAQ,IAAI,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACnF,OAAO,EAAE,QAAQ,IAAI,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAC3F,OAAO,EAAE,QAAQ,IAAI,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AACvF,OAAO,EAAE,QAAQ,IAAI,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,QAAQ,IAAI,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AACzF,OAAO,EAAE,QAAQ,IAAI,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACjF,OAAO,EAAE,QAAQ,IAAI,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,QAAQ,IAAI,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAAE,QAAQ,IAAI,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACrF,OAAO,EAAE,QAAQ,IAAI,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACrF,OAAO,EAAE,QAAQ,IAAI,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,QAAQ,IAAI,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,QAAQ,IAAI,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACnF,OAAO,EAAE,QAAQ,IAAI,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAC3F,OAAO,EAAE,QAAQ,IAAI,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AACvF,OAAO,EAAE,QAAQ,IAAI,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AACzF,OAAO,EAAE,QAAQ,IAAI,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,QAAQ,IAAI,6BAA6B,EAAE,MAAM,kCAAkC,CAAC;AAC7F,OAAO,EAAE,QAAQ,IAAI,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAEnF,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,YAAY;IAClB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,2BAA2B,CAAC,MAAM,CAAC,CAAC;AACpC,uBAAuB,CAAC,MAAM,CAAC,CAAC;AAChC,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAC5B,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAC/B,yBAAyB,CAAC,MAAM,CAAC,CAAC;AAClC,yBAAyB,CAAC,MAAM,CAAC,CAAC;AAClC,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC9B,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAC5B,wBAAwB,CAAC,MAAM,CAAC,CAAC;AACjC,4BAA4B,CAAC,MAAM,CAAC,CAAC;AACrC,0BAA0B,CAAC,MAAM,CAAC,CAAC;AACnC,2BAA2B,CAAC,MAAM,CAAC,CAAC;AACpC,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC9B,6BAA6B,CAAC,MAAM,CAAC,CAAC;AACtC,wBAAwB,CAAC,MAAM,CAAC,CAAC;AAEjC,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildForStore.d.ts","sourceRoot":"","sources":["../../src/tools/buildForStore.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiDzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0EhD"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { execSync } from "node:child_process";
|
|
3
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { textResponse, errorResponse } from "../types.js";
|
|
6
|
+
const inputSchema = {
|
|
7
|
+
platform: z
|
|
8
|
+
.enum(["ios", "android", "both"])
|
|
9
|
+
.describe("Target platform for the production build"),
|
|
10
|
+
profile: z
|
|
11
|
+
.string()
|
|
12
|
+
.optional()
|
|
13
|
+
.default("production")
|
|
14
|
+
.describe("EAS build profile name (default: production)"),
|
|
15
|
+
project_path: z
|
|
16
|
+
.string()
|
|
17
|
+
.optional()
|
|
18
|
+
.describe("Absolute path to the Expo project root. Defaults to cwd."),
|
|
19
|
+
};
|
|
20
|
+
function validateAppJson(root, platform) {
|
|
21
|
+
const appJsonPath = join(root, "app.json");
|
|
22
|
+
if (!existsSync(appJsonPath)) {
|
|
23
|
+
return { valid: false, errors: ["app.json not found"] };
|
|
24
|
+
}
|
|
25
|
+
const appJson = JSON.parse(readFileSync(appJsonPath, "utf-8"));
|
|
26
|
+
const expo = appJson.expo || {};
|
|
27
|
+
const errors = [];
|
|
28
|
+
if (!expo.version)
|
|
29
|
+
errors.push("Missing expo.version");
|
|
30
|
+
if (!expo.icon)
|
|
31
|
+
errors.push("Missing expo.icon");
|
|
32
|
+
if (platform === "ios" || platform === "both") {
|
|
33
|
+
if (!expo.ios?.bundleIdentifier) {
|
|
34
|
+
errors.push("Missing expo.ios.bundleIdentifier");
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (platform === "android" || platform === "both") {
|
|
38
|
+
if (!expo.android?.package) {
|
|
39
|
+
errors.push("Missing expo.android.package");
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return { valid: errors.length === 0, errors };
|
|
43
|
+
}
|
|
44
|
+
export function register(server) {
|
|
45
|
+
server.tool("mobile_buildForStore", "Create a production build for app store submission using EAS Build. Validates app.json before building.", inputSchema, async (args) => {
|
|
46
|
+
try {
|
|
47
|
+
const root = args.project_path || process.cwd();
|
|
48
|
+
const platforms = args.platform === "both" ? ["ios", "android"] : [args.platform];
|
|
49
|
+
const validation = validateAppJson(root, args.platform);
|
|
50
|
+
if (!validation.valid) {
|
|
51
|
+
return textResponse(JSON.stringify({
|
|
52
|
+
success: false,
|
|
53
|
+
message: "app.json validation failed. Fix these before building:",
|
|
54
|
+
errors: validation.errors,
|
|
55
|
+
}, null, 2));
|
|
56
|
+
}
|
|
57
|
+
const results = [];
|
|
58
|
+
for (const platform of platforms) {
|
|
59
|
+
try {
|
|
60
|
+
const cmd = `npx eas-cli build --platform ${platform} --profile ${args.profile} --non-interactive`;
|
|
61
|
+
const output = execSync(cmd, {
|
|
62
|
+
cwd: root,
|
|
63
|
+
encoding: "utf-8",
|
|
64
|
+
timeout: 600000,
|
|
65
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
66
|
+
});
|
|
67
|
+
results.push({
|
|
68
|
+
platform,
|
|
69
|
+
status: "submitted",
|
|
70
|
+
output: output.slice(-500),
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
75
|
+
results.push({
|
|
76
|
+
platform,
|
|
77
|
+
status: "error",
|
|
78
|
+
output: message.slice(-500),
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
const result = {
|
|
83
|
+
success: results.every((r) => r.status === "submitted"),
|
|
84
|
+
profile: args.profile,
|
|
85
|
+
builds: results,
|
|
86
|
+
next_steps: [
|
|
87
|
+
"Monitor build progress at https://expo.dev",
|
|
88
|
+
"Once complete, use mobile_submitToAppStore for iOS",
|
|
89
|
+
"For Android, use eas submit --platform android",
|
|
90
|
+
],
|
|
91
|
+
};
|
|
92
|
+
return textResponse(JSON.stringify(result, null, 2));
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
return errorResponse(err);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=buildForStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildForStore.js","sourceRoot":"","sources":["../../src/tools/buildForStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"submitToAppStore.d.ts","sourceRoot":"","sources":["../../src/tools/submitToAppStore.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkBzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuGhD"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { execSync } from "node:child_process";
|
|
3
|
+
import { existsSync } from "node:fs";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { textResponse, errorResponse } from "../types.js";
|
|
6
|
+
const inputSchema = {
|
|
7
|
+
project_path: z
|
|
8
|
+
.string()
|
|
9
|
+
.optional()
|
|
10
|
+
.describe("Absolute path to the Expo project root. Defaults to cwd."),
|
|
11
|
+
apple_id: z
|
|
12
|
+
.string()
|
|
13
|
+
.optional()
|
|
14
|
+
.describe("Apple ID email for App Store Connect. Falls back to EAS config or env."),
|
|
15
|
+
asc_app_id: z
|
|
16
|
+
.string()
|
|
17
|
+
.optional()
|
|
18
|
+
.describe("App Store Connect app ID (numeric). Falls back to EAS config."),
|
|
19
|
+
};
|
|
20
|
+
export function register(server) {
|
|
21
|
+
server.tool("mobile_submitToAppStore", "Submit the latest iOS production build to App Store Connect via EAS Submit. Validates that EAS CLI is available and a recent build exists.", inputSchema, async (args) => {
|
|
22
|
+
try {
|
|
23
|
+
const root = args.project_path || process.cwd();
|
|
24
|
+
if (!existsSync(join(root, "app.json"))) {
|
|
25
|
+
return errorResponse(new Error(`No app.json at ${root}. Is this an Expo project?`));
|
|
26
|
+
}
|
|
27
|
+
// Check EAS CLI is available
|
|
28
|
+
try {
|
|
29
|
+
execSync("npx eas-cli --version", {
|
|
30
|
+
encoding: "utf-8",
|
|
31
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
32
|
+
timeout: 15000,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return textResponse(JSON.stringify({
|
|
37
|
+
success: false,
|
|
38
|
+
message: "EAS CLI not found. Install with: npm install -g eas-cli",
|
|
39
|
+
}, null, 2));
|
|
40
|
+
}
|
|
41
|
+
// Build the submit command
|
|
42
|
+
const cmdParts = [
|
|
43
|
+
"npx eas-cli submit",
|
|
44
|
+
"--platform ios",
|
|
45
|
+
"--non-interactive",
|
|
46
|
+
];
|
|
47
|
+
if (args.apple_id) {
|
|
48
|
+
cmdParts.push(`--apple-id ${args.apple_id}`);
|
|
49
|
+
}
|
|
50
|
+
if (args.asc_app_id) {
|
|
51
|
+
cmdParts.push(`--asc-app-id ${args.asc_app_id}`);
|
|
52
|
+
}
|
|
53
|
+
const cmd = cmdParts.join(" ");
|
|
54
|
+
try {
|
|
55
|
+
const output = execSync(cmd, {
|
|
56
|
+
cwd: root,
|
|
57
|
+
encoding: "utf-8",
|
|
58
|
+
timeout: 300000,
|
|
59
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
60
|
+
});
|
|
61
|
+
return textResponse(JSON.stringify({
|
|
62
|
+
success: true,
|
|
63
|
+
message: "Build submitted to App Store Connect",
|
|
64
|
+
output: output.slice(-1000),
|
|
65
|
+
next_steps: [
|
|
66
|
+
"Check App Store Connect for the build status",
|
|
67
|
+
"Add the build to a TestFlight group for testing",
|
|
68
|
+
"Once tested, submit for App Review",
|
|
69
|
+
"Provide demo credentials in App Review Information if login is required",
|
|
70
|
+
],
|
|
71
|
+
}, null, 2));
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
75
|
+
return textResponse(JSON.stringify({
|
|
76
|
+
success: false,
|
|
77
|
+
message: "Submission failed",
|
|
78
|
+
error: message.slice(-1000),
|
|
79
|
+
troubleshooting: [
|
|
80
|
+
"Ensure you have a recent production build: eas build --platform ios --profile production",
|
|
81
|
+
"Check Apple credentials: eas credentials --platform ios",
|
|
82
|
+
"Verify Apple Developer account is active",
|
|
83
|
+
"If using ASC API key, ensure it has App Manager role",
|
|
84
|
+
],
|
|
85
|
+
}, null, 2));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
return errorResponse(err);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=submitToAppStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"submitToAppStore.js","sourceRoot":"","sources":["../../src/tools/submitToAppStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateStoreMetadata.d.ts","sourceRoot":"","sources":["../../src/tools/validateStoreMetadata.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAqBzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsKhD"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { textResponse, errorResponse } from "../types.js";
|
|
5
|
+
const inputSchema = {
|
|
6
|
+
project_path: z
|
|
7
|
+
.string()
|
|
8
|
+
.optional()
|
|
9
|
+
.describe("Absolute path to the Expo project root. Defaults to cwd."),
|
|
10
|
+
platform: z
|
|
11
|
+
.enum(["ios", "android", "both"])
|
|
12
|
+
.optional()
|
|
13
|
+
.default("both")
|
|
14
|
+
.describe("Which platform to validate metadata for"),
|
|
15
|
+
};
|
|
16
|
+
export function register(server) {
|
|
17
|
+
server.tool("mobile_validateStoreMetadata", "Check that an Expo project has all required app store listing fields: name, bundle ID, version, icon, splash, privacy policy. Returns a pass/fail checklist.", inputSchema, async (args) => {
|
|
18
|
+
try {
|
|
19
|
+
const root = args.project_path || process.cwd();
|
|
20
|
+
const appJsonPath = join(root, "app.json");
|
|
21
|
+
if (!existsSync(appJsonPath)) {
|
|
22
|
+
return errorResponse(new Error(`No app.json found at ${root}. Is this an Expo project?`));
|
|
23
|
+
}
|
|
24
|
+
const appJson = JSON.parse(readFileSync(appJsonPath, "utf-8"));
|
|
25
|
+
const expo = appJson.expo || {};
|
|
26
|
+
const checks = [];
|
|
27
|
+
const platform = args.platform;
|
|
28
|
+
// Shared checks
|
|
29
|
+
checks.push({
|
|
30
|
+
field: "expo.name",
|
|
31
|
+
status: expo.name ? "pass" : "fail",
|
|
32
|
+
message: expo.name
|
|
33
|
+
? `"${expo.name}" (${expo.name.length} chars)`
|
|
34
|
+
: "Missing app name",
|
|
35
|
+
});
|
|
36
|
+
if (expo.name && expo.name.length > 30) {
|
|
37
|
+
checks.push({
|
|
38
|
+
field: "expo.name (length)",
|
|
39
|
+
status: "warn",
|
|
40
|
+
message: `Name is ${expo.name.length} chars. Both stores limit to 30.`,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
checks.push({
|
|
44
|
+
field: "expo.version",
|
|
45
|
+
status: expo.version ? "pass" : "fail",
|
|
46
|
+
message: expo.version
|
|
47
|
+
? `"${expo.version}"`
|
|
48
|
+
: "Missing version string",
|
|
49
|
+
});
|
|
50
|
+
checks.push({
|
|
51
|
+
field: "expo.icon",
|
|
52
|
+
status: expo.icon ? "pass" : "fail",
|
|
53
|
+
message: expo.icon
|
|
54
|
+
? existsSync(join(root, expo.icon))
|
|
55
|
+
? `Found: ${expo.icon}`
|
|
56
|
+
: `Configured as ${expo.icon} but file not found`
|
|
57
|
+
: "Missing app icon",
|
|
58
|
+
});
|
|
59
|
+
if (expo.icon && existsSync(join(root, expo.icon))) {
|
|
60
|
+
checks[checks.length - 1].status = "pass";
|
|
61
|
+
}
|
|
62
|
+
else if (expo.icon) {
|
|
63
|
+
checks[checks.length - 1].status = "fail";
|
|
64
|
+
}
|
|
65
|
+
checks.push({
|
|
66
|
+
field: "expo.splash",
|
|
67
|
+
status: expo.splash?.image ? "pass" : "warn",
|
|
68
|
+
message: expo.splash?.image
|
|
69
|
+
? `Found: ${expo.splash.image}`
|
|
70
|
+
: "No splash screen configured (recommended)",
|
|
71
|
+
});
|
|
72
|
+
// iOS-specific
|
|
73
|
+
if (platform === "ios" || platform === "both") {
|
|
74
|
+
checks.push({
|
|
75
|
+
field: "expo.ios.bundleIdentifier",
|
|
76
|
+
status: expo.ios?.bundleIdentifier ? "pass" : "fail",
|
|
77
|
+
message: expo.ios?.bundleIdentifier
|
|
78
|
+
? `"${expo.ios.bundleIdentifier}"`
|
|
79
|
+
: "Missing iOS bundle identifier",
|
|
80
|
+
});
|
|
81
|
+
if (expo.ios?.bundleIdentifier) {
|
|
82
|
+
const validBundle = /^[a-zA-Z][a-zA-Z0-9.-]*$/.test(expo.ios.bundleIdentifier);
|
|
83
|
+
if (!validBundle) {
|
|
84
|
+
checks.push({
|
|
85
|
+
field: "expo.ios.bundleIdentifier (format)",
|
|
86
|
+
status: "fail",
|
|
87
|
+
message: "Invalid format. Must start with a letter and contain only alphanumerics, dots, and hyphens.",
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
checks.push({
|
|
92
|
+
field: "expo.ios.buildNumber",
|
|
93
|
+
status: expo.ios?.buildNumber ? "pass" : "warn",
|
|
94
|
+
message: expo.ios?.buildNumber
|
|
95
|
+
? `"${expo.ios.buildNumber}"`
|
|
96
|
+
: "Not set. Will default to 1. Set autoIncrement in eas.json for production.",
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
// Android-specific
|
|
100
|
+
if (platform === "android" || platform === "both") {
|
|
101
|
+
checks.push({
|
|
102
|
+
field: "expo.android.package",
|
|
103
|
+
status: expo.android?.package ? "pass" : "fail",
|
|
104
|
+
message: expo.android?.package
|
|
105
|
+
? `"${expo.android.package}"`
|
|
106
|
+
: "Missing Android package name",
|
|
107
|
+
});
|
|
108
|
+
if (expo.android?.package) {
|
|
109
|
+
const validPackage = /^[a-zA-Z][a-zA-Z0-9]*(\.[a-zA-Z][a-zA-Z0-9]*)+$/.test(expo.android.package);
|
|
110
|
+
if (!validPackage) {
|
|
111
|
+
checks.push({
|
|
112
|
+
field: "expo.android.package (format)",
|
|
113
|
+
status: "fail",
|
|
114
|
+
message: "Invalid format. Must be reverse domain notation (e.g. com.example.myapp).",
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
checks.push({
|
|
119
|
+
field: "expo.android.versionCode",
|
|
120
|
+
status: expo.android?.versionCode !== undefined ? "pass" : "warn",
|
|
121
|
+
message: expo.android?.versionCode !== undefined
|
|
122
|
+
? `${expo.android.versionCode}`
|
|
123
|
+
: "Not set. Will default to 1. Set autoIncrement in eas.json for production.",
|
|
124
|
+
});
|
|
125
|
+
checks.push({
|
|
126
|
+
field: "expo.android.adaptiveIcon",
|
|
127
|
+
status: expo.android?.adaptiveIcon?.foregroundImage
|
|
128
|
+
? "pass"
|
|
129
|
+
: "warn",
|
|
130
|
+
message: expo.android?.adaptiveIcon?.foregroundImage
|
|
131
|
+
? `Found: ${expo.android.adaptiveIcon.foregroundImage}`
|
|
132
|
+
: "No adaptive icon configured (recommended for Android)",
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
const passed = checks.filter((c) => c.status === "pass").length;
|
|
136
|
+
const failed = checks.filter((c) => c.status === "fail").length;
|
|
137
|
+
const warned = checks.filter((c) => c.status === "warn").length;
|
|
138
|
+
const result = {
|
|
139
|
+
project_path: root,
|
|
140
|
+
platform,
|
|
141
|
+
summary: `${passed} passed, ${failed} failed, ${warned} warnings out of ${checks.length} checks`,
|
|
142
|
+
ready: failed === 0,
|
|
143
|
+
checks,
|
|
144
|
+
};
|
|
145
|
+
return textResponse(JSON.stringify(result, null, 2));
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
return errorResponse(err);
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=validateStoreMetadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateStoreMetadata.js","sourceRoot":"","sources":["../../src/tools/validateStoreMetadata.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tmhs/mobile-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "MCP server for mobile app development - 12 tools for environment checks, project scaffolding, device deployment, screen/component generation, dependency installation, permissions, AI integration, build health, push notifications, deep links, and dev environment reset.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|