metro-mcp 0.7.1 → 0.7.2
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/bin/metro-mcp.js +36 -39
- package/dist/index.js +36 -39
- package/dist/plugins/ui-interact.d.ts.map +1 -1
- package/dist/utils/fiber.d.ts +7 -0
- package/dist/utils/fiber.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/bin/metro-mcp.js
CHANGED
|
@@ -4029,7 +4029,7 @@ function extractCDPExceptionMessage(details, fallback = "Evaluation failed") {
|
|
|
4029
4029
|
// package.json
|
|
4030
4030
|
var package_default = {
|
|
4031
4031
|
name: "metro-mcp",
|
|
4032
|
-
version: "0.7.
|
|
4032
|
+
version: "0.7.2",
|
|
4033
4033
|
description: "Plugin-based MCP server for React Native/Expo runtime debugging, inspection, and automation via Metro/CDP",
|
|
4034
4034
|
homepage: "https://metromcp.dev",
|
|
4035
4035
|
repository: {
|
|
@@ -5929,6 +5929,37 @@ var SWIPE_COORDS = {
|
|
|
5929
5929
|
left: [800, 1000, 200, 1000],
|
|
5930
5930
|
right: [200, 1000, 800, 1000]
|
|
5931
5931
|
};
|
|
5932
|
+
var FIND_AND_INVOKE_JS = `
|
|
5933
|
+
function findAndInvoke(needle, handlerName) {
|
|
5934
|
+
var target = null;
|
|
5935
|
+
var stack = [rootFiber];
|
|
5936
|
+
while (stack.length && !target) {
|
|
5937
|
+
var fiber = stack.pop();
|
|
5938
|
+
if (!fiber) continue;
|
|
5939
|
+
var props = fiber.memoizedProps || {};
|
|
5940
|
+
if (props.accessibilityLabel === needle ||
|
|
5941
|
+
props['aria-label'] === needle ||
|
|
5942
|
+
props.testID === needle) {
|
|
5943
|
+
target = fiber;
|
|
5944
|
+
} else {
|
|
5945
|
+
if (fiber.sibling) stack.push(fiber.sibling);
|
|
5946
|
+
if (fiber.child) stack.push(fiber.child);
|
|
5947
|
+
}
|
|
5948
|
+
}
|
|
5949
|
+
if (!target) return false;
|
|
5950
|
+
var f = target;
|
|
5951
|
+
var depth = 0;
|
|
5952
|
+
while (f && depth < 50) {
|
|
5953
|
+
if (f.memoizedProps && f.memoizedProps[handlerName]) {
|
|
5954
|
+
f.memoizedProps[handlerName]({ nativeEvent: {} });
|
|
5955
|
+
return true;
|
|
5956
|
+
}
|
|
5957
|
+
f = f.return;
|
|
5958
|
+
depth++;
|
|
5959
|
+
}
|
|
5960
|
+
return false;
|
|
5961
|
+
}
|
|
5962
|
+
`;
|
|
5932
5963
|
var GET_ROUTE_FUNC_JS = `function getRoute() {
|
|
5933
5964
|
try {
|
|
5934
5965
|
var n = globalThis.__METRO_MCP_NAV_REF__;
|
|
@@ -6080,25 +6111,8 @@ var uiInteractPlugin = definePlugin({
|
|
|
6080
6111
|
const tapped = await ctx.evalInApp(`
|
|
6081
6112
|
(function() {
|
|
6082
6113
|
${FIBER_ROOT_JS}
|
|
6083
|
-
|
|
6084
|
-
|
|
6085
|
-
var stack = [rootFiber];
|
|
6086
|
-
while (stack.length && !target) {
|
|
6087
|
-
var fiber = stack.pop();
|
|
6088
|
-
if (!fiber) continue;
|
|
6089
|
-
var props = fiber.memoizedProps || {};
|
|
6090
|
-
if ((props.accessibilityLabel === needle ||
|
|
6091
|
-
props['aria-label'] === needle ||
|
|
6092
|
-
props.testID === needle) && props.onPress) {
|
|
6093
|
-
target = fiber;
|
|
6094
|
-
} else {
|
|
6095
|
-
if (fiber.sibling) stack.push(fiber.sibling);
|
|
6096
|
-
if (fiber.child) stack.push(fiber.child);
|
|
6097
|
-
}
|
|
6098
|
-
}
|
|
6099
|
-
if (!target) return false;
|
|
6100
|
-
target.memoizedProps.onPress({ nativeEvent: {} });
|
|
6101
|
-
return true;
|
|
6114
|
+
${FIND_AND_INVOKE_JS}
|
|
6115
|
+
return findAndInvoke(${jsLabel}, 'onPress');
|
|
6102
6116
|
})()
|
|
6103
6117
|
`).catch(() => false);
|
|
6104
6118
|
if (tapped)
|
|
@@ -6218,25 +6232,8 @@ var uiInteractPlugin = definePlugin({
|
|
|
6218
6232
|
const pressed = await ctx.evalInApp(`
|
|
6219
6233
|
(function() {
|
|
6220
6234
|
${FIBER_ROOT_JS}
|
|
6221
|
-
|
|
6222
|
-
|
|
6223
|
-
var stack = [rootFiber];
|
|
6224
|
-
while (stack.length && !target) {
|
|
6225
|
-
var fiber = stack.pop();
|
|
6226
|
-
if (!fiber) continue;
|
|
6227
|
-
var props = fiber.memoizedProps || {};
|
|
6228
|
-
if ((props.accessibilityLabel === needle ||
|
|
6229
|
-
props['aria-label'] === needle ||
|
|
6230
|
-
props.testID === needle) && props.onLongPress) {
|
|
6231
|
-
target = fiber;
|
|
6232
|
-
} else {
|
|
6233
|
-
if (fiber.sibling) stack.push(fiber.sibling);
|
|
6234
|
-
if (fiber.child) stack.push(fiber.child);
|
|
6235
|
-
}
|
|
6236
|
-
}
|
|
6237
|
-
if (!target) return false;
|
|
6238
|
-
target.memoizedProps.onLongPress({ nativeEvent: {} });
|
|
6239
|
-
return true;
|
|
6235
|
+
${FIND_AND_INVOKE_JS}
|
|
6236
|
+
return findAndInvoke(${jsLabel}, 'onLongPress');
|
|
6240
6237
|
})()
|
|
6241
6238
|
`).catch(() => false);
|
|
6242
6239
|
if (pressed)
|
package/dist/index.js
CHANGED
|
@@ -4037,7 +4037,7 @@ function extractCDPExceptionMessage(details, fallback = "Evaluation failed") {
|
|
|
4037
4037
|
// package.json
|
|
4038
4038
|
var package_default = {
|
|
4039
4039
|
name: "metro-mcp",
|
|
4040
|
-
version: "0.7.
|
|
4040
|
+
version: "0.7.2",
|
|
4041
4041
|
description: "Plugin-based MCP server for React Native/Expo runtime debugging, inspection, and automation via Metro/CDP",
|
|
4042
4042
|
homepage: "https://metromcp.dev",
|
|
4043
4043
|
repository: {
|
|
@@ -5932,6 +5932,37 @@ var SWIPE_COORDS = {
|
|
|
5932
5932
|
left: [800, 1000, 200, 1000],
|
|
5933
5933
|
right: [200, 1000, 800, 1000]
|
|
5934
5934
|
};
|
|
5935
|
+
var FIND_AND_INVOKE_JS = `
|
|
5936
|
+
function findAndInvoke(needle, handlerName) {
|
|
5937
|
+
var target = null;
|
|
5938
|
+
var stack = [rootFiber];
|
|
5939
|
+
while (stack.length && !target) {
|
|
5940
|
+
var fiber = stack.pop();
|
|
5941
|
+
if (!fiber) continue;
|
|
5942
|
+
var props = fiber.memoizedProps || {};
|
|
5943
|
+
if (props.accessibilityLabel === needle ||
|
|
5944
|
+
props['aria-label'] === needle ||
|
|
5945
|
+
props.testID === needle) {
|
|
5946
|
+
target = fiber;
|
|
5947
|
+
} else {
|
|
5948
|
+
if (fiber.sibling) stack.push(fiber.sibling);
|
|
5949
|
+
if (fiber.child) stack.push(fiber.child);
|
|
5950
|
+
}
|
|
5951
|
+
}
|
|
5952
|
+
if (!target) return false;
|
|
5953
|
+
var f = target;
|
|
5954
|
+
var depth = 0;
|
|
5955
|
+
while (f && depth < 50) {
|
|
5956
|
+
if (f.memoizedProps && f.memoizedProps[handlerName]) {
|
|
5957
|
+
f.memoizedProps[handlerName]({ nativeEvent: {} });
|
|
5958
|
+
return true;
|
|
5959
|
+
}
|
|
5960
|
+
f = f.return;
|
|
5961
|
+
depth++;
|
|
5962
|
+
}
|
|
5963
|
+
return false;
|
|
5964
|
+
}
|
|
5965
|
+
`;
|
|
5935
5966
|
var GET_ROUTE_FUNC_JS = `function getRoute() {
|
|
5936
5967
|
try {
|
|
5937
5968
|
var n = globalThis.__METRO_MCP_NAV_REF__;
|
|
@@ -6083,25 +6114,8 @@ var uiInteractPlugin = definePlugin({
|
|
|
6083
6114
|
const tapped = await ctx.evalInApp(`
|
|
6084
6115
|
(function() {
|
|
6085
6116
|
${FIBER_ROOT_JS}
|
|
6086
|
-
|
|
6087
|
-
|
|
6088
|
-
var stack = [rootFiber];
|
|
6089
|
-
while (stack.length && !target) {
|
|
6090
|
-
var fiber = stack.pop();
|
|
6091
|
-
if (!fiber) continue;
|
|
6092
|
-
var props = fiber.memoizedProps || {};
|
|
6093
|
-
if ((props.accessibilityLabel === needle ||
|
|
6094
|
-
props['aria-label'] === needle ||
|
|
6095
|
-
props.testID === needle) && props.onPress) {
|
|
6096
|
-
target = fiber;
|
|
6097
|
-
} else {
|
|
6098
|
-
if (fiber.sibling) stack.push(fiber.sibling);
|
|
6099
|
-
if (fiber.child) stack.push(fiber.child);
|
|
6100
|
-
}
|
|
6101
|
-
}
|
|
6102
|
-
if (!target) return false;
|
|
6103
|
-
target.memoizedProps.onPress({ nativeEvent: {} });
|
|
6104
|
-
return true;
|
|
6117
|
+
${FIND_AND_INVOKE_JS}
|
|
6118
|
+
return findAndInvoke(${jsLabel}, 'onPress');
|
|
6105
6119
|
})()
|
|
6106
6120
|
`).catch(() => false);
|
|
6107
6121
|
if (tapped)
|
|
@@ -6221,25 +6235,8 @@ var uiInteractPlugin = definePlugin({
|
|
|
6221
6235
|
const pressed = await ctx.evalInApp(`
|
|
6222
6236
|
(function() {
|
|
6223
6237
|
${FIBER_ROOT_JS}
|
|
6224
|
-
|
|
6225
|
-
|
|
6226
|
-
var stack = [rootFiber];
|
|
6227
|
-
while (stack.length && !target) {
|
|
6228
|
-
var fiber = stack.pop();
|
|
6229
|
-
if (!fiber) continue;
|
|
6230
|
-
var props = fiber.memoizedProps || {};
|
|
6231
|
-
if ((props.accessibilityLabel === needle ||
|
|
6232
|
-
props['aria-label'] === needle ||
|
|
6233
|
-
props.testID === needle) && props.onLongPress) {
|
|
6234
|
-
target = fiber;
|
|
6235
|
-
} else {
|
|
6236
|
-
if (fiber.sibling) stack.push(fiber.sibling);
|
|
6237
|
-
if (fiber.child) stack.push(fiber.child);
|
|
6238
|
-
}
|
|
6239
|
-
}
|
|
6240
|
-
if (!target) return false;
|
|
6241
|
-
target.memoizedProps.onLongPress({ nativeEvent: {} });
|
|
6242
|
-
return true;
|
|
6238
|
+
${FIND_AND_INVOKE_JS}
|
|
6239
|
+
return findAndInvoke(${jsLabel}, 'onLongPress');
|
|
6243
6240
|
})()
|
|
6244
6241
|
`).catch(() => false);
|
|
6245
6242
|
if (pressed)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-interact.d.ts","sourceRoot":"","sources":["../../src/plugins/ui-interact.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,gBAAgB,
|
|
1
|
+
{"version":3,"file":"ui-interact.d.ts","sourceRoot":"","sources":["../../src/plugins/ui-interact.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,gBAAgB,yCAqgB3B,CAAC"}
|
package/dist/utils/fiber.d.ts
CHANGED
|
@@ -21,6 +21,13 @@ export declare const COLLECT_ELEMENTS_JS = "\n (function() {\n var hook = gl
|
|
|
21
21
|
* Shared by test-recorder (test generation) and ui-interact (native fallback swipes).
|
|
22
22
|
*/
|
|
23
23
|
export declare const SWIPE_COORDS: Record<string, [number, number, number, number]>;
|
|
24
|
+
/**
|
|
25
|
+
* JS snippet defining `findAndInvoke(needle, handlerName)`.
|
|
26
|
+
* Requires `rootFiber` to be set (embed after FIBER_ROOT_JS).
|
|
27
|
+
* Finds the fiber matching needle by accessibilityLabel, aria-label, or testID,
|
|
28
|
+
* then walks up to the nearest ancestor that has `handlerName` and calls it.
|
|
29
|
+
*/
|
|
30
|
+
export declare const FIND_AND_INVOKE_JS = "\n function findAndInvoke(needle, handlerName) {\n var target = null;\n var stack = [rootFiber];\n while (stack.length && !target) {\n var fiber = stack.pop();\n if (!fiber) continue;\n var props = fiber.memoizedProps || {};\n if (props.accessibilityLabel === needle ||\n props['aria-label'] === needle ||\n props.testID === needle) {\n target = fiber;\n } else {\n if (fiber.sibling) stack.push(fiber.sibling);\n if (fiber.child) stack.push(fiber.child);\n }\n }\n if (!target) return false;\n var f = target;\n var depth = 0;\n while (f && depth < 50) {\n if (f.memoizedProps && f.memoizedProps[handlerName]) {\n f.memoizedProps[handlerName]({ nativeEvent: {} });\n return true;\n }\n f = f.return;\n depth++;\n }\n return false;\n }\n";
|
|
24
31
|
/**
|
|
25
32
|
* JS snippet that defines a `getRoute()` function reading from the nav ref set by the
|
|
26
33
|
* navigation plugin. Embed inside an IIFE that also calls `getRoute()`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fiber.d.ts","sourceRoot":"","sources":["../../src/utils/fiber.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;GAIG;AACH,eAAO,MAAM,aAAa,waAYzB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,svDA4C/B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAKzE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,kNAM5B,CAAC;AAEH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,KAAK,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtG,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAEnF"}
|
|
1
|
+
{"version":3,"file":"fiber.d.ts","sourceRoot":"","sources":["../../src/utils/fiber.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;GAIG;AACH,eAAO,MAAM,aAAa,waAYzB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,svDA4C/B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAKzE,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,62BA8B9B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,kNAM5B,CAAC;AAEH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,KAAK,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtG,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAEnF"}
|
package/package.json
CHANGED