@tmhs/mobile-mcp 0.10.0 → 0.12.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 +13 -1
- package/dist/index.js.map +1 -1
- package/dist/tools/auditAccessibility.d.ts +3 -0
- package/dist/tools/auditAccessibility.d.ts.map +1 -0
- package/dist/tools/auditAccessibility.js +236 -0
- package/dist/tools/auditAccessibility.js.map +1 -0
- package/dist/tools/checkNativeCompat.d.ts +3 -0
- package/dist/tools/checkNativeCompat.d.ts.map +1 -0
- package/dist/tools/checkNativeCompat.js +255 -0
- package/dist/tools/checkNativeCompat.js.map +1 -0
- package/dist/tools/createNativeModule.d.ts +3 -0
- package/dist/tools/createNativeModule.d.ts.map +1 -0
- package/dist/tools/createNativeModule.js +291 -0
- package/dist/tools/createNativeModule.js.map +1 -0
- package/dist/tools/setupFeatureFlags.d.ts +3 -0
- package/dist/tools/setupFeatureFlags.d.ts.map +1 -0
- package/dist/tools/setupFeatureFlags.js +266 -0
- package/dist/tools/setupFeatureFlags.js.map +1 -0
- package/dist/tools/setupTheming.d.ts +3 -0
- package/dist/tools/setupTheming.d.ts.map +1 -0
- package/dist/tools/setupTheming.js +303 -0
- package/dist/tools/setupTheming.js.map +1 -0
- package/dist/tools/upgradeSDK.d.ts +3 -0
- package/dist/tools/upgradeSDK.d.ts.map +1 -0
- package/dist/tools/upgradeSDK.js +170 -0
- package/dist/tools/upgradeSDK.js.map +1 -0
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -31,9 +31,15 @@ import { register as registerSecurityAudit } from "./tools/securityAudit.js";
|
|
|
31
31
|
import { register as registerProfilePerformance } from "./tools/profilePerformance.js";
|
|
32
32
|
import { register as registerCheckOfflineReady } from "./tools/checkOfflineReady.js";
|
|
33
33
|
import { register as registerSetupMonitoring } from "./tools/setupMonitoring.js";
|
|
34
|
+
import { register as registerSetupTheming } from "./tools/setupTheming.js";
|
|
35
|
+
import { register as registerAuditAccessibility } from "./tools/auditAccessibility.js";
|
|
36
|
+
import { register as registerSetupFeatureFlags } from "./tools/setupFeatureFlags.js";
|
|
37
|
+
import { register as registerCreateNativeModule } from "./tools/createNativeModule.js";
|
|
38
|
+
import { register as registerUpgradeSDK } from "./tools/upgradeSDK.js";
|
|
39
|
+
import { register as registerCheckNativeCompat } from "./tools/checkNativeCompat.js";
|
|
34
40
|
const server = new McpServer({
|
|
35
41
|
name: "mobile-mcp",
|
|
36
|
-
version: "0.
|
|
42
|
+
version: "0.12.0",
|
|
37
43
|
});
|
|
38
44
|
registerCheckDevEnvironment(server);
|
|
39
45
|
registerScaffoldProject(server);
|
|
@@ -65,6 +71,12 @@ registerSecurityAudit(server);
|
|
|
65
71
|
registerProfilePerformance(server);
|
|
66
72
|
registerCheckOfflineReady(server);
|
|
67
73
|
registerSetupMonitoring(server);
|
|
74
|
+
registerSetupTheming(server);
|
|
75
|
+
registerAuditAccessibility(server);
|
|
76
|
+
registerSetupFeatureFlags(server);
|
|
77
|
+
registerCreateNativeModule(server);
|
|
78
|
+
registerUpgradeSDK(server);
|
|
79
|
+
registerCheckNativeCompat(server);
|
|
68
80
|
async function main() {
|
|
69
81
|
const transport = new StdioServerTransport();
|
|
70
82
|
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;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;AACnF,OAAO,EAAE,QAAQ,IAAI,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACrF,OAAO,EAAE,QAAQ,IAAI,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AACzF,OAAO,EAAE,QAAQ,IAAI,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,QAAQ,IAAI,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,QAAQ,IAAI,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,QAAQ,IAAI,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACnF,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,QAAQ,IAAI,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,QAAQ,IAAI,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,QAAQ,IAAI,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,QAAQ,IAAI,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AACvF,OAAO,EAAE,QAAQ,IAAI,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACrF,OAAO,EAAE,QAAQ,IAAI,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auditAccessibility.d.ts","sourceRoot":"","sources":["../../src/tools/auditAccessibility.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAsNzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA2ChD"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { readFileSync, existsSync, readdirSync, statSync } from "node:fs";
|
|
3
|
+
import { join, extname } 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 project root. Defaults to cwd."),
|
|
10
|
+
framework: z
|
|
11
|
+
.enum(["expo", "flutter"])
|
|
12
|
+
.optional()
|
|
13
|
+
.default("expo")
|
|
14
|
+
.describe("Framework to audit (default: expo)."),
|
|
15
|
+
};
|
|
16
|
+
function collectFiles(dir, extensions, maxDepth = 5, depth = 0) {
|
|
17
|
+
if (depth >= maxDepth || !existsSync(dir))
|
|
18
|
+
return [];
|
|
19
|
+
const results = [];
|
|
20
|
+
try {
|
|
21
|
+
for (const entry of readdirSync(dir)) {
|
|
22
|
+
if (entry.startsWith(".") || entry === "node_modules" || entry === "build" || entry === ".dart_tool")
|
|
23
|
+
continue;
|
|
24
|
+
const full = join(dir, entry);
|
|
25
|
+
try {
|
|
26
|
+
const stat = statSync(full);
|
|
27
|
+
if (stat.isDirectory()) {
|
|
28
|
+
results.push(...collectFiles(full, extensions, maxDepth, depth + 1));
|
|
29
|
+
}
|
|
30
|
+
else if (extensions.includes(extname(entry))) {
|
|
31
|
+
results.push(full);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
catch { /* skip */ }
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch { /* skip */ }
|
|
38
|
+
return results;
|
|
39
|
+
}
|
|
40
|
+
function auditExpo(root) {
|
|
41
|
+
const violations = [];
|
|
42
|
+
const srcDir = existsSync(join(root, "src")) ? join(root, "src") : join(root, "app");
|
|
43
|
+
const files = collectFiles(srcDir, [".tsx", ".jsx"]);
|
|
44
|
+
for (const file of files) {
|
|
45
|
+
let content;
|
|
46
|
+
try {
|
|
47
|
+
content = readFileSync(file, "utf-8");
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const rel = file.replace(root, "").replace(/\\/g, "/");
|
|
53
|
+
const touchableRegex = /<(TouchableOpacity|TouchableHighlight|Pressable|TouchableWithoutFeedback)\b/g;
|
|
54
|
+
let match;
|
|
55
|
+
while ((match = touchableRegex.exec(content)) !== null) {
|
|
56
|
+
const afterTag = content.slice(match.index, match.index + 300);
|
|
57
|
+
if (!afterTag.includes("accessibilityLabel") && !afterTag.includes("aria-label") && !afterTag.includes("accessible={false}")) {
|
|
58
|
+
violations.push({
|
|
59
|
+
severity: "critical",
|
|
60
|
+
wcag: "1.1.1 Non-text Content",
|
|
61
|
+
message: `<${match[1]}> without accessibilityLabel. Screen readers cannot describe this control.`,
|
|
62
|
+
fix: `Add accessibilityLabel="descriptive text" to the <${match[1]}>.`,
|
|
63
|
+
file: rel,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
if (!afterTag.includes("accessibilityRole") && !afterTag.includes("role=")) {
|
|
67
|
+
violations.push({
|
|
68
|
+
severity: "serious",
|
|
69
|
+
wcag: "4.1.2 Name, Role, Value",
|
|
70
|
+
message: `<${match[1]}> without accessibilityRole. Screen readers do not know this is a button.`,
|
|
71
|
+
fix: `Add accessibilityRole="button" (or "link", "tab", etc.).`,
|
|
72
|
+
file: rel,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const imageRegex = /<Image\b/g;
|
|
77
|
+
while ((match = imageRegex.exec(content)) !== null) {
|
|
78
|
+
const afterTag = content.slice(match.index, match.index + 300);
|
|
79
|
+
if (!afterTag.includes("accessibilityLabel") && !afterTag.includes("aria-label") && !afterTag.includes("accessible={false}")) {
|
|
80
|
+
violations.push({
|
|
81
|
+
severity: "serious",
|
|
82
|
+
wcag: "1.1.1 Non-text Content",
|
|
83
|
+
message: "<Image> without accessibilityLabel. Decorative images should set accessible={false}.",
|
|
84
|
+
fix: "Add accessibilityLabel describing the image, or accessible={false} for decorative images.",
|
|
85
|
+
file: rel,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
const smallSizeRegex = /(?:width|height|minWidth|minHeight)\s*:\s*(\d+)/g;
|
|
90
|
+
while ((match = smallSizeRegex.exec(content)) !== null) {
|
|
91
|
+
const size = parseInt(match[1], 10);
|
|
92
|
+
if (size > 0 && size < 44) {
|
|
93
|
+
const context = content.slice(Math.max(0, match.index - 100), match.index + 50);
|
|
94
|
+
if (/Touchable|Pressable|Button|onPress/i.test(context)) {
|
|
95
|
+
violations.push({
|
|
96
|
+
severity: "serious",
|
|
97
|
+
wcag: "2.5.5 Target Size",
|
|
98
|
+
message: `Touch target size ${size}px is below the 44px minimum. Difficult for users with motor impairments.`,
|
|
99
|
+
fix: "Set minimum width and height to 44 (or use hitSlop to expand the tappable area).",
|
|
100
|
+
file: rel,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (content.includes("color:") && !content.includes("accessibilityLabel") && /color:\s*["']?(red|green|#ff0000|#00ff00)/i.test(content)) {
|
|
106
|
+
violations.push({
|
|
107
|
+
severity: "moderate",
|
|
108
|
+
wcag: "1.4.1 Use of Color",
|
|
109
|
+
message: "Color may be the only indicator of state. Color-blind users cannot distinguish this.",
|
|
110
|
+
fix: "Add a text label, icon, or pattern in addition to the color change.",
|
|
111
|
+
file: rel,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (violations.length === 0) {
|
|
116
|
+
violations.push({
|
|
117
|
+
severity: "minor",
|
|
118
|
+
wcag: "General",
|
|
119
|
+
message: "No common a11y violations detected in source files. Test with VoiceOver/TalkBack for full coverage.",
|
|
120
|
+
fix: "Run the app with a screen reader and verify all flows are navigable.",
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
return violations;
|
|
124
|
+
}
|
|
125
|
+
function auditFlutter(root) {
|
|
126
|
+
const violations = [];
|
|
127
|
+
const libDir = join(root, "lib");
|
|
128
|
+
const files = collectFiles(libDir, [".dart"]);
|
|
129
|
+
for (const file of files) {
|
|
130
|
+
let content;
|
|
131
|
+
try {
|
|
132
|
+
content = readFileSync(file, "utf-8");
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
const rel = file.replace(root, "").replace(/\\/g, "/");
|
|
138
|
+
const gestureDetectorRegex = /GestureDetector\(/g;
|
|
139
|
+
let match;
|
|
140
|
+
while ((match = gestureDetectorRegex.exec(content)) !== null) {
|
|
141
|
+
const afterTag = content.slice(match.index, match.index + 500);
|
|
142
|
+
if (!afterTag.includes("Semantics") && !afterTag.includes("Tooltip")) {
|
|
143
|
+
violations.push({
|
|
144
|
+
severity: "critical",
|
|
145
|
+
wcag: "1.1.1 Non-text Content",
|
|
146
|
+
message: "GestureDetector without Semantics wrapper. Invisible to screen readers.",
|
|
147
|
+
fix: "Wrap in Semantics(label: '...', button: true, child: GestureDetector(...)).",
|
|
148
|
+
file: rel,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
const inkwellRegex = /InkWell\(/g;
|
|
153
|
+
while ((match = inkwellRegex.exec(content)) !== null) {
|
|
154
|
+
const afterTag = content.slice(match.index, match.index + 500);
|
|
155
|
+
if (!afterTag.includes("Semantics") && !afterTag.includes("Tooltip") && !afterTag.includes("semanticsLabel")) {
|
|
156
|
+
violations.push({
|
|
157
|
+
severity: "serious",
|
|
158
|
+
wcag: "4.1.2 Name, Role, Value",
|
|
159
|
+
message: "InkWell without Semantics. Screen readers cannot describe this interactive element.",
|
|
160
|
+
fix: "Wrap in Semantics(label: '...', button: true) or use a named widget like ElevatedButton.",
|
|
161
|
+
file: rel,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
const imageRegex = /Image\.(asset|network|file|memory)\(/g;
|
|
166
|
+
while ((match = imageRegex.exec(content)) !== null) {
|
|
167
|
+
const afterTag = content.slice(match.index, match.index + 300);
|
|
168
|
+
if (!afterTag.includes("semanticsLabel") && !afterTag.includes("Semantics") && !afterTag.includes("excludeFromSemantics")) {
|
|
169
|
+
violations.push({
|
|
170
|
+
severity: "serious",
|
|
171
|
+
wcag: "1.1.1 Non-text Content",
|
|
172
|
+
message: `Image.${match[1]}() without semanticsLabel. Screen readers skip this image.`,
|
|
173
|
+
fix: "Add semanticsLabel: '...' or excludeFromSemantics: true for decorative images.",
|
|
174
|
+
file: rel,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
const sizedBoxRegex = /SizedBox\(\s*(?:width|height)\s*:\s*(\d+)/g;
|
|
179
|
+
while ((match = sizedBoxRegex.exec(content)) !== null) {
|
|
180
|
+
const size = parseInt(match[1], 10);
|
|
181
|
+
if (size > 0 && size < 44) {
|
|
182
|
+
const context = content.slice(Math.max(0, match.index - 200), match.index + 100);
|
|
183
|
+
if (/onTap|onPressed|InkWell|GestureDetector|IconButton/i.test(context)) {
|
|
184
|
+
violations.push({
|
|
185
|
+
severity: "serious",
|
|
186
|
+
wcag: "2.5.5 Target Size",
|
|
187
|
+
message: `Touch target constrained to ${size}px. Below the 44px minimum.`,
|
|
188
|
+
fix: "Ensure interactive elements have at least 48x48 logical pixels (Material guideline).",
|
|
189
|
+
file: rel,
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
if (violations.length === 0) {
|
|
196
|
+
violations.push({
|
|
197
|
+
severity: "minor",
|
|
198
|
+
wcag: "General",
|
|
199
|
+
message: "No common a11y violations detected. Test with TalkBack (Android) and VoiceOver (iOS).",
|
|
200
|
+
fix: "Enable TalkBack in device settings and navigate the entire app by swipe gestures.",
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
return violations;
|
|
204
|
+
}
|
|
205
|
+
export function register(server) {
|
|
206
|
+
server.tool("mobile_auditAccessibility", "Scan a mobile project for accessibility violations: missing labels, small touch targets, images without alt text, color-only indicators. Reports WCAG level for each finding.", inputSchema, async (args) => {
|
|
207
|
+
try {
|
|
208
|
+
const root = args.project_path || process.cwd();
|
|
209
|
+
if (!existsSync(root)) {
|
|
210
|
+
return errorResponse(new Error(`Project path does not exist: ${root}`));
|
|
211
|
+
}
|
|
212
|
+
const violations = args.framework === "flutter"
|
|
213
|
+
? auditFlutter(root)
|
|
214
|
+
: auditExpo(root);
|
|
215
|
+
const criticalCount = violations.filter((v) => v.severity === "critical").length;
|
|
216
|
+
const seriousCount = violations.filter((v) => v.severity === "serious").length;
|
|
217
|
+
const moderateCount = violations.filter((v) => v.severity === "moderate").length;
|
|
218
|
+
return textResponse(JSON.stringify({
|
|
219
|
+
success: true,
|
|
220
|
+
framework: args.framework,
|
|
221
|
+
summary: {
|
|
222
|
+
total_violations: violations.length,
|
|
223
|
+
critical: criticalCount,
|
|
224
|
+
serious: seriousCount,
|
|
225
|
+
moderate: moderateCount,
|
|
226
|
+
minor: violations.length - criticalCount - seriousCount - moderateCount,
|
|
227
|
+
},
|
|
228
|
+
violations,
|
|
229
|
+
}, null, 2));
|
|
230
|
+
}
|
|
231
|
+
catch (err) {
|
|
232
|
+
return errorResponse(err);
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=auditAccessibility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auditAccessibility.js","sourceRoot":"","sources":["../../src/tools/auditAccessibility.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkNativeCompat.d.ts","sourceRoot":"","sources":["../../src/tools/checkNativeCompat.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAuPzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0ChD"}
|
|
@@ -0,0 +1,255 @@
|
|
|
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 project root. Defaults to cwd."),
|
|
10
|
+
framework: z
|
|
11
|
+
.enum(["expo", "flutter"])
|
|
12
|
+
.optional()
|
|
13
|
+
.default("expo")
|
|
14
|
+
.describe("Framework (default: expo)."),
|
|
15
|
+
};
|
|
16
|
+
const KNOWN_BRIDGE_ONLY_PACKAGES = new Set([
|
|
17
|
+
"react-native-camera",
|
|
18
|
+
"react-native-image-picker",
|
|
19
|
+
"react-native-video",
|
|
20
|
+
"react-native-fbsdk",
|
|
21
|
+
"react-native-firebase",
|
|
22
|
+
"react-native-push-notification",
|
|
23
|
+
"react-native-sound",
|
|
24
|
+
"react-native-background-geolocation",
|
|
25
|
+
"@react-native-community/netinfo",
|
|
26
|
+
"react-native-bluetooth-serial",
|
|
27
|
+
]);
|
|
28
|
+
const DEPRECATED_PACKAGES = {
|
|
29
|
+
"react-native-camera": "expo-camera or react-native-vision-camera",
|
|
30
|
+
"react-native-image-picker": "expo-image-picker or react-native-image-picker@5+",
|
|
31
|
+
"react-native-fbsdk": "@react-native-fbsdk-next/fbsdk-next",
|
|
32
|
+
"react-native-push-notification": "expo-notifications or @notifee/react-native",
|
|
33
|
+
"react-native-sound": "expo-av or react-native-track-player",
|
|
34
|
+
"@react-native-community/netinfo": "@react-native-community/netinfo@11+ (New Arch support)",
|
|
35
|
+
"react-native-navigation": "expo-router or @react-navigation/native@7+",
|
|
36
|
+
"react-native-vector-icons": "@expo/vector-icons (Expo) or react-native-vector-icons@10+",
|
|
37
|
+
};
|
|
38
|
+
const NEW_ARCH_READY_PACKAGES = new Set([
|
|
39
|
+
"react-native-reanimated",
|
|
40
|
+
"react-native-gesture-handler",
|
|
41
|
+
"react-native-screens",
|
|
42
|
+
"react-native-safe-area-context",
|
|
43
|
+
"@react-native-async-storage/async-storage",
|
|
44
|
+
"react-native-svg",
|
|
45
|
+
"react-native-webview",
|
|
46
|
+
"react-native-maps",
|
|
47
|
+
"@react-native-community/datetimepicker",
|
|
48
|
+
"react-native-pager-view",
|
|
49
|
+
"react-native-vision-camera",
|
|
50
|
+
"expo-camera",
|
|
51
|
+
"expo-location",
|
|
52
|
+
"expo-notifications",
|
|
53
|
+
"expo-file-system",
|
|
54
|
+
"expo-image-picker",
|
|
55
|
+
"expo-av",
|
|
56
|
+
"expo-haptics",
|
|
57
|
+
"expo-secure-store",
|
|
58
|
+
"expo-sqlite",
|
|
59
|
+
]);
|
|
60
|
+
function auditExpoProject(root) {
|
|
61
|
+
const issues = [];
|
|
62
|
+
const pkgPath = join(root, "package.json");
|
|
63
|
+
if (!existsSync(pkgPath)) {
|
|
64
|
+
issues.push({
|
|
65
|
+
severity: "critical",
|
|
66
|
+
package_name: "package.json",
|
|
67
|
+
message: "No package.json found at project root.",
|
|
68
|
+
recommendation: "Ensure you are pointing to the correct project directory.",
|
|
69
|
+
});
|
|
70
|
+
return issues;
|
|
71
|
+
}
|
|
72
|
+
let pkg;
|
|
73
|
+
try {
|
|
74
|
+
pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
issues.push({
|
|
78
|
+
severity: "critical",
|
|
79
|
+
package_name: "package.json",
|
|
80
|
+
message: "Failed to parse package.json.",
|
|
81
|
+
recommendation: "Fix JSON syntax errors in package.json.",
|
|
82
|
+
});
|
|
83
|
+
return issues;
|
|
84
|
+
}
|
|
85
|
+
const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
86
|
+
for (const [name, version] of Object.entries(allDeps)) {
|
|
87
|
+
if (DEPRECATED_PACKAGES[name]) {
|
|
88
|
+
issues.push({
|
|
89
|
+
severity: "critical",
|
|
90
|
+
package_name: name,
|
|
91
|
+
message: `Deprecated package. Use ${DEPRECATED_PACKAGES[name]} instead.`,
|
|
92
|
+
recommendation: `Replace ${name} with ${DEPRECATED_PACKAGES[name]} for New Architecture support.`,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
else if (KNOWN_BRIDGE_ONLY_PACKAGES.has(name)) {
|
|
96
|
+
issues.push({
|
|
97
|
+
severity: "warning",
|
|
98
|
+
package_name: name,
|
|
99
|
+
message: "This package may not support the New Architecture (Fabric/TurboModules).",
|
|
100
|
+
recommendation: "Check the package README for New Architecture support or find an alternative.",
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
if (name.startsWith("react-native-") && !name.startsWith("@") && !NEW_ARCH_READY_PACKAGES.has(name)) {
|
|
104
|
+
const isKnownIssue = DEPRECATED_PACKAGES[name] || KNOWN_BRIDGE_ONLY_PACKAGES.has(name);
|
|
105
|
+
if (!isKnownIssue) {
|
|
106
|
+
issues.push({
|
|
107
|
+
severity: "info",
|
|
108
|
+
package_name: name,
|
|
109
|
+
message: "Unverified New Architecture compatibility. Check package docs.",
|
|
110
|
+
recommendation: `Verify ${name} supports Fabric/TurboModules before enabling New Architecture.`,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
const appJsonPath = join(root, "app.json");
|
|
116
|
+
if (existsSync(appJsonPath)) {
|
|
117
|
+
try {
|
|
118
|
+
const appJson = JSON.parse(readFileSync(appJsonPath, "utf-8"));
|
|
119
|
+
const newArchEnabled = appJson?.expo?.newArchEnabled;
|
|
120
|
+
if (newArchEnabled === undefined) {
|
|
121
|
+
issues.push({
|
|
122
|
+
severity: "info",
|
|
123
|
+
package_name: "app.json",
|
|
124
|
+
message: 'New Architecture not explicitly configured. Set "newArchEnabled" in app.json.',
|
|
125
|
+
recommendation: 'Add "newArchEnabled": true under expo key to enable Fabric and TurboModules.',
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
catch { /* skip parse errors */ }
|
|
130
|
+
}
|
|
131
|
+
if (issues.length === 0) {
|
|
132
|
+
issues.push({
|
|
133
|
+
severity: "info",
|
|
134
|
+
package_name: "project",
|
|
135
|
+
message: "No known compatibility issues detected. All checked packages appear New Architecture ready.",
|
|
136
|
+
recommendation: "Enable New Architecture in app.json and test thoroughly on both platforms.",
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
return issues;
|
|
140
|
+
}
|
|
141
|
+
function auditFlutterProject(root) {
|
|
142
|
+
const issues = [];
|
|
143
|
+
const pubspecPath = join(root, "pubspec.yaml");
|
|
144
|
+
if (!existsSync(pubspecPath)) {
|
|
145
|
+
issues.push({
|
|
146
|
+
severity: "critical",
|
|
147
|
+
package_name: "pubspec.yaml",
|
|
148
|
+
message: "No pubspec.yaml found at project root.",
|
|
149
|
+
recommendation: "Ensure you are pointing to the correct Flutter project directory.",
|
|
150
|
+
});
|
|
151
|
+
return issues;
|
|
152
|
+
}
|
|
153
|
+
let content;
|
|
154
|
+
try {
|
|
155
|
+
content = readFileSync(pubspecPath, "utf-8");
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
issues.push({
|
|
159
|
+
severity: "critical",
|
|
160
|
+
package_name: "pubspec.yaml",
|
|
161
|
+
message: "Failed to read pubspec.yaml.",
|
|
162
|
+
recommendation: "Check file permissions.",
|
|
163
|
+
});
|
|
164
|
+
return issues;
|
|
165
|
+
}
|
|
166
|
+
const sdkMatch = content.match(/sdk:\s*['"]?>=?\s*([\d.]+)/);
|
|
167
|
+
if (sdkMatch) {
|
|
168
|
+
const minSdk = sdkMatch[1];
|
|
169
|
+
const parts = minSdk.split(".").map(Number);
|
|
170
|
+
if (parts[0] < 3) {
|
|
171
|
+
issues.push({
|
|
172
|
+
severity: "critical",
|
|
173
|
+
package_name: "dart-sdk",
|
|
174
|
+
message: `Dart SDK constraint starts at ${minSdk}. Dart 3+ is required for modern Flutter.`,
|
|
175
|
+
recommendation: "Update sdk constraint to >=3.0.0 in pubspec.yaml.",
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
const androidDir = join(root, "android");
|
|
180
|
+
if (existsSync(androidDir)) {
|
|
181
|
+
const buildGradlePath = join(androidDir, "app", "build.gradle");
|
|
182
|
+
if (existsSync(buildGradlePath)) {
|
|
183
|
+
try {
|
|
184
|
+
const gradle = readFileSync(buildGradlePath, "utf-8");
|
|
185
|
+
const minSdkMatch = gradle.match(/minSdkVersion\s+(\d+)/);
|
|
186
|
+
if (minSdkMatch && parseInt(minSdkMatch[1], 10) < 21) {
|
|
187
|
+
issues.push({
|
|
188
|
+
severity: "warning",
|
|
189
|
+
package_name: "android/app/build.gradle",
|
|
190
|
+
message: `minSdkVersion ${minSdkMatch[1]} is below 21. Most modern packages require 21+.`,
|
|
191
|
+
recommendation: "Update minSdkVersion to at least 21 (or 23 for best compatibility).",
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
catch { /* skip */ }
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
const deprecatedFlutterPackages = {
|
|
199
|
+
"flutter_webview_plugin": "webview_flutter",
|
|
200
|
+
"flutter_calendar_carousel": "table_calendar",
|
|
201
|
+
"flutter_slidable": "flutter_slidable@3+ (check API migration)",
|
|
202
|
+
"cached_network_image": "cached_network_image@3+ (null safety)",
|
|
203
|
+
"sqflite": "drift or sqflite@2+ (null safety)",
|
|
204
|
+
};
|
|
205
|
+
for (const [name, replacement] of Object.entries(deprecatedFlutterPackages)) {
|
|
206
|
+
if (content.includes(name + ":")) {
|
|
207
|
+
issues.push({
|
|
208
|
+
severity: "warning",
|
|
209
|
+
package_name: name,
|
|
210
|
+
message: `Consider upgrading or replacing with ${replacement}.`,
|
|
211
|
+
recommendation: `Migrate from ${name} to ${replacement} for better compatibility.`,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
if (issues.length === 0) {
|
|
216
|
+
issues.push({
|
|
217
|
+
severity: "info",
|
|
218
|
+
package_name: "project",
|
|
219
|
+
message: "No known compatibility issues detected.",
|
|
220
|
+
recommendation: "Run flutter analyze and flutter test to verify full compatibility.",
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
return issues;
|
|
224
|
+
}
|
|
225
|
+
export function register(server) {
|
|
226
|
+
server.tool("mobile_checkNativeCompat", "Audit installed packages for New Architecture (Fabric/TurboModules) support. Flag bridge-only dependencies, deprecated native APIs, and packages without JSI support.", inputSchema, async (args) => {
|
|
227
|
+
try {
|
|
228
|
+
const root = args.project_path || process.cwd();
|
|
229
|
+
if (!existsSync(root)) {
|
|
230
|
+
return errorResponse(new Error(`Project path does not exist: ${root}`));
|
|
231
|
+
}
|
|
232
|
+
const issues = args.framework === "flutter"
|
|
233
|
+
? auditFlutterProject(root)
|
|
234
|
+
: auditExpoProject(root);
|
|
235
|
+
const criticalCount = issues.filter((i) => i.severity === "critical").length;
|
|
236
|
+
const warningCount = issues.filter((i) => i.severity === "warning").length;
|
|
237
|
+
const infoCount = issues.filter((i) => i.severity === "info").length;
|
|
238
|
+
return textResponse(JSON.stringify({
|
|
239
|
+
success: true,
|
|
240
|
+
framework: args.framework,
|
|
241
|
+
summary: {
|
|
242
|
+
total_issues: issues.length,
|
|
243
|
+
critical: criticalCount,
|
|
244
|
+
warnings: warningCount,
|
|
245
|
+
info: infoCount,
|
|
246
|
+
},
|
|
247
|
+
issues,
|
|
248
|
+
}, null, 2));
|
|
249
|
+
}
|
|
250
|
+
catch (err) {
|
|
251
|
+
return errorResponse(err);
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
//# sourceMappingURL=checkNativeCompat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkNativeCompat.js","sourceRoot":"","sources":["../../src/tools/checkNativeCompat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createNativeModule.d.ts","sourceRoot":"","sources":["../../src/tools/createNativeModule.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkOzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA4FhD"}
|