zig-mobile-runner 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 (225) hide show
  1. package/CHANGELOG.md +484 -0
  2. package/CONTRIBUTING.md +42 -0
  3. package/FEATURES.md +112 -0
  4. package/LICENSE +21 -0
  5. package/README.md +255 -0
  6. package/SECURITY.md +34 -0
  7. package/build.zig +38 -0
  8. package/build.zig.zon +7 -0
  9. package/clients/README.md +144 -0
  10. package/clients/go/README.md +24 -0
  11. package/clients/go/examples/fake-session/main.go +93 -0
  12. package/clients/go/go.mod +3 -0
  13. package/clients/go/zmr/client.go +432 -0
  14. package/clients/kotlin/README.md +35 -0
  15. package/clients/kotlin/build.gradle.kts +35 -0
  16. package/clients/kotlin/settings.gradle.kts +15 -0
  17. package/clients/kotlin/src/main/kotlin/dev/zmr/FakeSession.kt +86 -0
  18. package/clients/kotlin/src/main/kotlin/dev/zmr/ZmrClient.kt +67 -0
  19. package/clients/python/README.md +29 -0
  20. package/clients/python/examples/fake_session.py +48 -0
  21. package/clients/python/pyproject.toml +13 -0
  22. package/clients/python/zmr_client.py +202 -0
  23. package/clients/rust/Cargo.lock +107 -0
  24. package/clients/rust/Cargo.toml +10 -0
  25. package/clients/rust/README.md +19 -0
  26. package/clients/rust/examples/fake_session.rs +70 -0
  27. package/clients/rust/src/lib.rs +461 -0
  28. package/clients/swift/Package.swift +16 -0
  29. package/clients/swift/README.md +36 -0
  30. package/clients/swift/Sources/ZMRClient/ZMRClient.swift +114 -0
  31. package/clients/swift/Sources/ZMRFakeSession/main.swift +86 -0
  32. package/clients/typescript/README.md +34 -0
  33. package/clients/typescript/examples/fake-session.mjs +36 -0
  34. package/clients/typescript/index.d.ts +144 -0
  35. package/clients/typescript/index.mjs +192 -0
  36. package/clients/typescript/package.json +8 -0
  37. package/docs/adr/0001-agent-native-runner-boundary.md +31 -0
  38. package/docs/adr/0002-app-local-zmr-contract.md +39 -0
  39. package/docs/adr/0003-ios-simulator-xctest-shim.md +41 -0
  40. package/docs/adr/0004-benchmark-claims-and-baseline-collection.md +37 -0
  41. package/docs/adr/README.md +12 -0
  42. package/docs/ai-agents.md +156 -0
  43. package/docs/app-integration.md +316 -0
  44. package/docs/benchmarking.md +275 -0
  45. package/docs/client-installation.md +141 -0
  46. package/docs/clients.md +98 -0
  47. package/docs/config.md +175 -0
  48. package/docs/demo.md +259 -0
  49. package/docs/dsl.md +57 -0
  50. package/docs/install.md +233 -0
  51. package/docs/market-positioning.md +70 -0
  52. package/docs/npm.md +359 -0
  53. package/docs/protocol-fixtures/README.md +8 -0
  54. package/docs/protocol-fixtures/core-session.requests.jsonl +8 -0
  55. package/docs/protocol-fixtures/core-session.responses.jsonl +8 -0
  56. package/docs/protocol-versioning.md +65 -0
  57. package/docs/protocol.md +560 -0
  58. package/docs/publication.md +77 -0
  59. package/docs/release-audit.md +99 -0
  60. package/docs/release-candidate.md +111 -0
  61. package/docs/release-evidence.md +188 -0
  62. package/docs/release-notes-template.md +58 -0
  63. package/docs/roadmap.md +334 -0
  64. package/docs/scenario-authoring.md +88 -0
  65. package/docs/shipping.md +170 -0
  66. package/docs/trace-privacy.md +88 -0
  67. package/docs/troubleshooting.md +256 -0
  68. package/examples/android-app-auth-probe.json +89 -0
  69. package/examples/android-app-error-state.json +13 -0
  70. package/examples/android-app-login-smoke.json +192 -0
  71. package/examples/android-app-onboarding.json +12 -0
  72. package/examples/android-app-referral-deep-link.json +12 -0
  73. package/examples/android-shim-smoke.json +19 -0
  74. package/examples/demo-failure.json +12 -0
  75. package/examples/demo-fake.json +14 -0
  76. package/examples/ios-dev-client-open-link.json +26 -0
  77. package/examples/ios-dev-client-route-snapshot.json +24 -0
  78. package/examples/ios-shim-smoke.json +23 -0
  79. package/examples/ios-smoke.json +9 -0
  80. package/go.work +3 -0
  81. package/npm/agents.mjs +183 -0
  82. package/npm/app-config.mjs +95 -0
  83. package/npm/build-zmr.mjs +21 -0
  84. package/npm/commands.mjs +104 -0
  85. package/npm/generated-files.mjs +50 -0
  86. package/npm/index.mjs +75 -0
  87. package/npm/init-app.mjs +80 -0
  88. package/npm/package-scripts.mjs +72 -0
  89. package/npm/postinstall.mjs +21 -0
  90. package/npm/scaffold.mjs +179 -0
  91. package/npm/scenarios.mjs +93 -0
  92. package/npm/setup.mjs +69 -0
  93. package/npm/wizard.mjs +117 -0
  94. package/npm/zmr.mjs +23 -0
  95. package/package.json +114 -0
  96. package/prebuilds/darwin-arm64/zmr +0 -0
  97. package/prebuilds/darwin-x64/zmr +0 -0
  98. package/prebuilds/linux-arm64/zmr +0 -0
  99. package/prebuilds/linux-x64/zmr +0 -0
  100. package/schemas/README.md +26 -0
  101. package/schemas/action-result.schema.json +27 -0
  102. package/schemas/capabilities-output.schema.json +98 -0
  103. package/schemas/devices-output.schema.json +25 -0
  104. package/schemas/doctor-output.schema.json +51 -0
  105. package/schemas/explain-output.schema.json +51 -0
  106. package/schemas/import-output.schema.json +23 -0
  107. package/schemas/init-output.schema.json +71 -0
  108. package/schemas/json-rpc.schema.json +55 -0
  109. package/schemas/release-manifest.schema.json +43 -0
  110. package/schemas/release-readiness-output.schema.json +127 -0
  111. package/schemas/run-output.schema.json +43 -0
  112. package/schemas/scenario.schema.json +128 -0
  113. package/schemas/schemas-output.schema.json +26 -0
  114. package/schemas/semantic-snapshot.schema.json +116 -0
  115. package/schemas/snapshot.schema.json +60 -0
  116. package/schemas/trace-event.schema.json +14 -0
  117. package/schemas/trace-manifest.schema.json +59 -0
  118. package/schemas/validate-output.schema.json +42 -0
  119. package/schemas/version-output.schema.json +23 -0
  120. package/schemas/zmr-config.schema.json +75 -0
  121. package/scripts/android-emulator.sh +126 -0
  122. package/scripts/assert-ios-physical-ready.sh +213 -0
  123. package/scripts/benchmark-command.sh +307 -0
  124. package/scripts/benchmark.sh +359 -0
  125. package/scripts/benchmark_gate.py +117 -0
  126. package/scripts/benchmark_result_row.py +88 -0
  127. package/scripts/compare-benchmarks.py +288 -0
  128. package/scripts/create-android-demo-app.sh +342 -0
  129. package/scripts/create-ios-demo-app.sh +261 -0
  130. package/scripts/demo-android-real.sh +232 -0
  131. package/scripts/demo-ios-real.sh +270 -0
  132. package/scripts/demo.sh +464 -0
  133. package/scripts/device-matrix.sh +338 -0
  134. package/scripts/ensure-ios-shim-target.rb +237 -0
  135. package/scripts/install-android-shim.sh +281 -0
  136. package/scripts/install-ios-shim.sh +589 -0
  137. package/scripts/pilot-gate.sh +560 -0
  138. package/scripts/release-readiness.py +838 -0
  139. package/scripts/release-readiness.sh +91 -0
  140. package/scripts/run-android-pilot.sh +561 -0
  141. package/scripts/run-ios-pilot.sh +509 -0
  142. package/shims/android/README.md +21 -0
  143. package/shims/android/ZMRShimInstrumentedTest.java +152 -0
  144. package/shims/android/protocol.md +18 -0
  145. package/shims/ios/README.md +50 -0
  146. package/shims/ios/ZMRShim.swift +110 -0
  147. package/shims/ios/ZMRShimUITestCase.swift +475 -0
  148. package/shims/ios/protocol.md +74 -0
  149. package/skills/zmr-mobile-testing/SKILL.md +127 -0
  150. package/src/android.zig +344 -0
  151. package/src/android_device_info.zig +99 -0
  152. package/src/android_emulator.zig +154 -0
  153. package/src/android_screen_recording.zig +112 -0
  154. package/src/android_shell.zig +112 -0
  155. package/src/bundle.zig +124 -0
  156. package/src/bundle_redaction.zig +272 -0
  157. package/src/bundle_tar.zig +123 -0
  158. package/src/cli_devices.zig +97 -0
  159. package/src/cli_doctor.zig +114 -0
  160. package/src/cli_import.zig +70 -0
  161. package/src/cli_info.zig +39 -0
  162. package/src/cli_init.zig +72 -0
  163. package/src/cli_output.zig +467 -0
  164. package/src/cli_run.zig +259 -0
  165. package/src/cli_serve.zig +287 -0
  166. package/src/cli_trace.zig +111 -0
  167. package/src/cli_validate.zig +41 -0
  168. package/src/command.zig +211 -0
  169. package/src/config.zig +305 -0
  170. package/src/config_diagnostics.zig +212 -0
  171. package/src/config_paths.zig +49 -0
  172. package/src/device_registry.zig +37 -0
  173. package/src/doctor.zig +412 -0
  174. package/src/doctor_hints.zig +52 -0
  175. package/src/errors.zig +55 -0
  176. package/src/fake_device.zig +163 -0
  177. package/src/health.zig +28 -0
  178. package/src/importer.zig +343 -0
  179. package/src/importer_json.zig +100 -0
  180. package/src/importer_model.zig +103 -0
  181. package/src/ios.zig +399 -0
  182. package/src/ios_devices.zig +219 -0
  183. package/src/ios_lifecycle.zig +72 -0
  184. package/src/ios_shim.zig +242 -0
  185. package/src/ios_snapshot.zig +20 -0
  186. package/src/json_fields.zig +80 -0
  187. package/src/json_rpc.zig +150 -0
  188. package/src/json_rpc_methods.zig +318 -0
  189. package/src/json_rpc_observation.zig +31 -0
  190. package/src/json_rpc_params.zig +52 -0
  191. package/src/json_rpc_protocol.zig +110 -0
  192. package/src/json_rpc_trace.zig +73 -0
  193. package/src/main.zig +135 -0
  194. package/src/mcp.zig +234 -0
  195. package/src/mcp_protocol.zig +64 -0
  196. package/src/mcp_trace.zig +83 -0
  197. package/src/report.zig +346 -0
  198. package/src/report_html.zig +63 -0
  199. package/src/report_values.zig +27 -0
  200. package/src/run_options.zig +152 -0
  201. package/src/runner.zig +280 -0
  202. package/src/runner_actions.zig +109 -0
  203. package/src/runner_config.zig +6 -0
  204. package/src/runner_diagnostics.zig +268 -0
  205. package/src/runner_events.zig +170 -0
  206. package/src/runner_native.zig +88 -0
  207. package/src/runner_waits.zig +300 -0
  208. package/src/scaffold.zig +472 -0
  209. package/src/scenario.zig +346 -0
  210. package/src/scenario_fields.zig +50 -0
  211. package/src/schema_registry.zig +53 -0
  212. package/src/selector.zig +84 -0
  213. package/src/semantic.zig +171 -0
  214. package/src/trace.zig +315 -0
  215. package/src/trace_json.zig +340 -0
  216. package/src/trace_summary.zig +218 -0
  217. package/src/trace_summary_diagnostic.zig +202 -0
  218. package/src/types.zig +120 -0
  219. package/src/uiautomator.zig +164 -0
  220. package/src/validation.zig +187 -0
  221. package/src/version.zig +22 -0
  222. package/viewer/app.js +373 -0
  223. package/viewer/index.html +126 -0
  224. package/viewer/parser.js +233 -0
  225. package/viewer/styles.css +585 -0
