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.
@@ -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.1",
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
- var needle = ${jsLabel};
6084
- var target = null;
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
- var needle = ${jsLabel};
6222
- var target = null;
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.1",
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
- var needle = ${jsLabel};
6087
- var target = null;
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
- var needle = ${jsLabel};
6225
- var target = null;
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,yCAuiB3B,CAAC"}
1
+ {"version":3,"file":"ui-interact.d.ts","sourceRoot":"","sources":["../../src/plugins/ui-interact.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,gBAAgB,yCAqgB3B,CAAC"}
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "metro-mcp",
3
- "version": "0.7.1",
3
+ "version": "0.7.2",
4
4
  "description": "Plugin-based MCP server for React Native/Expo runtime debugging, inspection, and automation via Metro/CDP",
5
5
  "homepage": "https://metromcp.dev",
6
6
  "repository": {