@@ -0,0 +1,281 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ SOURCE="${BASH_SOURCE[0]}"
5
+ while [[ -h "$SOURCE" ]]; do
6
+ SOURCE_DIR="$(cd -P "$(dirname "$SOURCE")" && pwd)"
7
+ SOURCE="$(readlink "$SOURCE")"
8
+ if [[ "$SOURCE" != /* ]]; then
9
+ SOURCE="$SOURCE_DIR/$SOURCE"
10
+ fi
11
+ done
12
+
13
+ ROOT="$(cd -P "$(dirname "$SOURCE")/.." && pwd)"
14
+ APP_ROOT=""
15
+ TEST_PACKAGE=""
16
+ RUNNER="androidx.test.runner.AndroidJUnitRunner"
17
+ RUNNER_PROVIDED=0
18
+ DEVICE=""
19
+ ANDROID_MODULE=""
20
+ GRADLE_FILE=""
21
+
22
+ usage() {
23
+ cat <<'USAGE'
24
+ Usage:
25
+ scripts/install-android-shim.sh --app-root <dir> --test-package <id> [options]
26
+
27
+ Writes an app-local .zmr/android-shim command and Android instrumentation
28
+ source file.
29
+
30
+ Options:
31
+ --app-root <dir> App repository root. Required.
32
+ --test-package <id> Android test package, for example com.example.app.test. Required.
33
+ --runner <class> Instrumentation runner. Default: androidx.test.runner.AndroidJUnitRunner.
34
+ --device <serial> Optional adb device serial.
35
+ --android-module <dir> Android app module dir, relative to app root or absolute.
36
+ Copies the shim into src/androidTest/java/dev/zmr/shim/.
37
+ --gradle-file <file> Gradle build file to patch with AndroidX test deps,
38
+ relative to app root or absolute. Guarded/idempotent.
39
+ -h, --help Show this help.
40
+
41
+ Without --android-module, add .zmr/ZMRShimInstrumentedTest.java to the app's
42
+ androidTest source set manually. With --android-module, this script writes the
43
+ source into the module's default androidTest tree.
44
+ USAGE
45
+ }
46
+
47
+ die() {
48
+ echo "error: $*" >&2
49
+ exit 2
50
+ }
51
+
52
+ require_value() {
53
+ local flag="$1"
54
+ local value="${2-}"
55
+ if [[ -z "$value" || "$value" == --* ]]; then
56
+ die "$flag requires a value"
57
+ fi
58
+ printf '%s\n' "$value"
59
+ }
60
+
61
+ while [[ $# -gt 0 ]]; do
62
+ case "$1" in
63
+ --app-root)
64
+ APP_ROOT="$(require_value "$1" "${2-}")"
65
+ shift 2
66
+ ;;
67
+ --test-package)
68
+ TEST_PACKAGE="$(require_value "$1" "${2-}")"
69
+ shift 2
70
+ ;;
71
+ --runner)
72
+ RUNNER="$(require_value "$1" "${2-}")"
73
+ RUNNER_PROVIDED=1
74
+ shift 2
75
+ ;;
76
+ --device)
77
+ DEVICE="$(require_value "$1" "${2-}")"
78
+ shift 2
79
+ ;;
80
+ --android-module)
81
+ ANDROID_MODULE="$(require_value "$1" "${2-}")"
82
+ shift 2
83
+ ;;
84
+ --gradle-file)
85
+ GRADLE_FILE="$(require_value "$1" "${2-}")"
86
+ shift 2
87
+ ;;
88
+ -h|--help)
89
+ usage
90
+ exit 0
91
+ ;;
92
+ *)
93
+ die "unknown argument: $1"
94
+ ;;
95
+ esac
96
+ done
97
+
98
+ [[ -n "$APP_ROOT" ]] || die "--app-root is required"
99
+ [[ -n "$TEST_PACKAGE" ]] || die "--test-package is required"
100
+
101
+ mkdir -p "$APP_ROOT"
102
+ APP_ROOT="$(cd "$APP_ROOT" && pwd)"
103
+
104
+ app_path() {
105
+ case "$1" in
106
+ /*) printf '%s\n' "$1" ;;
107
+ *) printf '%s\n' "$APP_ROOT/$1" ;;
108
+ esac
109
+ }
110
+
111
+ detect_gradle_runner() {
112
+ local file="$1"
113
+ local line=""
114
+ local value=""
115
+ line="$(grep -m1 'testInstrumentationRunner' "$file" || true)"
116
+ [[ -n "$line" ]] || return 1
117
+ value="$(printf '%s\n' "$line" | sed -E 's/.*testInstrumentationRunner[[:space:]]*(=)?[[:space:]]*"([^"]+)".*/\2/')"
118
+ if [[ -n "$value" && "$value" != "$line" ]]; then
119
+ printf '%s\n' "$value"
120
+ return 0
121
+ fi
122
+ return 1
123
+ }
124
+
125
+ patch_gradle_file() {
126
+ local file="$1"
127
+ [[ -f "$file" ]] || die "--gradle-file does not exist: $file"
128
+ if ! grep -q 'testInstrumentationRunner' "$file" && ! grep -q 'BEGIN ZMR Android shim runner' "$file"; then
129
+ if [[ "$file" == *.kts ]]; then
130
+ cat >> "$file" <<EOF
131
+
132
+ // BEGIN ZMR Android shim runner
133
+ android {
134
+ defaultConfig {
135
+ testInstrumentationRunner = "$RUNNER"
136
+ }
137
+ }
138
+ // END ZMR Android shim runner
139
+ EOF
140
+ else
141
+ cat >> "$file" <<EOF
142
+
143
+ // BEGIN ZMR Android shim runner
144
+ android {
145
+ defaultConfig {
146
+ testInstrumentationRunner "$RUNNER"
147
+ }
148
+ }
149
+ // END ZMR Android shim runner
150
+ EOF
151
+ fi
152
+ fi
153
+
154
+ if grep -q 'BEGIN ZMR Android shim dependencies' "$file"; then
155
+ return
156
+ fi
157
+
158
+ if [[ "$file" == *.kts ]]; then
159
+ cat >> "$file" <<'EOF'
160
+
161
+ // BEGIN ZMR Android shim dependencies
162
+ dependencies {
163
+ androidTestImplementation("androidx.test:runner:1.6.2")
164
+ androidTestImplementation("androidx.test.ext:junit:1.2.1")
165
+ androidTestImplementation("androidx.test.uiautomator:uiautomator:2.3.0")
166
+ }
167
+ // END ZMR Android shim dependencies
168
+ EOF
169
+ else
170
+ cat >> "$file" <<'EOF'
171
+
172
+ // BEGIN ZMR Android shim dependencies
173
+ dependencies {
174
+ androidTestImplementation "androidx.test:runner:1.6.2"
175
+ androidTestImplementation "androidx.test.ext:junit:1.2.1"
176
+ androidTestImplementation "androidx.test.uiautomator:uiautomator:2.3.0"
177
+ }
178
+ // END ZMR Android shim dependencies
179
+ EOF
180
+ fi
181
+ }
182
+
183
+ mkdir -p "$APP_ROOT/.zmr" "$APP_ROOT/.zmr/shims/android"
184
+ cp "$ROOT/shims/android/ZMRShimInstrumentedTest.java" "$APP_ROOT/.zmr/ZMRShimInstrumentedTest.java"
185
+
186
+ ANDROID_SOURCE_PATH=""
187
+ if [[ -n "$ANDROID_MODULE" ]]; then
188
+ ANDROID_MODULE_PATH="$(app_path "$ANDROID_MODULE")"
189
+ ANDROID_SOURCE_DIR="$ANDROID_MODULE_PATH/src/androidTest/java/dev/zmr/shim"
190
+ ANDROID_SOURCE_PATH="$ANDROID_SOURCE_DIR/ZMRShimInstrumentedTest.java"
191
+ mkdir -p "$ANDROID_SOURCE_DIR"
192
+ cp "$ROOT/shims/android/ZMRShimInstrumentedTest.java" "$ANDROID_SOURCE_PATH"
193
+ fi
194
+
195
+ GRADLE_PATH=""
196
+ if [[ -n "$GRADLE_FILE" ]]; then
197
+ GRADLE_PATH="$(app_path "$GRADLE_FILE")"
198
+ if [[ "$RUNNER_PROVIDED" -eq 0 ]]; then
199
+ DETECTED_RUNNER="$(detect_gradle_runner "$GRADLE_PATH" || true)"
200
+ if [[ -n "$DETECTED_RUNNER" ]]; then
201
+ RUNNER="$DETECTED_RUNNER"
202
+ fi
203
+ fi
204
+ patch_gradle_file "$GRADLE_PATH"
205
+ fi
206
+
207
+ cat > "$APP_ROOT/.zmr/android-shim" <<EOF
208
+ #!/usr/bin/env bash
209
+ set -euo pipefail
210
+
211
+ ADB="\${ADB:-adb}"
212
+ DEVICE="$DEVICE"
213
+ adb_args=()
214
+ if [[ -n "\$DEVICE" ]]; then
215
+ adb_args=(-s "\$DEVICE")
216
+ fi
217
+ REQUEST_LOCAL="\$(mktemp)"
218
+ RESPONSE_LOCAL="\$(mktemp)"
219
+ REQUEST_REMOTE="/data/local/tmp/zmr-request-\$\$.json"
220
+ RESPONSE_REMOTE="/data/local/tmp/zmr-response-\$\$.json"
221
+ trap 'rm -f "\$REQUEST_LOCAL" "\$RESPONSE_LOCAL"; "\$ADB" "\${adb_args[@]}" shell rm -f "\$REQUEST_REMOTE" "\$RESPONSE_REMOTE" >/dev/null 2>&1 || true' EXIT
222
+
223
+ cat > "\$REQUEST_LOCAL"
224
+
225
+ "\$ADB" "\${adb_args[@]}" push "\$REQUEST_LOCAL" "\$REQUEST_REMOTE" >/dev/null
226
+ "\$ADB" "\${adb_args[@]}" shell am instrument -w \\
227
+ -e zmrRequestFile "\$REQUEST_REMOTE" \\
228
+ -e zmrResponseFile "\$RESPONSE_REMOTE" \\
229
+ -e class dev.zmr.shim.ZMRShimInstrumentedTest#testRunZMRCommand \\
230
+ "$TEST_PACKAGE/$RUNNER" >/dev/null
231
+ "\$ADB" "\${adb_args[@]}" pull "\$RESPONSE_REMOTE" "\$RESPONSE_LOCAL" >/dev/null
232
+ cat "\$RESPONSE_LOCAL"
233
+ printf '\\n'
234
+ EOF
235
+
236
+ chmod +x "$APP_ROOT/.zmr/android-shim"
237
+
238
+ {
239
+ echo "# ZMR Android Shim"
240
+ echo ""
241
+ echo "Generated for test package \`$TEST_PACKAGE\`."
242
+ echo ""
243
+ if [[ -n "$ANDROID_SOURCE_PATH" ]]; then
244
+ echo "Installed instrumentation source:"
245
+ echo ""
246
+ echo "- \`${ANDROID_SOURCE_PATH#"$APP_ROOT"/}\`"
247
+ else
248
+ echo "Add \`.zmr/ZMRShimInstrumentedTest.java\` to the app's androidTest source set."
249
+ fi
250
+ echo ""
251
+ echo "The androidTest target needs:"
252
+ echo ""
253
+ echo "- \`testInstrumentationRunner \"$RUNNER\"\`"
254
+ echo "- \`androidx.test:runner\`"
255
+ echo "- \`androidx.test.ext:junit\`"
256
+ echo "- \`androidx.test.uiautomator:uiautomator\`"
257
+ echo ""
258
+ if [[ -n "$GRADLE_PATH" ]]; then
259
+ echo "Patched Gradle runner/dependencies in:"
260
+ echo ""
261
+ echo "- \`${GRADLE_PATH#"$APP_ROOT"/}\`"
262
+ else
263
+ echo "Pass \`--gradle-file <module-build.gradle>\` to let this installer append a"
264
+ echo "guarded dependency block for those libraries."
265
+ fi
266
+ echo ""
267
+ echo "Run ZMR with:"
268
+ echo ""
269
+ echo "\`\`\`bash"
270
+ echo "zmr run .zmr/android-smoke.json --android-shim ./.zmr/android-shim"
271
+ echo "\`\`\`"
272
+ } > "$APP_ROOT/.zmr/android-shim.README.md"
273
+
274
+ echo "wrote $APP_ROOT/.zmr/android-shim"
275
+ echo "wrote $APP_ROOT/.zmr/ZMRShimInstrumentedTest.java"
276
+ if [[ -n "$ANDROID_SOURCE_PATH" ]]; then
277
+ echo "wrote $ANDROID_SOURCE_PATH"
278
+ fi
279
+ if [[ -n "$GRADLE_PATH" ]]; then
280
+ echo "patched $GRADLE_PATH"
281
+ fi